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;
int n,win,i;
printf("输入学生数量:\n");
scanf("%d",&n);
printf("分别输入%d个学生的成绩:\n",n);
for (i=1;i<=n;i++){
scanf("%lf",&score);
all=all+score;
if(score>=60){
win++;
}
}
printf("平均分:%.1f\n",all/n);
printf("及格人数:%d",win);
return 0;
}
3.2
3.2.2 字符型数据
- 字符型常量,用一对单引号及其所括起来的字符表示(注:1是整数,'1'是字符)
- 字符型变量,定义时用类型名char,如char op;
3.2.3 字符类型数据的输入和输出
- scanf(),printf()就不介绍惹~
- 字符输入函数getchar(),调用getchar()可以从键盘输入一个字符,如果ch是字符类型,调用格式为:ch=getchar(); 即从键盘上输入一个字符赋值给ch
- 字符输出函数putchar(),调用putchar()可以输出一个字符,一般格式为putchar(输出参数);,即输出参数是字符变量或常量
注:getchar()和putchar()只能输入或输出一个字符,处理多个字符要多次调用
3.2.4 逻辑运算符
恰巧笔记二中写了,这里还是重新粘贴出来吧:
- 运算符 "&&" :逻辑与
- 运算符 "||" :逻辑或
- 运算符 "!" :逻辑非
练习3-4
统计字符,输入正整数n,再输入n个字符,统计英文字母、空格或回车、数字字符和其他字符的个数
#include <stdio.h>
int main(void){
int i,en=0,num=0,other=0,n;
char ch;
printf("输入字符个数n:\n");
scanf("%d",&n);
getchar(); //读入舍弃换行符
printf("请输入这%d个字符:\n",n);
for(i=1;i<=n;i++){
ch=getchar();
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
en++;
}else if(ch>='0'&&ch<='9'){
num++;
}else{
other++;
}
}
printf("英文字母%d个,数字%d个,其他%d个",en,num,other);
return 0;
}
这里要设置变量他们的默认值为0
练习3-5
输出21世纪中截至某个年份之前的所有闰年年份
#include <stdio.h>
int main(void){
int year,i;
printf("输入21世纪中的计算闰年的截至年份:\n");
scanf("%d",&year);
if((year<2001)||(year>2100)){ //这里依据"2000年是20世纪的结束之年,2001年是21世纪的开始之年"以此类推的观点判断是否在21世纪内
printf("输入的年份不在21世纪内");
}else{
printf("21世纪中截至%d年的闰年的所有年份如下:\n",year);
for(i=2001;i<=year;i++){
if((i%4==0&&i%100!=0)||(i%400==0)){
printf("%d\n",i);
}
}
}
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] apples\n");
printf("[2] pears\n");
printf("[3] oranges\n");
printf("[4] grapes\n");
printf("[0] Exit\n");
for (i=1;i<=5;i++){
printf("输入编号:");
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("价格为:%.1lf元/千克\n",price);
}
printf("Thanks for shopping~");
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<1;y=x+2;的执行条件为x<2且x>=1
- 改后:y=x+1;的执行条件为x<1;y=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;
printf("行驶里程(公里):");
scanf("%lf",&drive);
printf("等待时间(分钟):");
scanf("%d",&time);
if(drive<=3){
money1=10;
}else{
money1=10+(drive-3)*2+(drive-3)*3;
}
money2=time/5*2;
printf("车费:%.0lf 元",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("周长为:%.2lf\n",c);
printf("面积为:%.2lf",area);
}
return 0;
}
这里主要是坐标中两点间的距离公式?,以及书中提供的面积公式
- 第三章,END -
整理自书籍《C语言程序设计》
如有错误,欢迎纠正!
|