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("打印几行杨辉三角: "); 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 ",yang[k]); 27 } 28 printf(" "); 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 ",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(" "); 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(" "); } 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(" "); 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(" 加密结果: "); 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!='