c的详细学习选择结构与循环结构的编程练习

Posted MenAngel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c的详细学习选择结构与循环结构的编程练习相关的知识,希望对你有一定的参考价值。

    本节介绍c语言的编程实例。

 

    (1)求方程ax^2+bx+0的解:

      方程有解有以下几种可能:

      1.b^2-4ac=0,方程有两个相等实根。

      2.b^2-4ac>0,方程有两个不等实根。

      3.b^2-4ac<0,方程有两个共轭复根。

      程序中需要判断b^2-4ac是否等于0,由于它是实数,在存储时会有一些微笑的误差,因此不能直接进行(b*b-4ac)==0的判断。因为这样可能会出现本来是0的量,由于上述误差被判断不等于0而导致错误的结果。所以采取的办法是判别其绝对值是否小于一个很小的数(例如10^-6),如果小于此数,就认为它等于0.

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   double a,b,c,disc,x1,x2,realpart,imagpart;
 6   scanf("%lf,%lf,%lf",&a,&b,&c);//输入三个数据时用逗号作为分隔符 
 7   disc=b*b-4*a*c;
 8   if(fabs(disc)<=1e-6)
 9     printf("has two equal roots:%8.4lf\\n",-b/(2*a)); 
10   else if(disc>1e-6){
11     x1=(-b+sqrt(disc))/(2*a);
12     x2=(-b+sqrt(disc))/(2*a);
13     printf("has distinct real roots:%8.4lf\\n",-b/(2*a));
14     }
15   else{
16     realpart=-b/(2*a);
17     imagpart=sqrt(-disc)/(2*a);
18     printf("has complex roots:\\n");
19     printf("%8.4lf+%8.4lf i \\n",realpart,imagpart);
20     printf("%8.4lf+%8.4lf i \\n",realpart,imagpart);
21   }
22   return 0;
23 }

 

      (2)从键盘输入年号和月号,试计算改年该月共有几天:

 1 #include<stdio.h>
 2 
 3 int main(){
 4   int year,month,days=0;
 5   printf("please input year and month:(use \\\',\\\' to distinct)\\n");
 6   scanf("%d,%d",&year,&month);
 7 
 8   switch(month){
 9     case 1:
10     case 3:
11     case 5:
12     case 7:
13     case 8:
14     case 10:
15     case 12:days=31;break;
16     case 4:
17     case 6:
18     case 9:
19     case 11:days=30;break;
20     case 2:
21       if(year%4==0&&year%100!=0||year%400==0)
22         days=29;
23       else 
24           days=28;
25        break;   
26     default:
27       printf("Data error!");
28   }
29   printf("%d年%d月有%d天\\n",year,month,days);
30   return 0;
31 }

 

    (3)输入今天的日期y(年),m(月),d(日),输出明天的日期:

 1 #include<stdio.h>
 2 
 3 //验证输入值是否正确的函数 
 4 int valid(int y,int m,int d){
 5     if(y<=0|m<0|m>13|d>31|d<0){
 6     printf("Input errors!");
 7     return 0;
 8     }
 9     else
10     return 1;
11 }
12 
13 //进行运算的过程函数,输出结果的算法 
14 void outTom(int y, int m,int d){
15   d++;
16   switch(d){
17   case 32:{
18           d=1;
19           m++;
20           if(m==13){
21             m=1;y++;
22           }
23           break;
24           }
25   case 31:{
26           switch(m){
27            case 1:
28            case 3:
29            case 5:
30            case 7:
31            case 8:
32            case 10:
33            case 12:
34            {
35              break;
36            }
37            case 4:
38            case 6:
39            case 9:
40            case 11:
41            {
42              d=1;
43              m++;
44            break; 
45            }
46            default:
47            printf("This month has no such day!");
48
49         }
50          break;
51           }
52   case 30:{
53          if((m==2)&&((y%400==0)||(y&4==0&&y%100!=0))){
54            m++;
55            d=1;
56          }
57             break;
58           }
59   case 29:{
60           if(!((y%400==0)||(y&4==0&&y%100!=0))){
61            m++;
62            d=1;
63           }
64           break;
65           }
66  default: break;
67                    
68   }
69  printf("Tomorrow is %d/%d/%d",y,m,d);
70 }
71 
72 int main(){
73   //第一步完成数据的输入    
74   int y,m,d;
75   printf("please input the date today:year,moth,day,using \\\',\\\' to distinct!\\n");
76   scanf("%d,%d,%d",&y,&m,&d);
77   //完成数据的验证 
78   if((valid(y,m,d))==0){
79     return 0;
80   }
81   printf("The date today is %d/%d/%d\\n",y,m,d);
82   //输出结果 
83   outTom(y,m,d);
84   return 0; 
85 }

 

    (4)用两种方法求平方根:

     1.用迭代法求数a的平方根Xn=1/2*(Xn-1)+a/Xn-1),取a/2作为迭代的初值,迭代结束条件取|Xn-Xn-1|<=10e-5:

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   float a,x0,x1;    
 6   scanf("%f",&a);
 7   x1=a/2;
 8   do{
 9     x0=x1;
10     x1=(x0+a/x0)/2;
11   }while(fabs(x1-x0)>1e-5);
12   printf("a=%f,squart(a)=%f\\n",a,x1);
13   return 0;
14 } 

     2.用二分法求数a的平方根:

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 float find(float low,float high,float a){
 5   float middle=(low+high)/2;
 6   if(middle*middle<fabs(a))
 7     return middle;
 8   else if(middle*middle>a)
 9     high=middle;
10   else if(middle*middle<a)
11     low=middle;
12   float result=find(low,high,a);
13   return result;
14 }
15 
16 float sqt(float in){
17   float low,high;
18   if(in<1){
19     low=0;
20     high=1;
21   }
22   else{
23       for(int i=0;i<=in;i++){
24         if((float)i*i==in)
25           return (float)i;
26         else if(i*i<in&&(i+1)*(i+1)>in){
27           low=(float)i;
28           high=(float)(i+1);
29         }
30       }
31     }
32    return find(low,high,in);  
33 }
34 
35 int main(){
36   float a,result;
37   printf("please input a float number:\\n");
38   scanf("%f",&a);
39   if(a<0){
40     printf("Input error!");
41     return 0;}
42   result=sqt(a);
43   printf("Squrt(%f)=%f",a,result);
44   return 0;
45 }

 

    (5)利用公式求sinX的近似值:

    sinx=x-x^3/3!+x^5/5!-x^7/7!+.....+(-1)^(2n+1)/(2n+1)!

    这里x是弧度。这是一个级数求和问题。 

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   int k,i,n;//这里n是控制精确度的,n越大精确度越高。 
 6   double s,a,b,x;
 7   scanf("%d%lf",&n,&x);
 8   s=0;
 9   x=x*3.141593/180;//将输入的角度转化为弧度 
10   for(int i=1;i<=n;i++){
11     a=b=1;
12     for(k=1;k<=2*i-1;k++){
13       a=a*x;
14       b=b*k;
15     }
16     s=s+pow(-1,i+1)*a/b;
17   } 
18   printf("sinx=%lf\\n",s);
19   return 0;
20 }

 

    (6)计算正弦曲线y=sin(x)在[0,PI]上与x轴所围成的平面图形的面积:

    计算定积分的公式为:s=(h/2)*[f(a)+f(b)]+h*(从i=1到n-1)Ef(Xi),其中,Xi=a+ih,h=(b-a)/n,本例取n=100。

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   int i,n;
 6   double a,b,h,s;
 7   printf("Input a b:");
 8   scanf("%lf%lf",&a,&b);
 9   n=100;
10   h=(b-a)/n;
11   s=0.5*(sin(a)+sin(b));
12   for(i=1;i<=n-1;i++){
13     s+=sin(a+i*h);
14   }
15   s*=h;
16   printf("s=%8.4lf\\n",s); 
17   return 0;
18 }

 

    (7)找出100~999之间的所有"水仙花"数:

    所谓"水仙花"数是指一个三位数,其各位数字的立方和等于该数其各位数字的立方和等于该数本身,例如153=1^3+3^3+5^3,所以153是水仙花数。

   方法一:

    设100<=n<=999,i,j,k分别代表数n百位、十位,个位上的数字,则:

    i=n/100

    j=n/10%10

    k=n%10

    如果j^3+i^3+k^3=n,则n即为所求。

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   int i,j,k,n;
 6   for(n=100;n<=999;n++){
 7     i=n/100;
 8     j=n/10%10;
 9     k=n%10; 
10     if(n==(i*i*i+j*j*j+k*k*k))
11       printf("%d\\n",n);
12   }
13   return 0;
14 }

    方法二:

 1 #include<stdio.h>
 2 #include<math.h>
 3 
 4 int main(){
 5   int i,j,k;
 6   int n;
 7   for(i=1;i<10;i++)
 8     for(j=0;j<10;j++)
 9       for(k=0;k<10;k++){
10         n=i*100+j*10+k;
11         if((i*i*i+j*j*j+k*k*k)==n){
12           printf("%d是水仙花数!\\n",n);
13         }
14       }
15   return 0;
16 }

 

    (8)输入两个正整数m和n,求其最小公倍数:

 1 #include<stdio.h>
 2 
 3 int main(){
 4   int a,b;
 5   printf("Please input two int  number: ");
 6   scanf("%d%d",&a,&b);
 7   if(a<=0|b<=0)
 8     printf("Input error!");
 9     for(int i=a>b?a:b;;i++){
10     if(i%a==0&&i%b==0){
11       printf("最小公倍数是%d",i);
12       break;    
13     }
14   } 
15   return 0;
16 } 

更好的算法:

 1 #include<stdio.h>
 2 
 3 int main(){
 4   int a,b;
 5   int n;
 6   printf("Please input two int  number: ");
 7   scanf("%d%d",&a,&b);
 8   if(a<=0|b<=0)
 9     printf("Input error!");
10   n=a>b?a:b;
11     for(int i=1;;i++){
12     if((i*n)%a==0&&(i*n)%b==0){
13       printf("最小公倍数是%d",i*n);
14       break;    
15     }
16   } 
17   return 0;
18 } 

 

    (9)编写程序读入n,输出不超过n的所有完全数:

    如果一个正整数的因子所有之和等于该正整数,则称这个正整数为完全数。

 1 #include<stdio.h>
 2 
 3 int main(){
 4   int n;
 5   int k; 
 6   int s;
 7   printf("Please input a number:\\n");
 8   scanf("%d",&n);
 9   for(k=3;k<=n;k++){
10     s=0;
11     for(int i=1;i<k;i++){
12       if(k%i==0)
13         s+=i;
14     }
15     if(s==k){
16       printf("%d是完全数!",k);
17     }
18   }
19   return 0;
20 } 

以上是关于c的详细学习选择结构与循环结构的编程练习的主要内容,如果未能解决你的问题,请参考以下文章

EDUCoder编程练习题解(循环二)

EDUCoder编程练习题解(结构体)

EDUCoder编程练习题解(文件)

EDUCoder编程练习题解(编辑与调试)

EDUCoder编程练习题解(编辑与调试)

EDUCoder编程练习题解(顺序结构)