7/18 选择结构程序设计:
针对scanf函数用户输入错误的情况:
int main(void)
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d+%d=%d\n",i,j,i+j);
return 0;
}
当用户输入的不是数时,打印结果为随机数,要检测用户输入的数是否为数:
int main(void)
{
int i,j;
int ret;
ret=scanf("%d%d",&i,&j);
printf("%d\n",ret);
printf("%d+%d=%d\n",i,j,i+j);
return 0;
}
运行结果:
linux@ubuntu:~/learning/day_4$ gcc -otest test.c
linux@ubuntu:~/learning/day_4$ ./test
asb 12 //字符无法被识别为数字,导致缓存区被占用,无法识别第二串字符12,导致返回值为0.。
0
21947+-1757011264=-1756989317
linux@ubuntu:~/learning/day_4$ ./test
12 abc
1
12+67631568=67631580
ret:scanf的返回值表示正确输入的个数。
int main(void)
{
int i,j;
int ret;
ret=scanf("%d%d",&i,&j);
while(ret !=2) //while() while循环,当满足空格内条件时持续循环,不满足空格内条件时跳出循环
{
printf("erro!input again \n");
ret=scanf("%d%d",&i,&j);
}
printf("%d+%d=%d\n",i,j,i+j);
return 0;
}
这时输入错误字符串时,程序不间断执行循环(陷入死循环)
如何解决?——使用getchar函数取输入的单个字符,直到取到\n,循环终止。
int main(void)
{
int i,j;
int ret;
ret=scanf("%d%d",&i,&j);
while(ret !=2) //while() while循环,当满足空格内条件时持续循环,不满足空格内条件时跳出循环
{
printf("erro!input again \n");
while(getchar() !='\n')
{
}
ret=scanf("%d%d",&i,&j);
}
printf("%d+%d=%d\n",i,j,i+j);
return 0;
}
运行结果:
linux@ubuntu:~/learning/day_4$ gcc -otest test.c
linux@ubuntu:~/learning/day_4$ ./test
123 asdf
erro!input again
123 344
123+344=467
linux@ubuntu:~/learning/day_4$ ./test
asd 123
erro!input again
习题
19语句:printf(“%03d,%-3d\n”,4,5);的输出为 ()
(A)004,5 (B)004,5
(C)4,5 (D)4,5
A
21若变量c定义为float类型,当从终端输入283.1900 (代表回车键),能给变量c赋以283.19的输入语句是
A)scanf(“%f”,c); B)scanf(“%8.4f”,&c);
C)scanf(“%6.2f”,&c); D)scanf(“%8f”,&c);
SCANF函数输入小数时,禁止指定小数位数宽度
选择D
22设有如下程序段
int x=2002,y=2003; printf(“%d\n”,(x,y));
则以下叙述中正确的是 ()
A)输出语句中格式说明符的个数少于输出项的个数,不能正确输出
B)运行时产生出错信息
C)输出值为2002 D)输出值为2003
考察逗号运算符的赋值顺序(从左往右)
23以下程序的输出结果是 。
#include <stdio.h> void main( ) {
int i=010,j=10;
printf(“%d,%d\n”,++i, j–); } ()
A)11,10 B)9,10 C)010,9 D)10,9
i=010 不是10,是八进制010,对应的是十进制的8
再考察了先加先减后加后减的概念
25.已知i、j、k为 int型变量,若从键盘输入:1,2,3<回车>,使i的值为1、j的值为2、k的值为3,以下选项中正确的输入语句是 ()
A)scanf(“%2d%2d%2d”, &i, &j, &k); B)scanf(“%d %d %d”, &i, &j, &k);
C)scanf(“%d,%d,%d”, &i, &j, &k); D)scanf(“i=%d,j=%d,k=%d”, &i, &j, &k);
C
注意逗号
28****若有定义:int x,y; char a,b,c; 并有以下输入数据(此处代表换行,代表空格):
1 2
A B C
则能给X赋整数1,给Y赋数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是()
A) scanf(“x=%d y=%d”,&x,&y); a=getchar(); c=getchar();
B) scanf(“%d%d”,&x,&y); a=getchar(); b=getchar(); c=getchar();
C) scanf(“%d%d%c%c%c”,&x,&y,&a,&b,&c);
D) scanf(“%d%d%c%c%c%c%c%c”,&x,&y,&a,&a,&b,&b,&c,&c);
D
int型输入空格作为分隔符,而char型输入空格作为一个字符输入,
解:选项 D 中,虽然有多余的 %c,但可以这样理解:%d 读取 1 和 2 后,输入指针在 \n,然后第一个 %c 读取 \n(给 a),第二个 %c 读取 A(给 a,覆盖),第三个 %c 读取 (给 b),第四个 %c 读取 B(给 b,覆盖),第五个 %c 读取 (给 c),第六个 %c 读取 C(给 c,覆盖)。这样最终得到正确的结果。所以 D 正确。
6、分析下面程序
main()
{ int x,y;
x=16;y=(x++)+x; printf(“%d ”,y);
x=15;printf(“%d,%d ”,++x,x);
x=20;y=x–+x; printf(“%d ”,y);
x=13;printf(“%d,%d”,x++,x);
}
程序的输出结果是_____。
5.1 关系运算符及其优先顺序:
c语言规定:逻辑的真假判断依据为:非0即为真。
一个int型,四字节32比特,有(2^32)种取值可能性,只有0这一种为假,其余都为真。
#include<stdio.h>
int main(void)
{
int i=10,j=20;
printf("%d\n",i<j);
return 0;
}
运行结果为1
i<j的返回值为1或0,数据类型为int型。
注意以下:
#include<stdio.h>
int main(void)
{
int i=-2,j=0;
printf("%d\n",-4<i<j);
return 0;
}
运行结果为0
-4<i,结果为1,1<j,结果为0.
所有关系运算符的结合方向都是自左向右。
逻辑运算符及其结合顺序:
(1)!逻辑 非
(2)&&逻辑与
(3)|| 逻辑或
优先级由非到或递减**
逻辑与&&:同真为真,存假为假
#include<stdio.h>
int main(void)
{
int i=10;
printf("%d\n",i>3&&i<20);
return 0;
}
关系运算符也用%d加以输出。
逻辑或||:存真为真,同假为假
~~
#include<stdio.h>
int main(void)
{
int i=30;
printf(“%d\n”,i<-3 || i>20);
return 0;
}
结果为1,真。
~~
判断输入字符大小写:
#include<stdio.h>
int main(void)
{
char c;
c = getchar();
c >='A'&&c <='Z';
return 0;
}
计算机协会强制规定:
#include<stdio.h>
int main(void)
{
int i=2;
int k;
k=i< -6 && ++i;
printf("%d\n",i)
return 0;
}
输出结果为: i=2
因为i<-6为假,结果等于0,为了提高c语言的工作效率,不再执行后方的++i,所以i的值不发生变化。
若要结果为3,则这样修改代码:
#include<stdio.h>
int main(void)
{
int i=2;
int k;
k=i< -6 &||++i; //使用或||,单真为真,程序不再被截断。
printf("%d\n",i)
return 0;
}
if语句:
int main(void)
{
int i =10;
if(i>0)
{
printf(">0\n");
}
return 0;
}
注意if和花括号之间不能空行,if()后不能接;
等式比较:
int main(void)
{
int i =10;
if(i==100)
{
printf("=0\n");
}
return 0;
}
等式比较在if后括号内不能用单等号(赋值)
课内代码:
判断一个数能否被5整除:
#include<stdio.h>
#if 0
int main(void)
{
int z;
scanf("%d",&z);
if(z%5==0)
{
printf("real\n");
}
return 0;
}
#endif
判断输入是否为小写字符并将输入的大写字符转为小写字符
getchar函数获得的是运行代码时输入的字符串的ASCII编码,单引号括上字符串一样可以实现这个功能。
#if 0
int main(void) //判断输入是否为小写字符并将输入的大写字符转为小写字符
{
char z;
z=getchar();
if(z>=97&&z<=122) //if(z>='a'&&z<='z')
{
printf("输入为小写字符\n");
}
else
{
z=z+32;
putchar(z);
putchar('\n');
printf("输入的是大写字符,已经转为小写字符\n");
}
return 0;
}
#endif
输入年号并判断该年是闰年还是平年:
#if 0
int main(void)
{
int year;
scanf("%d",&year);
if(year%4==0&&year%100!= 0 || year%400==0)
{
printf("闰年\n");
}
else
{
printf("平年\n");
}
return 0;
}
#endif
找到三个数里的最大值,if+else
#if 0
int main(void) //输入三个数并找到最大值。
{
int max,i,j,k;
scanf("%d",&i);
scanf("%d",&j);
scanf("%d",&k);
if(i>j)
{
max=i;
}
else
{
max=j;
}
if(max<k)
{
max=k;
}
printf("max=%d\n",max);
return 0;
}
#endif
判断输入字符的类型:if ——else if————else
#if 0
int main(void)
{
char input;
input=getchar();
if(input>='A'&&input<='Z')
{
printf("输入为大写字符\n");
}
else if(input>='a'&&input<='z')
{
printf("输入为小写字符\n");
}
else if(input>=48&&input<=57) //else if(input>='0'&&input<='9')
{
printf("输入为数字0到9\n");
}
else
{
printf("为其他字符\n");
}
return 0;
}
#endif
输入年月查询该月的天数:
注意输入月份的值范围,对超过该值范围的情况进行处理。(return -1)
#if 0
int main(void)
{
int year,month,days;
printf("请依次输入要查询天数的年和月\n");
scanf("%d",&year);
scanf("%d",&month);
if(1>month||12<month)
{
printf("error!");
return -1;
}
if(1==month||3==month||5==month||7==month||8==month||10==month||12==month)
{
days=31;
}
else if(4==month||6==month||9==month||11==month)
{
days=30;
}
else if(2==month)
{
if(year%4==0&&year%100!= 0 || year%400==0)
{
days=29;
}
else
{
days=28;
}
}
printf("%d\n",days);
return 0;
}
#endif
需要熟悉switch——case语句结构
switch表达式数据类型必须接整型或整型相关量,case后必须接常量。
#if 0
int main(void)
{
int month,days,year;
scanf("%d",&year);
scanf("%d",&month);
switch(month)
{
case 1 :
case 3 :
case 5 :
case 7 :
case 8 :
case 10 :
case 12:
days=31;
break;
case 4 :
case 6 :
case 9 :
case 11 :
days=30;
break;
case 2 :
if(year%4==0&&year%100!= 0 || year%400==0)
{
days=29;
}
else
{
days=28;
}
break;
default:
days=-1;
break;
}
if(days<0)
{
printf("error");
}
else
{
printf("%d\n",days);
}
return 0;
}
#endif**
从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,例如,输入a,则输出b。如果输入的字符不在26个英语字母中,则显示输入数据有误,如果输入的字符是z或Z,则输出a或A。
#if 0
int main(void)
{
char i;
i=getchar();
if(i=='z')
{
i='a';
}
else if(i=='Z')
{
i='A';
}
else
{
i=1+i;
}
putchar(i);
return 0;
}
#endif
2、编写一个程序能读入两个数和一个运算符(+ - * /),打印出计算结构。
int main()
{
char symbol;
float a,b,c;
scanf("%f",&a);
scanf("%f",&b);
scanf(" %c",&symbol);
if(symbol=='+')
{
c=a+b;
printf("%f\n",c);
}
else if(symbol=='-')
{
c=a-b;
printf("%f\n",c);
}
else if(symbol=='*')
{
c=a*b;
printf("%f\n",c);
}
else if(symbol=='/')
{
if(b==0)
{
printf("除数不能为0!\n");
}
else
{
c=a/b;
printf("%f\n",c);
}
}
else
{
printf("error!");
}
return 0;
}
不清楚为什么%空格c:
当你执行 scanf(“%f”, &b); 读取第二个浮点数之后,输入缓冲区里会留存一个换行符 \n(这个换行符是用户按下回车键产生的)。接下来,scanf(“%c”, &symbol); 会直接读取这个换行符,而不会等待用户输入运算符。这就使得 symbol 的值变成了换行符 ‘\n’,进而导致程序执行 else 分支,输出 error!。