【C语言入门】笔记三 (分支结构)

3.1 

3.1.2 二分支结构和if-else语句

二分支结构

...
if(表达式){
    表达式为真时执行的语句
}else{
    表达式为假时执行的语句
}
...
...
if(表达式){
    表达式为真时执行的语句
}
...

if-else语句

if(表达式1){
	语句1 
} else if (表达式2){
	语句2 
}
...
 else if (表达式n-1) {
	语句n-1 
} else {
	语句n 
} 

练习3-2

输入整数x,计算输出下列分段函数sign(x)的值(不好放图就不展现了)

(x<0,y=-1;x=0,y=0;x>0,y=1)

#include <stdio.h>
int main(void){
	int x,y;
	printf("输入整数x\n");
	scanf("%d",&x);
	if (x<0){
		y=-1;
	}else if(x==0){
		y=0;
	}else{
		y=1;
	}
	printf("sign(%d)=%d",x,y);
	return 0; 
}

练习3-3

统计学生平均成绩与及格人数:输入一个正整数n,再输入n个学生的成绩,计算平均成绩,并统计所有及格学生的人数。

#include <stdio.h>
int main(void){
	double score,all=0,average=0;
	int n,win=0,i;
	scanf("%d",&n);
	for (i=1;i<=n;i++){
		scanf("%lf",&score);
		all=all+score;
		if(score>=60){
			win++;
		}
	}
    if(n!=0){
        average=all/n;
    }
	printf("average = %.1f\n",average);
	printf("count = %d",win);
	return 0;
}

3.2

3.2.2 字符型数据

  • 字符型常量,用一对单引号及其所括起来的字符表示(注:1是整数,'1'是字符)
  • 字符型变量,定义时用类型名char,char op;

3.2.3 字符类型数据的输入和输出

  1. scanf(),printf()就不介绍惹~
  2. 字符输入函数getchar(),调用getchar()可以从键盘输入一个字符,如果ch是字符类型,调用格式为:ch=getchar(); 即从键盘上输入一个字符赋值给ch
  3. 字符输出函数putchar(),调用putchar()可以输出一个字符,一般格式为putchar(输出参数);,即输出参数是字符变量或常量

注:getchar()putchar()只能输入或输出一个字符,处理多个字符要多次调用

3.2.4 逻辑运算符

恰巧笔记二中写了,这里还是重新粘贴出来吧:

  1. 运算符 "&&" :逻辑与
  2. 运算符 "||" :逻辑或
  3. 运算符 "!" :逻辑非

练习3-4

统计字符,输入正整数n,再输入n个字符,统计英文字母、空格或回车、数字字符和其他字符的个数

#include <stdio.h>
int main(void){
	int i,letter=0,blank=0,digit=0,other=0,n;
	char ch;
	for(i=1;i<=10;i++){
		ch=getchar();
		if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
			letter++;
		}else if(ch>='0'&&ch<='9'){
			digit++;
		}else if(ch==' '||ch=='\n'){
			blank++;
		}else{
            other++;
        }
	} 
	printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
	return 0;
}

这里要设置变量他们的默认值为0

练习3-5

输出21世纪中截至某个年份之前的所有闰年年份

#include <stdio.h>
int main(void){
	int year,i,result=0;
	scanf("%d",&year);
	if((year<2001)||(year>2100)){  //这里依据"2000年是20世纪的结束之年,2001年是21世纪的开始之年"以此类推的观点判断是否在21世纪内
        result=-1;
		printf("Invalid year!"); 
	}else{
		for(i=2001;i<=year;i++){
			if((i%4==0&&i%100!=0)||(i%400==0)){
                result=1;
				printf("%d\n",i);
			}
		}
	}
    if(result==0){
        printf("None");
    }
	return 0;
}

3.3

3.3.2 switch语句

...
switch(表达式){
	case 常量表达式1: 语句1; break;
	case 常量表达式2: 语句2; break;
	...
	case 常量表达式n: 语句n; break;
	default: 语句n+1; break; 
}
...

其中,break语句表示跳出switch语句。(应该是这样吧,hhh)

switch语句中default可忽略,忽略后,当表达式中的值与任何一个常量表达式的值都不相等时,就什么也不执行。

例3-10

#include <stdio.h>
int main(void){
	int blank,digit,i,n,other;
	char ch;
	
	blank=digit=other=0;
	printf("Enter n:");
	scanf("%d",&n);
	getchar();
	printf("Enter %d characters:",n);
	for(i=1;i<=n;i++){
		ch=getchar();
		switch(ch){
			case ' ':case' \n':blank++;break;
			case'0':case'1':case'2':case'3':case'4':
			case'5':case'6':case'7':case'8':case'9':
				digit++;break;
			default:other++;
			
		}
	}
	printf("blank=%d, digit=%d, other=%d\n",blank,digit,other);
	return 0; 
} 

这里' '' \n'公用一个语句段,同时'0'-'9'也公用一个语句段。当公用语句段时可以类似这样写。

if(表达式1)
    if(表达式2)语句1;
else        /* 与哪一个if匹配? */
    if(表达式3)语句2;
    else 语句3;

注:else与if的匹配准则:else与最靠近它的、没有与其他的else匹配过的if相匹配,虽然第一行的if与第三行的else对齐,但是它与第二行的if对应,因为它们的距离最近。

练习3-6

答:(简述)当switch语句中的所有break去掉后,即不能跳出switch语句,最后的查询结果为最后的case(无default)或者default(有default)的值。

练习3-7

成绩转换:输入一个百分制成绩,将其转换为五分制成绩(规则:>=90分为A,<90分且>=80分为B,<80分且>=70分为C,<70分且>=60分为D,<60分为E)

#include <stdio.h>
int main(void){
	double score1;
	char score2;
	printf("输入成绩:");
	scanf("%lf",&score1);
	if(score1>=90){
		score2='A';
	} else if(score1<90&&score1>=80){
		score2='B';
	} else if(score1<80&&score1>=70){
		score2='C';
	} else if(score1<70&&score1>=60){
		score2='D';
	} else {
		score2='E';
	}
	printf("五分制成绩为:%c",score2);
	return 0;
}

这里应该不能用switch语句,因为case后接的是常量表达式,不能接其他表达式

(没说错吧??Σ(っ °Д °;)っ

练习3-8

查询四种水果的单价,有苹果、梨子、橘子和葡萄,单价分别为3.00、2.50、4.10和10.20(元/千克),屏幕上显示以下菜单,查询次数超过五次自动退出,显示水果单价保留一位小数,输入0退出查询,输入其他编号显示0。

#include <stdio.h>
int main(void){
	double price;
	int num,i;
	printf("[1] apple\n");
	printf("[2] pear\n");
	printf("[3] orange\n");
	printf("[4] grape\n");
	printf("[0] exit\n");
	for (i=1;i<=5;i++){
		scanf("%d",&num);
		if(num==0){
			break;
		}
		switch(num){
			case 1:price=3.00;break;
			case 2:price=2.50;break;
			case 3:price=4.10;break;
			case 4:price=10.20;break;
			default:price=0;break;
		}
		printf("price = %.2f\n",price);
	}
	return 0;
} 

练习3-9

改写例3-4的代码,使用嵌套的if-else语句(例题的代码就不列出来惹~

#include <stdio.h>
int main(void){
	double x,y;
	printf("Enter x:");
	scanf("%lf",&x);
	if(x<0){
		y=0;
	}else{
		if(x<=15){
			y=4*x/3;
		}else{
			y=2.5*x-10.5;
		}
	}
	printf("f(%.2f)=%.2f\n",x,y);
	return 0;
}

练习3-10

在例3-11中,改写if语句前,y=x+1;和y=x+2; 这两条语句的执行条件是什么?改写后又是什么?

答:

  • 改前:y=x+1;的执行条件为x<1y=x+2;的执行条件为x<2x>=1
  • 改后:y=x+1;的执行条件为x<1y=x+2;的执行条件为x>=2

习题3

if语句等同

填空题中

if(a>50) printf("%d", a);
if(a>40) printf("%d", a);
if(a>30) printf("%d", a);

等同于

if(a>50){
	printf("%d",a);
	if(a>40){
		printf("%d",a);
		if(a>30){
			printf("%d",a);
		}
	}	
}

程序设计题1

输入三个整数,按从小到大顺序排出

#include <stdio.h>
int main(void){
	int a,b,c,f,s,t;
	printf("整数一:"); 
	scanf("%d",&a);
	printf("整数二:"); 
	scanf("%d",&b);
	printf("整数三:"); 
	scanf("%d",&c);
	if(a>b){
		f=a;
		s=b;
		if(b>c){ //a>b>c 
			t=c;
		}else{ //当b<c 
			if(a>c){ //a>c>b
				s=c;
				t=b;
			}else{ //当a<c c>a>b
				f=c;
				s=a;
				t=b;
			}
		}
	}else{ //a<b的情况 
		f=b;
		s=a;
		if(a>c){ //b>a>c
			t=c;
		}else{ //当a<c 
			if(b>c){ //b>c>a
				s=c;
				t=a;
			}else{ //当b<c c>b>a 
				f=c;
				s=b;
				t=a;
			}
		}
	}
	printf("顺序为:%d<%d<%d",t,s,f);
	return 0;
}

还有更优解咩? (°ー°〃)

程序设计题2

高速公路上,超出车道限速的10%罚款200元;超出50%吊销驾照,根据车速和限速自动判断对该机车的处理

#include <stdio.h>
int main(void){
	double set_speed,true_speed;
	printf("输入限制车速:");
	scanf("%lf",&set_speed);
	printf("输入实际车速:");
	scanf("%lf",&true_speed);
	if(set_speed>=true_speed||true_speed<=set_speed*1.1){
		printf("没有违规");
	}else if(set_speed*1.5>=true_speed&&true_speed>set_speed*1.1){
		printf("罚款200元!");
	}else{
		printf("吊销驾照!");
	}
	return 0; 
}

程序设计题3

出租车起步里程为3千里,起步费10元,超过10公里后,每公里2元,超过10公里以上部分加收50%的空驶补贴费,每公里3元;营运过程中若要求停车的,每5分钟2元计费(不足5分钟则不收费)。运价计费位数四舍五入,保留到元。输入行驶里程(公里)和等待时间(分钟),计算输出乘客应该支付的价格。

#include <stdio.h>
int main(void){
	double drive,money1,money2;
	int time;
	scanf("%lf",&drive);
	scanf("%d",&time); 
	if(drive<=3){
		money1=10;
	}else if(drive>3&&drive<=10){
        money1=10+(drive-3)*2;
    }else if(drive>=10){
		money1=10+14+(drive-10)*3;
	}
	money2=time/5*2;
	printf("%.0f",money1+money2);
	return 0;
} 

程序设计题4

输入正整数n,在输入n个学生的成绩,统计五分制成绩的分布。(规则:>=90分为A,<90分且>=80分为B,<80分且>=70分为C,<70分且>=60分为D,<60分为E)

#include <stdio.h>
int main(void){
	int i,n,a,b,c,d,e,score;
	a=b=c=d=e=0;
	printf("输入整数n:");
	scanf("%d",&n);
	printf("分别输入这 %d 个人的成绩:\n",n);
	for(i=1;i<=n;i++){
		scanf("%d",&score);
		if(score>=90){
			a++;
		}else if(score<90&&score>=80){
			b++;
		}else if(score<80&&score>=70){
			c++;
		}else if(score<70&&score>=60){
			d++;
		}else{
			e++;
		}
	}
	printf("A: %d 人, B: %d 人, C: %d 人, D: %d 人, E: %d 人",a,b,c,d,e);
	return 0;
}

程序设计题5

输入平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验他们能否构成三角形。如果能,则输出周长和面积(保留两位小数);否则输出"Impossible"。

#include <stdio.h>
#include <math.h>
int main(void){
	double x1,x2,x3,y1,y2,y3,ab,bc,ac,area,s,c;
	printf("输入三个点的坐标[例如(5,6)则输入5 6]\n");
	printf("第一个点:");
	scanf("%lf %lf",&x1,&y1);
	printf("第二个点:");
	scanf("%lf %lf",&x2,&y2); 
	printf("第三个点:");
	scanf("%lf %lf",&x3,&y3);
	ab=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
	bc=sqrt(pow(x1-x3,2)+pow(y1-y3,2));
	ac=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
	if(ab+bc<=ac||ab+ac<=bc||bc+ac<=ab){
		printf("Impossible");
	}else{
		c=ab+bc+ac;
		s=(ab+bc+ac)/2;
		area=sqrt(s*(s-ab)*(s-bc)*(s-ac));
		printf("周长为:%.2f\n",c);
		printf("面积为:%.2f",area);
	}
	return 0;
}

这里主要是坐标中两点间的距离公式 ab=\sqrt{(x1-x2)^{2}+(y1-y2)^{2}},以及书中提供的面积公式

- 第三章,END -

整理自书籍《C语言程序设计》

如有错误,欢迎纠正!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值