第一篇:编程题小结大全
1011 字符逆序
Description:将一个字符串str的内容颠倒过来,并输出。Str的长度不超过100个字符。
Input:输入包括一行。第一行输入的字符串。Output:输出转换好的逆序字符串。Sample input:I am a student Sample output:tneduts a ma I 解答:
#include
int main(){ int i = 0;char str[100];gets(str);int len=strlen(str)-1;for(i=len;i>=0;i--)printf(“%c”,str[i]);return 0;} 1541 课后习题9.1 Description:输入一行电报文字,将字母变成其下一字母(如a变成b,z变成a等)Input:一行字符
Output:加密处理后的字符 Sample Input:a b Sample Output:b c #include
printf(“%sn”,str);return 0;} 1888 #include Input 输入只有三个正整数a、b、c。 Output 输出一行,包括三个的和、乘积、平均数。数据之间用一个空格隔开,其中平均数保留小数后面两位。 Sample Input 1 2 3 Sample Output 6 6 2.00 #include 编程小结 (一)一.累加:加数1+加数2+加数3+„„+加数n(n个加数相加)假设我们用i表示我们的加数数目,例如:当i=9时,就表示加数9 模版:int i,sum=0;(注意:如果是分数或者小数sum就是float类型) for(i=1;i<=n;i++)(注意:循环变量的初值和递变规律,也有 可能是i--,或者i+=2等等){通项a;(通项:用一个通用的式子表示所有的加数)sum+=a;} printf(“%d”,sum);(注意:如果是float类型就是%f) 1、求1+2+3„„+100的和,则通项a就是i。 分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略。整理之后就是: int i,sum=0;for(i=1;i<=100;i++)sum+=i;printf(“%d”,sum); 2、求2+4+6„„+100的和。 分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个加数都是偶数,那么i的变化就是i+=2,并且i是从2开始变化,那么在赋值的时候就应该是i=2。整理之后就是: int i,sum=0;for(i=2;i<=100;i+=2)sum+=i;printf(“%d”,sum); 3、求1+3+5„„+99的和。 分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个加数都是奇数,那么i的变化就是i+=2。整理之后就是: int i,sum=0;for(i=1;i<=100;i+=2)sum+=i;printf(“%d”,sum); 4、求1+5+9+13+17+„„的前100项的和,则通项为j+4,则程序为: int i,sum=0,j=1;for(i=1;i<=100;i++){ sum+=j;j=j+4; } printf(“%d”,sum);因为加数的第一项是1,所以赋初值的时候j=1,然后加数进行变化,变成5加到sum里面,所以这里要将通项和求和这两句话互换位置。 5、求1+4+9+16+„„的前100项的和 分析可知:每个加数就是对应的加数数目的平方,则通项为i*i,则程序为: int i,sum=0;for(i=1;i<=100;i++)sum+= i*i;printf(“%d”,sum); 6、求1+(1+2)+(1+2+3)+(1+2+3+4)+„„的前100项的和。 分析可知每一个加数本身又是一个累加的式子,进一步观察可以发现,每个累加的式子都是加到这个加数所在的加数数目,即第35个加数就是1+2+3„„+35,并且是在前面一个加数的基础上加上这个加数所在的加数数目,也就是说第36个加数就是在前一个加数的基础上加上36,即:1+2+3„„+35+36。假设第k个加数是j,那么第k+1个加数就可以表示为j+(k+1),然后第k+2个加数就是j+(k+1)+(k+2)„„那么我们的通项就可以表示为a=a+i,则程序为: int i,sum=0, a=0;for(i=1;i<=100;i++){ a+=i;sum+=a;} printf(“%d”,sum); 7、求1+1+2+3+5+8+13+21+„„的前100项的和。 分析可知从第三个加数开始,每一个加数是其前两个加数之和,假设第k个加数是m,第k+1个加数是n,然后第k+2个加数就是m+n,那么我们的通项就可以表示为a=m+n,但是要注意每次加数所对应的m和n不一样,所以我们要在求出每个加数之后,找出其对应的m和n;再分析我们可以发现当前的n是下一次的m,当前的加数a是下一次的n,假设接着上面的推导,那么第k+3个加数就是n+(m+n),对应我们的通项a=m+n,理解前面一句话。则程序为: int i,sum=0, m=1,n=1,a;for(i=3;i<=100;i++){ a=m+n;sum+=a;m=n;n=a;} printf(“%d”,sum); 8、求1+1/2+1/3+„„+1/100 分析可知每一个加数就是我们的加数数目的倒数,则通项a就是1/i,我们说循环变量i一般定义为整型,那么1/i的结果就是整型,这样的话小数点后面的就会被省略,所以正确的应该写为a=1.0/i,则程序为: int i;float sum=0;for(i=1;i<=100;i++){a=1.0/i;sum+=a;} printf(“%f”,sum); 9、求1+1/2+2/3+3/5+5/8+„„的前100项的和。 分析可从第三个加数开始观察,每一个加数的分母是其前一个加数的分子和分母之和,每一个加数的分子是其前一个加数的分母。可以将第一个加数看成1/1,那么第二个加数也符合我们的规律,只有第一个不符合,那么我们可以先将第一个加数加到sum,然后再变下一个加数,但是要注意每次加数所对应的分子和分母不一样,所以我们要在求出每个加数之后,找出下一个加数所对应的分子和分母。设通项表示为a=m/n, 那么下一个加数是n/(m+n),然后下下一个加数就是(m+n)/(m+n+n);再分析我们可以发现当前的分子和分母之和(m+n)是下一次的分母n,当前的分母n是下一次的分子m,注意这里在做数据交换的时候需要中间变量,对应我们的通项a=m/n,理解前面一句话。则程序为: int i;float sum=0, m=1,n=1,t;for(i=1;i<=100;i++){ sum+=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum); 二.累乘:乘数1*乘数2*乘数3*„„*乘数n(n个乘数相乘)假设我们用i表示我们的乘数数目,例如:当i=9时,就表示乘数9 模版:int i,sum=1;(注意:如果是分数或者小数sum就是float类型) for(i=1;i<=n;i++)(注意:循环变量的初值和递变规律,也有 可能是i--,或者i+=2等等){通项a;(通项:用一个通用的式子表示所有的乘数)sum*=a;} printf(“%d”,sum);(注意:如果是float类型就是%f) 1、求1*2*3„„*100的积,则通项a就是i。 分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略。整理之后就是: int i,sum=1;for(i=1;i<=100;i**)sum*=i;printf(“%d”,sum); 2、求2*4*6„„*100的和。分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个乘数都是偶数,那么i的变化就是i+=2,并且i是从2开始变化,那么在赋值的时候就应该是i=2。整理之后就是: int i,sum=1;for(i=2;i<=100;i+=2)sum*=i;printf(“%d”,sum); 3、求1*3*5„„*99的和。 分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个乘数都是奇数,那么i的变化就是i+=2。整理之后就是: int i,sum=1;for(i=1;i<=100;i+=2)sum*=i;printf(“%d”,sum); 4、求1*5*9*13*17*„„的前100项的积,则通项为j*4,则程序为: 分析:因为乘数的第一项是1,所以赋初值的时候j=1,然后乘数进行变化,变成5乘到sum里面,所以这里要将通项和求积这两句话互换位置。 int i,sum=1,j=1;for(i=1;i<=100;i**){ sum*=j;j=j*4; } printf(“%d”,sum); 5、求1*4*9*16*„„的前100项的积 分析可知:每个乘数就是对应的乘数数目的平方,则通项为i*i,则程序为: int i,sum=1;for(i=1;i<=100;i**)sum*= i*i;printf(“%d”,sum); 6、求1*(1*2)*(1*2*3)*(1*2*3*4)*„„的前100项的积。分析可知每一个乘数本身又是一个累乘的式子,进一步观察可以发现,每个累乘的式子都是乘到这个乘数所在的乘数数目,即第35个乘数就是1*2*3„„*35,并且是在前面一个乘数的基础上乘上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上乘上36,即:1*2*3„„*35*36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j*(k+1),然后第k+2个乘数就是j*(k+1)*(k+2)„„那么我们的通项就可以表示为a=a*i,则程序为: int i,sum=1, a=0;for(i=1;i<=100;i**){ a*=i;sum*=a;} printf(“%d”,sum); 7、求1*1*2*3*5*8*13*21*„„的前100项的积。 分析可知从第三个乘数开始,每一个乘数是其前两个乘数之和,假设第k个乘数是m,第k+1个乘数是n,然后第k+2个乘数就是m+n,那么我们的通项就可以表示为a=m+n,但是要注意每次乘数所对应的m和n不一样,所以我们要在求出每个乘数之后,找出其对应的m和n;再分析我们可以发现当前的n是下一次的m,当前的乘数a是下一次的n,假设接着上面的推导,那么第k+3个乘数就是n*(m+n),对应我们的通项a=m*n,理解前面一句话。则程序为: int i,sum=1, m=1,n=1,a;for(i=3;i<=100;i**){ a=m+n;sum*=a;m=n;n=a;} printf(“%d”,sum); 8、求1*1/2*1/3*„„*1/100 分析可知每一个乘数就是我们的乘数数目的倒数,则通项a就是1/i,我们说循环变量i一般定义为整型,那么1/i的结果就是整型,这样的话小数点后面的就会被省略,所以正确的应该写为a=1.0/i,则程序为: int i;float sum=1;for(i=1;i<=100;i**){a=1.0/i;sum*=a;} printf(“%f”,sum); 9、求1*1/2*2/3*3/5*5/8*„„的前100项的积。 分析可从第三个乘数开始观察,每一个乘数的分母是其前一个乘数的分子和分母之和,每一个乘数的分子是其前一个乘数的分母。可以将第一个乘数看成1/1,那么第二个乘数也符合我们的规律,只有第一个不符合,那么我们可以先将第一个乘数乘到sum,然后再变下一个乘数,但是要注意每次乘数所对应的分子和分母不一样,所以我们要在求出每个乘数之后,找出下一个乘数所对应的分子和分母。设通项表示为a=m/n, 那么下一个乘数是n/(m+n),然后下下一个乘数就是(m+n)/(m+n+n);再分析我们可以发现当前的分子和分母之和(m+n)是下一次的分母n,当前的分母n是下一次的分子m,注意这里在做数据交换的时候需要中间变量,对应我们的通项a=m/n,理解前面一句话。则程序为: int i;float sum=1, m=1,n=1,t;for(i=1;i<=100;i**){ sum*=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum); 10、求1+(1*2)+(1*2*3)+(1*2*3*4)+„„的前100项的和。 分析可知每一个加数本身是一个累乘的式子,进一步观察可以发现,每个累乘的式子都是乘到这个乘数所在的乘数数目,即第35个乘数就是1*2*3„„*35,并且是在前面一个乘数的基础上乘上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上乘上36,即:1*2*3„„*35*36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j*(k+1),然后第k+2个乘数就是j*(k+1)*(k+2)„„那么我们的通项就可以表示为a=a*i,再利用累加的模版,则程序为: int i,sum=0, a=1;for(i=1;i<=100;i**){ a*=i;sum+=a;} printf(“%d”,sum); 11、求1*(1+2)*(1+2+3)*(1+2+3+4)*„„的前100项的积。 分析可知每一个乘数本身又是一个累加的式子,进一步观察可以发现,每个累加的式子都是加到这个乘数所在的乘数数目,即第35个乘数就是1+2+3„„+35,并且是在前面一个乘数的基础上加上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上加上36,即:1+2+3„„+35+36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j+(k+1),然后第k+2个乘数就是j+(k+1)+(k+2)„„那么我们的通项就可以表示为a=a+i, 再利用累乘的模版,则程序为: int i,sum=1, a=0;for(i=1;i<=100;i**){ a+=i;sum*=a;} printf(“%d”,sum); 三.最大值和最小值:数字0,数字1,数字2,„„数字n-1(一共n个数字)假设我们用i表示我们的数字所在的位置,并且第一个位置是0,例如:当i=9时,就表示这个数字在第10个位子 模版: int i,max,a[n];(注意:如果是分数或者小数max和a[n]就是float 类型,注意这里定义的时候根据题目所给的具体数字把n换掉,千万不可以写a[n]o哦~~~~) for(i=0;i 了数字,就在定义的时候直接赋值,这个循环就不需要了;如果要求产生给数组赋a到b之间的随机数,那么就用a[i]= a + rand()%(b-a);这句话代替这句。注意如果是float类型就是%f)max=a[0];for(i=0;i 1、求20个数字的最大值和最小值,要求赋1到100之间的随机数,并且输出它们及其下标。 分析:因为这里还要输出其下标,所以还有定义一个row来存放,并且要对其赋值为0,因为我们给max赋值为a[0],则程序为: int i,max,min,a[20],row1=0,row2=0;for(i=0;i<20;i++)a[i]= 1+rand()%99;max=a[0];min=a[0];for(i=0;i<20;i++){ if(maxa[i])(这里是找出最小值){ min=a[i];row2=i;} } printf(“max =%d, row=%dn min =%d, row=%dn”, max,row1,min,row2); 2、求4*5矩阵的最大值和最小值,要求赋值随机数,并且输出它们及其下标。分析:虽然这是一个二维的数组,但是其思路仍然和一维数组的一样,区别只是这里需要用嵌套循环。要求还要输出其下标,二维数组的下标是两个,所以还要定义一个row和一个col来存放,并且要对它们赋值为0,因为我们给max赋值为a[0] [0],则程序为: int i,j,max,min,a[4] [5],row1=0,row2=0,col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();max=a[0] [0];min=a[0] [0];for(i=0;i<4;i++)for(j=0;j<5;j++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];row2=i;col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”, max,row1, col1, min,row2, col2); 3、求4*5矩阵的每一行最大值和最小值,要求赋值随机数,并且输出它们及其下标。 分析:虽然这是一个二维的数组,但是要求的是每一行的最大最小值,我们知道二维数组的每一行本身就是一个数组,那么我们就还需要一个控制行数的循环。要求还要输出其下标,二维数组的下标是两个,每一行的最大最小值其行号不就是i,所以还要定义一个存放列号的col,并且要对它赋值为0,因为我们给max赋值为每一行的第一个元素,也就是a[i] [0],则程序为: int i,j,max,min,a[4] [5],col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(i=0;i<4;i++)(这个循环是控制行的,里面的循环体本身就是一个求 一维数组的最大最小值的程序) {max=a[i] [0];min=a[i] [0];for(j=0;j<5;j++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max,i, col1, min,i, col2);} 4、求4*5矩阵的每一列最大值和最小值,要求赋值随机数,并且输出它们及其下标。 分析:虽然这是一个二维的数组,但是要求的是每一列的最大最小值,二维数组的每一列可以看成一个数组,那么我们就还需要一个控制列数的循环。要求还要输出其下标,二维数组的下标是两个,每一列的最大最小值其列号不就是j,所以还要定义一个存放行号的row,并且要对它赋值为0,因为我们给max赋值为每一列的第一个元素,也就是a[0] [j],则程序为: int i,j,max,min,a[4] [5],row1=0,row2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(j=0;j<5;j++)(这个循环是控制列的,里面的循环体本身就是一个求 一维数组的最大最小值的程序){max=a[0] [j];min=a[0] [j];for(i=0;i<4;i++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];row2=i;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max, row1,j, min, row2,j);} 5、排序(冒泡法)比如说 对于5个数字排序,首先要把5个数字放到一个一维的数组里面去 所以编程的前几句为:int a[5] for(i=0;i<5;i++)scanf(“%d”,&a*i+); 那接下来就是排序了,为了方便理解就将数组实际化:比如 a[5]里面放着{7,9,0,12,3}那画图出来就是 a[5] a[0] a[1] a[2] a[3] a[4] 那我们排序的方法是这样的采用这样几步: 1,用a[0]与后面的(a[1]~a[4]里面的每一个成员比较即是说:a[0]~a[1]比较 a[0]~a[2]比较 a[0]~a[3]比较 a[0]~a[4]比较)当后面的成员只要发现比a[0]小的就与他的位置交换 这部做完之后数组就应 该是这个样子: a[0] a[1] a[2] a[3] a[4] 2,用a[1]与后面的(a[2]~a[4]里面的每一个成员比较即是说: a[1]~a[2]比较 a[1]~a[3]比较 a[1]~a[4]比较)当后面的成员只要发现比a[1]小的就与他的位置交换 这部做完之后数 组该是这个样子:这个时候的a1不是我们赋初值时候的a1老就是我们改变后的数组所以这个时候的a1=9哦。 a[0] a[1] a[2] a[3] a[4] 3,用a[2]与后面的(a[3]~a[4]里面的每一个成员比较即是说: a[2]~a[3]比较 a[2]~a[4]比较)当后面的成员只要发现比a[2]小的就与他的位置交换 这部做完之后数组就应 该是这个样子: a[0] a[1] a[2] a[3] a[4] 4,用a[3]与后面的(a[4]~a[4]里面的每一个成员比较即是说: a[3]~a[4]比较)当后面的成员只要发现比a[2]小的就与他的位置交换 这部做完之后数组就应 该是这个样子: a[0] a[1] a[2] a[3] a[4] 循环就是 写成这个样子的哦: for(i=0;i<4;i++) for(j=i+1;j<5;j++)if(a[i] {c=a[i];a[i]=a[j];a[j]=c;}(这个复合语句表示交换a[i]与a[j]进行交换)你把这个 循环好好的分析一下,当i=0 j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之间的所有进行比较并且交换。其他的以此类推。 最后是不是要对排好序的数组进行输出: for(i=0;i<5;i++)printf(“%d”,a*i+); 6、排序(选择法)比如说 对于5个数字排序,首先要把5个数字放到一个一维的数组里面去 所以编程的前几句为:int a[5] for(i=0;i<5;i++)scanf(“%d”,&a*i+); 那接下来就是排序了,为了方便理解就将数组实际化:比如 a[5]里面放着{7,9,0,12,3}那画图出来就是 a[5] a[0] a[1] a[2] a[3] a[4] 那我们排序的方法是这样的采用这样几步: 1,先把a[0]的下标储存起来,即赋值给k,然后用a[0]与后面的比较 (a[1]~a[4]里面的每一个成员比较即是说:a[0]~a[1]比较 a[0]~a[2]比较 a[0]~a[3]比较 a[0]~a[4]比较)当后面的成员只要发现比a[0]小的就把他的下标赋值给k,最后将a[0]和a[k]的位置交换,这步做完之后数组就应该是这个样子: a[0] a[1] a[2] a[3] a[4] 2,先把a[1]的下标储存起来,即赋值给k,然后用a[1]与后面的比较 (a[2]~a[4]里面的每一个成员比较即是说: a[1]~a[2]比较 a[1]~a[3]比较 a[1]~a[4]比较)当后面的成员只要发现比a[1]小的就把他的下标赋值给k,最后将a[1]和a[k]的位置交换 这步做完之后数组就应该是这个样子: a[0] a[1] a[2] a[3] a[4] 3,先把a[2]的下标储存起来,即赋值给k,然后用a[2]与后面的比较 (a[3]~a[4]里面的每一个成员比较即是说:a[2]~a[3]比较 a[2]~a[4]比较)当后面的成员只要发现比a[2]小的就把他的下标赋值给k,最后将a[2]和a[k]的位置交换 这步做完之后数组就应该是这个样子: a[0] a[1] a[2] a[3] a[4] 4,先把a[3]的下标储存起来,即赋值给k,然后用a[3]与后面的比较(a[4]里面的每一个成员比较即是说: a[3]~a[4]比较)当后面的成员只要发现比a[3]小的就把他的下标赋值给k,最后将a[3]和a[k]的位置交换 这步做完之后数组就应该是这个样子: a[0] a[1] a[2] a[3] a[4] 循环就是 写成这个样子的哦: for(i=0;i<4;i++) {k=i;for(j=i+1;j<5;j++) if(a[i] k=j;if(k!=i) {c=a[i];a[i]=a[j];a[j]=c;} }(这个复合语句表示交换a[i]与a[j]进行交换)把这个循环好好的分析一下,当i=0, j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之间的所有进行比较并且交换。其他的以此类推。 最后是不是要对排好序的数组进行输出: for(i=0;i<5;i++)printf(“%d”,a*i+); 四.寻找特殊的数字或解应用题:输出a到b之间的所有的具有某个特点的数字 模版: int n,a,b;(注意:如果是分数或者小数a和b就是float类型) scanf(“%d,%d”,&a,&b);(从键盘输入查找的范围;如果题目已经给 了范围,就在循环的时候直接带值,这句话就不需要了。注意如果是float类型就是%f。注意如果运行程序,在输入数据验证的时候注意格式要匹配)for(n=a;n<=b;n++)(如果题目已经给了具体的范围,那么这里就根 据题目把a和b换掉){if(条件)(注意:这句话是这类题目的核心,有时候也许不是一 句话,这句话放在这的意思是判定是否是特殊数字)printf(“%d”, n);(注意:如果是float类型就是%f)} 1、输出3到1000之间的所有素数 分析:在做本题之前,先要搞明白什么是素数,它又是如何判定的。补充: 素数 又叫质数,如果一个数只能被1和它本身整除,那么我们就说它是素数。分析:既然一个素数只可以被1和它本身整除,那么当我们判断一个数n是不是素数的时候,就用这个数去除2到(n-1),一旦我们发现可以整除这个区间的某一个数,那么我们就不再去除别的数了,因为在2到(n-1)这个范围内,n可以整除其中的某一个数,那么就肯定不是素数。这个过程需要一个循环和停止循环的break来实现。继续分析,当我们在2到(n-1)这个范围内找不到n可以整除的数,那么就说明这个数是素数,那么我们就判断上面的循环时候做完了,如果中间就跳出循环,则说明不是素数,反之,如果做完了,那么就是素数。P判断能否整除,就是求余看是否为0,则程序如下: int n;(n是要判断的数,具体根据题意赋值或从键盘输入)for(i=2;i 上面的循环有没有做完)本题分析:只要用上面的程序替换掉模版的那个if就可以了,注意这里不再需要else了,因为题目只要求输出素数,输出语句也只需要一句,则程序如下: int n,i;for(n=3;n<=1000;n++){ for(i=2;i 2、输出1到100之间的所有同构数 分析:在做本题之前,先要搞明白什么是同构数,它又是如何判定的。补充: 同构数 如果一个数出现在自己的平方数的右边,那么我们就说它是同构数。分析:既然一个同构数会出现在它自己的平方数的右边,那么当我们判断一个数n是不是同构数的时候,先要做的就是求出这个数的平方,然后该怎么判断是不是出现在右边呢?我们人有眼睛,可以直接看,但是电脑不长眼睛的,它看不到,它只能分析,那么它怎么分析呢?1到100之间的所有数只有一位或者两位,那么我们在取平方数右边的时候,只要取这个平方数的最右边的一位或者两位,与我们的数进行比较,看是否一样,如果一样就是同构数,反之就不是。怎么取一个数的最右边一位或者两位呢?求余!!一个数对10求余就是取它的最右边一位,也就是个位;如果对100求余就是取它的最右边两位,也就是十位和个位。则程序如下: int n;(n是要判断的数,具体根据题意赋值或从键盘输入)if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);本题分析:直接带模版,则程序如下: int n;for(n=1;n<=100;n++){ if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);}(这里的大括号实际是可以去掉的,不去掉也没有关系) 3、输出1到1000之间的所有回文数 分析:在做本题之前,先要搞明白什么是回文数,它又是如何判定的。补充: 回文数 如果一个数字正读和倒读一样,那么这个数字就是回文数。例如:98789, 这个数字正读是98789,倒读也是98789,所以这个数字就是回文数。 分析:既然一个回文数正读和倒读一样,也就是它的最高位和最低位一样,它的次高位和次低位一样,那么当我们判断一个数n是不是回文数的时候,先要确定这个数有几位,才可以确定谁与谁进行比较,然后确定这个数每一位都是谁。1到1000之间的数,除了1000其余最多三位数,显然1000不是回文数,先不考虑,怎么确定这个数是几位呢?如果它的百位是0,那么肯定不是三位数,如果百位和十位都是0,那么肯定是一位数,我们知道一位数肯定都是回文数;对于一个两位数,只要判断它的个位和十位是不是一样就可以了,如果一样,那么肯定是回文数;对于一个三位数只要判断他的个位和百位就可以了,如果一样就是回文数。求一个最多是三位数的每一位,就是将这个数对10求余得到个位;然后这个数除以10,再对10求余得到十位;最后除以100得到百位。则程序如下: int n;(n是要判断的数,具体根据题意赋值或从键盘输入)if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);} 4、输出1到1000之间的所有完数 分析:在做本题之前,先要搞明白什么是完数,它又是如何判定的。补充: 再做完数之前先讲怎么求两个数的最大公约数和最小公倍数。 分析:假设求a和b两个数的最大公约数和最小公倍数,并且a>b,如果a0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);} 5、输出1到999之间的所有水仙花数 分析:在做本题之前,先要搞明白什么是水仙花数,它又是如何判定的。补充: 水仙花数 如果一个三位数的各个位数字的立方和等于该数字本身,那么这个数就是水仙花数。例如:153,1*1*1+5*5*5+3*3*3=153,所以这个数字就是回文数。分析:既然一个水仙花数的各个位数字的立方和等于该数字本身,那么当我们判断一个数n是不是水仙花数的时候,先要求出各个位数字,然后求其立方和,判断是不是和该数本身一样,如果一样就是水仙花数,否则就不是。求一个三位数的每一位,就是将这个数对10求余得到个位;然后这个数除以10,再对10求余得到十位;最后除以100得到百位。则程序如下: int n,a,b,c;(n是要判断的数,具体根据题意赋值或从键盘输入)a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);} 6、用一张100的钱换100张零钞,假设面额有5元,3元,1/2元三种,问有多少种方法? 分析:这是一道解方程组的题,根据我们的小学知识可以列出方程组,其中有三个未知数,所以应该是三层嵌套循环,再分析题目我们知道1/2的张数只能是偶数张,则程序为: int i,j,k,n;for(i=0;i<=20;i++)for(j=0;j<=33;j++)for(k=0;k<=100;k++)if(5*i+3*j+k/2==100&&i+j+k==100&&k%2==0){ printf(“%d,%d,%dn”,i,j,k);n++;} printf(“There are %d changes!n”,n); 7、爱因斯坦阶梯问题。设有一阶梯,每步跨2阶,最后剩1阶;每步跨3阶,最后剩2阶;每步跨5阶,最后剩4阶;每步跨6阶,最后剩5阶;每步跨7阶,正好到阶梯顶。问满足条件的最少阶梯数是多少? 分析:这道题的实质是找满足上述条件的数,而且要最小的,那么我们就写一个循环,循环变量从最小的数开始递增,分析题目我们可知从7开始递增即可(如果不从7,从1开始也是可以的),一旦满足上述条件,循环变量就不需要增加了,输出循环变量即可,所以我们选择while循环结构,当不满足上述条件我们就做循环变量的递增,如果满足就输出,则程序为: int n=7;while(!(n%2==1&&n%3==2&&n%5==4&&n%6==5&&n%7==0)){ n++;} printf(“%dn”,n); 8、求一句英文所含有的单词数。 分析:一句英文里面每个单词之间都用空格隔开,所以我们只要数空格的个数即可,但是注意最后一个单词后面是没有空格的。一句英文肯定要存放在数组中,我们选择简单的一维数组。从字符数组中的第一个元素开始查看,先查看第一个元素,如果不是空格,那就证明是第一个单词,单词个数加一,然后一直做循环,直到遇到空格,就说明这个单词结束了,然后再判断是不是到数组的结尾,如果没有就继续查找,直到数组结束为止,则程序如下: #include } 五.图案:输出n行的具有规律的字符,组成我们所想要的图案。模版: int i,j,k;for(i=0;i 具体对待)for(k;;)printf(“%d”,);(注意:如果是char类型就是%c)} 1、输出下列图案 * *** ***** printf(“ There are %d words.n”,num);******* ********* ******* ***** *** * 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出*,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的*数,通过观察我们发现如下规律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均为奇数,再分析发现k=2i+1,每行输完还要输出换行,则程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“*”);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j 2、输出下列图案 A BBB CCCCC DDDDDDD EEEEEEEEE FFFFFFF GGGGG HHH I 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出字母,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的字母数,通过观察我们发现如下规律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均为奇数,再分析发现k=2i+1。每行的字母相同但是和上下行的不相同,观察发现字母是按照顺序递增的,那么我们就先把字母存放在一个变量里面,然后在输出每行所需的字符之后,改变字母。每行输完还要输出换行,则程序如下: int i,j,k;char c=’A’;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“%c”,c);c++;printf(“n”);} for(i=0;i<4;i++){ for(j=0;j 3、输出下列图案 121 12321 1234321 123454321 1234321 12321 121 1 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出数字,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的数字数,每行的数字还不相同,观察发现数字是按照顺序递增递减的,那么我们输出数字的循环又要分为两个循环,继续观察我们发现每次输出的数字和循环变量k有关,通过观察我们发现如下规律: i j k 0 4 1 1 3 2 2 2 3 3 1 4 4 0 5 那么,i+j=4,k均为奇数,再分析发现k的递增从1开始到i+1为止,递减是从i开始到1为止。每行输完还要输出换行,则程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=1;k<=i+1;k++)printf(“%d”,k);for(k=i;k>0;k--)printf(“%d”,k);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j0;k--)printf(“%d”,k);printf(“n”);} 4、输出九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 „„ „„ 分析:如果用i表示行,j表示列,那么每行输出i个式子,分析发现每个式子可以用j*i表示。每行输完还要输出换行,则程序如下: int i,j;for(i=1;i<10;i++){ for(j=1;j<=i;j++)printf(“%d*%d=%dt”,j,i,j*i);printf(“n”);} 5、输出杨辉三角的前10行 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 7 21 35 35 21 7 1 8 28 56 70 56 28 8 1 9 36 84 126 126 84 36 9 1 分析:如果用i表示行,j表示列,那么每行输出i个数字,分析发现除了两头的数字为1以外,其余的每个数字每个数字等于上一行的左右两个数字之和,所以用二维数组比较简单。每行输完还要输出换行,则程序如下: int a[10][10],i,j;for(i=0;i<10;i++){ for(j=0;j<=i;j++){ if(i==j||j==0)a[i][j]=1;else a[i][j]=a[i-1][j]+a[i-1][j-1];printf(“%dt”,a[i][j]);} printf(“n”);} 五.字符串操作: 1.函数的原型说明为int chrn(char *s,char c);,其功能是测试c在s中出现的次数,编制该函数并用相应的主调函数对其进行测试。#include C作业汇总 1.short a,b=32767;/*short类型在内存中占2B*/ a=b+1;问:a的值是多少?并分析原因。 2.有一4位数整数,假设用abcd表示,请把这个4位数的每个数位用表达式表示出来。3.从键盘输入圆的半径r,计算并输出圆的面积s(要求:半径r定义为float型;圆周率定义为符号常量;面积s保留2位小数)#define PI 3.14159 #include 4.输入m>=3的正整数,判断m是否素数。画出算法流程图及NS图 5.有一函数: x1 x y2x1 1x10 3x-11 x10 写一段程序,输入x,输出y值。 要求x,y声明为float类型,y保留2位小数。#include if(x<1) y=x;else if(x<10) y=2*x-1; else y=3*x-11; } printf(“y=%.2fn”,y); x3x5x7x9,6.课后习题4.17(P159)利用泰勒级数sinxx计算sinx的3!5!7!9!值。要求最后一项的绝对值小于10,并统计出此时累加了多少项。#include /*记录每个项数*/ int n=1,count=0;/*count记录累加了多少项*/ printf(“请输入x值(弧度):n”);scanf(“%f”,&x); term=x/n;while(fabs(term)>1e-5) /* while循环*/ { sinx+=term; count++; n+=2; term=-term*x*x/((n-1)*n);} /* do /*do while循环*/ { sinx+=term; count++; n+=2; term=-term*x*x/((n-1)*n);}while(fabs(term)>1e-5); */ printf(“sin(%.2f)=%.4fn”,x,sinx);printf(“一共累加了:%d项。n”,count);} 7.用牛顿迭代法求下面方程在1.5附近的根: 2x4x3x60 325 牛顿迭代公式: x1x0f(x0)f(x0) #include /*y1记录f(x0),y2记录f(x0)的导数*/ do { x0=x1; y1=2*x0*x0*x0-4*x0*x0+3*x0-6; y2=6*x0*x0-8*x0+3; x1=x0-y1/y2;}while(fabs(x1-x0)>1e-5); printf(“the root is:%.2fn”,x1);} 8.写一函数,输入一个16进制整数,输出相应的10进制数。例:从键盘输入2a,输出结果是42。 要求:若输入数据不合法,则输出提示信息。如输入了35g,输出“您输入的16进制数不合法!”。 #include printf(“请输入一个16进制数字:n”); while((c=getchar())!='n'){ if(c>='0' && c<='9') sum=sum*16+c-'0'; else if(c>='a' && c<='f') sum=sum*16+c-87; else if(c>='A' && c<='F') sum=sum*16+c-55; else { printf(“您输入的16进制不合法.n”); exit(0); } } printf(“相应的10进制数是:%dn”,sum);} 方法2:用字符串处理的方式 #include printf(“请输入一个16进制数字:n”);gets(str); for(i=0;str[i];i++){ if(str[i]>='0' && str[i]<='9') sum=sum*16+str[i]-'0'; else if(str[i]>='a' && str[i]<='f') sum=sum*16+str[i]-87; else if(str[i]>='A' && str[i]<='F') sum=sum*16+str[i]-55; else { printf(“您输入的16进制不合法.n”); exit(0); } } printf(“相应的10进制数是:%dn”,sum);} 方法3:用字符数组及指针处理的方式 #include { char str[20],*p=str;int sum=0; printf(“请输入一个16进制数字:n”);gets(p); while(*p){ if(*p>='0' && *p<='9') sum=sum*16+*p-'0'; else if(*p>='a' && *p<='f') sum=sum*16+*p-87; else if(*p>='A' && *p<='F') sum=sum*16+*p-55; else { printf(“您输入的16进制不合法.n”); exit(0); } p++;} printf(“相应的10进制数是:%dn”,sum);} 9.编写一个小函数,其功能是计算两个整数的平均值,该函数要在主函数中调用。 #include avg=average(x,y); printf(“%d,%d的平均值是:%.2fn”,x,y,avg);} float average(int x,int y) { return(x+y)/2.0;} 10.有N(N用宏定义为符号常量)个元素的一维整型数组,该数组中各元素值从键盘随机输入。然后,将这个整型数组中的值逆序存放。例如,原来5个元素的顺序为8、1、4、6、5,逆序之后各元素的值是5、6、4、1、8 #define N 5 #include printf(“输入%d个整数,用空格或回车分隔:n”,N);for(i=0;i scanf(“%d”,&a[i]); printf(“数组原来的值是:n”);for(i=0;i printf(“%dt”,a[i]); for(i=0;i t=a[i]; a[i]=a[N-1-i]; a[N-1-i]=t;} printf(“n逆序之后数组的值是:n”);for(i=0;i printf(“%dt”,a[i]); printf(“n”);} 11.有N(N用宏定义为符号常量)个元素的一维整型数组,该数组中各元素值从键盘随机输入。然后,对该数组元素进行由小到大排序(要求,该功能用函数实现),输出数组中各元素值。最后,从键盘随机输入一个整数,并把该整数插入上述数组中(该功能用函数实现),使得插入该整数后的数组仍然有序,输出数组中各元素的值。#define N 5 #include int i,x;void sort(int array[],int n);void insert(int array[],int n,int x); printf(“输入%d个整数,用空格或回车分隔:n”,N);for(i=0;i scanf(“%d”,&a[i]); sort(a,N); /*调用sort对数组进行排序*/ printf(“n升序排序之后数组的值是:n”);for(i=0;i printf(“%d ”,a[i]); printf(“n输入一个x值插入到数组中:n”);scanf(“%d”,&x); insert(a,N,x); printf(“n插入%d之后数组的值是:n”,x);for(i=0;i printf(“%d ”,a[i]); printf(“n”);} void sort(int array[],int n)/*用选择法对数组array升序排序*/ { int i,j,t,min; for(i=0;i min=i; for(j=i+1;j if(array[j] min=j; if(min!=i) { t=array[i]; array[i]=array[min]; array[min]=t; } } } void insert(int array[],int n,int x){ int i,pos; for(i=0;i pos=i; for(i=n-1;i>=pos;i--) array[i+1]=array[i]; array[pos]=x;} 12.有一整型数组,N(N用宏定义为符号常量)个元素,该数组中各元素值从键盘随机输入。从键盘随机输入一个整数x,删除该数组中值与x相同的所有元素(该功能用函数实现),输出数组中各元素的值。#define N 5 #include printf(“输入%d个整数,用空格或回车分隔:n”,N);for(i=0;i scanf(“%d”,&a[i]); printf(“数组原来的值是:n”);for(i=0;i printf(“%dt”,a[i]); printf(“n请输入要删除的值x:n”);scanf(“%d”,&x); n=delet(a,N,x); /*n值是删除与x相同的元素后,数组剩余元素的个数。*/ printf(“删除%d之后数组的值是:n”,x);for(i=0;i printf(“%d ”,a[i]); printf(“n”); } int delet(int a[],int n,int x){ int i,j; for(i=0,j=0;i if(a[i]!=x) a[j++]=a[i]; return j;} 13.从键盘随机输入一字符串,将所有ASCII值为偶数的字符输出。例如:输入abc123,输出结果是b2(因为b的ASCII值是98,2的ASCII值是50,其他字符的ASCII值都是奇数) #include printf(“输入字符串:n”);gets(str); printf(“ASCII码是偶数的字符有:”);for(i=0;str[i];i++) if(str[i]%2==0)putchar(str[i]); printf(“n”);} 14.从键盘输入两个字符串s1,s2,把s2连接到s1的末尾。不能用strcat函数 #include printf(“输入两个字符串,输入回车键结束:n”);gets(str1);gets(str2); mystrcat(str1,str2); printf(“连接在一起的字符串是:n”);puts(str1); } void mystrcat(char *p1,char *p2){ while(*p1)p1++;while(*p2) *p1++=*p2++;*p1='';} 15.从键盘输入一个字符串,把其中最长的单词输出。单词定义为连续的一串英文字母。如输入I am a student.输出结果为student #include { char str[80];int i,start,len=0,lenthest=0,lenstart=0;int word=0; printf(“input a string:n”);gets(str); for(i=0;str[i];i++){ if(str[i]>='a' && str[i]<='z' || str[i]>='A'&&str[i]<='Z') if(!word) { word=1; start=i; } else { len++; } else if(word) { word=0; } } if(len>lenthest){ lenthest=len;lenstart=start;} len=0; printf(“the lenthest word is:n”);for(i=lenstart;i<=lenstart+lenthest;i++) putchar(str[i]); printf(“n”);} 16.有一整型数组,N(N用宏定义为符号常量)个元素,该数组中各元素值从键盘随机输入。编写函数calculate,计算出所有元素的最大值、最小值、平均值,结果在主函数中输出。#define N 5 #include printf(“输入%d个整数,用空格或回车分隔:n”,N);for(i=0;i scanf(“%d”,&a[i]); calculate(a,&max,&min,&avg); printf(“数组中所有元素的最大值、最小值、平均值分别是:n”);printf(“最大值max=%d,n”,max);if(word)if(len>lenthest){ lenthest=len; lenstart=start;} printf(“最小值min=%d,n”,min);printf(“平均值avg=%.2f,n”,avg); } void calculate(int a[],int *pmax,int *pmin,float *pavg){ int i;int sum; *pmax=*pmin=sum=a[0]; for(i=1;i if(a[i]>*pmax) *pmax=a[i]; if(a[i]<*pmin) *pmin=a[i]; sum=sum+a[i];} *pavg=(float)sum/N;} 实验二 VC++流程控制语句 (一)二 程序设计题 1、编写程序,输入一个不多于5位的整数,求出它是几位数,并分别打印出每一位数字,再按逆序打印出各位数字。 2、编写程序,输入三角形三边a、b、c,判断a、b、c能否构成三角形。若能,则判断组成的是等腰、等边、直角还是一般三角形;若不能,则输出相应的信息。 1、参考程序 方法一: #include int m,a,b,c,d,e;cout<<“输入一个不多于5位的数字:”;cin>>m;a=m%10;//个位 b=m/10%10;//十位 c=m/100%10;//百位 d=m/1000%10;//千位 e=m/10000;//万位 if(e!=0)cout< 个 5位 数,”<<“ 逆 序 各 位 数 字 是”< else if(d!=0)cout< 3位数,”<<“逆序各位数字是位数,”<<“逆序各位数字是2位数,”<<“逆序各位数字是”< else if(b!=0)cout< 方法二: #include int a,b,c;//b表示所输入数的位数 cout<<“请输入一个不多于5位数的正整数:”;cin>>a;cout<<“从个位到万位分别为:”;if(a==0)cout< for(b=0;a;b++) { c=a%10; cout<<'t'< a=a/10; } cout<<“ 共”< } } 2、参考程序 #include } int a,b,c;cout<<“输入三边的长:”;cin>>a>>b>>c;if(a+b>c&& a-b if(a==b&&b==c&&c==a)//错误的a==b==c cout<<“能构成等边三角形”<<'n';else if(a==b||a==c||b==c) cout<<“能构成等腰三角形”<<'n'; else if(a*a+b*b==c*c||a*a+c*c==b*b||c*c+b*b==a*a) cout<<“能构成直角三角形”<<'n'; else cout<<“能构成一般角形”<<'n';} else cout<<“不能构成三角形”<<'n';实验二 VC++流程控制语句 (二)1、从键盘输入整数n,求n的阶乘。 2、从键盘输入若干个实数,以输入0结束。设计一程序,分别统计正数的个数和负数的个数,并求出正数之和、负数之和及总平均值 3、设计一个程序,求出满足以下条件的最小n值和s值: s=1+2+3……….+n, 且s>=600 4、用二分法解方程f(x)=0的具体算法如下: (1)输入x1,x2,直至f(x1)与f(x2)异号,说明方程在x1、x2之间有解。 (2)求x1和x2的中点x0.(3)如果f(x0)与f(x1)同号,表明方程的解在x0与x2之间,用x0取代x1;否则方程的解在x0与x1之间,用x0取代x2.(4)如果f(x0)的值足够小,则方程的近似解为x0;否则重复执行步骤(2)、(3)、(4),直至f(x0)足够小。 (5)输出方程的解x0.2要求用二分法求解方程x+4x-4=0.参考程序: 1、#include } 2、#include cin>>a;while(a){ if(a>0){ m++;s1+=a;} else{ n++;s2+=a;int i=1,n;long int s=1;cout<<“请输入一个整数:”;cin>>n;while(i<=n){ s*=i;i++;} cout<<“n!=”< cout<<“n正数之和为:”< 3、cout<<“n总的平均为:”<<(s1+s2)/(m+n)<<'n';#include ++n;} s+=n;cout<<“n=”< 4、#include } float x0,x1,x2;double y0,y1,y2;do{ cout<<“请输入方程的两个初始区间值:”;cin>>x1>>x2;y1=x1*x1+4*x1-4;y2=x2*x2+4*x2-4;}while(y1*y2>0); x0=(x1+x2)/2;y0=x0*x0+4*x0-4;do{ if(y0*y1>0){x1=x0;y1=y0;} else {x2=x0;y2=y0;}//可以不要y2=y0;x0=(x1+x2)/2;y0=x0*x0+4*x0-4;}while(fabs(y0)>1e-5);cout<<“方程x^2+4x-4=0的解为”< (三)二、改错题 答案: 增加 #include j=sqrt(i);修改为: int j=sqrt(i);if(i%n=0)break;修改为:if(i%n==0)break;if(k/5=0)cout<<'n';修改为:if(k%5==0)cout<<'n'; 三、编程设计题 1、设计一个程序,输出所有的水仙花数。所谓水仙化数是一个三为数,其各位数字的立方和等于该数本身。列如153是一个水仙化数。水仙花数的算法分析: 1)用穷举法对100~999之间的每个数验证,验证公式为:x=h*h*h+d*d*d+n*n*n 2)分解一个3位数x的百位、十位和个位。 2、求出1000以内所有完全数,并输出。例如6就是一个完全数,6的因数共有4个:1、2、3、6,除了6自身这个因数外,其他的3个因数都是它的真因数,把6的所有真因数都加起来,正好等于6这个自然数本身。具有这种性质的自然数叫做完全数。 参考程序: 1、#include int x,h,d,n;cout<<“水仙花数为:”;for(int i=100;i<1000;i++){ h=i/100;d=i/10%10;n=i%10;x=h*h*h+d*d*d+n*n*n;if(i==x)cout< 2、#include } int s;for(int i=1;i<=1000;i++){ } s=0;for(int j=1;j<=i/2;j++)if(i%j==0) s+=j;if(s==i)cout< 实验三 函数与编译预处理(一) 三、改错题 答案: 增加#include 四、编程设计题 1、设计一程序,计算组合数:C(m,r)=m!/(r!*(m-r)!),其中m,r为正整数,且m>r.分别求出C(4,2).C(6,4).C(8,7)的组合数。求阶乘和组合数须用函数来实现。 2、阿克曼函数定义如下,其中m、n为正整数,设计一个程序,分别求出Acm(3,2)和Acm(2,2)的值。 m0n1Acm(m,n)Acm(m1,1)n0 Acm(m1,Acm(m,n1))n0,m0参考程序: 1、#include } if(m<=r){ cout<<“m必须大于r!”<<'n';exit(1);} c=jc(m)/(jc(r)*jc(m-r));return c; void main(void){ } 2、#include } if(n==0)return Acm(m-1,1);if(n>0&&m>0){ c=Acm(m,n-1);return Acm(m-1,c);} void main(){ } int m,n;cout<<“Acm(5,3)=”<>m>>n;cout<<“Acm(”< 三、改错题 答案: 在main()的上面增加语句int gys(int x,int y);return y;修改为:return x; 三、编程设计题 1、设计一程序,将求两个实数的最大值函数放在头文件myfun.h中,在源程序文件mypro.cpp中包含该头文件,并实现输入三个实数,求最大值。 2、设计一程序,定义重载函数area,分别求圆和长方形的面积。 3、用递归法将一个整数n转换成字符串。例如,输入整数567,应输出字符串“567”。n的位数不确定,可以是任意的整数。参考程序: 1、//myfun.h float max(float x, float y){ float z;if(x>y)z= x;else z=y;return z;} //mypro.cpp #include cout<<“最大值为:”<< max(max(a,b),c)<<'n';} 2、#include 3、#include } int a,b;a=n%10;b=n/10;if(b)fun(b);cout< int m; } cin>>m;cout<<“转换后的字符串为:”“;fun(m);cout<<”“"< 实验四 数组的应用 (一)一、程序设计题 1、定义一个10个整数的数组,从键盘输入数据,设计一程序,找出其中最大的偶数和最大的奇数(若设有奇数时,输出“没有奇数!”,若没有偶数,输出“没有偶数!”)。 2、输入一组非0整数(以输入0作为输入结束标志)到一维数组中。设计一程序,求出这一组数的平均值,并分别统计出这一组数中正数和负数的个数。参考程序: 1、#include int max1,max2,j=0,k=0,m,n,t;cout<<”请输入10个整数:“;for(int i=0;i<10;i++)cin>>a[i];for(i=0;i<10;i++){ if(a[i]%2){ b[j++]=a[i];n=j;} else { c[k++]=a[i];m=k;} } if(j==0)cout<<”没有奇数。“;else { max1=b[0];cout<<”输入的奇数有:“;for(i=0;i for(i=0;i 2、#include } int,j=0,k=0,t;float avg,s=0;cout<<”请输入一组整数(0结束):“;int i=0;do{ cin>>a[i];s+=a[i];i++;}while(a[i-1]);t=i-1;cout<<”共输入“< 实验四 数组的应用 (二)四、编程题 1、设计一程序,用cin.getline()将一个字符串输入到字符数组s(char s[200])中,删除字符串的所有空格后输出。参考程序 //方法一: #include } //法二: #include void main(){ char s[200];int i=0;cout<<”请输入字符串(回车结束):“; cin.getline(s,200);cout<<”s=“< 大家必须掌握每种类型的1-3题。 题号考点要求 48、将两个两位数的整数合并成一个整数 65、两个正整数合并成一个整数 71、两个正整数合并成一个整数 77、两个正整数合并成一个整数 81、两个正整数合并成一个整数 84、两个正整数合并成一个整数 87、两个正整数合并成一个整数 91、两个正整数合并成一个整数 8、s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+.....+n) 9、p=m!/(n!*(m-n)!) 26、连加 68、s=1+1/1!+1/2!+1/3!+........70、s=1/(1*2)+1/(2*3)+...+1/(n*(n+1)) 76、s=1+0.5*x+(0.5*(0.5-1)*x*x/2!+......86、连加 90、连加 92、连加 93、连加 97、连加 100、连加 (2、) 类似素数或者闰年算法 2、求出1到1000之间能被7或11整除、但不能同时被7和11整除的所有整数,并将他们放在a所指的数组中,通过n返回这些数的个数。 58、求n以内同时能被3与7整除的所有自然数之和的平方根s3、求出能整除x且不是偶数的各整数,并按从小到大的顺序放在pp所指的数组中,这些除数的个数通过形参n返回。 27、求出1到m之间能被7或11整除的整数,放在数组中,通过n返回这些数的个数 63、求n的所有因子(不包括1与自身) 98、计算n以内能被5或9整除的所有自然数的倒数之和 15、w是大于10的无符号整数,若w是n(n>=2)位的整数,则函数求出w的后n-1位的数作为函数值返回。 24、将数字字符串转化为一个整数 16、对变量中的值保留两位小数,对第三位四舍五入 (3、) 1、一维数组中,将低于平均分的人数作为函数值返回,低于平均分的分数放在below所指的数组中。 82、计算一维数组中n门课程的平均分 96、一维数组中每相邻元素之平均值的平方根之和 28、找出一维数组中最大的值和它所在的下标,两者通过形参返回 7、求出数组的最大元素在数组中下标并存放在k所指的存贮单元中。 43、从num个字符串中找出最长的一个字符串,并通过形参指针传回 39、移动数组中的内容,前p个数移动到数组后面 40、移动数组中的内容,前m个字符移动到后面 5、将大于整数m且紧靠m的k个素数存入xx所指的数组中。 20、求出小于变量m的所有素数并放在一个数组中 51、将大于1小于m的非素数存入xx所指数组中,个数通过形参返回 99、计算3到n之间所有素数的平方根之和 29、将字符串中下标为奇数位置上的字母转化为大写 47、字符串中所有下标为奇数的字母转为大写 31、将字符串中除了下标为偶数、同时ASCII码也为偶数的字符外,其余的全都删除;串中剩余字符放在t字符串中 32、除了下标为奇数、同时ASCII码也为奇数的字符外,其余的全都删除;串中剩余字符放在t字符串中 49、将字符串中下标为偶数且ASCII码为奇数的字符删除 19、从字符串中删除指定字符 64、将字符串中ASCII值为奇数的字符删除,剩余字符放在t所指字符串中 72、将字符串中下标为偶数的字符删除 78、字符串中ASCII为偶数的字符删除 35、删除字符串中所有空格 6、删除一个字符串中指定下标的字符。 60、删去一维有序数组中所有相同的数,使之只剩一个 33、删除字符串中尾部*号,使不超过n个 36、把字符串中的前导*号全部移到字符串尾部 45、删除字符串中前导和尾部的*号 56、字符串中,除了尾部*号外,字符串中其余*号全部删除 73、删除字符串中除了前导和尾部*号外的所有*号 83、字符串中尾部*号删除 88、字符串中除了前导*外,删除其余*号 94、字符串中,前导*号全部删除 95、字符串中前导*号不得多于n个 66、删除字符串中所有*号 (4、) 17、字符串内容逆置 23、判断字符串是否为回文 25、比较两个字符串的长度(不能用strlen) 52、实现两个字符串连接 59、将字符串数组中的字符串依次合并到一个字符串中 21、字符串中字符按降序排列(选择法排序) 4、统计在tt字符串中“a”到“z”26个字母各自出现的次数,并依次放在pp所指数组中。 38、求出字符串中指定字符的个数 44、统计长度为2的字符串在另一个字符串出现的次数 62、统计一行字符串中单词个数 11、二维数组构成矩阵,使数组左下半三角元素中的值全部置成042、二维数组,将右上半角元素中的值乘以m80、二维数组中左下半三角中元素中的值乘以312、求出数组周边元素的平均值 14、求出二维数组周边元素之和 18、矩阵行列互换 53、矩阵B=A+A130、求出二维数组中最大元素的值,此值返回给调用函数 55、M行N列的二维数组中的数据,按行的顺序依次放到一维数组中 41、将二维数组中的字符,按列的顺序依次放到一个字符串中 75、二维数组中数按列的顺序放到一维数组中 13、求出二维数组每列中最小元素,并依次放在pp所指一维数组中 37、结构体数组(学号、8门成绩、平均成绩),求出每个学生的平均成绩 34、把结构体数组(学号、成绩)中分数最高的学生放到h数组中,函数返回人数 74、把结构体数组(学号、成绩)中分数最低的学生数据放在h所指数组中 50、结构体数组(学号、成绩),找出成绩最高的学生记录,通过形参返回 54、结构体数组(学号、成绩),低于平均分的学生数据放在b所指数组中 89、结构体数组(学号、成绩),高于等于平均分的学生人数通过形参返回 57、结构体数组(学号、姓名),把指定范围内的学生数据放在所指数组中 67、结构体数组(学号、成绩)返回指定学号的学生数据(查找) 46、结构体数组(学号、成绩),按分数降序排列(选择法排序) 22、链表结构中,找出数值最大的结点,并由函数值返回 85、链表中,求出平均成绩 10、迭代法求方程的实根 61、统计各年龄段人数(建议采用if else) 69、递归函数第二篇:编程小结
第三篇:编程题总结
第四篇:改错编程题
>a;} cout<<“n正数有”<第五篇:编程题总结