《算法笔记》2.3选择结构 2.4循环结构
一、学习概览
2.3选择结构
2.3.1if语句
2.3.2if语句的嵌套
if(条件A){
...
} else if(条件B){
...
} else{
...
}
2.4循环结构(3种循环语句)
2.4.1while语句
- while和if都是:只要条件A成立,就反复执行省略号的内容。
2.4.2do…while语句
- do…while语句的while后面是括号(),末尾要加分号;。
do{
...
}while(条件A);
2.4.3for语句
- for循环3个语句之间是分号;
- i为奇数
i%2==1;
- for里面声明的只在for里有效,要想在整个代码使用,要在一开始就声明。且不要重复声明。
2.4.4break和continue语句
- if与break
if(sum>=2000) break;
二、2.3练习
A 例题4-1 一元二次方程求根
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,r1,r2;
scanf("%lf%lf%lf",&a,&b,&c);
if(a){
if((b*b)-(4*a*c)<0){
printf("No real roots! \n");
}
else{
r1 = ((-b) + sqrt(b*b - 4*a*c))/(2*a);
r2 = ((-b) - sqrt(b*b - 4*a*c))/(2*a);
printf("r1=%.2f\n",r1);
printf("r2=%.2f",r2);
}
}
else
{
printf("a不能等于0,请重新输入参数!");
}
return 0;
}
B 例题4-2 比较交换实数值
#include <stdio.h>
#include <math.h>
int main(){
double a,b;
scanf("%lf%lf",&a,&b);
if((a+(-b))<0){
printf("%.2f %.2f\n",a,b);
} else {
printf("%.2f %.2f\n",b,a);
}
return 0;
}
【总结】
scanf需要取地址符,printf不需要哦。(不是不需要,加了&会输出成变量的地址)
C 例题4-3 比较交换3个实数值,并按序输出
#include <stdio.h>
#include <math.h>
int main(){
double a,b,c,k=0;
scanf("%lf%lf%1lf",&a,&b,&c);
if(a>b){
k=a;
a=b;
b=k;
}//make a<b
if(b>c){
k=b;
b=c;
c=k;
} //make b<c,max=c
if(a>b){
k=a;
a=b;
b=k;
} //make a<b
printf("%.2f %.2f %.2f\n",a,b,c);
return 0;
}
感觉有点太复杂了。
D 习题4-4 三个整数求最大值
#include <stdio.h>
#include <math.h>
int main(){
int a,b,c,k=0;
scanf("%d%d%d",&a,&b,&c);
if(a>b){
k=a;
a=b;
b=k;
}//make a<b
if(b>c){
k=b;
b=c;
c=k;
} //make b<c,max=c
if(a>b){
k=a;
a=b;
b=k;
} //make a<b
printf("%d\n",c);
return 0;
}
E 习题4-10-1 奖金计算
【总结】
见注释
#include <stdio.h>
#include <math.h>
int main(){
double I,R;
double I1=100000,I2=200000,I3=400000,I4=600000,I5=1000000;
scanf("%lf",&I);
if(I>0&&I<=I1){ //不可以写成0<I<I1
R=I*(10.00/100.00);//不可以写成10/100,会输出0
}
else if(I>I1&&I<=I2){
R=I1*(10.00/100.00)+(I-I1)*(7.50/100.00);
}
else if(I>I2&&I<=I3){
R=I1*(10.00/100.00)+I2*(7.50/100.00)+(I-I2)*(5.00/100.00);
}
else if(I>I3&&I<=I4){
R=I1*(10.00/100.00)+I2*(7.50/100.00)+I3*(5.00/100.00)+(I-I3)*(3.00/100.00);
}
else if(I>I4&&I<=I5){
R=I1*(10.00/100.00)+I2*(7.50/100.00)+I3*(5.00/100.00)+I4*(3.00/100.00)+(I-I4)*(1.50/100.00);
}
else {
R=I1*(10.00/100.00)+I2*(7.50/100.00)+I3*(5.00/100.00)+I4*(3.00/100.00)+I5*(1.50/100.00)+(I-I5)*(1.00/100.00);
}
printf("%.2f\n",R);
return 0;
}
三、2.4练习
A 例题5-1-1 连续自然数求和
#include <stdio.h>
#include <math.h>
int main(){
int i=1,sum=0;
while(i<=100){
sum=sum+i;
i++;
}
printf("%d\n",sum);
return 0;
}
B 例题5-1-2 连续自然数求和
#include <stdio.h>
#include <math.h>
int main(){
int i=1,sum=0;
do{
sum=sum+i;
i++;
}while(i<=100);
printf("%d\n",sum);
return 0;
}
C 例题5-1-3 连续自然数求和
#include <stdio.h>
#include <math.h>
int main(){
int sum;
for(int i=1;i<=100;i++){
sum=sum+i;
}
printf("%d\n",sum);
return 0;
}
D 例题5-1-4 使用break语句对连续自然数求和
#include <stdio.h>
main(){
int n=1,N,sum=0;
scanf("%d",&N);
while(1){//造成无限循环
if(n>N) break;//跳出循环的条件
sum+=n;
n++;
}
printf("%d\n",sum);
}
【总结】
输入scanf不要换行。
scanf("%d\n",&N);
E 例题5-1-5 连续自然数求和
#include <stdio.h>
#include <math.h>
int main(){
int sum=0,i;
for(i=1;i<=100;i++){
sum=sum+i;
if(sum>1000) break;
}
printf("%d\n",i);
return 0;
}
[Error] stray ‘\243’ in program
出现这类问题时,需要根据提示错误的行数,找到对应行,然后重点查找以下几个方面:
1 是否存在汉字。
2 是否存在汉语标点。
3 是否有全角英文字符。
对于这一点,需要注意的是全角的空格,由于空格的不可见性,全角空格比较难查,当无法查到有显式的错误符号时,可以尝试删除所有空格,重新编译。
F 例题5-6 矩阵输出
【总结】
- 数组名与数组元素名的表示区别。
- 语句先后顺序:先写的先执行。
#include <stdio.h>
int main(){
int a[4][5]={{1,2,3,4,5},{2,4,6,8,10},{3,6,9,12,15},{4,8,12,16,20}};
for(int i=0;i<=3;i++){ //数组名a[i+1][j+1],数组元素名a[i]a[j],且i/j从o0开始。
for(int j=0;j<=4;j++){
printf("%3d",a[i][j]);
if(j==4) printf("\n"); //两句的先后也要考量
}
}
return 0;
}
G 例题5-7 求圆周率pi的近似值
【总结】
- 先加还是先判断的解决方法。
- i就用int就行。
Not found in current content解决方法
DevC++添加变量时无法监控:把局部变量改到全局变量定义。
double PI,a=1,sum=0;
for(double i=0;a>=(pow(10,-6));i++){
a=1.0/(2.0*i+1);
sum+=pow(-1,i)*a;
}
题目描述
用如下公式
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。
要求输出的结果总宽度占10位,其中小数部分为8位。
程序中使用浮点型数据时,请定义为双精度double类型。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).
输入
无
输出
PI=圆周率的近似值
输出的结果总宽度占10位,其中小数部分为8位。
末尾输出换行。
样例输入
无
样例输出
PI=3.14159065
错误代码1(多加了一次)
#include <stdio.h>
#include <math.h>
int main(){
double PI;
for(double i=0,a=1,sum=0;a>(pow(10,-6));i++){
a=1.0/(2.0*i+1);
sum+=pow(-1,i)*a;
//pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
//double pow(double x, double y);
PI=4.0*sum;
}
printf("PI=%10.8f\n",PI);
return 0;
}
正确代码1(通过调整赋值式子的顺序来避免先加再判断)
#include <stdio.h>
#include <math.h>
int main(){
double PI,a=1,sum=0;
for(int i=1;a>=(pow(10,-6));i++){
sum+=pow(-1,(i-1))*a;
a=1.0/(2.0*i+1);
//pow() 函数用来求 x 的 y 次幂(次方),x、y及函数值都是double型 ,其原型为:
//double pow(double x, double y);
}
printf("PI=%10.8f\n",4.0*sum);
return 0;
}
正确代码2(通过在等式中多加判断来避免sum的运行)
注意i、a的初值,以及到底是pow(-1,i)还是pow(-1,(i+1))
#include <stdio.h>
#include <math.h>
int main(){
double PI,a=1,sum=0;
for(int i=0;a>=(pow(10,-6));i++){
a=1.0/(2.0*i+1);
if(a<(pow(10,-6)))break;
sum+=pow(-1,(i))*a;
}
printf("PI=%10.8f\n",4.0*sum);
return 0;
}
H 例题5-8 Fibonacci数列
题目描述
输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。即:
F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
要求输入的正整数n不超过50.
输入
一个不超过50的正整数
输出
Fibonacci数列的第n个数,末尾输出换行。
样例输入
20
样例输出
6765
递归算法
#include <stdio.h>
#include <math.h>
int F(int n){
if(n<=0&&n>50) return -1;
else if(n==1||n==2) return 1;
else return F(n-1)+F(n-2);
}
int main(){
int n;
scanf("%d",&n);
printf("%d\n",F(n));
return 0;
}
循环结构
#include <stdio.h>
#include <math.h>
int main(){
int n,f1=1,f2=1,F;
scanf("%d",&n);
if(n<=0&&n>50){
printf("-1");
}
else if(n==1||n==2){
printf("%d",f1);
}
else{
for(int i=3;i<=n;i++){
F = f1 + f2;
f1 = f2;
f2 = F;
}
}
printf("%d\n",F);
return 0;
}
I 习题5-10 分数序列求和
2/1,3/2,5/3,8/5,13/8,21/13…求前二十项之和。
#include <stdio.h>
int main(){
int n;
double f1=1,f2=2,m,sum;
for(int i=1;i<=20;i++){
sum+=f2/f1;
m = f2;
f2 = f1+f2;
f1=m;
}
printf("%.6f\n",sum);
return 0;
}