顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
循环结构:在给定条件成立的情况下,反复执行某一段代码。
1.选择结构-if
if的4种结构:
> 1.if的第1种结构
if(条件)
{
语句1;
语句2;
......
}
> 2.if的第2种结构
if(条件1)
{
语句1;
语句2;
......
}
else
{
}
> 3.if的第3种结构
if(条件1)
{
语句1;
语句2;
......
}
else if(条件2)
{
}
else if(条件3)
{
}
else if(条件4)
{
}
else
{
}
> 4.if的第4种结构
if (条件)
语句1;
练习:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
程序代码:
#include<stdio.h>
main()
{
//定义一个变量i存放金额
long int i;
//定义每个金额区间
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
//提示并接受用户输入数值
printf("请输入金额:\n");
scanf("%ld",&i);
//计算每个区间应发放的金额
bonus1=100000*0.1;
bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
//循环判断并调用相关公式计算金额
if(i<=100000)
bonus=i*0.1;
else if(i<=200000)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i-1000000)*0.01;
printf("利润是%d,应发放金额为%d",i,bonus);
}
2.选择结构-switchswitch(表达式)
{ case 数值1:
break;
… default:
break;}
switch没有If灵活。switch只能某个单值。
练习:输入某年某月某日,判断这一天是这一年的第几天?
> 1.分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
> 2.程序代码:
#include<stdio.h>
main()
{
int day,month,year,sum,leap;
printf("\n请输入年月日并以逗号隔开:\n");
scanf("%d,%d,%d",&year,&month,&day);
//先计算某月以前月份的总天数
switch(month)
{
case 1:sum=0;break;
case 2:sum=31;break;
case 3:sum=59;break;
case 4:sum=90;break;
case 5:sum=120;break;
case 6:sum=151;break;
case 7:sum=181;break;
case 8:sum=212;break;
case 9:sum=243;break;
case 10:sum=273;break;
case 11:sum=304;break;
case 12:sum=334;break;
default:printf("您的输入有误\n"); break;
}
//再加上某天的天数
sum=sum+day;
//判断是不是闰年
if(year%400==0||(year%4==0&&year%100!=0))
leap=1;
else
leap=0;
//如果是闰年且月份大于2,总天数应该加一天
if(leap==1&&month>2)
sum++;
printf("%d-%d-%d是一年的第%d天。\n",sum);
}
>编译运行结果:
3.循环结构-while和do while
(1)
while (条件)
{
循环体
}
> 运行原理
1.如果一开始条件就不成立,永远不会执行循环体
2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立......
break
直接结束整个while循环
continue
结束当前的循环体,进入下一次循环体的执行
(2)
do {
} while(条件);
> while和do-while的区别
1.很多情况下,while和do while可以互换。
2.while特点:如果一开始的条件不成立,永远不会执行循环体。
do while特点:不管一开始的条件是否成立,至少会执行一次循环体。
3.最好使用while
注意:
while循环是一开始条件不成立就永不执行,do while是先执行do再进行条件判断,注意do while后有“
int a = 10;
while (a>0); // 死循环
// 最简单的死循环
while(1);
练习:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
> 1.利用while语句,条件为输入的字符不为'\n'.
#include <stdio.h>
int main()
{
char c;
int letters=0,space=0,digit=0,others=0;
printf("请输入一串字符:\n");
while((c=getchar())!='\n')
{
if((c>='a' && c<='z')||(c>='A' && c<='Z'))
letters++;
else if(c==' ')
space++;
else if(c>='0' && c<='9')
digit++;
else
others++;
}
printf("统计结过为:%d个英文字符,%d个空格,%d个数字,%d个其他字符\n",letters,
space,digit,others);
}
4.循环结构-for
(1)
for (语句1; 条件; 语句2)
{
循环体
}
语句1:初始化语句
语句2:增量语句(执行完循环体后再执行的语句)
> 1.for一开始就会执行一次语句1(整个for循环只会执行一次)
> 2.判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立
(2)使用注意
不要随便在for()后面写分号
如果要在循环体中定义新的变量,必须用大括号{}包住
最简单的利用for循环实现死循环:for(;;);
练习:题目:打印出如下图案(菱形)
> 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
> 2.程序代码:
#include <stdio.h>
int main()
{
//定义三个变量i代表行数,j代表空格数,k代表*数
int i,j,k;
//先打印前四行
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
//再打印后三行
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\n");
}
}
输出结果:
5.三种循环结构小结
> 1.可以相互替代
> 2.while和do while,循环变量的初始化应该在while和do while语句之前完成,for语句可以在表达式1中实现循环变量的初始化。
> 3.while和do while应在循环体中包含使循环结束的语句。
> 4.do while是先执行后判断,while是先判断后执行。
> 5.for的功能最强,凡是while和do while能完成的都可以用for代替。
二、函数
1.什么是函数
程序的每一个功能都是可以定义一个函数来实现。
例如一个mp3软件的暂停、播放、停止都可以定义函数去实现其功能。
2.函数的定义
当需要添加一个常用的功能的时候就可以定义函数。
定义格式:
返回值类型 函数名(形式参数列表)
{
函数体
}
例:定义一个函数计算a+b的值。
#include<stdio.h>
int sum()
int main()
{
int a = 10,b = 20;
sum(a,b);
return 0;
}
int sum(m,n)
{
return m+n;
}
> 1.函数名要起的有意义。
> 2.明确返回值类型,没有返回值就写void,声明了返回值类型,也可以不返回任何值。
> 3.如果函数写在main的后面,调用前一定要声明。
> 4.默认情况下,不允许有函数的名称一样
> 5..函数不能嵌套定义
> 6.函数不能重复定义,但是可以重复声明
> 7.如果有函数的声明,没有函数的定义
编译可以通过,因为编译器只会检测语法合不合理,并不会检测函数有没有定义。
链接报错,因为链接的时候会检测函数是否定义。
3.函数的参数
形式参数:定义函数时函数名后面中的参数,简称形参。
.实际参数:调用函数式传入的具体数据,简称实参。
参数注意点:
> 1.形式参数:定义函数时函数名后面中的参数,简称形参。
> 2.实际参数:调用函数式传入的具体数据,简称实参。
> 3.实参个数必须等于形参个数。
> 4.函数体内部不能定义和形参一样的变量。
> 5.如果是基本数据类型作为函数形参,纯粹是值传递,修改函数内部形参的值,并不会影响外面实参的值。
> 6.一个函数可以没有形参,也可以有无限多个形参。
4.函数的递归调用
在调用一个函数时又出现直接或间接调用该函数本身,称为函数的递归调用。
练习:用递归方法求n!(n的阶乘的值),如果n为5,结果为120。
程序代码:
#include<stdio.h>
int mul(int m);
int main()
{
int n = 0;
//如果输入的数值小于等于0就重新输入
while (n <= 0)
{
printf("请输入一个正整数:\n");
scanf("%d",&n);
}
printf("%d的阶乘结果是:%d\n",n,mul(n));
return 0;
}
//定义计算阶乘的函数
int mul(int m)
{
int p;
if(m>1)
p = m*mul(m-1);
else
p = 1;
return p;
}
编译运行结果为: