第02章 CORE C++_控制语句_选择_循环_分支_跳出_函数_声明_形参_返回值_重载_递归

来源:互联网 发布:飞行器设计知乎 编辑:程序博客网 时间:2024/04/29 12:55

1.问题:对不同成绩给予对应评语

   思路:1.输入成绩

            2.判断是否为有效成绩

            3.分类(按成绩),对应输出

   代码:#include<iostream>  
            using namespace std;   
            int main()   
            {   
               int score;   
               cout<<"input score:";   
               cin>>score;   
               if(score<0||score>100)   
               cout<<"invalid score!"<<endl;   
               else
               {   
                  switch(score/10)   
                  {   
                     case 10:   
                        cout<<'A'<<endl;   
                        cout<<" 恭喜你,满分!"<<endl;   
                        break;   
                     case 9:   
                        cout<<'B'<<endl;   
                        cout<<" 成绩优秀!"<<endl;   
                        break;   
                     case 8:   
                        cout<<'C'<<endl;   
                        cout<<" 成绩良好!"<<endl;   
                        break;   
                     case 7:   
                        cout<<'D'<<endl;   
                        cout<<" 成绩一般!"<<endl;   
                        break;   
                     case 6:   
                        cout<<'E'<<endl;   
                        cout<<" 刚刚及格!"<<endl;   
                        break;   
                     default:   
                        cout<<'F'<<endl;   
                        cout<<" 要加倍努力!"<<endl;   
                  }   
              }  
          }    

   解释:1.控制结构(流程控制)(flort control)  
                  1.顺序

                  2.选择:if{...};if{...}else{...}
                  3.分支(多路选择):switch(){case:...}
                  4.循环:for(){...};while(){...};do{...}while()

            2.结构:
                  1.switch( 结果为整数的表达式):先计算表达式
                  2.{...case( 整数常数:)...case( 整数常数:)}:case(可为整数、字符、枚举常量)。每个case 后的整数常数各不相同
                  3....break;(跳出):至少有一个分支;switch 所有的分支必须用{}括起来。
                  4.default; (习惯上放最后一位):至少有一个分支;switch 所有的分支必须用{}括起来。

 2.问题1:以每行数*形式输出

    问题2:错误代码,无限循环

    思路1:无

    思路2:i为字符型,不能i++运算,i的ASCII码值不变,即,一直<128

    代码1:#include<iostream>  
             using namespace std;  
             int main()  
             {  
                for(int i=0;i<10;i++)  
                {  
                   cout<<i<<"*"<<endl;    
                }  
                cout<<"bye"<<endl;  
             }   

    代码2:#include<iostream>  
             using namespace std;  
             int main()  
             {  
                for(char i=0;i<128;i++)  
                cout<<"*"<<endl;  
             }  

    解释:for(准备;条件;调整):如果条件总为真的话,这个判断就是多余的,一直执行下去 
             for(准备;;调整):无条件循环就是无限循环,也就是死循环    
             for循环的()中任何条件都是可有可无的
             for(;;) 无限次执行下面的语句,死循环

3.问题:共讲16天课,依次输出“讲第i天课”

   思路:用while{}做,初始化15,减至0

   代码:#include<iostream>  
            using namespace std;   
            int main()   
            {   
               int days=15;   
               while(days>0)   
               {   
                  cout<<" 讲第"<<16-days<<" 天课"<<endl;   
                  --days;// 前--比后--性能高些,++也是   
               }   
               cout<<" 大家解放了"<<endl;   
            }  

   解释:while(true)或者while(1):无限次执行下面的语句,死循环
4.问题:显示存款,取款,转账,查询选项,选中后,输出其代号;额外贴心功能:如果输入错误,重新让你选

   思路:1.输入错误循环,即数<1||数>4,所以只能选while(){}或do{}while();

            2.显示:用do{},选中:输入代号,是否数<1||数>4?:while(数<1||数>4)

   代码:#include<iostream>  
            using namespace std;   
            int main()   
            {   
               int choice;     
               do{   
                  cout<<"1--存款"<<endl;   
                  cout<<"2--取款"<<endl;   
                  cout<<"3--转帐"<<endl;   
                  cout<<"4--查询"<<endl;   
                  cout<<" 请选择(1~4)"<<endl;   
                  //int choice;//因为{}后还要用到choice需要把变量放在外面

                  cin>>choice;   
               }   
               while(choice<1||choice>4);// 千万别忘了;号  
               cout<<" 您选择的是:"<<choice<<endl;   
            }

   解释:如果不是考虑到额外情况,可以先输出选项,输入,然后可以if(){}else{}结构做

5. 问题:循环输入,每次输入都有序号;输入年份为0,则推出程序;输入年份<1600,为非法年份,重新输入;输入年份>=1600,判断是否为闰年还是正常年;不限制输入年份大小

    思路:1.for(){}和while(){}都可以

             2.属于break和continue语句范畴,但是要跳出输入的这层循环,所以用break

             3.必须在循环体内一层有continue,因为还要输入

             4.正常闰年算法

             5.for(准备;;i++){}和while(1){初始化;...;++i}都可以

    代码:#include<iostream>  
             using namespace std;   
             int main()   
             {   
                int year;   
                for(int i=1; ;i++)

                {   
                   cout<<i<<':'<<"input a year:";   
                   cin>>year;   
                   if(year==0)   
                      break;   
                   if(year<1600)

                   {   
                      cout<<"invalid year!"<<endl;   
                      continue;   
                   }   
                   if(year%4==0&&year%100!=0||year%400==0)   
                      cout<<"leap year"<<endl;   
                   else   
                      cout<<"common year"<<endl;   
                }   
             }

    解释:break:终止循环,跳出,只跳出一层循环(不在这层循环体内执行)

             continue:用来跳过本轮循环中剩余的循环体,跳到调整部分(还在这层循环体内执行)
             C++中:for( 准备;条件;调整){ } 如果和准备和调整去掉就同于while;控制结构可以随意组合,任意多层

6.问题:输入一个范围为100~500之间的整数,并列出这个数所有的约数divisors(不含本身),最后统计出个数count 和sum

   思路:1.输入数,if(数<100||数>500),则非法;else{}

               输入数,do{输入}while(数<100||数>500)或while(数<100||数>500) {} 

            2.反复对从1到这个数之前的所有整数能整除就是约数,输出:

                  int count=0;int sum=0;for(int i=1;i<数;i++){if(数%i==0){cout<<i<<","<<endl;count++;sum++=i;}}

   代码:#include<iostream>  
            using namespace std;   
            int main()   
            {   
               int n;   
               do

               {   
                  cout<<" 请输入一个100~500的整数";   
                  cin>>n;   
               }while(n<100||n>500);   
               int count=0;   
               int sum=0;   
               for(int i=1;i<n;i++)

               {   
                  if(n%i==0)

                  {   
                     cout<<i<<' ';   
                     ++count;   
                     sum+=i;   
                  }   
               }   
               cout<<endl;   
               cout<<count<<" divisors,sum is:"<<sum<<endl;   
            }   

   解释:按照自己思路编程,即编程思想

7.问题:对于指定某年某月,输出其天数

   思路:1.输入或指定值

            2.在main()函数中调计算天数子函数

            3.1.考虑31天的月份(反正要进行天数初始化,直接以其中31天或以30天初始化,这样简洁)

            3.2.考虑30天的月份

            3.3.考虑闰年的2月份

   代码:#include<iostream>  
            using namespace std;   
            int daysOfMonth(int year,int month);// 函数的声明,名字不起任何作用  
            int main()   
            {   
               cout<<"main function"<<endl;   
               cout<<daysOfMonth(2002,11)<<endl; //执行函数daysOfMonth(),返回函数值,输出  
               daysOfMonth(2008, 6);   //执行函数daysOfMonth(),返回函数值
            }   
            int daysOfMonth(int year,int month)// 函数名+参数表称为函数头  
            {//int 为返回类型;year/month 为行参;   
               cout<<"year="<<year<<",month="<<month<<endl;   
               int days=31;   
               if(month==4||month==6||month==9||month==11)   
               days=30;   
               else if(month==2)   
               days=(year%4==0&&year%100!=0||year%400==0)?29:28;   
               return days;   
            }//函数体

   解释:1.main函数是shell自动调用的,其他的不是 

               在main函数中调用那个函数

            2.函数可以声明,也可在函数头直接写 
            3.形参中的数据是从那个函数之外传来的,形参本身也是变量,所以它自己会把数据保存一份   
               形参和函数体中的数据有什么区别:函数的形参在调用的时候才创建,而从函数返回时就释放

            4. 实参(值参):跟形参对应的数据

8.问题:对于指定某年某月,输出其下一天的年月日;额外要对非法的数据,重新输入

   思路:1.额外的非法输入的矫正应在main(){}中体现:循环判断年,月,日是否有效(这是while(){},do{}while(),for(){}皆可选用)。即,判断日是否在1~当年当月最大天数之间

            2.以算出指定年月的各有天数的方法为基础

            3.日增加一:   
                 3.1.对于每个月最后一天的判断,推出第二天的日期,++月份(即,如果超过了当年当月最大天数,日归一,月加一)

                 3.2.在前两步的基础上,最后一个月(即12月)的判断,推出第二天的日期,月份,年份;如果是12月最后一天,推出1月和++年(如果月超过了12,月归一,年增加一)

   代码:using namespace std;  
            int daysOfMonth(int y,int m)   
            {    
               if(m==4||m==6||m==9||m==11)   
                  return 30;   
               if(m==2){// 这里的{}可有可无   
                  if(y%4==0&&y%100!=0||y%400==0)    
                     return 29;    
                  else    
                     return 28;    
               }   
               return 31;    
            }     
            int main()   
            {   
               int y,m,d;   
               do{   
                  cout<<"input a date:";   
                  cin>>y>>m>>d;   
               }while(y<1600||m<1||m>12||d<1||d>daysOfMonth(y,m));   
               if(++d>daysOfMonth(y,m)){ //这条判断语句很经典:两层意思  
                  d=1;   
                  if(++m>12){//这条判断语句很经典:两层意思  
                     m=1;   
                     ++y;   
                  }   
               }   
               cout<<"the next day:"<<y<<'-'<<m<<'-'<<d<<endl;   
            }   

   解释:1.这次没有函数声明(上次有)

            2.这次计算每月天数的返回值的方式不同,是直接返回(上次是存到变量,然后返回变量的值)

9.问题:输入数,输出数的平方

   思路:计算平方的函数,由main函数调用

   代码:#include<iostream>  
            using namespace std;   
            int squre(int n)   
            {   
               cout<<"n="<<n<<endl;   
               n=n*n;   
               cout<<"n="<<n<<endl;   
               return n;// 千万别忘了  
               cout<<"---"<<endl;// 此句无效语句因为已经返回了  
            }   
            int main()   
            {   
               int m=111;   
               squre(m);   
               cout<<squre(m)<<endl;   
               cout<<"m="<<m<<endl;   
            }  

   解释:在形参的名字里可以不同,但是类型和个数必须相同

10.问题:列菜单,选菜,输出代号

   思路:注意无形参函数调用

   代码:#include<iostream>   

            using namespace std;   
            int menu()// ()必须带着  
            {   
               int choice;   
               cout<<"---欢迎光临饭店---"<<endl;   
               cout<<"1-水煮鱼"<<endl;   
               cout<<"2-毛血旺"<<endl;   

               cout<<"3-辣子鸡丁"<<endl;   
               cout<<"4-河水豆花"<<endl;   
               cout<<" 请点菜:";   
               cin>>choice;   
               return choice; // 因为返回类型为int,所以return 数据 
            }   
            int main()   
            {   

               cout<<menu()<<" 号菜!"<<endl;   
            }  

   解释:形参的名字里可以不写,但是类型和个数必须相同

11.问题:输出指定符号的矩阵

   思路:双层for循环

   代码:void print(int row,int col,char ch)   
            {   
               for(int i=0;i<row;i++){   
                  for(int j=0;j<col;j++){   
                     cout<<' '<<ch;   
                  }   
                  cout<<endl;   
               }   
               return;// 因为返回类型为void,所以可以省略,注意不能带0或其他数据,是不带回结果的函数  
            }   
            int main()   
            {   
               print(3,5,'*');   
               cout<<"--------------------"<<endl;   
               print (4,8,'$');   
               cout<<"===================="<<endl;   
            }  

   解释:无返回值函数调用

12.问题:根据性别分别输出

   思路:另一种分不同情况输出的方法

   代码:#include<iostream>  
            using namespace std;   
            void reg(string name,bool gender);   
            void reg(string name);   
            int main()   
            {   
               reg("陈东");   
               reg("刘哲");   
               reg("刘晓梅",false);   
               reg("杨智");   
            }   
            void reg(string name)   
            {   
               reg(name,true);   
            }   
            void reg(string name,bool gender)   
            {   
               cout<<(gender?" 帅哥":"美女")<<name<<" 报名啦!"<<endl;   
            }  

   解释:函数的重载:多个函数用同一个名字,必须让编译器能够区分出该调用哪个函数

            栈:一种内存空间,系统自动管理 

13.问题:有数列1,1,3,5,8,13,21,...1597,2584,4181,6765.用程序写出

   思路:f(1)=1;f(2)=1;f(3)=f(3-1)+f(3-2);...f(n)=f(n-1)+f(n-2);...f(20)=f(19)+f(18).

   代码:#include<iostream>  
            using namespace std; 
            int fib(int m) { 
               if(m<3) 
                  return 1;   
               else   
                  return fib(m-1)+fib(m-2);  
            }   
            int main()   
            {   
               for(int i=1;i<=20;i++)   
               cout<<fib(i)<<endl;   
            }  

   解释:递归:函数(某形参)自己调用自己(另形参)

14.问题:有无存储类static,声明变量的比较

   思路:无

   代码:#include<iostream>  
            using namespace std;   
            int getid()   
            { //int id=1000;  每次执行getid()时,运行
               static int id=1000;//第一次执行getid()时,运行。直到程序结束   
               ++id;   
               return id;   
            }   
            int main()   
            {   
               cout<<getid()<<endl;   
               cout<<getid()<<endl;   
               cout<<getid()<<endl;   
            }

   解释:存储类:auto:自动变量,默认变量,无人用 
               extern   
               register   
               static:用于局部变量时有特殊含义,只在第一次遇到时执行,会在程序结束时才回收 
               volatile:不稳定

15.问题:汉诺塔算法(经典递归算法)(???)

   思路:1.输入盘子数

            2.hano(int n,char a,char b,char c){  
                  if(n>0){   
                     hano(n-1,a,c,b);   
                     n号从a直接移到b   
                     hano(n-1,c,b,a);   
                  }   
               }  

   代码:#include<iostream>  
            using namespace std;   
            void hano(int n,char a,char b,char c)   
            {   
               if(n>0)   
               {   
                  hano(n-1,a,c,b);   
                  cout<<n<<" 号"<<a<<"==>"<<b<<endl;   
                  hano(n-1,c,b,a);   
               }   
            }   
            int main()   
            {   
               int n;   
               cout<<" 请输入盘子数:";   
               cin>>n;   
               hano(n,'A','B','C');   
               cout<<" 完毕!"<<endl;   
            }   
   解释:无

16.问题:输出一个十进制整数,位与位之间用空格分隔 

   思路:1.输入数

            2.1我们要的结果是数ab...cd以a,b,.....c,d的形式输出

            2.2输出a(最高为取余),然后输出',';b(次高位取余),然后输出',';...c,然后输出',';d(???)

   代码:#include <iostream>  
            using namespace std;   
            void showdigit(int n)   
            {   
               if(n>9){   
                  showdigit(n/10);   
                  cout << ',';   
               }   
               cout << n%10;   
            }   
            int main()   
            {   
               int n;   
               cout << "input n:";   
               cin >> n;   
               showdigit(n);   
               cout << endl;   
            }  

   解释:无

原创粉丝点击