一、学习内容  

     本次课我们重点学习了怎样向函数传递数组,鉴于大家对函数和数组的理解和运用还存在一些问题,下面通过一些实例加以说明,希望同学们能够认真阅读和理解。

     例1:火柴棍拼数字

    要用火柴棍拼出0-9之间的数字,输入任意一个数字,输出需要多少根火柴棍。用火柴棍拼数字0-9的拼法如图所示: 

  对于这道题,我们学过分支结构后,就可以编程实现。代码如下:     

#include <stdio.h>
int main()
{
int digit,count;
printf("请输入0-9之间的数字\n");
scanf("%d",&digit);
switch(digit)
{
case :
case :
case : count= ;break;
case : count= ;break;
case :
case :
case : count= ;break;
case : count= ;break;
case : count= ;break;
case : count= ;break;
}
printf("拼出数字%d需要%d根火柴\n",digit,count);
return ;
}

现在我们对例1进行扩展

    例2:火柴棍等式:有16根火柴,可以拼出多少个形如“A+B=C”的等式,A、B、C是用火柴棍拼出的整数,且为一位数,输出该等式形式。

    在学过循环结构之后,我们可以采用穷举法来完成。代码如下:   

#include <stdio.h>
int main()
{ int a,b,c,count1,count2,count3;
for(a=;a<=;a++)
{
for(b=;b<=;b++)
{
c = a + b;
if(c > )
break;
switch(a)
{
case :
case :
case : count1= ;break;
case : count1= ;break;
case :
case :
case : count1= ;break;
case : count1= ;break;
case : count1= ;break;
case : count1= ;break;
}
switch(b)
{
case :
case :
case : count2= ;break;
case : count2= ;break;
case :
case :
case : count2= ;break;
case : count2= ;break;
case : count2= ;break;
case : count2= ;break;
}
switch(c)
{
case :
case :
case : count3= ;break;
case : count3= ;break;
case :
case :
case : count3= ;break;
case : count3= ;break;
case : count3= ;break;
case : count3= ;break;
}
if(count1+count2+count3 == )
printf("%d+%d=%d\n",a,b,c);
}
}
return ;
}

在完成上面的程序过程中,我们发现三个switch结构的语句完全是一样的,都是实现计算拼出一个数字需要多少根火柴的功能,那么我们就可以考虑,把这部分重复的代码提取出来,单独设计成一个函数。

    例3:利用函数实现火柴棍等式。代码如下:    

#include <stdio.h>
int num(int n);
int main()
{ int a,b,c,sum;
for(a=;a<=;a++)
{
for(b=;b<=;b++)
{
c = a + b;
if(c > )
break;
sum = num(a)+num(b)+num(c);
if(sum == )
printf("%d+%d=%d\n",a,b,c);
}
}
return ;
}
int num(int n)
{
int count=;
switch(n)
{
case :
case :
case : count= ;break;
case : count= ;break;
case :
case :
case : count= ;break;
case : count= ;break;
case : count= ;break;
case : count= ;break;
}
return count;
}

明显,例3的代码比例2的代码要简洁。

   对于一个程序,如果实现的功能比较单一,那么直接在main函数完成就可以,如果实现的功能比较复杂,那么从程序的模块化设计出发,应将每一个功能设计为一个函数,如本次实验要求大家完成的成绩管理问题;另外,如果程序中存在代码的重复使用,那么也应该考虑是否将重复代码实现的功能设计为一个单独的函数,如火柴棍等式问题。

 在使用函数的过程中,需要注意以下问题:

  (1)函数中定义的变量(包括形参),它只在本函数范围内起作用,我们称之为局部变量。在其他函数中是不能使用本函数定义的变量的。

  (2)简单变量做函数参数和数组做函数参数存在着本质的不同。

     简单变量做参数,实现的是值的单向传递,即只能把实参的值传给形参,由于实参和形参占用不同的内存单元,形参的改变不会影响实参。

     数组做函数参数,是将实参数组的地址传给形参数组,实参和形参占用的是相同的内存空间。         

  当我们学习了数组之后,有些程序可以通过使用数组进行优化。例如火柴棍问题,可以将火柴棍数存储在一个数组中

  int match[10]={6,2,5,5,4,5,6,3,7,6};

  则数字a的火柴棍数就是match[a]。代码如下:   

#include <stdio.h>
int main()
{ int a,b,c,sum;
int match[]={,,,,,,,,,};
for(a=;a<=;a++)
{
for(b=;b<=;b++)
{
c = a + b;
if(c > )
break;
sum = match[a]+match[b]+match[c];
if(sum == )
printf("%d+%d=%d\n",a,b,c);
}
}
return ;
}

在使用数组的过程中,特别需要强调的是数组越界问题。由于C语言不会对数组越界做检查,这就需要我们自己在写程序的过程中格外小心。

  例如: int  a[10];

   数组定义大小是10,那么数组元素是从a[0]到a[9]。

   数组的数据处理通常是通过循环结构来完成的,需要注意此时循环变量的初值是0,循环条件是i<10,那么在循环体中如果出现类似a[i-1]和a[i+1]的操作时就要考虑一下是否出现数组越界的情况了。

   最后,说说实验总结的问题。实验总结应该是对自己在完成实验题目的过程中遇到的问题进行总结,现在我们在语法方面的错误已经比较少了,那么,重点应该分析的是问题的解题思路,程序有哪些考虑不全面的地方,出现了哪些bug,怎么解决的,以及程序是否可以优化等问题。希望大家可以认真对此进行总结。

   再啰嗦一句,程序如果不会,不建议问百度,还是和同学一起讨论更有收获。

啰嗦了这么多,不知道大家认真看了没有,认真看了的同学,就在总结里回复我一声吧。    

二、实验内容   

    1.定义函数实现:输入若干名学生的成绩(输入人数或用负数结束均可),求其平均分,最高分和最低分,并指出最高分和最低分的学生(给出下标即可),输入一个成绩,说明是第几个学生的成绩,最后按照成绩从高到低排序后输出。(至少七个函数。输入函数、平均值函数、最大值下标函数、最小值下标函数,查找函数,排序函数,输出函数)

   2.定义长度为100的整型数组,将数组元素赋初值为1,2……100,将其中所有值为3或7倍数的值删除,最后打印输出数组中剩余数的个数及每个数。

附加题

   1.将数组a中的10个元素后移m位,移出的m位顺序存放在数组的 前m位。要求:(1)数组值在程序中初始化(2)m从键盘输入。

   2. 数字加密:输入一个四位数,将其加密后输出。方法是将该数每一位上的数字加9,然后除以10取余,做为该位上的新数字,最后将千位和十位上的数字互换,百位和个位上的数字互换,组成加密后的新四位数。例如输入1257,经过加9取余后得到新数字0146,再经过两次换位后得到4601。

三、实验要求 

      作业提交必须按照以下格式写,不能只写源代码,或只提交运行结果截图。 

     格式如下: 

      一、实验内容        

  1. 实验要求:XXXXXXXXX  

        代码:(利用博客园的插入代码功能插入源代码,不要截图,严格按照标准格式来写,学习加入必要的注释) 

        程序运行结果:截图 

       每个实验题都按照上述格式完成。        

      二、实验总结(实验中遇到的问题及解决方法) 

           1、....... 

           2、....... 

                ........ 

     三、程序分析

     程序1     

#include <stdio.h>
void swap(int x[]);
int main()
{
int a[]={,};
swap(a);
printf("a[0]=%d\na[1]=%d\n",a[],a[]);
return ;
}
void swap(int x[])
{
int z;
z=x[];
x[]=x[];
x[]=z;
}

程序2

#include <stdio.h>
void swap(int x,int y);
int main()
{
int a[]={,};
swap(a[],a[]);
printf("a[0]=%d\na[1]=%d\n",a[],a[]);
return ;
}
void swap(int x,int y)
{
int z;
z=x;
x=y;
y=z;
}

分析上述两个程序的执行结果。说明为什么?

四、作业评定: 

    满分10分,其中程序书写规范(缩格)及结果正确 5 分,程序书写不规范扣 1 分,程序少完成一题扣1分, 实验总结 2分,程序分析2分,每班提交的前5名同学  1分。奖励分:作业评阅 1分,附加题 2分 

    迟交作业 0 分,一周以后仍然没有交作业,倒扣 10 分,发现抄袭,一律倒扣10分。作业的评分将作为期末成绩中平时成绩和实验成绩的主要依据。

C语言程序设计第九次作业的更多相关文章

  1. C语言程序设计第二次作业--顺序结构

    C语言程序设计第二次作业--顺序结构 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido ...

  2. C语言学习 第九次作业总结

    本次作业练习的内容是二维数组.下面我先简单的说下二维数组的基本知识点: 二维数组其实这个中文概念颇有误导--会让人感觉这是一个两个维度的概念.所以很多的国外的C语言书籍上会称这种数组为多下标数组:即首 ...

  3. C语言程序设计第十次作业

    一.实验内容        1.有5名学生,每名学生有语文.数学和外语3门课的考试成绩.编程统计各学生的总分和平均分以及所有学生各科的平均分.要求成绩在程序中初始化,结果以表格的形式输出.      ...

  4. C语言程序设计第二次作业

    一.学习内容 掌握关系运算符.逻辑运算符.条件运算符 掌握常用数学函数的用法 if语句(单分支,双分支和多分支) 用switch语句实现多分支 理解多个if语句,if...else if... 和if ...

  5. C语言程序设计第二次作业—————顺序结构改

    1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 #include <stido.h> int mian() { ...

  6. C语言程序设计第二次作业1

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  7. C语言程序设计第二次作业0

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  8. C语言程序设计第二次作业—————顺序结构

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...

  9. Java语言程序设计-Markdown格式作业模板

    Markdown格式作业模板如下,大家可以直接复制粘贴使用. 注意:作业中不能只写答案,题目本身也要出现.. # 1. 本章学习总结 你对于本章知识的学习总结 # 2. 书面作业 **Q1 java ...

随机推荐

  1. 《开源大数据分析引擎Impala实战》目录

    当当网图书信息: http://product.dangdang.com/23648533.html <开源大数据分析引擎Impala实战>目录 第1章  Impala概述.安装与配置.. ...

  2. xml和json的区别

    本文转自SanMaoSpace的博客 链接地址如下:http://www.cnblogs.com/SanMaoSpace/p/3139186.html 1.定义介绍 (1).XML定义扩展标记语言 ( ...

  3. MEF 生命周期PartCreationPolicy

    为什么要单独把这个生命周期捞出来单独说一说呢?因为我今天就被这个东东坑了一把……新加了一个界面,第二次打开界面的时候会报错“指定的元素已经是另一个元素的逻辑子元素”.好嘛,我一看,哟,感觉就是xaml ...

  4. json转实体类

    VS快速生成JSON数据格式对应的实体 Json生成类在线生成工具 http://tool.sufeinet.com/Creater/JsonClassGenerator.aspx http://js ...

  5. Scala学习 —— 元组&映射

    再说集合之前,我们先来回顾一下映射&元祖 映射是键/值对偶的集合,Scala有一个通用的叫法--元组,也就是n个对象的聚集,并不一定要相同类型的.对偶不过是一个n=2的元祖.元祖对于那种需要将 ...

  6. First commit

    今天是2016年11月14日.天气晴. 第一篇博客,准备在这里记录下我学到的技术,希望能够坚持下来.^.^

  7. Android开发--TableLayout的应用

    1.简介 TableLayout为表格框架结构

  8. [整]磁盘 I/O 性能监控指标和调优方法

    在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能. 磁盘 I/O 性能监控的指标主要包括: 指标 1:每秒 I/O 数(IOPS 或 t ...

  9. JavaEE SpringMVC 基础概念(如需详细资料请留言)

    SpringMVC Web开发核心思想: 模型与视图相分离: 控制逻辑与业务逻辑相分离: 视图选择与具体视图技术相分离: 非侵入式开发(尽量少使用框架特定API),易于测试. SpringMVC是什么 ...

  10. django学习

    1.进入目录→创建一个新的项目mysite 命令:E:\MyCode\PythonCode>django-admin startproject mysite 自动生成目录: 2.创建一个APP ...