黑马程序员——ios基础---练习:2

来源:互联网 发布:ubuntu touch 平板安装 编辑:程序博客网 时间:2024/06/07 11:19

C5-----------------------------------------------------------------------------

一、改错题

 

二、分析题

1 以下程序的输出结果是( 20 )

main(){

    int n=4;

    while (n--)

        printf(%d,--n)

        }

 

2 以下程序的输出结果是(101091)

main()

{int x=10,y=10,i;

        for(i=0;x>8;y=++i)

                printf("%d%d",x--,y);

}

 

3 当执行以下程序段时。A

x=-1

do

{x=x*x}

while (!x)

A.循环体将执行一次             B.循环体将执行两次

C.循环体将执行无数多次             D.系统将提示有语法错误

 

4 执行以下程序后输出的结果是( 0 )。

main()

{ int y=10;

        do{

        y--;}

    while(--y);

        printf("%d\n",y--);}

 

5 下面程序的输出结果是(  54)。

main()

{ int x=3,y=6,a=0;

        while (x++!=(y-=1))

            {a+=1;

                    if (y<x) break;

                }

        printf("x=%d,y=%d,a=%d\n",x,y,a);

}

 

6.若i,j已定义为int类型,则以下程序段中内循环的总的执行次数是  20 )。

for (i=5ii--)

for (j=0j<4j++)

{…}

 

 

7.在下列选项中,没有构成死循环的程序段是(  c  )。

A.int i=100

while (1)

{

        i=i%100+1

        if(i>100) break

                }

B. for (  )

 

C.int k=1000

do {++k}while (k>=10000)

 

D.int s=36

while (s) ;

--s

 

8.列程序运行的情况是( d )。

main()

{ int i=1,sum=0;

        while(i<10)sum=sum+1;i++;

        printf("i=%d,sum=%d",i,sum);

}

A.i=10,sum=9      B.i=9,sum=9      C.i=2,sum=1          D.运行出现错误

 

9.下面程序的运行结果为( 12457810 )。

main()

{ int n;

        for(n=1;n<=10;n++)

            { if(n%3==0)continue;

                    printf("%d",n);

                }

}

 

10.输出结果?(0246

#include <stdio.h>

int main()

{

        for (int i = 0; i<10; i++) {

                if (i % 2) continue;

                if (i == 8) break;

                printf("i=%d\n", i);

            }

        return 0;

}

 

11.输出结果?

#include <stdio.h>

int main()

{

        for (int i = 0; i<5; i++) {

                for (int j = 0; j<5; j++) {

                        printf("i=%d, j=%d\n", i, j);

                        if (j == 1) {

                                break;

                            }

                    }

                if (i == 2) {

                        break;

                    }

            }

        return 0;

}


i=0, j=0

i=0, j=1

i=1, j=0

i=1, j=1

i=2, j=0

i=2, j=1

     

三:编程题

     /*

       打印1 - 100中不能被7整除又不包含7的数

       */

#include <stdio.h>

     

     int main(int argc, const char * argv[]) {

         

         for (int i = 1; i<100; i++) {

             if ((i%7==0)||(i%10==7)||(i/10==7)) {

                 continue;

             }

             printf("%d\n",i);

         }

         return 0;

     }



     /*

       打印九九乘法表

      */ 

      


#include <stdio.h>

      

     int main(int argc, const char * argv[])

     {

             //    外循环控制行数

             for (int i = 1; i <=9; i++) {

                     //        内循环控制列数

                     for (int j = 1; j <= i; j++) {

                             //            输出结果

                             printf("%d * %d = %d\t", i, j, i*j);

                         } 

                     //        换行 

                     printf("\n"); 

                 } 

             return 0; 

     }

     

     /*

       一农户在集市上卖西瓜,他总共有1020个西瓜,第一天卖掉一半多两个,第二天卖掉剩下的一个多两个,问照此规律卖下去,该农户几天能将所有的西瓜卖完?

       */ 

    

    int main(int argc, const char * argv[])

     {

             //    瓜的总数

             int count = 1020;

             //    天数

             int day = 0;

             //    计算天数

             while (count) {

                     //        每天卖剩下的瓜

                     int temp = count/2 - 2;

                     count = temp;

                     day++; 

                 } 

             printf("day = %d\n", day); 

              

             return 0; 

     }

     

       假设银行当前整存零取五年期的年利息为2.5%,现在某人手里有一笔钱,预计在今后的五年当中每年年底取出1000,到第五年的时候刚好取完,计算在最开始存钱的时候要存多少钱?

       int main(int argc, const char * argv[])

        {

          //    总金 a*1.025-1000=0   a=(a+1000)/(1+0.025)

          float total = 0;

          for (int i = 0; i < 5; i++) {

              //        倒推第5年年初存款,用1000/

              total = (total + 1000)/(1 + 0.025);

          }

          //    输出结果

          printf("total = %.3f\n", total);

          return 0; 

        }


     

  

     /*

       假设一个班中有20个学生,输入某科考试的成绩然后统计出该班不及格的学生人数

      */ 


     int main(int argc, const char * argv[])

     {

              

             int score , count = 0;

             //    循环录入学生成绩

             for (int i = 1; i <= 20; i++) {

                     printf("请输入 %d 个学生的成绩\n",i);

                     scanf("%d" , &score);

                      

                     //        判断学生成绩是否及格

                     if (score < 60) {

                             count++; 

                         } 

                 } 

              

             printf("不及格人数 %d ", count); 

             return 0; 

     } 

C6-----------------------------------------------------------------------

     

     1.

      #include <stdio.h>

      

     int main()

     {

             for (int i = 0; i<5; i++)

                 {

                         // 不加上大括号{}的话,变量a的作用域混乱\不明确

                         int a = 20;

                     }

              

             return 0;

     }

      

     // 1处错误

      

     2.

     // 应该将test函数进行提前声明,或者在main函数前面定义

     void test();

      

     int main()

     {

             test();

             return 0;

     }

      

     void test()

     {

     }

      

     // 1处错误

      

     3.

     void test1()

     {

             // void表示没有返回值,因此不应该return一个整数

             return; // 省略return也可用

             //return 0;

     }

      

     int test2()

     {

             // 返回值是int类型,因此return后面应该跟上一个整数

             return 0; // 这个0仅仅是随便写的,具体返回什么值,应该根据业务逻辑

             // return;

     }

      

     int main()

     {

             // test2不接收任何参数

             test2();

             // test2(10);

             return 0;

     }

     // 3处错误

      

     4.

     void test()

     {

     }

      

     int main()

     {

             // 函数不能嵌套定义

             /*

                   void test()

                   {

                   }*/ 

              

             test(); 

             return 0; 

     } 

     // 1处错误 

      

     5. 

     // 不允许有函数同名,这里将前面的test改为了test2 

     void test2() 

     { 

     } 

      

     void test(int n) 

     { 

     } 

      

     int main() 

     { 

             // test函数只接收1个参数 

             test(10); 

             // test(10, 20); 

             return 0; 

     } 

     // 2处错误 

      

     6. 

     void test1() 

     { 

     } 

      

     void test2(int n) 

     { 

     } 

      

     int main() 

     { 

             // test2接收的是int类型的参数,而test1没有返回值 

             // 因此test1()不能作为test2的参数 

             test2(10); 

             //test2( test1() ); 

             return 0; 

     } 

     // 1处错误 

      

     二、分析题

     1. 打印结果42

#include <stdio.h>

     int sum(int a, int b)

     {

             return a + b;

     }

      

     int two(int n)

     {

             return n * 2;

     }

      

     void test(int n)

     {

             printf("%d\n", two(n));

     }

      

     int main()

     {

             test( sum(10, 11) );

             return 0;

     }

 三、编程题      

     1.

     /*

       题目:

       编写一个函数int pieAdd(int n),计算1!+2!+3!+……+n!的值(n>=1)。

       比如pieAdd(3)的返回值是1! + 2! + 3! = 1 + 1*2 + 1*2*3 = 9

       */ 


     int pieAdd(int n)

     {

             /*

                   解题思路:先计算出每个数字的阶乘,再把所有的阶乘加起来

                   */

              

             // 1.如果传入的n值不合理,直接返回0

             if (n<1) return 0;

              

             // 2.定义一个变量,用来记录每次阶乘相加的结果

             int sum = 0;

              

             for (int i = 1; i<=n; i++) { // 一共有多少个数字

                      

                     // 3.定义一个变量,记录当前数字对应的阶乘

                     int multi = 1;

                     for (int j=1; j<=i; j++) {

                             multi *= j; 

                         } 

                      

                     // 4.累加每次的阶乘 

                     sum += multi; 

                 } 

              

             return sum; 

     } 

     

     int main()

     {

             int result = pieAdd(3);

              

             printf("%d\n", result);

             return 0; 

     }

     

4.5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁,问第4个人岁数,他说比第3个人大两岁,问第3个人岁数,他又说比第2个人大两岁,问第2个人岁数,他说比第1个人大两岁,最后问第1个人他说10岁。编写程序,当输入第几个人时求出其对应的年龄。

    

     int age(int n)

     {

             int f;

             if(n = 1) //n等于1时,f等于10

                     f = 10;

             else

                     f = age(n-1)+2;//递归调用age函数

             return f; 

     } 

     

  5.A/B/C/D/E 5个人在某天夜里合伙去捕鱼,到凌晨时都疲惫不堪,于是各自找地方睡觉,第二天,A第一个醒来,他将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分成5份,把多余的一条鱼扔掉,拿走自己的一份。C/D/E依次醒来,按同样的方法拿鱼。问他们合伙至少捕了多少条鱼?

      C语言算法竞赛题目:捕鱼和分鱼

       

      ABCDE五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,保持走自己的一份。CDE依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?

       

      根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。

       

      假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4*(X-1)/5。若X满足上述要求,则X就是题目的解。

       

      1.分配的方式相同,即扔掉一条鱼后剩下的鱼正好分成五份,鱼的总数 -1 一定能被5整除

      2.我们不知道鱼的总数是多少,那么就假定它是 x 

      3.一共对鱼进行了几次分配 一共5个人,每个人分配1 一共分配了5 for循环

          4.至少捕了多少条鱼? 只要我们找出一个合理的数字比如所 6 条开始 一点一点增加鱼的数量

          我们就要试探 for循环

               

              x

              x = ((x - 1) / 5) * 4

              x = ((x - 1) / 5) * 4 

              x = ((x - 1) / 5) * 4 

              x = ((x - 1) / 5) * 4 

               

               

              */ 

              


     int leastFishNum(){

              

             int totalFishNum = 0; //我们要试探进行所以需要一个变量假定捕鱼的总数量数量

             //6条鱼开始试探,

             for (totalFishNum = 6; 1; totalFishNum++) {

                     int flag = 1;  //我们还需要一个标记,如果我们试探出了一个合理的数字,用它来结束循环

                     //5个人一共分配了5

                     //我们把试探的值赋值给鱼的总量totalFishNum

                     int leftFishNum = totalFishNum; //定义一个变量记录每次分鱼后剩下的条数,第一次分为捕鱼的数量

                     for (int i = 1; i <= 5; i++) {

                              

                             //如果鱼的总数量减去1一定能被5整除

                             if ((leftFishNum - 1) % 5 == 0)//满足if条件说明第一次分配完成

                                 {

                                         //经过了第一次分配,A拿走了它的那份

                                         //后面每一次分配都是,拿走第一份剩余四份

                                         //那么剩余的鱼 总数应该是

                                         leftFishNum = 4 * (leftFishNum - 1) / 5; //我们通过假设x的值  (x-1)/5 * 4

                                         // printf("total = %d\n", leftFishNum);

                                     }else

                                         {

                                                 flag = 0; //如果不能被整除,就让我们的标记为0

                                                 break; //结束当前循环 

                                             } 

                              

                         } 

                      

                     //我们的flag 只有在找到了能够瞒住我们分配条件的第一个数出现的时候 

                     //也就是找到了最少要有多少鱼的时候才会为

                     if(flag) 

                         { 

                                 break; 

                             } 

                 } 

              

             //printf("Total = %d\n",totalFishNum);     /*输出结果*/ 

             return totalFishNum; 

              

     } 

      


0 0
原创粉丝点击