程序2:一个班有n个同学,通过键盘输入成绩,并进行以下处理: (1)求平均成绩;(数组求和) 算法分析:
1.输入n的值及n个成绩;
2.对成绩进行汇总求和,存入变量s中; 3.求平均数:average=s/n; 4.输出平均分average。 #include “stdio.h” main() {
int n,i,s=0; int score[30]; float average;
printf(“请输入学生的人数:”); scanf(“%d”,&n);
printf(“请输入%d学生的成绩:\\n”,n); for(i=0;i {scanf(“%d”,&score[i]); s=s+score[i];} average=(float)s/n; printf(“%.1f”,average); } (2)添加m个同学的成绩;(数组添加) 算法分析: 1.当前成绩个数设为n个; 2.输入m的值; 3.从第n个元素开始输入m个成绩; 4.更新数组元素的个数: n=m+n; 5.输出添加完后的成绩。 (3)把不及格同学的成绩更新为60分;(数组更新) 算法分析: 1.当前成绩个数设为n个; 2.从第0个元素开始逐个元素进行测试: if(score[i]<60) score[i]=60; 直到最后一个元素; 3.输出修改完后的成绩元素。 (4)求成绩的最高分和最低分,并记住对应元素的下标;(数组求极值) 算法分析: 1.当前成绩个数设为n个,定义变量max和min分别用来存放最大数和最小数; 2.为max和min赋初始值:max=min=score[0]; 3.从第1个元素开始逐个元素进行测试: if(score[i]>max) max=score[i]; if(score[i] 两种基本算法: 1.起泡法:将相邻两个数比较,小的调到前面。 2.选择法:将前面的数和后面的所有数依次进行比较,记住小数的下标,当比较完一遍,用前面的数和该小数进行交换。 起泡法排序: #include “stdio.h” main() {int score[10], i,j,k,n=10; printf(“ 输入成绩:\\n”); for(i=0;i scanf(“%d”,&score[i]); for(i=0;i for(j=0;j if(score[j] > score[j+1] ) {k= score[j]; score[j] = score[j+1]; score[j+1] =k; } for(i=0;i printf(\ printf(\ } 选择法排序: #include “stdio.h” main() { int i,j,k,m,score[10],n=10; for(i=0;i scanf(“%d”,&score[i]); for(i=0;i for(j=i+1;j if (score[k]> score[j]) k=j; m=score[i]; score[i]=score[k]; score[k]=m; } for(i=0;i printf(\ printf(\ } 程序3:对已经排好序的成绩数组进行以下操作:把一个新成绩按照顺序插入到数组的合适位置。(提高)。 算法分析: 1. 从键盘接收一个数据,存入变量m; 2. 根据变量m的大小进行定位,其对应下标为k; 3. 把score[9]到score[k]的元素依次后移,为新数据腾出空间; 4. 把m存入下标为k的空间中:score[k]=m; 5. 输出处理完后的新数组。 程序4:编程实现求一个3行4列整型数组的平均数。 算法分析: 1.定义一个二维数组a[3][4]; 2.为数组赋值; 3.累加元素的和,存入变量s中; 4.求平均数ave=s/12; 5.输出平均数ave。 #include “stdio.h” main() { int a[3][4],i,j,s=0; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”,&a[i][j]); for(i=0;i<3;i++) for(j=0;j<4;j++) s+=a[i][j]; ave=s/12; printf(“average=]\\n”,ave); } 程序4:编程实现把一个三行三列的二维数组转置输出。 算法分析: 1.定义一个二维数组a[3][3]; 2.为数组赋值; 3.交换a[i][j]与a[j][i]的值; 4.输出交换后的数组a。 #include “stdio.h” main() { int a[3][3],i,j,s=0; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf(“%d”,&a[i][j]); for(i=0;i<3;i++) for(j=0;j {t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} for(i=0;i<3;i++) { for(j=0;j<3;j++) printf(“]\\n”,a[i][j]); printf(“\\n”);} } 程序5:某学习小组有4名同学,学习了5门课程,求每个同学的平均分和每门课程的平均分。 算法分析: 1.定义一个二维数组score[5][6](最后一行和最后一列存放平均数); 2.为数组赋值; 3.求行平均数,把平均数存入score[i][5]中(i=0-3); 4.求列平均数,把平均数存入score[4][j]中(j=0-4); 5.输出整个数组。 程序6:从键盘输入一行字符,要求删除第一次出现的某个字符(要删除的字符也由键盘输入)。 算法分析: 1.定义存放字符串的字符数组str和存放单个字符的字符变量ch; 2.输入字符串str和要删除的字符ch; 3.对要删除的ch定位; 4.从该位置开始,开始把后续字符依次前移; 5.检查字符串的结束标记。 程序7:编一程序,将两个字符串连接起来。 算法分析: 1.定位:第一个字符串的?\\0?的位置; 2.从?\\0?开始把第二个字符串的字符依次放入第一个字符串的后端,直至第二个字符串的?\\0?; 3.检验第一个字符串的末端是否有结束符?\\0?,若没有,修正所得的字符串,在它的末端加上?\\0?。 #include “stdio.h” main( ) { char s1[80],s2[80]; int i=0,j=0; gets(s1); gets(s2); while(s1[i]!='\\0') i++; while(s2[j]!='\\0') {s1[i]=s2[j];i++;j++;} s1[i]='\\0'; puts(s1); } 程序8:有三个字符串(长度不超过20),要求找出其中最大者。 算法分析: 1.输入三个字符串,存入二维字符数组中; 2.先取前两个字符串比较,找出大的存入string 数组中; 3.用string和后续的依次进行比较,当出现比string的时更新string的值; 4.输出string中的字符串。 #include \ main( ) { char string[20],str[3][20]; int i; for(i=0;i<3;i++) gets(str[i]); if (strcmp(str[0],str[1])>0) strcpy(string,str[0]); else strcpy(string,str[1]); if (strcmp(str[2],string)>0) strcpy(string,str[2]); printf(\ } 实训题目 1、从键盘输入20个整型数据,统计其中正数的个数,并计算它们的求和。 2、把1000之内的素数存放在数组中,并输出素数的个数和各个素数。 3、在第一题的基础上找出最大数和最小数并输出对应的下标。 4、任意输入10个数据,对其进行排序(用选择法小到大)。 5、在第4题的基础上,从键盘上接收一个数据,如果该数不存在,把该数按照顺序放在数组中,若存在则把和该数相等的元素删除。 6、某学习小组有4名同学,学习了5门课程,编程求出最高分和最低分及其对应的行号和列号。 7、输入一行字符,统计字母、数字、空格和其它字符的个数。 第四部分 数据类型构造与模块化程序设计 (函数的应用) [实训目的及要求] 函数体现了程序设计的模块化思想,可以把复杂的问题简单化,并可实现代码共享。通过本次实训内容,使学生对函数的定义及应用能系统认识,并能熟练地在编程中体现出来。 程序1:利用自定义函数输出两个数中的大数。 #include “stdio.h” int max(int x,int y) /*用户自定义函数*/ {int z; if(x>y) z=x; else z=y; return(z);} main( ) /*主函数*/ {int a,b,c; scanf(“%d,%d”,&a,&b); c=max(a,b); printf(“max=%d\\n”,c);} 程序2:编写以下功能函数 (1)求两个数的和 (2)求两个数的差 (3)求两个数的积 (4)求两个数的商 /*两个数之和*/ int add(int x,int y) { int s; s=x+y; return(s); } /*两个数之差*/ int sub(int x,int y) { int s; s=x-y;