C基础的练习集及测试答案(40-50)
40、(课堂)打印杨辉三角型前10行
1
#if 0
40、(课堂)打印杨辉三角型前10行
思路分析:
一。打印十行杨辉三角得第十行长度为十,所以建立一个长度为十的数组,作为每行的数据存储
二。按 0-9循环,代表行号,每次循环按行号递减遍历操作数组,
三。行号位元素置一,递减遍历 元素(n)=元素(n)+元素(n-1),首位不运算。
四。对一行操作完成可得到对应的杨慧三角值。输出。
错误分析:
没有将完整的杨慧三角记录。
#endif
2 3 #include<stdio.h> 4 #include<stdlib.h> 5 int main(){ 6 int row; 7 int *yang=NULL; 8 int i=0; 9 10 printf("打印几行杨辉三角:\n"); 11 scanf("%d",&row); 12 yang=(int *)malloc(sizeof(int)*row); 13 if(NULL==yang){ 14 perror("cannot malloc"); 15 return 1; 16 } 17 for(i=0;i<row;i++){ 18 yang[i]=1; 19 int j; 20 for(j=i-1;j>0;j--){ 21 yang[j]+=yang[j-1]; 22 //printf("4444444444"); 23 } 24 int k=0; 25 for(k=0;k<=i;k++){ 26 printf("%d\t",yang[k]); 27 } 28 printf("\n"); 29 30 } 31 32 33 return 0; 34 }
41、给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。
例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...
现给定任意4位正整数,请编写程序演示到达黑洞的过程。
1 #if 0 2 41、给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字, 3 将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。 4 例如,我们从6767开始,将得到 5 7766 - 6677 = 1089 6 9810 - 0189 = 9621 7 9621 - 1269 = 8352 8 8532 - 2358 = 6174 9 7641 - 1467 = 6174 10 ... ... 11 现给定任意4位正整数,请编写程序演示到达黑洞的过程。
思路分析:
一。利用循环结束条件为结果等于6174
二。接收数据,
三。对数据排序,得到递增递减两数的差值,判断是否为6174,否则继续循环。
12 #endif 13 #include<stdio.h> 14 void bubblesort(int a[],int len){ 15 int i,j; 16 for(i=0;i<len-1;i++){ 17 for(j=0;j<len-1-i;j++){ 18 if(a[j]>a[j+1]){ 19 a[j]^=a[j+1]; 20 a[j+1]^=a[j]; 21 a[j]^=a[j+1]; 22 } 23 } 24 } 25 26 } 27 28 int dijian(int danwei[],int len){ 29 int sum=0; 30 bubblesort(danwei,len); 31 int i=0; 32 for(i=len-1;i>=0;i--){ 33 sum=sum*10; 34 sum+=danwei[i]; 35 } 36 return sum; 37 } 38 int dizeng(int danwei[],int len){ 39 int sum=0; 40 bubblesort(danwei,len); 41 int i=0; 42 for(i=0;i<len;i++){ 43 sum=sum*10; 44 sum+=danwei[i]; 45 } 46 return sum; 47 } 48 49 int main(){ 50 51 //获得一个数 52 int num=0; 53 printf("请输入一个四位数:"); 54 scanf("%d",&num); 55 while(num!=6174){ 56 //分解数值 57 58 int danwei[4]; 59 danwei[3]=num/1000; 60 danwei[2]=(num%1000)/100; 61 danwei[1]=(num%100)/10; 62 danwei[0]=num%10; 63 //排序成两个新数据 64 int jian=dijian(danwei,4); 65 int zeng=dizeng(danwei,4); 66 //相减得到新数据 67 num=jian-zeng; 68 printf("%d-%d=%d\t",jian,zeng,num); 69 70 } 71 return 0; 72 }
42、(课堂)自定义2个字符数组,不使用系统提供的strcat()函数,实现strcat()函数功能。
43、(课堂)自定义2个字符数组,不使用系统提供的strcpy()函数,实现strcpy()函数功能。
44、(课堂)自定义2个字符数组,不使用系统提供的strcmp()函数,实现strcmp()函数功能。
45、(课堂)自定义1个字符数组,不使用系统提供的strlen()函数,实现strlen()函数功能。
46、输出以下图案。要求每行的字符数与每次偏移几个字符由用户输入。结束条件为最后一行开头与第一行末尾对齐或在其之后
**********
**********
**********
**********
**********
**********
//结束条件:最后一行开头与第一行末尾对齐或在其之后
#if 0 46、输出以下图案。要求每行的字符数与每次偏移几个字符由用户输入。结束条件为最后一行开头与第一行末尾对齐或在其之后 ********** ********** ********** ********** ********** **********
思路分析:
一。分三种情况,偏移大于行数,偏移量和字符数等比且偏移量不为一,偏移量和字符数不等比;
偏移大于字符:第一行字符,第二行偏移空格加上字符;
偏移量和字符数等比且偏移量不为一;字符数除偏移量的值加二
偏移量和字符数不等比;
错误分析;
再次看代码感觉这样有问题写个新算法
#endif #include<stdio.h> int main(){ int zifu,pianyi; printf("每行的字符数"); scanf("%d",&zifu); printf("每次偏移几个字符"); scanf("%d",&pianyi); int i=0; if(pianyi>zifu){ int i; for(i=0;i<zifu;i++){ printf("*"); } printf("\n"); for(i=0;i<pianyi;i++){ printf(" "); } for(i=0;i<zifu;i++){ printf("*"); } return 0; } /* if(zifu%pianyi==0) i=0; else i=-1; */ //if(zifu%pianyi!=0)zifu+=pianyi; int num=zifu/pianyi; if(zifu%pianyi!=0 && pianyi!=1)num=num+2; for(i=0;i<num;i++){ int k=0; for(k=0;k<pianyi*i;k++){ printf(" "); } int j=0; for(j=0;j<zifu;j++){ printf("*"); } printf("\n"); } return 0; }
改版一:
1 #if 0 2 46、输出以下图案。要求每行的字符数与每次偏移几个字符由用户输入。结束条件为最后一行开头与第一行末尾对齐或在其之后 3 ********** 4 ********** 5 ********** 6 ********** 7 ********** 8 ********** 9 10 思路分析: 11 一。空格数=++kong * 偏移量 12 二。循环执行条件 空格数小于字符数 13 14 15 #endif 16 17 #include<stdio.h> 18 19 int main(){ 20 int zifu,pianyi; 21 printf("每行的字符数"); 22 scanf("%d",&zifu); 23 printf("每次偏移几个字符"); 24 scanf("%d",&pianyi); 25 int kongge=0; 26 int kong=0; 27 while(kongge<zifu){ 28 int k=0; 29 kongge=kong*pianyi; 30 for(k=0;k<kongge;k++){ 31 printf(" "); 32 } 33 kong++; 34 35 int j=0; 36 for(j=0;j<zifu;j++){ 37 printf("*"); 38 } 39 printf("\n"); 40 41 42 } 43 return 0; 44 }
47、按以下规律加密一段文字。
A->Z a->z
B->Y b->y
C->X c->x
……
Z->A z->a
其中不是字母的部分不加密。
1 #if 0 2 47、按以下规律加密一段文字。 3 A->Z a->z 4 B->Y b->y 5 C->X c->x 6 …… 7 Z->A z->a 8 其中不是字母的部分不加密。 9 10 解题思路: 11 一。利用字母对应的ASCII码表的数值进行运算,达到加密的目的。 12 二。B-A=Z-Y; C-A=Z-X ==》X=Z-(C-A)=Z-C+A 13 #endif 14 15 16 #include<stdio.h> 17 18 int main(){ 19 int i=0; 20 char encryption[14]={'0','A','a','0','B','b','0','Z','z','0','0','Q','q','0'}; 21 for(i=0;i<14;i++){ 22 printf("%c",encryption[i]); 23 } 24 printf("\n加密结果:\n"); 25 for(i=0;i<14;i++){ 26 if((encryption[i]>='A')&&(encryption[i]<='Z')){ 27 encryption[i]='Z'-encryption[i]+'A'; 28 } 29 if((encryption[i]>='a')&&(encryption[i]<='z')){ 30 encryption[i]='z'-encryption[i]+'a'; 31 } 32 33 } 34 for(i=0;i<14;i++){ 35 printf("%c",encryption[i]); 36 } 37 return 0; 38 }
48、规定一句话中以空格作为分词符。输入一句话,求一句话中最长单词的长度。例如:
I love China!
则最长单词是China!,最长单词长度是6
1 #if 0 2 48、规定一句话中以空格作为分词符。输入一句话,求一句话中最长单词的长度。例如: 3 I love China! 4 则最长单词是China!,最长单词长度是6 5 6 解题思路: 7 一。因为不需要对数组本身进行修改,所以直接操作字符串常量 8 二。四个变量, 9 最高值 最高值单词首地址 10 每个单词的长度 单词首地址 11 三。输出最高值的结果。 12 13 错误分析: 14 如果以空格为判断标志则最后一个单词无法判断 15 解决在循环结束后再判断一次; 16 17 18 如果要用scanf()输入需要知道语句长度 19 scanf("%s",p);这样写并不是在代码区p的值使stdin的地址; 20 21 #endif 22 23 #include<stdio.h> 24 25 void my_printf(char p[]){ 26 while((*p!='\0'&&(*p!=' '))){ 27 printf("%c",*p++); 28 } 29 } 30 31 int main(){ 32 char *p="I love China!"; 33 int max=0; 34 int len=0; 35 36 char *plen=p; 37 38 //scanf("%s",p);||(*p!=' ') 39 40 printf("%s\n",p); 41 42 char *pmax=p; 43 while(*p!='\0'){ 44 if(*p!=' '){ 45 ++len; 46 47 }else{ 48 49 if(len>max){ 50 max=len; 51 pmax=plen; 52 53 } 54 plen=p+1; 55 len=0; 56 } 57 58 p++; 59 } 60 if(len>max){ 61 max=len; 62 pmax=plen; 63 } 64 printf("最大长度:%d,单词:",max); 65 my_printf(pmax); 66 67 //printf("最大长度:%s\n",pmax); 68 69 70 //printf("最大长度:%p\n",plen); 71 //printf("最大长度:%p\n",p); 72 73 74 return 0; 75 }
49、读以下程序,猜想程序的运行结果,然后上机验证
#include<stdio.h>
int main()
{
int i;
int lh,rh,le,re,m;
char *lefthand[] = {"╮","o","<","~\\"};
char *righthand[]= {"╭","o",">","/~"};
char *lefteye[] = {"╯","^","-","=",">","@","⊙"};
char *righteye[]= {"╰","^","-","=","<","@","⊙"};
char *mouth[] = {"Д","▽","_","ε","^"};
printf("请选择左手:\n");
for(i=0;i<=3;i++)
{
printf("%d.[%s] ",i+1,lefthand[i]);
}
printf("\n");
scanf("%d",&lh);
lh--;
printf("请选择右手:\n");
printf("推荐:%d.[%s]\n其他:",lh+1,righthand[lh]);
for(i=0;i<=3;i++)
{
if(i==lh)
continue;
printf("%d.[%s] ",i+1,righthand[i]);
}
printf("\n");
scanf("%d",&rh);
rh--;
printf("请选择左眼:\n");
for(i=0;i<=6;i++)
{
printf("%d.[%s] ",i+1,lefteye[i]);
}
printf("\n");
scanf("%d",&le);
le--;
printf("请选择右眼:\n");
printf("推荐:%d.[%s]\n其他:",le+1,righteye[le]);
for(i=0;i<=6;i++)
{
if(i==le)
continue;
printf("%d.[%s] ",i+1,righteye[i]);
}
printf("\n");
scanf("%d",&re);
re--;
printf("请选择嘴:\n");
for(i=0;i<=4;i++)
{
printf("%d.[%s] ",i+1,mouth[i]);
}
printf("\n");
scanf("%d",&m);
m--;
printf("%s(%s%s%s)%s\n",lefthand[lh],lefteye[le],mouth[m],righteye[re],righthand[rh]);
return 0;
}
1 //49、读以下程序,猜想程序的运行结果,然后上机验证 2 #include<stdio.h> 3 int main() 4 { 5 int i; 6 int lh,rh,le,re,m; 7 char *lefthand[] = {"╮","o","<","~\\"}; 8 char *righthand[]= {"╭","o",">","/~"}; 9 char *lefteye[] = {"╯","^","-","=",">","@","⊙"}; 10 char *righteye[]= {"╰","^","-","=","<","@","⊙"}; 11 char *mouth[] = {"Д","▽","_","ε","^"}; 12 printf("请选择左手:\n"); 13 for(i=0;i<=3;i++) 14 { 15 printf("%d.[%s] ",i+1,lefthand[i]); 16 } 17 printf("\n"); 18 scanf("%d",&lh); 19 lh--; 20 printf("请选择右手:\n"); 21 printf("推荐:%d.[%s]\n其他:",lh+1,righthand[lh]); 22 for(i=0;i<=3;i++) 23 { 24 if(i==lh) 25 continue; 26 printf("%d.[%s] ",i+1,righthand[i]); 27 } 28 printf("\n"); 29 scanf("%d",&rh); 30 rh--; 31 printf("请选择左眼:\n"); 32 for(i=0;i<=6;i++) 33 { 34 printf("%d.[%s] ",i+1,lefteye[i]); 35 } 36 printf("\n"); 37 scanf("%d",&le); 38 le--; 39 printf("请选择右眼:\n"); 40 printf("推荐:%d.[%s]\n其他:",le+1,righteye[le]); 41 for(i=0;i<=6;i++) 42 { 43 if(i==le) 44 continue; 45 printf("%d.[%s] ",i+1,righteye[i]); 46 } 47 printf("\n"); 48 scanf("%d",&re); 49 re--; 50 printf("请选择嘴:\n"); 51 for(i=0;i<=4;i++) 52 { 53 printf("%d.[%s] ",i+1,mouth[i]); 54 } 55 printf("\n"); 56 scanf("%d",&m); 57 m--; 58 printf("%s(%s%s%s)%s\n",lefthand[lh],lefteye[le],mouth[m],righteye[re],righthand[rh]); 59 return 0; 60 }
50、围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。
问:兔子可能藏身于哪(几)个洞中?
1 #if 0 2 50、围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须先找到我,我就藏身于这十个洞中的某个洞。 3 你从1号洞找,下次隔1个洞(即3号洞)找,第三次隔2个洞(即6号洞)找,再隔3个…以后在这个圆圈中如此类推,次数不限。 4 ”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。 5 问:兔子可能藏身于哪(几)个洞中?
思路分析:
一。创建一个十一个元素数组,元素角标对应山洞。
二。
第几次寻找 对应的洞号 相应洞号的差值
1 1 1
2 3 2
3 6 3
三。根据洞号差来确定每次的洞号,山洞对应的元素自增;
四。输出每个元素的值为零即使没有找过的。
6 #endif 7 8 #include<stdio.h> 9 10 int main(){ 11 int i=1; 12 int sum=0; 13 int fp[11]={0}; 14 int j; 15 for(i=1;i<=1000;i++){ 16 sum+=i; 17 j=sum%10; 18 if(j==0)j=10; 19 fp[j]++; 20 } 21 int k=1; 22 for(k=1;k<11;k++){ 23 24 printf("%d号洞被找%d次\n",k,fp[k]); 25 } 26 27 28 29 return 0; 30 }