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

(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 }

时间: 2024-10-29 19:12:06

c的详细学习(4)选择结构与循环结构的编程练习的相关文章

黑马程序员— C语言选择结构和循环结构的总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 在学习完C语言的流程控制后,发现选择结构跟循环结构都各自有各自的特点,下面就来对选择结构与循环结构进行一个综合的总结 第一讲  选择结构与循环结构 选择结构主要包括if语句和switch语句,而循环结构包括for循环,while循环以及do while循环: 一 选择结构 1.if(条件){ }else if(条件2){ }else{ } 特点:同一时刻只有一个大括号里面的代码会执行. 2.s

Java基本知识(运算符/选择结构语句/循环结构语句/方法/标识符)

Java基本知识(运算符/选择结构语句/循环结构语句/方法/标识符)一.Java标识符给类.接口.方法等命名的字符序列.1.标识符组成(1)英文字母大小写:(2)数字(不能以数字开头):(3)$和_.2.命名规则常量:每个单次字母均大写,若由多个单词组成,则每个单词间用下划线隔开.变量.方法:第一个单词全部小写,若由多个单词组成,则第一个单词全部小写,从第二个单词开始,每个单词首字母大写其他单词首字母小写.包:所有字母都小写,多级包采用域名反写,每级用"."隔开.类.接口:每个单词首字

Java基础之结构--&gt;&gt;条件结构与循环结构

Java中程序流程控制语句包括条件结构.循环结构和跳转语句 4.1条件结构 条件结构包括顺序结构和选择结构.顺序结构在程序执行中没有跳转和判断,知道程序结束为止.选择结构包括 if 语句,if-else 语句,switch 语句,在程序执行过程中可以改变程序的执行流程. 4.1.1 if 语句 if 语句是条件判断后再处理的一种语法结构 if(条件表达式){ //条件成立后执行 一条或多条语句 } //条件表达式的值只能是 boolean 类型 false / true 4.1.2 if-els

3.分支结构与循环结构

1 程序结构 程序结构分为顺序结构.分支结构.循环结构.分支结构有:if结构,if....else结构,if...else if....else ,if...else结构,switch结构:循环结构有:while循环,do....while循环,for循环. 2 分支结构 ①if结构  语法: if(布尔表达式){ //语句; } 执行过程:如果布尔表达式为true执行其下语句,布尔表达式为false时不执行其下语句. {}可以省略,如果省略将执行第一个语句块.为了程序的可读性推荐不要省略{}

Java语法基础(四)----选择结构的循环结构

一.循环结构: 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形成死循环. 循环语句的组成: 初始化语句:一条或者多条语句,这些语句完成一些初始化操作. 判断条件语句:这是一个boolean 表达式,这个表达式能决定是否执行循环体. 循环体语句:这个部分是循环体语句,也就是我们要多次做的事情. 控制条件语句:这个部分在一次循环体结束后,下一

黑马程序员————C语言基础语法二(算数运算、赋值运算符、自增自减、sizeof、关系运算、逻辑运算、三目运算符、选择结构、循环结构)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一讲  算数运算 C语言一共有34种运算符,包括了常见的加减乘除运算 1.加法运算+ 除开能做加法运算,还能表示正号:+5.+90 2.减法运算- 除开能做减法运算,还能表示符号:-10.-29 3.乘法运算* 注意符号,不是x,而是* 4.除法运算/ 注意符号,不是÷,也不是\,而是/ 整数除于整数,还是整数.1/2的值是0,这个并不是二分之一 5.取余运算% 什么是取余:两个整数相除之后

C- 流程控制(顺序结构,选择结构,循环结构)

一.选择结构 1.if 特点: 同一时刻,只有一个大括号里面的代码会被执行 2,switch 特点 默认情况下,只有一个case后面的代码会被执行 如果一个case后面没有break,而且这个case成立,就会被顺序执行后面所有case中的语句,知道遇到break为止 如果要在case后面定义一个新的变量,必须用大括号{}包住 二.循环结构 1,while 2,do while 特点:不管条件是否成立,至少会执行一次循环体 3,for 选择::::一般优先使用for循环 然后考虑while 最后

shell条件测试,运算符,选择结构,for循环结构

一.shell条件测试      man bash  //查看帮助 条件测试的命令 test 选项 文件名或目录名 或 [ 选项 文件名或目录名 ] 例: [ -e /etc/passd ] 文件状态 -f              //判断是不是文件,是文件为真 -d //判断是不是目录,是目录为真 -e //判断是不是存在,存在为真 -r //判断是否可以阅读,可以阅读为真 -w //判断是否可写,可写为真 -x //判断是否可执行,可执行为真 -l //判断是否为链接,是链接为真 数值比较

C语言---选择结构和循环结构

C语言的两种选择语句,1) if语句; 2) switch语句; 在if判断语句中,一般使用关系表达式. 关系运算符: <.<=.>.>=.==.!= 关系表达式:用关系运算符将两个或多个数值连起来. 当需要将多个关系表达式进行逻辑运算时, 逻辑运算符: &&.||.! 逻辑表达式: 用逻辑运算符联系多个关系表达式. C99中新定义过一种逻辑型变量,_Bool,需要使用头文件stdbool.h #include<stdbool.h> _Bool a,b;

bash中选择结构、循环结构与break、continue

if两种选择结构 if 测试条件; then 程序块 else 程序块 fi if 测试条件1; then 程序块 elif 测试条件2; then 程序块 ... elif 程序条件n; then 程序块 else 程序块 fi case选择结构 case 变量 in 情况1) 程序块 ;; 情况2) 程序块 ;; ... 情况n) 程序块 ;; *) 程序块 ;; esca for循环结构 for 变量 in 列表; do 程序块 done while循环结构 while 测试条件; do