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 }

 

posted @ 2018-08-10 15:45  蓝勃斐重新开始  阅读(366)  评论(0编辑  收藏  举报