zoukankan      html  css  js  c++  java
  • C基础的练习集及测试答案(16-30)

    16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)

     1 #if 0
     2 16、(课堂)输入一个年份(正整数),判断这年是否是闰年。闰年判断标准:年份能被4整除;如若遇到100的倍数,
     3 则需判断年份能否被400整除。(逢4一闰,逢百不闰,逢400又闰)

      解题思路:
      一。各个数据的包含关系:
      能被4整除 包含 能被100整除 包含 能被400整除
      二。多分支判断,从最小集合开始判断则判断条件最为简单;

     4 #endif
     5 #include<stdio.h>
     6 
     7 int main(){
     8     int year;
     9     scanf("%d",&year);
    10     
    11     if((year%400)==0){
    12         printf("%d是闰年",year);
    13     }else if((year%100)==0){
    14         printf("%d不是闰年",year);
    15     }else if((year%4)==0){
    16         printf("%d是闰年",year);
    17     }else{
    18         printf("%d不是闰年",year);
    19     }
    20     return 0;
    21 }


    17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,0~59为不及格,其他则输出错误信息。要求使用switch实现。

     1 #if 0
     2 17、(课堂)输入一个学生的成绩,输出该成绩对应的分数段。90~100为优,80~89为良,70~79为中,60~69为及格,
     3 0~59为不及格,其他则输出错误信息。要求使用switch实现。
     4 
     5 解题思路:
     6 一。判断数据是否合法;
     7 二。提取分数的十位进行switch判断。
     8 
     9 #endif
    10 #include<stdio.h>
    11 int main(){
    12     int grade;
    13     scanf("%d",&grade);
    14     if((grade>100)||(grade<0)){
    15         printf("%d数据不合法",grade);
    16     }
    17     grade/=10;
    18     switch(grade){
    19         case 10:
    20         case 9: 
    21             printf("%d等级为:优",grade);
    22         break;
    23         case 8: 
    24             printf("%d等级为:良",grade);
    25         break;
    26         case 7: 
    27             printf("%d等级为:中",grade);
    28         break;
    29         case 6: 
    30             printf("%d等级为:及格",grade);
    31         break;
    32         default:
    33             printf("%d等级为:不及格",grade);
    34         
    35         
    36     }
    37     printf("%lf",(grade*0.4));
    38     
    39     return 0;
    40 }

     


    18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
    freight = weight * distance * price * (1-discount);
    路程与折扣的关系如下:
    s<250:无折扣
    250<=s<500:2%折扣
    500<=s<1000:5%折扣
    1000<=s<2000:8%折扣
    2000<=s<3000:10%折扣
    3000<=s:15%折扣
    要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。

     1 #if 0
     2 18、(课堂)运输公司对用户按路程计算费用。路程越远,每吨*千米运费折扣越高。计算运费公式如下:
     3 freight = distance * distance * price * (1-discount);
     4 路程与折扣的关系如下:
     5 s<250:无折扣
     6 250<=s<500:2%折扣
     7 500<=s<1000:5%折扣
     8 1000<=s<20008%折扣
     9 2000<=s<300010%折扣
    10 3000<=s:15%折扣
    11 要求从键盘输入货运总重(单位吨)、货运路程(单位千米)、每吨*千米货运单价(单位元),输出总花费。

      解题思路:
      一。将重量进行分段,对每段重量的费用进行计算。
      二。从大重量向小重量遍历计算比小重量向大重量计算各直观
      例如
      大到小:向算先算一千到一百,自减九百,再算一百到零,
      小到大:先算零到一百,自减一百,再算零至900;
      三。依次从大到小判断重量的大小,计算对应重量的费用,然后重量相应自减已计算重量。

    12 #endif
    13 
    14 
    15 
    16 #include<stdio.h>
    17 int fun(int distance,int price,int weight){
    18     int freight=0;
    19     if(distance>=3000){
    20         freight+=(distance-3000)*price*8.5*weight;
    21         printf("
    %d=(%d-3000)*%d*0.9*%d
    ",freight,distance,price,weight);
    22         distance=3000;
    23         
    24     }
    25     if(distance>=2000){
    26         freight+=(distance-2000)*price*0.90*weight;
    27         printf("
    %d=(%d-2000)*%d*0.9*%d
    ",freight,distance,price,weight);
    28         distance=2000;
    29         
    30     }
    31     if(distance>=1000){
    32         freight+=(distance-1000)*price*0.92*weight;
    33         printf("
    %d=(%d-3000)*%d*0.9*%d
    ",freight,distance,price,weight);
    34         distance=1000;
    35         
    36     }
    37     if(distance>=500){
    38         freight+=(distance-500)*price*0.95*weight;
    39         printf("
    %d=(%d-3000)*%d*0.9*%d
    ",freight,distance,price,weight);
    40         distance=500;
    41     }    
    42     if(distance>=250){
    43         freight+=(distance-250)*price*0.95*weight;
    44         printf("
    %d=(%d-250)*%d*0.9*%d
    ",freight,distance,price,weight);
    45         distance=250;
    46         
    47     }
    48     if(distance>=0){
    49         freight+=(distance)*price*weight;
    50         printf("
    %d=(%d-3000)*%d*%d
    ",freight,distance,price,weight);
    51     }
    52     if(distance<0){
    53         printf("
    %d路程不能为负",distance);
    54     }
    55     
    56     return freight;
    57 }
    58 
    59 int main(){
    60     int distance,price, weight;
    61     int freight;
    62     printf("输入 ;重量  单价  路程: ");
    63     scanf("%d %d %d",&weight,&price,&distance);
    64     //printf("%d %d %d",distance,unit,distance);
    65     freight=fun(distance,price,weight);
    66     printf("
    总价为:%d
    ",freight);
    67     
    68     return 0;
    69 }

    19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。

     1 //19、(课堂)求1+2+3+……+99+100=?。使用while()、do-while()和for()三种循环分别实现。
      //解题思路:for()和while互为语法糖,当循环超过一次是while()、do-while()等价;
    2 #include<stdio.h> 3 4 int fun_while(int num){ 5 int sum=0; 6 int i=1; 7 while(i<=num){ 8 sum+=i; 9 i++; 10 } 11 12 13 return sum; 14 } 15 int fun_dowhile(int num){ 16 int sum=0; 17 int i=1; 18 do{ 19 sum+=i; 20 i++; 21 }while(i<=num); 22 return sum; 23 } 24 25 int fun_for(int num){ 26 int sum=0; 27 int i=1; 28 for(i=1;i<=num;i++){ 29 sum+=i; 30 31 } 32 return sum; 33 } 34 35 int main(){ 36 int sum1,sum2,sum3; 37 sum1=fun_while(100); 38 sum2=fun_dowhile(100); 39 sum3=fun_for(100); 40 printf("while=%d ,dowhile=%d ,for=%d",sum1,sum2,sum3); 41 return 0; 42 }

    20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。

     1

      #if 0
      20、打印所有水仙花数。水仙花数是这样的三位数:各位数字的立方和等于其本身。如153就是一个水仙花数。
      解题思路:
      一。遍历100至999;每次分别提取个十百位上的数;
      二。判断对每次提取的数进行立方和,对比和本身是否相等从而确定水仙花数。

      #endif

     2 #include<stdio.h>
     3 void shuixian(){
     4     int i=100;
     5     while(i<=999){
     6         
     7         int ge=i%10;
     8         int bai=i/100;
     9         int shi=(i/10)%10;
    10         //printf("%d  %d %d ",bai,shi,ge);
    11         int sum=(ge*ge*ge)+(shi*shi*shi)+(bai*bai*bai);
    12             //printf("
    %d
    ",sum);
    13         if(sum==i){
    14             printf("
    %d
    ",sum);
    15         }
    16         i++;
    17     }
    18     
    19 }
    20 
    21 
    22 int main(){
    23     shuixian();
    24     return 0;
    25 }


    21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
    F1=1 (n=1)
    F2=1 (n=2)
    Fn=Fn-1 + Fn-2 (n>=3)

     1 #if 0
     2 21、(课堂)打印斐波那契数列的前n项,其中n由键盘输入。斐波那契数列的特点如下:
     3 F1=1            (n=1)
     4 F2=1            (n=2)
     5 Fn=Fn-1 + Fn-2  (n>=3)

      解题思路:
      一。应该建立一个数组来存储产生的斐波那契数列,但没有对数列的操作,所以不存储直接输出
      二。使用两个标志位存储n-1 和n-2 的值,由此产生n的值。

     6 #endif
     7 
     8 #include<stdio.h>
     9 
    10 void fei(int len){
    11     int one=1;
    12     int two=1;
    13     int i;
    14     printf("%d
     %d 
    ",one,two);
    15     for(i=3;i<=len;i++){
    16         int temp=two;
    17         two+=one;
    18         one=temp;
    19         printf("%d
    ",two);
    20     }
    21 }
    22 int main(){
    23     int n;
    24     printf("打印多少项");
    25     scanf("%d",&n);
    26     
    27     fei(n);
    28     
    29     return 0;
    30 }


    22、(课堂)输出如下图形:
    *
    ***
    *****
    *******
    *********
    ……
    其中需要输出几行由键盘输入。

     1 #if 0
     2 22、(课堂)输出如下图形:
     3      4*1
     4     3***3
     5    2*****5
     6   1*******7
     7  0*********9
     8 ……5
     9 其中需要输出几行由键盘输入。

      解题思路:
      一。确定输出多少行;
      二。第i行的空格数:总行数-i
      第i行的*数:i*2-1

    10 #endif
    11 #include<stdio.h>
    12 
    13 void sanjiao(int len){
    14     //第I次输出几个*   i*2-1
    15     //第i次空几个      i-1
    16     
    17     int kong,xiang,i;
    18     for(i=1;i<=len;i++){
    19         //printf("%d",i);
    20         //printf("%d",i);
    21         
    22         for(kong=len-i;kong>=0;kong--){
    23             printf(" ");
    24         }
    25         for(xiang=(i*2-1);xiang>=1;xiang--){
    26             printf("*");
    27             
    28         }
    29         printf("
    ");
    30     }
    31     
    32     
    33     
    34 }
    35 
    36 int main(){
    37     int hang;
    38     printf("输出几行三角");
    39     scanf("%d",&hang);
    40     sanjiao(hang);
    41     
    42     
    43     
    44     return 0;
    45 }


    23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。列举出所有的购买方案,以及列举出所有花光100元的购买方案

     1

      #if 0
      23、(课堂)现有100元钱要买以下3种文具。其中一个笔记本20元,一套尺6元,一个笔4元,每样文具至少买1个。
      列举出所有的购买方案,以及列举出所有花光100元的购买方案

      解题思路:
      一。排除各买一件则剩余70元。
      二。建立一个三重循环,分别代表笔记本,尺子,笔。可以遍历所有情况。总价恰好为70则为结果。


      错误分析:
      大O算法为n^3 ,算法效率太低。有待改进。
      #endif

     3 #include<stdio.h>
     4 
     5 void wenju(int money){
     6     money-=(20+6+4);//30 70
     7     int notebook,rule,pen;
     8     for(notebook=0;notebook<=3;notebook++){
     9         for(rule=0;rule<=11;rule++){
    10             for(pen=0;pen<=17;pen++){
    11                 if(notebook*20+rule*6+pen*4==70){
    12                     printf("notebook=%d*20 ,rule=%d*6,pen=%d*4=70 
    ",notebook,rule,pen);
    13                 }
    14             }
    15         }
    16     }
    17 }
    18 
    19 int main(){
    20     //组合正好一百元;
    21     wenju(100);
    22 }

    24、(课堂)输出100~200间的所有素数

     1

      #if 0
      24、(课堂)输出100~200间的所有素数
      解题思路:
      一。遍历100~200,每个数取余 2至n/2,判断如果所有余数都不为零则该数为素数。
      #endif

     2 #include<stdio.h>
     3 
     4 void su(int low,int high){
     5     int i;
     6     for(i=low;i<=high;i++){
     7         int j;
     8         int st=0;
     9         for(j=2;j<low;j++){
    10             if(i%j==0){
    11                 st++;
    12             }
    13             
    14         }
    15         if(st==0){
    16             printf("%d 是素数
    ",i);
    17         }
    18         
    19         
    20     }
    21     
    22 }
    23 int main(){
    24     
    25     su(100,200);
    26     return 0;
    27 }


    25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。

     1

      #if 0
      25、计算1+2+3+……+99+100=?,在执行加法之前由用户输入3个数,这3个数不参与运算。例如输入3、57和89,则最终结果等于4901。

      解题思路:
      一。建立一个五个元素数组,中间三个用于用户输入,首尾元素分别为0 101。
      二。依次遍历数组两两之间,元素值之间不包括本身进行累加,
      三。将最后累加值总和进行输出为结果。
      #endif

     2 #include<stdio.h>
     3 
     4 int Accumulate(int low,int high){
     5     int sum=0;
     6     if((low+1)>=(high)){
     7         return 0;
     8     }
     9     for(++low;low<high;low++){
    10         sum+=low;
    11     }
    12     return sum;
    13 }
    14 
    15 int main(){
    16     int a[]={0,100,100,100,101};
    17     int i;
    18     int sum=0;
    19     printf("请输入三个数");
    20     scanf("%d %d %d",&a[1],&a[2],&a[3]);
    21     for(i=1;i<5;i++){
    22         sum+=Accumulate(a[i-1],a[i]);
    23         //sum+=Accumulate(0,101);
    24     }
    25     //sum=Accumulate(0,101);
    26     printf("
    结果是:%d
    ",sum);
    27     
    28     return 0;
    29 }

    26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;计算输入的数中的偶数的个数、总和、平均值。

     1 #if 0
     2 26、编写一个程序,由键盘输入若干正整数,输入0代表输入完成。计算输入的数中的奇数的个数、总和、平均值;
     3 计算输入的数中的偶数的个数、总和、平均值。
     4 
     5 解题思路:
     6 1。通过命令行传参获取数据,但数据是字符串形式
     7 2。将字符串形式数据转换为int形式数据,放在一个数组中,便于操作
     8 3。按要求对数据进行操作
     9 
    10 #endif
    11 
    12 
    13 #include<stdio.h>
    14 #include<stdlib.h>
    15 
    16 int my_even(int num[],int len){
    17     int even=0;
    18     int i=0;
    19     for(i=0;i<len;i++){
    20         if(num[i]%2==0){
    21             ++even;
    22         }
    23         
    24     }
    25     
    26     
    27     return even;
    28 }
    29 int my_sum(int num[],int len){
    30     int sum=0;
    31     int i=0;
    32     for(i=0;i<len;i++){
    33         sum+=num[i];
    34     }
    35     return sum;
    36 }
    37 
    38 int my_ave(int num[],int len){
    39     int ave=my_sum(num,len);
    40     ave/=len;
    41     return ave;
    42     
    43 }
    44 
    45 int main(int argc,char *argv[]){
    46     int i=0;
    47     for(i=1;i<argc;i++){
    48         //printf("%s
    ",argv[i]);
    49         if(*argv[i]=='0'){
    50             //i;
    51             break;
    52         }    
    53     }
    54     //printf("%s",argv[i]);
    55     int *num;
    56     int len=i-1;
    57     if(NULL==(num=(int *)malloc(sizeof(int)*len))){
    58         perror("cannot malloc");
    59         return 1;
    60     }
    61     //num[0]=NULL;
    62     
    63     for(i=0;i<len;i++){
    64         int sum=0;
    65         char *s=argv[i+1];
    66         while(*s !=''){
    67             sum=sum*10+((*s++)-'0');
    68             //printf("%c",*s);
    69             //++s;
    70         }
    71         num[i]=sum;
    72     }
    73     /*
    74     for(i=0;i<len;i++){
    75         printf("%d 
    ",num[i]);
    76     }
    77     */
    78     int even=my_even(num,len);
    79     int sum=my_sum(num,len);
    80     int ave=my_ave(num,len);
    81     printf("偶数个数:%d,总和:%d,平均值:%d。",even,sum,ave);
    82     
    83     
    84     return 0;
    85 }

    27、卡拉兹(Callatz)猜想:
    对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

    我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1?

     1 #if 0
     2 27、卡拉兹(Callatz)猜想:
     3 对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,
     4 最后一定在某一步得到n=1 。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,
     5 拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,
     6 卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
     7 我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步才能得到n=1 8 解题思路:
     9 1.  获取一个数
    10 2.  判断是偶数则除二,是奇数乘三加一
    11 3。 循环判断直至得到1;
    12 
    13 #endif
    14 
    15 #include<stdio.h>
    16 
    17 int main(){
    18     int num=0;
    19     printf("输入一个1000以内的自然数:");
    20     scanf("%d",&num);
    21     
    22     while(num!=1){
    23         if(num%2==0){
    24             num/=2;
    25         }else if(num%2==1){
    26             num=num*3+1;
    27         }
    28         printf("%d	",num);
    29     }
    30     return 0;
    31 }



    28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
    #include<stdio.h>
    int main()
    {
    int x,y;
    printf("enter x:");
    scanf("%d",&x);
    y=0;
    if(x!=0)
    {
    if(x>0)
    y=1;
    else
    y=-1;
    }
    printf("x=%d y=%d ",x,y);
    return 0;
    }

     1 //28、读懂以下程序,分析程序逻辑,画出流程图,说明程序的功能
     2 #include<stdio.h>
     3 int main()
     4 {
     5     int x,y;
     6     printf("enter x:");
     7     scanf("%d",&x);
     8     y=0;
     9     if(x!=0)
    10     {
    11         if(x>0)
    12         y=1;
    13         else
    14         y=-1;
    15     }
    16     printf("x=%d
    y=%d
    ",x,y);
    17     return 0;
    18 }


    29、给定一个不多于5位的正整数,要求:
    ①求出它是几位数
    ②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
    ③将数字逆序。例如输入123,则输出321

     1 #if 0
     2 29、给定一个不多于5位的正整数,要求:
     3 ①求出它是几位数
     4 ②分别输出每一位数字(这里的位指十进制的位而非二进制的bit)
     5 ③将数字逆序。例如输入123,则输出321

      解题思路:
      一。对输入数值合法性进行判定
      二。判断数据的位数。
      三。提取按从高位到低位进行,但将提取的数据按从低位到高位累加可得置逆结果。

    
    

      错误分析:
      本例中应该用一个数组存储提取的每一位的值。

     6 #endif
     7 
     8 #include<stdio.h>
     9 #include<math.h>
    10 
    11 int main(){
    12     int num;
    13     int Q=10000;
    14     int wei=0;
    15     int ni=0;
    16     printf("输入不大于十万的数");
    17     scanf("%d",&num);
    18     if(num>99999){
    19         printf("数据过大");
    20         return 0;
    21     }
    22     while(num/Q==0){
    23         Q=Q/10;
    24         
    25     }
    26     while(Q>0){
    27         int a=num/Q;
    28         Q=Q/10;
    29         a=a%10;
    30         
    31         printf("第%d位是:%d
    ",wei+1,a);
    32         ni=ni+pow(10,wei)*a;
    33         wei++;
    34     }
    35     printf("
    置逆%d
    ",ni);
    36     
    37     
    38     
    39     
    40     return 0;
    41 }


    30、使用公式求π的近似值
    π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
    直到某一项的绝对值小于10^-6为止。
    (提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
    fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
    若要使用fabs()函数,则应包含头文件math.h
    #include<math.h>
    而且要在编译时添加-lm,即手动添加数学库libm.o
    gcc qiupai.c -o qiupai -lm)

     1 #if 0
     2 30、使用公式求π的近似值
     3 π/4 = 1 - 1/3 + 1/5 - 1/7 + ……
     4 直到某一项的绝对值小于10^-6为止。
     5 (提示:判断该数字是否小于10^-6,可以使用系统库函数fabs
     6 fabs(f)>=1e-6//1e-6是10^-6的科学计数法表示方式
     7 若要使用fabs()函数,则应包含头文件math.h
     8 #include<math.h>
     9 而且要在编译时添加-lm,即手动添加数学库libm.o
    10 gcc qiupai.c -o qiupai -lm)
    11 
    12 解题思路:
    13 一。使用累加结束条件为某一项的绝对值小于10^-6为止。
    14 二。每一项中加减交替,分子为1,分母为奇数递增。
    15 三。累加结果乘四为π的值
    16 
    17 错误经历:
    18 将double型的数据以%d形式输出;
    19 
    20 #endif
    21 
    22 #include<stdio.h>
    23 #include<math.h>
    24 
    25 int main(){
    26     double PI;
    27     double sum=1;
    28     double item=0;
    29     int i=1;
    30     double jue=1;
    31     //int fp=1;
    32     while(fabs(jue)>=1e-6){
    33         if(i>0){
    34             i+=2;
    35         }else{
    36             i-=2;
    37         }
    38         i=-i;
    39         item=(double)1/i;
    40         
    41         sum+=item;
    42         //printf("item=%lf
    ",sum);
    43         
    44         jue=item;
    45         if(jue<0){
    46             jue=-jue;
    47         }
    48         
    49         
    50         //fp++;
    51         /*
    52         if(fp>1000){
    53             break;
    54         }
    55         */
    56         
    57     }
    58     PI=sum*4;
    59     printf("π=%lf ",PI);
    60     
    61     return 0;
    62 }

  • 相关阅读:
    带符号数的移位
    day03-Java语言基础之运算符
    day02Java语言基础数量部分
    day01Java概述
    交换机光口识别与连接问题
    wireshark怎么抓包
    Java中的语句
    构建主键批注的方法
    通过反射,获得数据库增删改查的sql语句的方法
    sql语句
  • 原文地址:https://www.cnblogs.com/lanbofei/p/9440740.html
Copyright © 2011-2022 走看看