zoukankan      html  css  js  c++  java
  • 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("打印几行杨辉三角:
    ");
    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!=''&&(*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
    ",p);
    41     
    42     char *pmax=p;
    43     while(*p!=''){
    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
    ",pmax);
    68     
    69     
    70     //printf("最大长度:%p
    ",plen);
    71     //printf("最大长度:%p
    ",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("请选择左手: ");
    for(i=0;i<=3;i++)
    {
    printf("%d.[%s] ",i+1,lefthand[i]);
    }
    printf(" ");
    scanf("%d",&lh);
    lh--;
    printf("请选择右手: ");
    printf("推荐:%d.[%s] 其他:",lh+1,righthand[lh]);
    for(i=0;i<=3;i++)
    {
    if(i==lh)
    continue;
    printf("%d.[%s] ",i+1,righthand[i]);
    }
    printf(" ");
    scanf("%d",&rh);
    rh--;
    printf("请选择左眼: ");
    for(i=0;i<=6;i++)
    {
    printf("%d.[%s] ",i+1,lefteye[i]);
    }
    printf(" ");
    scanf("%d",&le);
    le--;
    printf("请选择右眼: ");
    printf("推荐:%d.[%s] 其他:",le+1,righteye[le]);
    for(i=0;i<=6;i++)
    {
    if(i==le)
    continue;
    printf("%d.[%s] ",i+1,righteye[i]);
    }
    printf(" ");
    scanf("%d",&re);
    re--;
    printf("请选择嘴: ");
    for(i=0;i<=4;i++)
    {
    printf("%d.[%s] ",i+1,mouth[i]);
    }
    printf(" ");
    scanf("%d",&m);
    m--;
    printf("%s(%s%s%s)%s ",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("请选择左手:
    ");
    13     for(i=0;i<=3;i++)
    14     {
    15         printf("%d.[%s]  ",i+1,lefthand[i]);
    16     }
    17     printf("
    ");
    18     scanf("%d",&lh);
    19     lh--;
    20     printf("请选择右手:
    ");
    21     printf("推荐:%d.[%s]
    其他:",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("
    ");
    29     scanf("%d",&rh);
    30     rh--;
    31     printf("请选择左眼:
    ");
    32     for(i=0;i<=6;i++)
    33     {
    34         printf("%d.[%s]  ",i+1,lefteye[i]);
    35     }
    36     printf("
    ");
    37     scanf("%d",&le);
    38     le--;
    39     printf("请选择右眼:
    ");
    40     printf("推荐:%d.[%s]
    其他:",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("
    ");
    48     scanf("%d",&re);
    49     re--;
    50     printf("请选择嘴:
    ");
    51     for(i=0;i<=4;i++)
    52     {
    53         printf("%d.[%s]  ",i+1,mouth[i]);
    54     }
    55     printf("
    ");
    56     scanf("%d",&m);
    57     m--;
    58     printf("%s(%s%s%s)%s
    ",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次
    ",k,fp[k]);
    25     }
    26     
    27     
    28     
    29     return 0;
    30 }

     

  • 相关阅读:
    【MongoDB】windows下搭建Mongo主(Master)/从(slave)数据库同步
    视图与暂时表
    Highcharts构建分组分类坐标轴
    iOS可持续化集成: Jenkins + bundler + cocoapods + shenzhen + fastlane + pgyer
    Internationalization composition diagram
    ASCII表 基本记忆 -- C
    Java内部类
    Idea过期继续激活~
    Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)
    Spark源码分析之Spark-submit和Spark-class
  • 原文地址:https://www.cnblogs.com/lanbofei/p/9455425.html
Copyright © 2011-2022 走看看