程序设计(C语言)1.ppt
例例1 1 用简单选择法对用简单选择法对1010个数排序个数排序(从小到大)从小到大)排序过程:(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换第一趟选择排序,结果最小的数被安置在第1个元素位置上(2)从第2个元素开始,再通过n-2次比较,从剩余的n-1个数中找出关键字次小的元素,将它与第二个数交换第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束1例初始:49 38 65 97 76 13 27 kji=11349一趟:13 38 65 97 76 49 27 i=22738二趟:13 27 65 97 76 49 38 三趟:13 27 38 97 76 49 65 四趟:13 27 38 49 76 97 65 五趟:13 27 38 49 65 97 76 六趟:13 27 38 49 65 76 97 kkkkjjjjjjjjjj2#include /*/*对比实验指导书对比实验指导书P22*/P22*/main()int a11,i,j,k,x;printf(Input 10 numbers:n);for(i=1;i11;i+)scanf(%d,&ai);printf(n);for(i=1;i10;i+)k=i;/*k记录本趟排序的最小值元素位置*/for(j=i+1;j=10;j+)if(ajak)k=j;if(i!=k)x=ai;ai=ak;ak=x;printf(The sorted numbers:n);for(i=1;i11;i+)printf(%d,ai);3习习题题:请请在在以以下下程程序序下下划划线线处处填填上上正正确确的的内内容容,以以实实现现对对数数组组中的数据由小到大排序的功能。中的数据由小到大排序的功能。(选择法)选择法)#include include .hmain()main()int int a10=1,0,4,8,12,65,-76,100,-45,123;a10=1,0,4,8,12,65,-76,100,-45,123;int int i,j,x;i,j,x;for(i=0;i10;+i)for(i=0;i10;+i)x=ai;x=ai;for(j=i+1;j9;+j)for(j=i+1;j9;+j)if(aj if(aj )ai=aj;ai=aj;aj=aj=;x=ai;x=ai;for(i=0;i10;+i)for(i=0;ia1,则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束 i:i:i:i:表示第几轮比较表示第几轮比较表示第几轮比较表示第几轮比较 j:j:j:j:表示本轮的比较次数表示本轮的比较次数表示本轮的比较次数表示本轮的比较次数5冒泡法的核心:小数上浮,大数下沉。冒泡法第一轮:使最大的数放在最后一个位置上;i=0,j=04;共N-1次比较6冒泡法第二轮:使次大的数放在倒数第二个位置上;i=1,j=03;65431第1次56431第2次54631第3次54361第4次54316结果7main()int num10;int i,j,temp;printf(Please input 10 numbers:n);for(i=0;i10;i+)scanf(%d,&numi);for(i=0;i=8;i+)for(j=0;jnumj+1)temp=numj;numj=numj+1;numj+1=temp;printf(The sorted numbers:n);for(i=0;i10;i+)printf(%4d,numi);8冒泡法排序中的核心程序段:冒泡法排序中的核心程序段:for(i=0;i=for(i=0;i=8 8;i+);i+)/*/*将将将将8 8改为改为改为改为9 9,怎样怎样怎样怎样?*/*/for(j=0;j=for(j=0;jnumj+1)if(numjnumj+1)temp=numj;temp=numj;numj=numj+1;numj=numj+1;numj+1=temp;numj+1=temp;91、程序填空:从键盘输入由5个字符组成的单词,判断此单词是不是good!,并显示结果。#include“stdio.h”main()static char str=good!;char b5;int i,flag for(i=0;i5;i+)_=getchar();flag=0;for(i=0;i5;i+)if(bi_stri)flag=1;break;if()printf(“This word is not good!”);else printf(“This word is good!”);或或flag=1flag=1 bi!=flag102 2将将两两个个字字符符串串连连接接起起来来的的程程序序,选选择择合合适适的的句句子子填填入入该该空空格中。(书格中。(书P142 P142 习题习题 7.13)7.13)main()char a150,b50;int i=0;j=0;scanf(%s,a);scanf(%s,b);while(ai!=0);while(!=0)ai+=b ;ai=0;i+j+bj113.3.下面程序的功能是输入下面程序的功能是输入5 5个整数,找出最大数和最小数所在的位置,并把个整数,找出最大数和最小数所在的位置,并把二者对调,然后输出调整后的二者对调,然后输出调整后的5 5个数,选择合适的句子填入该程序空格中。个数,选择合适的句子填入该程序空格中。main()int a5,max,min,i,j,k;for(i=0;i5;i+)scanf(“%d”,&ai);min=a0;for(i=1;i5;i+)if(aimin)min=ai;_;max=a0;for(i=1;imax)max=ai;_;printf(“nThe position of min is:%3dn”,k);printf(“The position of max is:%3dn”,j);for(i=1;i5;i+)printf(“%5dn”,ai);k=ij=iak=max;aj=min121.找出死循环程序段是 A:int i=150;B:for(i=0;i100)break;C:int k=0;D:int s=25;do while (s/2)k+=2/2;s-;while (k=10);本章习题本章习题答案:A132.For(;3;);代表的意义是 _;A:死循环 B:不循环 C:循环3次 D:语法错误3.打印如下图形的C程序,选择合适的句子填入该空格中。+main()int i,j,k;for(i=1;i=4;i+)for(j=0;j=3-i;j+)printf();for(k=0;k ;k+)printf(_);printf(n);本章习题本章习题A 2*i+144下面程序的功能是打印100以内个位数为6且能被3整除的所有数,选择合适的句子填入该空格中。#includemain()int i,a;for(i=0;i+)j=i*10+6;if()continue;printf(%d,j);本章习题本章习题i=9j%3!=0156.3 求s=a+aa+aaa+aaa之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),n由键盘输入:P120main()int a,n,i;long tn,sum;scanf(%d,%d,&a,&n);tn=a;sum=a;for(i=2;i=n;i+)tn=tn*10+a;sum+=tn;printf(sum is%dn,sum);分析:先求每一数项的值,1:tn=a2:tn=a*10+a3:tn=aa*10+a i:tn=tn*a+a总和:sum+=tnP120作业评讲作业评讲16main()unsigned long s=0,t=1;int n;for(n=1;n=20;n+)t=t*n;s=s+t;printf(“1!+2!+20!=%lun”,s)6.4 求 (即1!+2!+20!)17main()int k;float s=0;for(k=1;k=100;k+)s+=k;for(k=1;k=50;k+)s+=k*k;for(k=1;k=10;k+)s+=1.0/k;printf(the sum=%.4f,s);6.5 求186.6 6.6 打印出所有打印出所有的的“水仙花数水仙花数”。所谓。所谓“水仙花数水仙花数”是指一是指一个个3 3位数,其各位数字的立方和等于该数本身。例如,位数,其各位数字的立方和等于该数本身。例如,153153是是一个一个“水仙花数水仙花数”,因为,因为153=1153=13 3+5+53 3+3+33 3(参实验指导书(参实验指导书P55.3P55.3)main()int i,j,k,n;printf(“n”);for(n=100;n1000;n+)i=n/100;j=n/10-i*10;/*等价于j=n%100/10*/k=n%10;if(n=i*i*i+j*j*j+k*k*k)printf(“%-10d”,n);printf(“n”);分析:先求个、十、百位的数,再判断196.7 6.7 一个数如果恰好等于它的因子之和,这个数就称为一个数如果恰好等于它的因子之和,这个数就称为“完数完数”。例如。例如6 6的因子为的因子为1 1,2 2,3 3,而,而6=1+2+36=1+2+3,因此,因此6 6就是就是“完数完数”。编程找出。编程找出10001000以内的以内的所有所有“完数完数”,并按下面,并按下面格式输出其因子:格式输出其因子:its its facters facters are 1,2,3are 1,2,3Main()int m,s,i;for(m=2;m1000;m+)s=0;for(i=1;i=m/2;i+)/*求所有因子之和*/if(m%i)=0)s=s+i;if(s=m)printf(“%d its factors are”,m);for(i=1;im;i+)if(m%i)=0)printf(“%d”),i;分析:找一个数的因子,在1m/2范围内找,凡是能被m除尽的均为m的因子206.8 6.8 有一分数序列:有一分数序列:求出这个数列的前求出这个数列的前2020项之和项之和Main()int i,t,n=20;float a=2,b=1,s=0;for(i=1;i=n;i+)s=s+a/b);t=b;b=a;a=a+t;printf(“sum=%9.6fn”,s);分析:序列的规律,发现前一项的分子作为后一项的分母,前一项分子、分母之和为后一项的分子。216.9 6.9 一球从一球从100100m m高度自由落下,每次落地后反跳高度自由落下,每次落地后反跳回原来高度的一半,再落下。求它在第回原来高度的一半,再落下。求它在第1010次落地次落地时,共经过多少时,共经过多少m?m?第第1010次反弹多高?次反弹多高?Main()int n;float sn=100,hn=100/2;for(n=2;n0)x1=(x2+1)*2;x2=x1;day-;printf(total=%d,x1);23int fun(n)int n;int sum;if(n=10)sum=1;else sum=2*fun(n+1)+2;return(sum);main()int total,day=1;total=fun(day);printf(ntotal=%dn,total);24#include#include#define N 101main()int aN,i,j;for(i=2;iN;i+)ai=i;a1=0;for(i=2;i=sqrt(N-1);i+)/*使非素数为0*/for(j=i+1;jN;j+)if(aj!=0&j%i=0)aj=0;break;i=0;for(j=1;jN;j+)if(i%10=0)printf(n);if(aj!=0)printf(%4d,aj);i+;7.1 7.1 用筛法求用筛法求100100以内的素数。以内的素数。原理:原理:使数组中的非素数置0,剩余的数则全部是素数。25#include#define N 3main()int aNN,sum=0,i,j;for(i=0;iN;i+)/*输入矩阵元素*/for(j=0;jN;j+)scanf(%d,&aij);for(i=0;iN;i+)/*求对角线元素之和*/sum+=aii;printf(sum=%d,sum);7.3 求一个求一个33的整型矩阵对角线元素之和。的整型矩阵对角线元素之和。26#include#define N 5main()int aN,i,temp;for(i=0;iN;i+)scanf(%d,&ai);for(i=0;iN/2;i+)/*将数组倒置*/temp=ai;ai=aN-1-i;aN-1-i=temp;for(i=0;iN;i+)printf(%5d,ai);7.5 将一个数组中的值按逆序重新存放。如:原来为将一个数组中的值按逆序重新存放。如:原来为 9,8,4,3,要求改为,要求改为3,4,8,9。277.8 找出一个二维数组的鞍点,即位置上的在该行上最大,找出一个二维数组的鞍点,即位置上的在该行上最大,在该列上最小。也可能没有鞍点。在该列上最小。也可能没有鞍点。(实验指导书实验指导书P57,7)435211333452311230251鞍点是:鞍点是:0行,行,2列的列的301)用二重循环输入数组元素用二重循环输入数组元素2)用二重循环输出数组元素用二重循环输出数组元素3)置整个矩阵有无鞍点的标志置整个矩阵有无鞍点的标志flag2=04)从从0行至行至n行,行,A)找到该行的最大元素找到该行的最大元素max,并记录所在列号并记录所在列号maxj=j B)比较该元素在本列是否最小比较该元素在本列是否最小,如否,如否,flag1=0,是则是则flag1=1 C)如如flag1=1输出鞍点,并置输出鞍点,并置flag2=15)如如flag2=0,则输出无鞍点信息。则输出无鞍点信息。28#define N 10#define M 10main()int i,j,k,m,n,flag1,flag2,aNM,max,maxi,maxj;printf(n输入行数n:);scanf(%d,&n);printf(n输入列数m:);scanf(%d,&m);for(i=0;in;i+)/*输入二维矩阵*/printf(第%d行:,i);for(j=0;jm;j+)scanf(%d,&aij);for(i=0;in;i+)/*输出二维矩阵*/for(j=0;jm;j+)printf(%5d,aij);printf(n);29 flag2=0;/*flag2:整个矩阵有无鞍点的标志,flag2=1表示有鞍点*/for(i=0;in;i+)max=ai0;/*找出一行中的最大值*/for(j=0;jmax)max=aij;maxj=j;/*如果max本列中不是最小,则flag1=0,标志着不是鞍点*/for(k=0,flag1=1;kakmaxj)flag1=0;break;if(flag1)printf(n第%d行,第%d列的%d是鞍点n,i,maxj,max);flag2=1;if(!flag2)printf(n整个矩阵有无鞍点!n);308.1 8.1 输入两个正整数输入两个正整数m m和和n n,求其最大公约数和最小求其最大公约数和最小公倍数。(参实验指导书公倍数。(参实验指导书P56P56、4 4)分析:首先求最大公约数:使nm,循环:n%mm;m n 直到m=0,此时n即为最大公约数 最大公倍数:m*n/最大公约数。如:m=12,n=8 最大公约数为4 最小公倍数为12*8/4=24m=12%8n=8m=8%4n=431yue(int n,int m)int temp;while(m!=0)temp=n%m;n=m;m=temp;return(n);bei(int n,int m,int c)return(n*m/c);main()int x,y,z;printf(n请输入两个正整数:n);scanf(%d%d,&x,&y);if(xy)temp=x;x=y;y=temp;z=yue(x,y);printf(最大公约数是:%dn,z);printf(最小公倍数是:%d,bei(x,y,z);32void input(int*p,int n)int i;printf(n);for(i=0;in;i+)scanf(%d,p+i);void exchange(int*p,int n)int i,max,maxi=0,min,mini=0;max=min=*p;for(i=1;in;i+)if(max*(p+i)min=*(p+i);mini=i;*(p+maxi)=*(p+n-1);*(p+n-1)=max;*(p+mini)=*p;*p=min;10.3 输入输入10个数,将最小数与第一个数交换,最大数与最个数,将最小数与第一个数交换,最大数与最后一个数交换。写出三个函数:后一个数交换。写出三个函数:1)输入输入2)处理处理3)输出输出33void output(int*p,int n)int i;printf(n);for(i=0;in;i+)printf(%5d,*(p+i);#define N 10main()int aN,*p=a;input(p,N);output(p,N);exchange(p,N);output(p,N);34