7/18 选择结构程序设计

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!。

与上方的习题28原理相同。% n(中间加个空格)可跳过换行符 \n。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值