前提说明: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.程序举例
————————————————————————————————————————————————————————
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函数只能接收一个字符,并将字符赋给一个字符变量或整型变量*/
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个字符,在左侧右补空格)
程序例子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.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;
注意:三目运算符,结合方向自右至左,优于赋值运算符。
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后续会详细介绍*/
程序例子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);//算实部与虚部
}
}
}
# 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;累加*/
# 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;*/
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++,按照这个模式依次进行*/
三种主要形式: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
不是零
循环更新部分不能定义成浮点型
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");
}
程序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循环*/
}