《算法笔记》2.3选择结构 2.4循环结构

本文详细介绍了C语言中的选择结构(包括if语句与嵌套)和循环结构(while, do...while, for以及break, continue语句)。配合丰富的练习题,如一元二次方程求根、比较交换数值、连续自然数求和、求圆周率等,深入理解并巩固了这些基本概念和技巧。同时也提醒读者注意输入输出格式、错误排查方法以及编程细节,如变量的作用域、全角字符问题和浮点型数据处理。" 106092807,7337250,电商平台模板管理:品牌与规格的关联实现,"['前端开发', '后端开发', '数据库设计', 'Web应用']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、学习概览

2.3选择结构

2.3选择结构
2.3.1if语句
2个简化小技巧
2.3.2if语句的嵌套
2.3.3switch语句
分支较多时使用
case的执行内容不用加大括号
break在于跳出switch循环

2.3.1if语句

2个简化小技巧
省略“!=0”
省略“==0”,并在表达式前添加非运算符“!”

2.3.2if语句的嵌套

if(条件A){
...
} else if(条件B){
...
} else{
...
}

2.4循环结构(3种循环语句)

2.4循环结构
2.4.1while语句
比起do...while更实用
2.4.2do...while语句
2.4.3for语句
使用频率最高
逻辑清晰
方便检查
2.4.4break和continue语句
break的两种使用场景
退出switch
退出三种循环
写在if后面表示暂停

2.4.1while语句

  1. while和if都是:只要条件A成立,就反复执行省略号的内容。

2.4.2do…while语句

  1. do…while语句的while后面是括号(),末尾要加分号;
do{
...
}while(条件A);

2.4.3for语句

  1. for循环3个语句之间是分号;
    for循环
  2. i为奇数
    i%2==1;
  1. for里面声明的只在for里有效,要想在整个代码使用,要在一开始就声明。且不要重复声明。

2.4.4break和continue语句

  1. 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;
}

2.09

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

2.10

【总结】

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

3.11

感觉有点太复杂了。

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

2.12

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

2.14

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

2.15

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

2.16

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

2.18

[Error] stray ‘\243’ in program

出现这类问题时,需要根据提示错误的行数,找到对应行,然后重点查找以下几个方面:
1 是否存在汉字。
2 是否存在汉语标点。
3 是否有全角英文字符。

对于这一点,需要注意的是全角的空格,由于空格的不可见性,全角空格比较难查,当无法查到有显式的错误符号时,可以尝试删除所有空格,重新编译。

F 例题5-6 矩阵输出

【总结】

  1. 数组名与数组元素名的表示区别。
  2. 语句先后顺序:先写的先执行。
#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的近似值

【总结】

  1. 先加还是先判断的解决方法。
  2. 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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值