C语言程序设计————学习知识归纳总结(二)

流程控制【学习C语言的第一个重点】(程序代码执行的顺序)

前提说明:1.须关注流程;2.理解每条语句的功能;3.试数
一.顺序结构
1.字符数据输入与输出
2.格式输入与输出
3.顺序结构程序设计举例
二.选择结构
1.关系运算符和关系表达式
2.逻辑运算符和逻辑表达式
3.if语
4.switch语句
5.程序举例
三.循环结构
1.while语句
2.do…while
3.for循环
4.循环的嵌套
5.break语句和continue语句
6.程序举例
————————————————————————————————————————————————————————

一.顺序结构

1.字符数据的输入输出

putchar函数(字符输出函数)的作用是向终端输出一个字符,包括能显示的字符和控制字符
putchar(c)c的值可以是字符型变量或整型变量

# include 

void main()
{
	char a, b, c;
	a = 'B'; b = 'O'; c = 'Y';
	putchar(a);putchar(b);putchar(c);putchar('\n');
}
/*结果显示:BOY*/
			 

getchar函数(字符输入函数)的作用是从终端输入一个字符
getchar()

# include 

void main()
{
	char c;
	c = getchar()
    putchar(c);
	putchar('\n');
}
/*结果显示:输入a,显示a
注意:getchar函数只能接收一个字符,并将字符赋给一个字符变量或整型变量*/

2.格式输入与输出(基本的输入和输出函数的用法)

printf()------将变量的内容输出到显示器上
四种用法: 1.printf(“字符串\n”);
2.printf(“输出控制符”,输出参数);
3.printf(“输出控制符1 输出控制符2…”,输出参数1,输出参数2…);输出控制符和输出参数的个数必须一一对应
4.printf(“输出控制符 非输出控制符”,输出参数);

scanf() ------通过键盘将数据输入到变量中
两种用法: 1.scanf(“输入控制符”,输入参数);//将从键盘输入的字符转化为输入控制符所规定格式的数据,然后存入以输入参数的值为地址的变量中。
2.scanf(“非输入控制符 输入控制符”,输入参数);//非输入控制符必须原样输入

附加格式字符的说明
1.%d或者%ld(按十进制整型数据的实际长度输出);
%md(指定的输出字段的宽度,若数据位数小于m,左端补空格,大于m,按实际位数输出)
2.o格式符(以八进制整数形式输出)
3.u格式符(无符号数,以十进制整数形式输出)
4.x格式符(一十六进制数形式输出整数)
5.c格式符(用来输出一个字符)
6.%s(用来输出一个字符串)
%ms(输出的字符串占m列,字符本身长度大于m,全部输出,小于则左补空格)
%-ms (若小于m,则向左靠,右补空格)
%m.ns (输出占m列,但只取字符串中左端n个字符,在右侧左补空格)
%-m.ns(输出占m列,但只取字符串中左端n个字符,在左侧右补空格)

3.顺序结构程序设计举例

程序例子1

/*输入三角形的三边长,求三角形面积。设输入的三个边长a、b、c能构成三角形。
从数学知识已知求三角形面积的公式为area=sqrt(s*(s-a)*(s-b)*(s-c)),其中的s=a+b+c/2*/




# include 
# include 

void main()
{
	double a, b, c, s, area;/*定义三角形a,b,c,s和面积area的变量*/
    printf("请输入三角形边长a,b,c:"); /*提示用户输入三个系数*/
	scanf("%lf,%lf,%lf",&a, &b, &c);/*接收用户输入的系数*/
	s = 1.0/2 * (a+b+c);/*给表达式赋值*/
	area = sqrt(s*(s-a)*(s-b)*(s-c));/*area的表达公式*/
	printf("a=%7.2lf,  b=%7.2lf,  c=%7.2lf,  s=%7.2lf\n",a, b, c, s);/*输出a,b,c,s的值*/
	printf("area=%7.2f\n",area);/*输出面积的值*/

}

程序举例二

/*求ax^2+bx+c=0方程的根。a,b,c由键盘输入,设D=b^2-4ac>0。
一元二次方程方程的根为:x1 = (-b + √D) / 2a ;x2= (-b - √D) / 2a ;
可化为p=-b/2a,,q=根号b^2-4ac/2a;
x1=p+q,x2=p-q*/




# include 
# include 

void main()
{
	double a, b, c, disc, x1, x2, p, q;  /*定义系数变量,根变量和表达式的变量值*/
    printf("请输入三个系数a,b,c:"); /*提示用户输入三个系数*/
    printf("\n");                             
	scanf("a=%lf, b=%lf, c=%lf",&a, &b, &c); /*接收用户输入的系数*/
	disc = b*b - 4*a*c; /*给表达式赋值*/
	p = -b / (2*a); /*给表达式赋值*/
	q = sqrt(disc) / (2*a); /*给表达式赋值*/
	x1 = p + q;/*根1的值*/
	x2 = p - q;/*根2的值*/
	printf("x1 = %5.2f\nx2 = %5.2f\n",x1 , x2);/*输出两个根的值*/
}

二.选择结构

1.关系运算符的优先级低于算术运算符高于赋值运算符(见学习知识归纳总结一)

2.逻辑运算符和逻辑表达式

逻辑运算符
逻辑非(!)→逻辑与(&&)→逻辑或(||)(优先次序)

3.if语句

1.if语句的三种形式
if(表达式)
语句;

if(表达式)
语句1;
else
语句2;

if(表达式1)
语句1;
else if(表达式2)
语句2;

else
语句n;
2.if 的范围问题(当然也包括后续的else if 和else)
只能含有一条语句,含多条语句以上需要花括号{}组成一个复合语句
if 语句的程序举例如下

# include 

void main()
{
	float a, b, c, t;
	scanf("%f,%f,%f",&a,&b,&c);
	if(a>b)
	{
		t=a;
		a=b;
		b=t;
	}//上一个花括号的意思是如果a>b,以t为中间变量,将a赋给t,b赋给a,最后将t赋给b,完成排序
	if(a>c)
	{
		t=a;
		a=c;
		c=t;
	}
	if(b>c)
	{
		t=b;
		b=c;
		c=t;
	}
	printf("%5.2f,%5.2f%5.2f\n",a,b,c);
}
/*上面程序意思为输入三个数,要求由小到大的顺序排序,结果显示:输入3,7,1,显示 1.00, 3.00, 7.00*/

小专题 条件运算符
max=(a>b)?a:b;
等价于
if(a>b)
max=a;
else
max=b;
注意:三目运算符,结合方向自右至左,优于赋值运算符。

4.switch语句

switch(表达式)//表达式的值可以是整型,字符型,枚举型数据
{
case 常量表达式1:
语句1;
case 常量表达式2:
语句2;

case 常量表达式n:
语句n;
default:
语句n+1;
}

switch程序举例如下

# include 

void main()
{
	char grade;
	scanf("%c",&grade);
	switch(grade)
	{
	case 'A':
		printf("85~100\n");
		break;
    case 'B':
		printf("70~84\n");
        break;
    case 'C':
		printf("60~69\n");
        break;
    case 'D':
		printf("<60\n");
        break;
	default:
		printf("error\n");



	}

}
/*输入等级,找到相对应的入口,显示成绩区间,case 常量表达式就相当于入口,至于程序中的break后续会详细介绍*/

5.选择结构程序举例

程序例子1

# include 

void main()
{
	int year, leap;
	scanf("%d",&year);
	if(year%4 == 0)
	{
		if(year%100 == 0)
		{
			if(year%400 == 0)
				leap = 1;
			else
				leap = 0;
		}
		else
			leap = 1;
	}
	else
		leap = 0;
	if(leap)
		printf("%d is ", year);
	else
		printf("%d is not", year);
	printf("a leap year .\n");
}
/*判断闰年被四百年整除*/
/*第6~19行可改成以下语句:
if(year%4 = 0)
leap = 0;
else if(year%100! = 0 )
leap = 1;
else if(year%400! = 0)
leap = 0'
else
leap = 1;
或者
if((year%4 == 0 && year%100! = 0)||(year%400 == 0))
leap = 1;
else
leap = 0;*/

程序例子2

/*1.a=0,不是二次方程
2.b^2-4ac=0,有两个相等的实数根
3.b^2-4ac>0,有两个不等实根
4.b^2-4ac<0,有两个共轭复根*/





# include 
# include 

void main()
{
	double a, b, c, disc, x1, x2, realpart, imagpart;//realpart(实部p) imagpart(虚部q)
	scanf("%lf,%lf,%lf", &a, &b, &c);
	printf("The equation");
	if(fabs(a) <= 1e-6)//判断a=0
		printf("is not a quadratic");
	else
	{
		disc = b*b - 4*a*c;
		if(fabs(disc) <= 1e-6)//判断disc=0
			printf("has two equal roots:%8.4lf\n",-b/(2*a));
		else if(disc > 1e-6)
		{
			x1 = (-b + sqrt(disc)) / (2*a);
            x2 = (-b - sqrt(disc)) / (2*a);
			printf("has distinct real roots: %8.4lf and %8.4lf\n", x1, x2);
		}
		else
		{
			realpart = -b / (2*a);
			imagpart = sqrt(-disc) / (2*a);
			printf("has complex roots :\n");
			printf("%8.4lf + %8.4lfi\n",realpart , imagpart);
            printf("%8.4lf - %8.4lfi\n",realpart , imagpart);//算实部与虚部
		}	

	}
}

三.循环结构

1.while语句

# include 

void main()
{
	int i, sum = 0;
	i=1;
	while(i<=100)//while(表达式)用于控制循环的次数
	{
		sum = sum + i;//while语句的使用范围
		i++;
	}
	printf("%d\n",sum);

}
/*1+2+......+100=5050;累加*/
			 

2.do…while语句

# include 

void main()
{
	int i, sum = 0;
	i=1;
	do
	{
		sum = sum + i;//do...while语句的使用范围
		i++;
	}
	while(i<=100);//do...while(表达式)用于控制循环的次数
	printf("%d\n",sum);

}
/*1+2+......+100=5050;累加*/
		

	 

专题 while语句和do…while语句的循环比较

# include 

void main()
{
	int sum = 0, i;
	scanf("%d",&i);
	while(i<=10)
	{
		sum = sum + i;
		i++;
	}

	printf("sum = %d\n",sum);

}
/*运行情况如下: i=1     sum=55;
                 i=11    sum=0;*/
			 
# include 

void main()
{
	int sum = 0, i;
	scanf("%d",&i);
	do
	{
		sum = sum + i;
		i++;
	}
	while(i<=10);
	printf("sum = %d\n",sum);

}
/*运行情况如下: i=1     sum=55;
                 i=11    sum=11;*/
			 

3.for循环

for(循环变量赋初值;循环条件;循环变量增值)语句;

# include 

void main()
{
	int i;
	int sum = 0;
	for(i=1;i<=4;i++)
		sum = sum + i;
	printf("sum=%d\n",sum);
}
/*i=1先执行,判断i<=4,然后进行累加,再i++,按照这个模式依次进行*/
			 

4for循环的多层嵌套

三种主要形式:1.for(1;2;3)
for(4;5;6)
A;//1至3行是一个整体,为一条语句
B;//这是第二条语句
2.for(1;2;3)
for(4;5;6)
{
A;
B;
}//整体是一个语句
3.for(1;2;3)
{
A;
B;
for(4;5;6)
C;
}//整体是一个语句

for 和 if 的嵌套使用后续具体程序内容会详细介绍
浮点数的存储所带来的问题
float 和 double都不能保证可以精确的存储一个小数
举例:
有一个浮点型变量x,如何判断x的值是否为零
if (|x-0.00001|<0.00001)
是零
else
不是零
循环更新部分不能定义成浮点型

5.break 语句和continue 语句

break;如果是用来循环用来终止循环
break;如果用于switch,则是用来终止switch
break;不能直接用于if,除非if属于循环内部的一个子句
在多层循环中,break只能终止距离它最近的那个循环(switch也一样)

continue;
for(1;2;3)
A;
B;
continue;//跳过C D语句,执行3语句,结束本次循环
C;
D;
while(表达式)
A;
B;
continue;//自增自减必须在continue上,否则不执行
C;
D;

/*把100~200之间的不能被3整除的数输出*/
	


# include 


void main()
{
	int n;
	for(n=100;n<=200;n++)
	{
		if(n%3==0)
			continue;
		printf("%d\n",n);
	}
	printf("\n");
}
		 

6.循环结构程序举例

程序1

/*用Π/4=1-1/3+1/5-1/7+...公式求Π的近似值,直到某一项的绝对值小于10^-6为止
运行结果为:
pi=  3.141594*/
	


# include 
# include 

void main()
{
	int s;
	float n,t,pi;
	/*定义s为整型变量,n,t,pi 为浮点型变量*/
	t = 1;
	pi = 0;
	n = 1.0;
	s = 1;
	/*给各变量赋值*/
	while(fabs(t)>1e-6)
	{
		pi = pi + t;
		n = n + 2;
		s = -s;
		t = s / n; 
	}
	/*while循环求Π/4*/
pi = pi * 4;
printf("pi=%10.6f\n",pi);/*输出Π的近似值*/
}
		 

程序2

/*求Fibonacci数列前40个数。这个数列由如下特点:第1、2个数为1、1.第3个数开始,该数是其前面两个数之和。即:
F1 = 1 (n=1)
F2 = 1 (n=2)
Fn = Fn-1 + Fn-2 (n>=3)*/
	


# include 


void main()
{
	long int f1,f2;
	int i;/*定义变量*/
	f1 = 1;
	f2 = 1;/*给变量赋初值*/
	for(i=1;i<=20;i++)
	{
		printf("%12ld %12ld",f1,f2);
		if(i%2==0)
			printf("\n");/*作用是是输出4个数后换行,当i为偶数时换行,而i每增值1,就要计算和输出2个数(f1,f2),因此i每隔2换一次行相当于每输出4个数后换行输出*/
		f1=f1+f2;
		f2=f2+f1;
	}
	/*采用for循环*/
}
		 

你可能感兴趣的:(C语言,c语言,学习,开发语言)