目录

1、算法

1.1算法的概念

1.2算法的表示方法

1.2.1自然语言

1.2.2流程图

1.2.3伪代码

1.2.4C语言

2、C语句

3、数据的输入输出

3.1格式输入输出函数

1、printf函数(print+format 格式输出)

2、scanf函数(scan+format格式输入)

4、字符输入输出函数

4.1putchar函数(字符输出函数)

4.2getchar函数(字符输入函数)

5、顺序结果程序设计

6、选择结构程序设计

6.1单分支选择结构

6.2多分支选择结构

6.3嵌套选择结构

7、循环结构程序设计

7.1while结构

7.2do while循环结构

7.3for结构

7.4循环嵌套结构

7.5有关循环语句的建议

8、break和continue辅助控制语句

8.1break语句

​8.2continue语句


1、算法

1.1算法的概念

为解决一个问题而采取的方法、策略和步骤,称为算法 。

Pascal之父沃思提出一个公式:程序=数据结构+算法

其中数据结构是程序对数据的描述,指数据的类型和组织形式;算法是对操作的描述,指操作步骤。此公式更准确的表达是:程序=算法+数据结构+程序设计方法+语言环境,以树为例来解释此公式:

程序——种树

算法(程序的灵魂)——种树的步骤、方法:挖坑、放树苗、填土、浇水等

数据结构(加工对象)——各种树苗:松树、柏树等

程序设计方法——种树的规划,按行、列种树?一圈一圈种?交叉种?

语言环境(工具)——土地、铁锹、水桶等

计算机能够执行的算法称为计算机算法,可分为两类,一类是数值算法:数值运算的目的是求数值解,例如求平方根、求定积分等。针对这类算法的研究相对深入,算法较为成熟,已经做成“标准函数库”供用户直接使用。另一类是非数值算法:最常见的是用于事务管理领域,例如排序和检索(查找)。这类算法可以参考已有类似算法,重新设计。

1.2算法的表示方法

1.2.1自然语言

自然语言是算法的一种表示方法,一般文字冗长,语义丰富,通俗易懂。但是表达上容易有歧义性

例如:

(1)拿两个杯子a和b,分别转入酱油和醋

(2)再拿一个空杯子c,将a中的酱油倒入c中

(3)将b中的醋倒入a中

(4)将c中暂存的酱油倒入b中

1.2.2流程图

流程图是算法常用的一种表示方法,这种方法灵活、自由、形象、容易理解。使用时要记住常用的流程图符号、意义和名称。如下:

另一种新型流程图,也称为N-S图,它去掉了连接线,节省篇。N-S图将全部算法写在一个矩形框内,矩形框内划分成一些小框,框与框之间可以有前后顺序关系、选择关系和从属关系,特别适合结构化程序设计,如下:

假设0表示酱油,1表示醋

定义装入0的杯子a

定义装入1的杯子b

定义空杯子c

aa
ca

define b,1c

bb

1.2.4C语言

2、C语句

c语言程序由一个或多个源程序文件(简称源文件)构成,每个源文件又由一个或多个函数加上相关的变量构成 。因此源程序的基本组成单位是函数函数体可分为内部变量定义部分和可执行语句(简称语句)两个部分

可执行语句(简称语句)是程序最基本的执行单位,程序就是通过执行一系列语句来实现其功能的。C语言中的语句有多种形式:

(1)表达式语句:表达式加分号。例如:用赋值运算符

(2)函数调用语句:由一次函数调用加上一个分号构成一个语句,

例如:printf(”Hello World!”);

(3)控制语句:用来控制程序的流程,以实现程序的各种结构。主要有以下几种:

1、选择语句,也称分支语句:if()~else~

2、多分支语句:switch()~case~

3、循环语句:for()~、while()~、do~while()

4、辅助控制语句(与分支和循环语句搭配使用):continue、break、goto

5、返回语句(若函数本身需要得到一个结果,就必须由return语句将结果返回):return

(4)复合语句:用{}将一些语义相关的语句括起来就构成了复合语句,又称为块和语句块。

例如:if(a>b){a++;b++;}用大括号括起来的就是复合语句,表示如果a<b成立,a++;和b++;都要执行。

(5)空语句:只有一个分号的语句,它什么也不做。有时用来做循环语句中的循环体。

例如:if(a<b);当a<b成立时执行分号表示的空语句。

3、数据的输入输出

C语言中数据的输入输出都是指相对于计算机而言的输入和输出,数据输入指的是利用外部设备,包括键盘、鼠标、扫描仪等将数据输入到计算机中。数据输出指的是将数据从计算机中输出到外部设备中,如:显示器、打印机等。

C语言本身没有输入输出语句,它的输入输出是通过调用stdio.h文件的C标准函数库中完成输入输出功能的函数来完成。正是如此,如果程序中需要输入或输出数据,必须将stdio.h包含进来(注意有些编译器已经自动包含此头文件,不需要用户再写此文件的包含命令)。

3.1格式输入输出函数

1、printf函数(print+format 格式输出)

printf函数的作用是向系统指定的输出设备(一般指显示器)输出若干个任意类型的数据。

printf函数的使用格式为:printf(格式控制,输出列表);

例如:printf(“i=%d,c=%c\n”,i,c);

printf函数的括号里面包含两部分的内容:

格式

功能

%d

按十进制整型数据格式和数据的实际长度输出

%ld

按长整型数据格式和数据的实际长度输出

%hd

按短整型数据格式和数据的实际长度输出

%(-)md

%(-)mld

%(-)mhd

m指定输出字段的宽度。如果十进制数据的位数小于m,

则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

%o

按八进制整型数据格式和数据的实际长度输出

%lo

按八进制长整型数据格式和数据的实际长度输出

%ho

按八进制短整型数据格式和数据的实际长度输出

%(-)mo

%(-)mlo

%(-)mho

m指定输出字段的宽度。如果八进制数据的位数小于m,则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

%x

按十六进制整型数据格式和数据的实际长度输出

%lx

按十六进制长整型数据格式和数据的实际长度输出

%hx

按十六进制短整型数据格式和数据的实际长度输出

%(-)mx

%(-)mlx

%(-)mhx

m指定输出字段的宽度。如果十六进制数据的位数小于m,则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

%u

按无符号整型数据格式和数据的实际长度输出

%lu

按无符号长整型数据格式和数据的实际长度输出

%hu

按无符号短整型数据格式和数据的实际长度输出

%(-)mu

%(-)mlu

%(-)mhu

m指定输出字段的宽度。如果无符号数据的位数小于m,则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

%c

按字符类型数据格式输出

%(-)mc

m指定输出字段的宽度。如果字符的长度小于m,则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

%s

去掉双引号,输出双引号内的字符串

%(-)ms

m指定输出字段的宽度。如果字符串的长度小于m,则左端补空格(若m前面有负号,则右端补空格);否则按实际长度输出

% m.ns

输出占m列,但只取字符串左端的n个字符,这n个字符输出在m列的右侧,左补空格

%-m.ns

输出占m列,但只取字符串左端的n个字符,这n个字符输出在m列的左侧,右补空格

%f、%lf

按实数格式输出,整数部分全部输出,并输出6位小数

%m.nf

%m.nlf

m指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格;否则按实际长度输出

%-m.nf

%-m.nlf

m指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则右端补空格;否则按实际长度输出

%e、%le

有的c编译系统自动指定给出6位小数,指数部分占5位,其中“e”占1位,指数符号占1位,指数占3位(例如e+002)。数值按规范化指数形式输出(即小数点前必须有而且只有1位非零数字)

%m.ne

%m.nle

m指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格;否则按实际长度输出

%-m.ne

%-m.nle

m指定输出数据共占m列,其中有n位小数。如果数值长度小于m,则右端补空格;否则按实际长度输出

演示过程:

2、scanf函数(scan+format格式输入)

scanf函数的作用是向系统指定的输入设备按地址输入若干个任意类型的数据。scanf函数的使用格式:scanf(格式控制,地址表列);

注意:

1、scanf函数中的格式控制后面应当是变量地址

例如:

scanf(”%d,%d”,a,b);//错误

scanf(”%d,%d”,&a,&b);//正确

(2)如果在格式控制字符串除了格式说明以外还有其他字符,则输入数据时应输入与这些字符相同的字符。

例如:

scanf(”%d,%d”,&a,&b);正确的输入形式是:3,4 最后按Enter键

scanf(”a=%d,b=%d”,&a,&b);正确的输入形式是:a=3,b=4 最后按Enter键

为简单起见,可以在格式控制中只写控制字符,输入时数据之间以空格字符、按Enter或tab健作为间隔。

(3)scanf的格式控制中不要包含转义字符,如\n、\t、\\等等

(4)若从键盘读入double类型变量的值,只能使用%lf,而不能使用%f

(5)在用%c格式输入字符时,空格字符和转义字符都作为有效字符输入

(6)输入数据时,在遇到以下情况时认为该数据结束:

1、空格,或按回车或tab健

2、按指定的宽度结束,如%3d,只取3列

3、遇到非法输入

scanf(”%d%c%f”,&a,&b,&c);若输入:1234a123A.26最后回车

结果:a接受到1234,b接受到’a’,c接受到123

4、字符输入输出函数

4.1putchar函数(字符输出函数)

putchar函数的功能是在显示器上输出单个字符。putchar函数的使用格式为:putchar(字符变量或字符常量);

注意:

(1)字符可以是单个普通字符或者转义字符。

(2)对字符变量ch执行:putchar(ch);与printf(”%c”,ch);两者等价

4.2getchar函数(字符输入函数)

getchar函数的功能是在键盘上输入单个字符。getchar函数的使用格式为:字符变量=getchar();

注意:

(1)不管输入多少字符,getchar只能接收一个字符(输入的第一个字符)

(2)对字符变量ch执行:ch=getchar();与scanf(”%c”,&ch);两者等价

注意:getchar函数会将空格、回车等字符作为有效字符存入字符变量中。

5、顺序结果程序设计

计算机处理问题也一样要遵循先后顺序,所以设计程序时,一般都会按照处理问题的步骤,依次写出处理问题的语句。这些语句按照书写的先后顺序从前到后依次被C编译系统执行,无需进行选择、拐弯或者折回,这就属于顺序结果。

6、选择结构程序设计

计算机处理问题时也可能需要判断,让计算机能够从岔路中选择执行合适的语句 ,这就是选择结构(也称为分支结构)。执行时会根据条件不同,选择执行不同的分支

6.1单分支选择结构

面临的选择是:要么执行一个操作,要么跳过它

(1)处理两种情况的结构

if(表达式)

语句组1

else

语句组2

执行过程是:如果表达式为真,则执行语句组1,否则执行语句组2.

(2)处理一种情况的结构

if(表达式)

语句组1

执行过程是:如果表达式为真,则执行语句组1

注意:

if语句中的表达式可以是逻辑表达式、关系表达式、常量、变量等

表达式的类型可以是任意的数值类型(如整型数据等)

注意等价的表达式形式。

例如:有整型变量x,if(x)与if(x!=0)等价,if(!x)与if(x==0)等价

语句组可以是单个语句,也可以是用花括号“{}”括起来的复合语句

演示过程:

6.2多分支选择结构

如果计算机面对的不是二选一,而是多选一的问题,程序中需要使用多分支结构。

if(表达式)

语句组1

else if(表达式2)

语句组2

……

else if(表达式n)

语句组n

else

语句组n+1

还可以使用开关语句,即switch语句实现多分支结构。之所以将switch语句称为开关语句,是由每个case语句都相当于一个入口,即进入语句组的钥匙。

用switch语句实现多分支结构的语句格式为:

switch(表达式)

{

case 常量表达式1:语句组1;break;

case 常量表达式2:语句组2;break;

…………………………………………

case 常量表达式n:语句组n;break;

default:语句组n+1;break;

}

题目1:编写一个程序,根据学生的得分判定其类别,判定规则:若小于60分判为E级,60到69分判别为D级,70到79分判别为C级,80到89分判别为B级,90到100分判为A级;
(1)用多个if单分支结构实现;
(2)用if分支结构实现
(3)用switch语句实现

//(1)多个单分支if语句实现#includeint main(){int score=0;printf("请输入学生成绩:");scanf("%d",&score);if(score100){printf("输入的成绩不合法!\n");}if(score=60&&score=70&&score=80&&score=90&&score<=100){printf("A级\n");}return 0;}
//(2)if多分支结构程序 #includeint main(){int score=0;printf("请输入学生成绩:");scanf("%d",&score);if(score>100||score<0){printf("输入不合法!");}else if(score=60&&score=70&&score=80&&score<=89){printf("B级\n");}else{printf("A级\n");}return 0;}
//(3)用switch语句实现#includeint main(){int score=0;printf("请输入学生成绩:");scanf("%d",&score);switch(score/10){case 10:case 9:printf("A级\n");break;case 8:printf("B级\n");break;case 7:printf("C级\n");break;case 6:printf("D级\n");break;case 5:case 4:case 3:case 1:    case 0:printf("E级\n");break;    default:printf("输入不合法!\n");break;}return 0;}

题目二:从键盘输入1-7之间的数字,输出此数字对应的是星期几。若输入的数字不在此范围,提示出错。

(1)if多分支结构实现,(2)用switch结构实现

//(1)if多分支结构实现#includeint main(){int number=0;printf("请输入一个1-7之间的整数:\n");scanf("%d",&number);if(number7){printf("输入不合法!\n");}else if(number==1){printf("星期一\n"); } else if(number==2){printf("星期二\n"); }else if(number==3){printf("星期三\n");}else if(number==4){printf("星期四\n");}else if(number==5){printf("星期五\n");}else if(number==6){printf("星期六\n");}else{printf("星期日\n"); }return 0;} 
//(2)用switch结构实现#includeint main(){int number=0;printf("请输入一个1-7之间的整数:\n");scanf("%d",&number);switch(number){case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期日\n");break;default:printf("输入不合法!\n");break;}return 0;}

6.3嵌套选择结构

在分支语句中又多包含一个或多个分支语句称为嵌套选择结构。例如:if(或 if else)语句中又包含1个或多个if(或if else)语句就是if语句的嵌套,例如:

if(表达式1)

{

if(表达式2){

语句组1

}

else{

语句组2

}

}

题目:按照下面的公式,输入x,输出相应的y

7.2do while循环结构

do while结构常称为直到型循环结构。用do while语句实现循环结构的语句格式:

do

{

循环体

}

while(表达式);

执行过程:执行循环体,然后计算表达式的值,当值为假时,结束循环,跳出循环结构,向下执行。当值为真时,执行循环体,重复判断表达式的值,执行循环体,直到表达式的值是假为止。

特点:先执行循环体,再判断表达式。

说明:

(1)最少执行一次循环体,当第一次判断表达式的值为假,循环体已执行了

(2)除去必要的情况,尽量避免无限循环(也称死循环),如while(1)是死循环

(3)不要忘记while(表达式)处有分号

(4)循环体可为任意类型语句,若循环体不止一条语句,应使用一对大括号括起来

(5)当循环体内遇到关键字break,return,goto时,直接退出whlie循环,不再往下执行

题目:用do while循环求sum=1+2+3+……+100;

//用do while循环求sum=1+2+3+……+100;#includeint main(){int i=1,sum=0;do{sum=sum+i;i++;}while(i<=100);printf("1+2+3+4+……+n=%d\n",sum);return 0;}

综述所述:while循环最少执行0次,do while循环最少执行1次。

7.3for结构

for结构是三种循环结构中最常用的一种

用for语句实现循环结构的语句格式:

for(初始化表达式;判断表达式;修正表达式)

{

循环体

}

执行过程:先计算初始化表达式,然后计算判断表达式的值,如果其值为假,则结束循环,跳出循环,向下执行。如果其值为真,则执行循环体,重复计算判断表达式的值,执行循环体,计算修正表达式的值,直至表达式的值是假为止。

题目:用for循环求1+2+3……+100.

//用for循环求sum=1+2+3+……+100;#includeint main(){int i=1,sum=0;for(i=1;i<=100;i++){sum=i+sum;}printf("1+2+3+4+……+n=%d\n",sum);return 0;} 

题目:水仙花数,指将一个3位数,其各位数字立方和等于该数本身。例如153=

注意:

for语句中表达式1,表达式2,表达式3类型任意,都可省略,但之间的分号不可省略。

7.4循环嵌套结构

一个循环体内又包含另一个完整的循环体结果,称为循环的嵌套。

while、do……while、for三种循环结构还可以互相嵌套。嵌套的格式繁多,不能一一列举,以for结构中嵌套for结构为例来说明:

for(初始化表达式;判断表达式2;修正表达式1)

{

for(初始化表达式2;判断表达式2;修正表达式2)

{

循环体

}

}

执行过程:外循环每执行一次,内循环完全执行一遍到内循环判断表达式2的值是假为止,外循环再执行一次,内循环再完全执行一遍,反复一直到外循环条件不成立。

题目1:编写程序输出如下图形:

***

***

***

题目2:编写程序输出如下图形:

***

**

*

题目2:编写程序输出如下图形:

*

**

***

题目4:编程输出将100元人民币兑换成1元、2元、5元的所有方案。

7.5有关循环语句的建议

c和c++的循环语句中,for语句使用的频率最高,while语句其次,do语句用的最少

提高循环体效率的基本办法是降低循环体的复杂性,有以下几点建议:

(1)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,可以提高程序的效率,这是由于程序流程在内层循环和外层循环之间的跳转,每次跳转都会付出一定的开销,包括占用CPU和内存等。

(2)不可在for循环体内修改循环变量,防止for循环失去控制。

(3)建议for语句的循环控制变量的取值采取半闭半开的区间写法

8、break和continue辅助控制语句

8.1break语句

如果将循环结构视为一层壳,那么break的作用就是破壳而出,当程序流程执行到循环结构中的break语句时,循环被终止,程序流程跳出循环体,转到循环结构之后的语句执行。因此break语句被称为循环结束语句。

break语句的功能:在循环语句和switch语句中,终止并跳出循环体或开关体。

说明:

(1)break只能终止并跳出最近一层的结构

(2)break只能用于循环语句和switch语句

题目1:编写程序,查找100到200之间的所有的素数(质数)并输出

//编写程序,查找100到200之间的所有的素数(质数)并输出#includeint main(){int m,k,i,n=0;for(m=101;m<=200;m=m+2){//m是待判断的数,只检查奇数 k=m/2;//k中只存放m的因子取值范围内的最大值 for(i=2;i<=k;i++){//循环判断m是否被i整除,若是,不必再检查后面的数 if(m%i==0){break;}}if(i==k+1){//若i为k+1,说明break没有被执行到,即m不能被2~m/2之间的任何数整除,为素数 printf("%-5d",m);n++;//统计素数 }if(n%10==0){printf("\n");//每打印输出10个素数,换行 }}printf("\n");return 0;}

题目2编写程序,查找100到200之间的第一个的素数(质数)并输出

//编写程序,查找100到200之间的第一个的素数(质数)并输出#includeint main(){int m,k,i,n=0;for(m=101;m<=200;m=m+2){//m是待判断的数,只检查奇数 k=m/2;//k中只存放m的因子取值范围内的最大值 for(i=2;i<=k;i++){//循环判断m是否被i整除,若是,不必再检查后面的数 if(m%i==0){break;}}if(i==k+1){//若i为k+1,说明break没有被执行到,即m不能被2~m/2之间的任何数整除,为素数 printf("%d",m);break;//退出外循环 }}printf("\n");return 0;}

8.2continue语句

break语句结束的是整个循环结构,而continue语句结束的是本次循环,跳出循环体中尚未执行的语句,进行下一次是否执行循环体的判断,即“再来一次”。即:本次循环中的后续内容被continue短路了,因此continue语句被称为循环继续语句。

说明:

(1)continue不是终止循环,而是将本次循环提前结束,常与if条件语句一起使用,用来加速循环。

(2)continue仅用于循环语句。

题目:编写程序,查找10到100之间不能同时被3和5整除的数并输出

//编写程序,查找10到100之间不能同时被3和5整除的数并输出#includeint main(){int i,a,b;for(i=10;i<=100;i++){a=i%3;b=i%5;    if(a==0&&b==0){    continue;    }    printf("%-5d",i);}   printf("\n");   return 0;}

Copyright © maxssl.com 版权所有 浙ICP备2022011180号