【文档说明】第10章C语言程序的设计初步-课件.ppt,共(70)页,1.166 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44649.html
以下为本文档部分文字说明:
大学计算机应用基础安徽师范大学数学与计算机科学学院1第10章C语言程序设计初步大学计算机应用基础安徽师范大学数学与计算机科学学院210.1引论程序设计语言的发展经历了三个阶段:机器语言是用二进制表示的,计算机能直接识别和执行的语言如
:10000000(加)10010000(减),机器语言执行速度最快。由于用二进制表示,因而程序可读性差,非专业人员难于掌握二进制指令通过符号化如ADDA,B汇编程序机器语言汇编语言高级语言面向过程面向对象高级语言表达方式接近被描述的问题,
接近于自然语言和数学表达式,易于人们接受和掌握大学计算机应用基础安徽师范大学数学与计算机科学学院3C语言发展史产生背景产生过程时间:1972~1973地点:美国贝尔实验室目的:UNIX操作系统设计人:Ken.Thompson和Dennis.M.RitchieC标准标准C:K&R合著《
TheCProgrammingLanguage》ANSIC:1983年87ANSIC:1987年1990年国际标准的ANSIC大学计算机应用基础安徽师范大学数学与计算机科学学院42.C语言的特点(1)高效性:C程序
往往紧凑且运行速度快。(2)移植性:C程序不经修改或很少修改就可以到其他系统上运行。(3)运算符丰富:有算术、关系、逻辑、位、自增/自减、赋值运算符等等。(4)数据结构丰富:数据类型有整型、实型、字符、数组、指针、结构
体等,能实现如链表、树、栈等结构运算。(5)对硬件操作:能直接访问内存的物理地址,并进行位操作。(6)自由度大:语法限制不严格。如:不检查数组下标是否越界,整型与字符型可通用,条件可用0和非0表示假与真,指针操作灵活等。大学计算机应用基础安徽师范大学数学
与计算机科学学院510.1.3C语言程序的基本结构一个C语言程序可以是非常简单的,也可以是特别复杂的,这取决于程序所要实现的功能。我们先来认识一个最为简单的C程序。【例1】最简单的C程序。voidmain(){printf("ThisisaCLanguageProgram!\n")
;}函数体语句结束标志运行结果:ThisisaCLanguageProgram!main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,并且只能有一个主函数(main函数),这是整个C程序运行的入口点printf是C语言中的输出
函数,它的功能是把要输出的内容送到显示器去显示。双引号内字符串原样输出,“\n”是回车换行符。C语言规定:语句以分号结束大学计算机应用基础安徽师范大学数学与计算机科学学院6【例2】计算输入的两个整数的和。/*求两数的和。*/voidmain(){inta,b,sum;/*这是定义变
量*/a=12;b=34;sum=a+b;printf("Thesumis%d\n",sum);}数据类型名定义的变量名,以“,”分隔两个赋值语句,使a和b的值分别为12和34调用内部函数,输出计算的和数求和的值给sum运行结果:thesumis46大学计算机应用基础安徽师范大学数学与
计算机科学学院7【例3】计算输入的两个整数的最大值。/*ThisisthethirdCprogram*/#include<stdio.h>intmax(inta,intb);voidmain(){in
tx,y,z;printf("Inputtwonumbers:\n");scanf("%d%d",&x,&y);z=max(x,y);printf("maxnum=%d\n",z);}intmax(inta,intb){intc;if(a>b)returna;else
returnb;return(c);}自定义函数声明自定义函数调用自定义函数max带两个形参返回a、b中最大值返回值为整型数假设输入:1020↙运行结果:max=20调用内部函数,接受键盘输入数据大学计算机应
用基础安徽师范大学数学与计算机科学学院8总结C源程序的结构特点(1)一个C语言源程序可以由一个或多个源文件组成,每个源文件以“.c”作为扩展名。(2)每个源文件可由一个或多个函数组成。(3)一个源程序不论由多少个
文件组成,都有一个且只能有一个main函数,即主函数,整个程序的运行从主函数开始。(4)源程序中可以有预处理命令(include命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。(5)每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头之后
不能加分号。(6)标识符、关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。大学计算机应用基础安徽师范大学数学与计算机科学学院9编辑程序代码的录入,生成源程序*.c或*.cpp编译语法分析查错
,翻译生成目标程序*.obj链接与其它目标程序或库链接装配,生成可执行程序*.exe运行开始编辑编译有错?链接执行结果正确?结束源程序file.c目标程序file.obj库函数和其它目标程序可执行程序file.exe不正确正确有无调试C程序的流程10.1
.4C语言的编辑、编译和运行大学计算机应用基础安徽师范大学数学与计算机科学学院10人们使用计算机,就是要利用计算机处理各种不同的问题,而要做到这一点,人们就必须事先对各类问题进行分析,确定解决问题的具体方法
和步骤,再编制好一组让计算机执行的指令即程序,让计算机按人们指定的步骤有效地工作。这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据某种规则编写计算机执行的命令序列,就是编制程序,而书写时所应遵守的规则,即为某种语言的语法.10.2算法基础10.2.1
算法(Algorithm)的概念【例10.2.1】输入3个数,求其最大值。问题分析:设num1,num2,num3存放3个数,max存放其最大值。为求最大值,就必须对3个数进行比较,可按如下步骤去做:⑴输入3个数num1,num2,num3。⑵先把第1个数num1的值赋给max。⑶将
第2个数num2与max比较,如果num2>max,则把第2个数num2的值赋给max(否则不做任何工作)。⑷将第3个数num3与max比较,如果num3>max,则把第3个数num3的值赋给max(否则不做任何工作)。⑸输出max的值,即
最大值。大学计算机应用基础安徽师范大学数学与计算机科学学院1110.2.2算法的基本特征一个算法应具有以下5个基本特征:有穷性确定性有效性有零个或多个输入有一个或多个输出算法必须总是在执行有限个操作
步骤和可以接受的时间内完成其执行过程。也就是说,对于一个算法,要求其在时间和空间上均是有穷的。例如:一个采集气象数据并加以计算进行天气预报的应用程序,如果不能及时得到结果,超出了可以接受的时间,就起不到天气预报的作用。算法中的每一步都必须有明确的含义,不允许存在二义性。例如:“将成绩优秀
的同学名单打印输出”,在这一描述中“成绩优秀”就很不明确,是每门功课均为95分以上?还是指总成绩在多少分以上?算法中描述的每一步操作都应能有效地执行,并最终得到确定的结果。例如:当Y=0时,X/Y是不能有效执行的。大学计算机
应用基础安徽师范大学数学与计算机科学学院1210.2.3算法的表示用自然语言表示用流程图表示用伪代码表示计算机语言表示算法自然语言可以是中文、英文、数学表达式等。用自然语言表示通俗易懂,缺点是可能文字过长,不太严格,表达分支和循环的结构不很方便。【例10.2.2】求1+2+…+m的值N,当
N>10000时结束。算法可表示如下:①n=0②m=0③m加1④N加m⑤判N是否大于10000,如果满足关系结束;不满足关系继续执行③。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法的,它不用图形符号,因此,书写方便,格式紧凑,也容易懂,
同时也便于向计算机语言算法的转换。【例10.2.4】用伪代码表示求10!的算法。begin(开始)置t的初值为1(1t)置i的初值为2(2i)当(while)i<=10,执行(do)begin使t=ti使i=
i+1end打印t的值(printt)end(结束)。计算机是无法识别流程图和伪代码形式,只有用计算机语言编写的程序才能被计算机执行。因此在用流程图和伪代码形式描述出算法后,还要将它转换成计算机语言程序。【例10.2.5】
用C语言程序来描述求10!。#include<stdio.h>voidmain(void){longi,t;t=1L;i=2L;while(i<=10L){t=t*i;i=i+1;}printf("%ld\n",t);}。处理框判断框终点框过程框I/O框流程线连接点准备框下
图列出了标准的流程图符号:大学计算机应用基础安徽师范大学数学与计算机科学学院13C数据类型基本类型构造类型指针类型空类型void字符类型char枚举类型enum整型实型单精度型float双精度型double数组结构体struct共用体union短整型short长整型lo
ng整型int数据类型决定:1.数据占内存字节数2.数据取值范围3.其上可进行的操作本节所介绍的数据类型10.3基本数据类型10.3.1数据概述大学计算机应用基础安徽师范大学数学与计算机科学学院14常量与符号常量.常量定义:程序运行时其值不能改变的量(即常数)常量的分类:直接常
量(值常量)•整型常量如,15、0、-7•浮点型常量如,5.0、-12.36•字符型常量如,'A'、’a‟•指针常量如,NULL•字符串常量如,”ABC”符号常量用标识符来代表常量。其定义格式为:#define符号常量常量#defineNUM20#definePI3.1415926【
例10.3.1】#include<stdio.h>#definePI3.14main(){floatarea;area=10*10*PI;printf(“area=%f\n”,area);}运行结果:area=314.000
000•行尾不能有分号•define前面一定要有#•符号常量名最好使用大写•符号常量名最好有意义大学计算机应用基础安徽师范大学数学与计算机科学学院15变量定义:程序运行时其值可以被改变的量变量的两要素:变量名、变量值变量的使用:先说明,后使用例:intx,y,z;floatr
adius,length,charch;例:inta=2,b,c=4;floatdata=3.67;charch=‘A’;intx=1,y=1,z=1;intx=y=z=1;大学计算机应用基础安徽师范大学数学与计算机科学学院1610.3.2整型数据1.整型常量十进制整数
:由数字0~9和正负号表示.如:123,-456,0八进制整数:由数字0开头,后跟数字0~7表示.如:0123,011十六进制整数:由0x或0X开头,后跟0~9,a~f,A~F表示.如0x123,0Xff2
.整型变量类别类型说明符内存中所占字节基本型int2个字节短整型shortint或short2个字节长整型longint或long4个字节无符号型无符号基本型unsignedint或unsigned无符号短整型unsignedshort无符号长整型unsignedlong整型变量的分类大学计算
机应用基础安徽师范大学数学与计算机科学学院17变量的说明,也即变量的定义,一般形式为:类型说明符变量名标识符1,变量名标识符2,...;例如:inta,b,c;/*a,b,c为整型变量*/longm,n;/*m,n为长整型变量*/unsignedp,q
;/*p,q为无符号整型变量*/在书写变量说明时,应注意以下几点:允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。最后一个变量名之后必须以“;”号结尾。变量说明必须放在变量使用之前。也可在说明变量为整型
的同时,给出变量的初值。其格式为:类型说明符变量名标识符1=初值1,变量名标识符2=初值2,...;整型变量的说明【例10.3.2】main(){inta=3,b=5;printf(“a+b=%d\n”,
a+b);}程序的运行结果为:a+b=8大学计算机应用基础安徽师范大学数学与计算机科学学院185.10.3.3实型数据实型常量(实数或浮点数)十进制小数形式:由数字0~9和小数点组成.如:0.0,5.6,-5.指数形式:由十
进制数,加阶码标志e或E以及阶码(只能为整数,可以带符号)组成.其一般形式为:aEn其中:a为十进制数,n为十进制整数,都不可缺少。其可表示为a×10n合法的实数表示:2.1E5表示2.1×105,3.7E-2表示3.7×10-2。非法的实数表示:345(无小
数点),E7(阶码标志E之前无数字),-5(无阶码标志),50.-E3(负号位置不对)实型变量单精度实型(float)floatf=3.14,g;这种定义的变量在内存中占4个字节(32位)的存储单元。双精度实型(double)doublex
,y;这种定义的变量在内存中占8个字节(64位)的存储单元。注意:实型常量不分单精度和双精度。一个实型常量可以赋给一个float或double型变量,根据变量的类型截取实型常量中相应的有效位数字。【例10.3.3】main(){floata;a=0.1234567
89;printf("a=%f",a);}运行结果为:a=0.123457大学计算机应用基础安徽师范大学数学与计算机科学学院1910.3.4字符型数据字符型常量定义:用单引号括起来的单个普通字符或转义字符.如‘a’‘A’‘?’‘
\n’‘\101’字符常量的值:该字符的ASCII码值如‘A’——65,‘a’——97,‘0’——48,‘\n’——10转义字符:反斜线后面跟一个字符或一个代码值表示<转义字符及其含义:转义字符含义\n\v\r\a\‘\dd
d\t\b\f\\\―\xhh转义字符含义换行垂直制表回车响铃单引号3位8进制数代表的字符水平制表退格换页反斜线双引号2位16进制数代表的字符大学计算机应用基础安徽师范大学数学与计算机科学学院20字符型变量字符型数据类型符是char(字符character)
在内存中占1个字节(16位)字符变量存放字符ASCII码char与int数据间可进行算术运算存在有符号和无符号之分。默认情况下为有符号例:charch;unsignedcharC='B';例:a=‘D’;//a=68;x=‘A’+5;//x=65+5;s=‘!’+‘G’//s=3
3+71;【例10.3.4】main(){chara,b;a=120;b=121;printf("%c,%c\n%d,%d\n",a,b,a,b);}程序运行结果为:x,y120,121(思考???)大学计算机应用基础安徽师范大学数学与计算机科学学院21基本算术
运算符:+-*/%结合方向:从左向右优先级:----->*/%----->+-(2)(3)(4)说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据例:5/2=-5/
2.0=例:5%2=-5%2=1%10=5%1=5.5%22-2.51-110()10.3.5算术运算符和算术表达式大学计算机应用基础安徽师范大学数学与计算机科学学院22自增、自减运算符++--作用:使变量值
加1或减1种类:前置++i,--i(先执行i=i+1或i=i-1,再使用i值)后置i++,i--(先使用i值,再执行i=i+1或i=i-1)例:j=3;k=++j;j=3;k=j++;j=3;printf(“%d”,++j);j=3;pr
intf(“%d”,j++);a=3;b=5;c=(++a)*b;a=3;b=5;c=(a++)*b;//k=4,j=4//k=3,j=4//4//3//c=20,a=4//c=15,a=4大学计算机应用基础安徽师范大学数学与计算机科学学院23表达式和算术表达式表达式:用运算符
和括号将运算对象(常量、变量和函数等)连接起来的、符合C语言语法规则的式子。算术表达式:表达式中的运算符都是算术运算符的表达式。例:3+5*8、(x+y)/2-1等大学计算机应用基础安徽师范大学数学与计算机科学学院2410.4顺序结构程序设计10.4.1C语言语句1.控制语句:完成一定功能的
语句称为控制语句。C语言有9种控制语句,参见表10.4-1。2.表达式语句由一个表达式构成一个语句,称为表达式语句。一般形式为:表达式;表达式语句可分为:(1)赋值语句赋值语句由赋值表达式后跟一个分号组成。例如:a=3;(2)函数调用语句函数调用语句由函数调用表达式后跟一个分号组成。例如:pr
intf(“ThisisaCstatement.”);(3)空语句空语句是只有一个分号而没有表达式的语句。大学计算机应用基础安徽师范大学数学与计算机科学学院253.特殊语句C语言中还包括一些其他语句,如复合语句等。把多个语句用花括号
{}括起来组成的语句称复合语句。在程序中可以把复合语句看成是一条语句,而不是多条语句。例如:{x=y+z;a=b+c;printf(“%d%d”,x,a);}注:复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。大学计算机应用基础安徽师范大学数学与计算机科学学院2
610.4.2printf函数1.一般格式printf("格式控制字符串",表达式1,表达式2,…,表达式n);功能按照“格式控制字符串”的要求,将表达式1,表达式2,…,表达式n的值显示在计算机屏幕上。说明格式控制字符串用于指定输出格式。它包含两类字符:常规字符:
包括可显示字符和用转义字符表示的字符。格式控制符:以%开头的一个或多个字符,以说明输出数据的类型、形式、长度、小数位数等。其格式为:%[修饰符]格式转换字符例:longintx=0x8AB6;printf(“TheValueofxis%ld\n”,x);
常规字符常规字符(转义符)格式控制符(修饰符)格式控制符(格式转换符)大学计算机应用基础安徽师范大学数学与计算机科学学院272.转义字符就以一个“\”开头的字符序列,称为转义字符字符形式含义ASCII代码\n换行,将当前
位置移到下一行开头10\t横向跳格(即跳到下一个输出区,一个输出区占8列)9\b退格,将当前位置移到前一列8\rEnter,将当前位置移到本行开头13\f换页,将当前位置多到下页开头12\\反斜杠字符“、”92\‟单引号字符39\”双引号字符34\ddd1到3位8进制数所代表的字符\xhh
1到2位16进制数所代表的字符【例10.4.1】转义字符的使用main(){chara,b,c;a=‟n‟;b=‟e‟;c=‟\167‟;/*8进制数167代表的字符w*/printf(“%c%c%c\n”,a,b,c);/*以字符格式输出*/p
rintf(“%c\t%c\t%c\n”,a,b,c);/*每输出一个字符跳到下一输出区*/printf(“%c\n%c\n%c\n”,a,b,c);/*每输出一个字符后换行*/}运行结果如下:newn□□□□□□□e□□□□□□□w“□”代表空格,下同new大学计算机应用基础安徽师范
大学数学与计算机科学学院28“%d”是格式说明“a=”、“□”、“b=”为普通字符3.printf函数的调用格式控制用于指定输出参数的输出格式,格式控制由两部分组成:格式说明和普通字符。普通字符(包括转义字符)将被简单
地复制显示(或执行)。一个格式说明项将引起输出参数项的转换与显示。例如:main(){inta=3,b=4;printf(“a=%d□b=%d\n”,a,b);}输出结果为:a=3□b=4“\n”为转义字符【例10.4.2】main(){cha
rch1=‟a‟,ch2=‟b‟;printf(“ch1=%c,ch2=%c\n”,ch1,ch2);printf(“ch1=%d,ch2=%d\n”,ch1,ch2);}程序运行结果为:???大学计算机应用基础安徽师范大学数学与计算机科学学院294.格式字符串在TurboC中pri
ntf函数格式字符串一般形式为:%m±.nh/l格式字符↓↓↓↓↓↓↓[开始符][标志字符][宽度指示符][精度指示符][长度修正符][格式转换字符]说明:⑴格式字符:格式字符用来表示输出数据的类型,在格式控制字符串不能略,其常用符号和含义参见表10.4-3。(2)标志字符:标志字符包括
-、+、#三种,具体含义参见表10.4-4。⑶宽度指标符:用来设置输出数据项的最小宽度,通常用十进制整数来表示输出的位数。如果输出数据项所需实际位数多于指定宽度,则按实际位数输出,如果实际位数少于指定的宽度则用空
格填补。⑷精度指示符:以“.”开头,用十进制整数指精度。对于float或double类型的浮点数可以用“m.n”的形式在指定宽度的同时来指定其精度。其中,“m”用以指定输出数据所占总的宽度,“n”称为精度。⑸长度修正符:常用的长度修改符为h和l两种,
h表示输出项按短整型输出,l表示输出项按长整型输出。例如,以下语句输出六位十进制整数:printf(“%6d\n”,111);printf(“%-6d\n”,111);输出结果为:□□□111(输出右对齐,左边填空格)111
□□□(输出左对齐,右边填空格)例如,语句printf(“%+d,%+d\n”,111,-111);输出结果为:+111,-111输出八进制或十六进制时,可以使用以下形式:printf(“%#o,%#x\n”,10,
16);输出结果为:012,0x10输出语句输出结果printf(“%d\n”,888);888(按实际需要宽度输出)printf(“%6d\n”,888);□□□888(输出右对齐,左边填空格)printf(“%f\n”,888.88);888.8800
00(按实际需要宽度输出)printf(“%12f\n”,888.88);□□888.880000(输出右对齐,左边填空格)printf(“%g\n”,888.88);888.88(%f格式比采用%e格式输出宽度小)printf
(“%8g\n”,888.88);□□888.88(输出右对齐,左边填空格)输出语句输出结果printf(“%.5d\n”,888);00888(数字前补0)printf(“%.0d\n”,888);888printf(“%8.3f\n”,888.88);□8
88.880printf(“%8.1f\n”,888.88);□□□888.9printf(“%8.0f\n”,888.88);□□□□□889printf(“%.5s\n”,”abcdefg”);abcde(截去超过的部分)printf(“%5s\
n”,”abcdefg”);abcdef(宽度不够,按实际宽度输出)【例10.4.3】输出形式举例main(){intnum1=123;longnum2=1234567;floatreal=123.456
7;printf(“%d,%6d,%-6d,%2d\n”,num1,num1,num1,num1);printf(“%ld,%8ld,%4ld\n”,num2,num2,num2);printf(“%f,%10f,%10.2f,%-10.2f\n”,real,
real,real,real);printf(“%s,%10.5s,%-10.5s\n”,”student”,”student”,”student”)}输出结果如下:123,□□□123,123□□□,1231234567,□1234567,1234567123.456700,123.456700
,□□□□123.46,123.46□□□□student,□□□□□stude,stude□□□□□大学计算机应用基础安徽师范大学数学与计算机科学学院304.2格式化输入scanf一般格式scanf(“格式控制字符串”,变量1的地址,变量2的地址,…
,变量n的地址);功能第一个参数格式控制字符串的控制下,接受用户的键盘输入,并将输入的数据依此存放在变量1、变量2、……、变量n中。inta;scanf("%d",&a);取地址运算符(与按位“与”同符号),只能作用于变量!格式控制符与后续参数中的
变量地址的对应关系已知:inta,b;函数调用:scanf("%d%d",&a,&b);假设输入:10□20↙变量的值:a的值是10,b的值是20大学计算机应用基础安徽师范大学数学与计算机科学学院31scanf函数的格式控制符%[*][width][l|h]Type一般形式:说
明:[]:表示可选项,可缺省。|表示互斥关系。width:指定输入数据的域宽,遇空格或不可转换字符则结束。Type:各种格式转换符(参照printf)。*:抑制符,输入的数据不会赋值给相应的变量
。l:用于d、u、o、x|X前,指定输入为long型整数;用于e|E、f前,指定输入为double型实数。h:用于d、u、o、x|X前,指定输入为short型整数。大学计算机应用基础安徽师范大学数学与计算机科学学院32【例】数据的格式化输入输入一学生的学号(8位数字)、生日(年-月-日)、
性别(M:男,F:女)及三门功课(语文、数学、英语)的成绩,现要求计算该学生的总分和平均分,并将该学生的全部信息输出(包括总分、平均分)。#include<stdio.h>voidmain(){unsigne
dlongno;//学号unsignedintyear,month,day;//生日(年、月、日)unsignedcharsex;//性别floatchinese,math,english;//语文、数学、英语成绩floattotal,average;//总分、平均分prin
tf("inputthestudent'sNO:");scanf("%8ld",&no);printf("inputthestudent'sBirthday(yyyy-mm-dd):");scanf("%
4d-%2d-%2d",&year,&month,&day);fflush(stdin);//清除键盘缓冲区printf("inputthestudent'sSex(M/F):");scanf("%c",&sex);print
f("inputthestudent'sScores(chinese,math,english):");scanf("%f,%f,%f",&chinese,&math,&english);total=chinese+math+engl
ish;//计算总分average=total/3;//计算平均分printf("\n===NO=======birthday==sex==chinese==math==english==total==average\n");printf("%08ld%4d-%02
d-%02d%c%-5.1f%-5.1f%-5.1f%-5.1f%-5.1f\n",no,year,month,day,sex,chinese,math,english,total,average);}假设输入:inputthestudent'sNO:20040101↙in
putthestudent'sBirthday(yyyy-mm-dd):1987-9-8↙inputthestudent'sSex(M/F):M↙inputthestudent'sScores(chinese,math,english):
90,80,90↙输出结果:===NO=======birthday==sex==chinese==math==english==total==average200401011987-09-08M90.080.090.0
260.086.7大学计算机应用基础安徽师范大学数学与计算机科学学院3310.4.4其他输入输出函数1.getcharintgetchar(void);//应包含的.h文件为stdio.h•功能:从键盘读一字符•返值:正常,返回读取字符的ASCII码值;出错,返回EOF(-
1)。•说明:以回车符为输入结束条件;输入多个字符时,返回第一个字符的值;输入字符回显。大学计算机应用基础安徽师范大学数学与计算机科学学院34【例】利用getchar输入字符#include<stdio.h>#include<conio.h>voidm
ain(){charch1,ch2;inta;ch1=getchar();ch2=getchar();scanf("%d",&a);printf("ch1=%c,ch2=%c\n",ch1,ch2);printf(
"a=%d\n",a);}ch1=1,ch2=2a=34运行结果(假设输入为:1234↙):大学计算机应用基础安徽师范大学数学与计算机科学学院352.putcharintputchar(intc);//应包含的.h文件为stdio.h•功能:
在显示器上输出字符c。•返值:正常,返回字符的代码值;出错,返回EOF(-1)。•说明:该函数带有一个参数c,它为要显示字符的ASCII码值,有一个int型返回值。大学计算机应用基础安徽师范大学数学与计算机
科学学院36【例】利用字符输出函数输出字符#include<stdio.h>voidmain(){inta=65;charb='B';putchar(a);//不自动回车putchar('\n');puts(“isasgood
as”);//自动回车putc(b,stdout);}AisasgoodasB运行结果:大学计算机应用基础安徽师范大学数学与计算机科学学院3710.5.1关系运算和逻辑运算1.关系运算符和关系表达式关系运算符含义优先级结合性>大于这些关系运算符等优先级,
但比下面的优先级高左结合性>=(>和=之间没有空格)大于或等于<小于<=(<和=之间没有空格)小于或等于==(两个=之间没有空格)等于这些关系运算符等优先级,但比上面的优先级低!=(!和=之间没有空格)不等于关系运算符关系表达式用关系运算符连接起来的
式子称为关系表达式。关系表达式的一般形式为:表达式关系运算符表达式例:a+b>c–dx>3/2'a'+1<c–i–5*j==k+1注意:C语言用0表示假,非0表示真。一个关系表达式的值不是0就是1,0表示假,1表示真。10.5选择结构程序设计大学计算机应用基础安徽师范大学
数学与计算机科学学院382.逻辑运算符和逻辑表达式逻辑运算符逻辑运算符含义结合性优先级关系!单目运算符,逻辑非,表示相反右结合性高低&&(两个&之间没有空格)双目运算符,逻辑与,表示并且左结合性||(两个|之间没有空格)双目运算符,逻辑或,表示
或者AB!A!BA&&BA||B假假1100假真1001真假0101真真0011逻辑运算真值表大学计算机应用基础安徽师范大学数学与计算机科学学院39!、~、++、--、sizeof高算术运算符移位运算符关系运算符&、|、^&&、||赋值
运算符低例如:a<=x&&x<=b等价于:a>b&&x>y等价于:a==b||x==y等价于:!a||a>b等价于:!a>b等价于:c=a||b等价于:a|7&&b&8等价于:a>>2&&b<<1等价于:2.逻辑运算符和逻辑表达式逻辑表达式用逻辑运算符连接起来的式子称为逻辑表达式。逻辑表达式的一
般形式为:表达式逻辑运算符表达式例:a<b&&b<c、x>10||x<-10、!x&&!y逻辑运算符的优先级(a<=x)&&(x<=b)(a>b)&&(x>y)(a==b)||(x==y)(!a)||(a
>b)(!a)>bc=(a||b)(a|7)&&(b&8)(a>>2)&&(b<<1)已知:a=4;b=5;问:c=b>3&&2||8<b-!a;的值?答:c的值为1。等价于:c=(((b>3)&&2)||(8<(b–(!a))));例:a=4;b=
5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0„c‟&&„d‟//值为0//值为1//值为1//值为1//值为1//值为1//值为1大学计算机应用基础安徽师范大学数学与计算机科学学院4010.5.2选择结构的程序设计1.if
语句简单if语句形式if(表达式)语句;格式:执行流程:语句表达式TF例如:下面的程序段是输出其中的大数。【例10.5.3】if(Number1<Number2){Number1=Number2;}printf(“ThebigNumberis%d”,Number1);if_e
lse形式if(表达式)语句1;else语句2;格式:执行流程:表达式语句1语句2TF例如:下面的程序段同样是输出两个整数中的最大数。inta,b;printf("inputtwonumbers:");scanf("%d%
d",&a,&b);if(a>b)printf("max=%d\n",a);elseprintf("max=%d\n",b);【例10.5.4】在学生分数高于或等于60分时显示Pass,否则显示Fail程序片段如下:if(grade>=60)printf(“Pass\n”);el
seprintf(“Fail\n”);分数大于等于60打印Failed打印Passed例10.5.4流程图大学计算机应用基础安徽师范大学数学与计算机科学学院41【例10.5.6】根据输入的百分制成绩(s
core),要求输出成绩等级(grade)A、B、C、D、E。90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。用if语句实现,程序如下:if和else子句中,可以是任意合法的C语句或语句块,如
果这子句是个if语句,则构成了if语句的嵌套。程序的运行情况如下:Pleaseinputascore(0~100):86ThegradeisB.main(){intscore;chargrade;printf(“\nPleaseinputascore(0~100):”);scanf(“%d”,&
score);if(score>=90)grade=‟A‟;elseif(score>=80)grade=‟B‟;elseif(score>=70)grade=‟C‟;elseif(score>=60)grade=‟D‟;elsegrad
e=‟E‟;printf(“Thegradeis%c.\n”,grade);}2.if语句的嵌套大学计算机应用基础安徽师范大学数学与计算机科学学院423.条件运算符一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句exp
r1取expr2值取expr3值非0=0例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);大学计算机应用基础安徽师范大学数学与计算机科学学院4310.5.3switch语句一般格式:switch(表达
式){caseE1:语句组1;break;caseE2:语句组2;break;…….caseEn:语句组n;break;[default:语句组;break;]}执行过程:switch表达式语句组1语句组2语句组n语
句组…...E1E2Endefaultcase大学计算机应用基础安徽师范大学数学与计算机科学学院44【例10.5.7】根据天气情况,安排活动。#include<stdio.h>main(){intw_con;/*天
气情况变量定义*/printf("天气如何?[1:晴天,2:多云,3:下雨]");scanf("%d",&w_con);switch(w_con){case1:printf("上街购物!\n");break;case2:print
f("去游泳!\n");break;case3:printf("在家看电视!\n");break;default:printf("错误选择!\n");}}break作用:控制转向switch语句的后继语句。大学计算机应用基础
安徽师范大学数学与计算机科学学院4510.5.4程序设计举例【例10.5.7】输入三个整数,输出其中的最大数【例10.5.8】输入三个整数,按值从大到小的顺序输出。【例10.5.9】对分段函数:x(x<1)y=2x-1(1
≤x<10)3x-11(x≥10)用scanf()函数输入x的值,求y值。【例10.5.10】若运行时从键盘上输入2.0<回车>,求以下程序的输出结果【例10.5.12】执行以下程序时,为了使输出结果为:t=4,则给a和b输入的值应满足的条件是:A)a
>bB)a<bC)a>0&&a<bD)a<0&&a<b大学计算机应用基础安徽师范大学数学与计算机科学学院4610.6循环结构程序设计C语言中用如下语句实现循环while语句。do-while语句。for语句。用goto语句和i
f语句构成循环。大学计算机应用基础安徽师范大学数学与计算机科学学院4710.6.1循环结构的程序设计1.while语句一般形式:while(表达式)循环体语句;执行流程:FTexpr循环体while其中:(1)while后面的括号()不能省。(2)while后面的表达式可以是
任意类型的表达式,但一般是条件表达式或逻辑表达式。(3)表达式语句称为“循环体”,可以是任何语句,通常是一个复合语句。(4)若循环体中又含有“循环语句”,则称为循环嵌套,也称多重循环。特点:先判断表达式,再
执行循环体大学计算机应用基础安徽师范大学数学与计算机科学学院48【例】利用while语句,编写程序,求1+2+3+…+100的值#include<stdio.h>voidmain(){inti=1,sum=0;while(i<=100){sum+
=i;i++;}printf("sum=%d\n",sum);}循环初值循环终值循环条件循环体循环变量增值运行结果:sum=5050大学计算机应用基础安徽师范大学数学与计算机科学学院49(1)如果while后的表达式的值一开始就为假,循环体将一
次也不执行。(2)当循环体由多个语句组成时,必须用左、右花括号括起来,使其形成复合语句。(3)为了使循环最终能够结束,而不至于使循环体语句无穷执行(即产生“死循环”),每执行一次循环体,条件表达式的值都应该
有所变化,这既可以在表达式本身中实现,也可以在循环体中实现。while语句注意事项:inta=0,b=0;while(a>0)//a>0为假,b++不可能执行b++;intnum=0;//字符计数while(1){if(g
etche()=='\n')//如果输入的字符是回车符,则返回return;num++;}大学计算机应用基础安徽师范大学数学与计算机科学学院5010.6.2do-while循环语句一般形式:do循环体语句;while(表达式);执行流程:其中:while后面的括号()
不能省。while最后面的分号;不能省。语句部分称为循环体,当需要执行多条语句时,应使用复合语句。do必须与While联合使用。C语言中的do-while语句是在表达式的值为真时重复执行循环体,这一点与别的语言中类似语句有区别,在程序设计时应引
起注意。FTexpr循环体dowhile特点:先执行循环体,再判断表达式大学计算机应用基础安徽师范大学数学与计算机科学学院51【例10.6.3】利用do-while语句,求1+2+3+…+100的值#include<s
tdio.h>voidmain(){inti=1,sum=0;do{sum+=i;i++;}while(i<=100);printf("sum=%d\n",sum);}运行结果:sum=5050大学计算机应用基础安徽师范大学数学与计算机科学学院52【例
10.6.5】while和do-while循环的比较main()main(){{intsum=0,i;intsum=0,i;scanf("%d",&i);scanf("%d",&i);while(i<=10)
do{{sum=sum+i;sum=sum+i;i++;i++;}}while(i<=10);printf("sum=%d\n",sum);printf("sum=%d\n",sum);}}大学计算机应用基础安徽师范大学数学与计算机科学学院5310.6.3f
or语句一般形式:for(表达式1;表达式2;表达式3)循环体语句;执行流程:其中:for后面的括号()不能省。表达式1:一般为赋值表达式,给控制变量赋初值。表达式2:关系表达式或逻辑表达式,循环控制条件。表达式3:一般为赋值表
达式,给控制变量增量或减量。表达式之间用分号分隔。语句部分称为循环体,当需要执行多条语句时,应使用复合语句。FTexpr2循环体forexpr1expr3for语句很好地体现了正确表达循环结构应注意的三个问题:控制变量的初始化。
循环的条件。循环控制变量的更新。大学计算机应用基础安徽师范大学数学与计算机科学学院54【例】用for语句求1~100的累计和。#include<stdio.h>voidmain(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("sum=%
d\n",sum);}运行结果:sum=5050大学计算机应用基础安徽师范大学数学与计算机科学学院55【例10.6.6】请编写一个程序,计算半径为0.5、1.5、2.5、3.5、4.5、5.5mm时的圆面积。【例10.6.7】求正整数n的阶乘n!其中n由用户输入。大学计算机应用
基础安徽师范大学数学与计算机科学学院56#include<stdio.h>voidmain(){inti,sum=0;i=1;for(;i<=100;i++)sum+=i;printf("sum=%d\n",sum);}#include<stdio.h>voidmain(){inti,s
um=0;i=1;for(;i<=100;)sum+=i++;printf("sum=%d\n",sum);}for语句注意事项:省掉表达式1,3省掉表达式1(1)表达式1、表达式2、和表达式3都是任选项,可以省掉其中的一个、两个或全部,
但其用于间隔的分号是一个也不能省的。#include<stdio.h>voidmain(){inti,sum=0;i=1;for(;;){if(i>100)break;sum+=i++;}printf("sum=%d\n",sum);}省掉表达式1,2,3表
达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束大学计算机应用基础安徽师范大学数学与计算机科学学院57for语句注意事项:for(a=1;;a++)printf("&d\n",a);(3)表达式2如
果为空则相当于表达式2的值是真。死循环!(4)表达式2一般是关系表达式(如i<10)或逻辑表达式(如a<b&&x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:①for(i=0;(c=g
etchar())!=’\n’;i=i+c);②for(;(c=getchar())!=’\n’;)printf(“%c”,c);大学计算机应用基础安徽师范大学数学与计算机科学学院5810.6.4语句标号和goto语句一般形式:goto语句标号;……语句标号:……语句标号
:…………goto语句标号;或说明:语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto语句配合使用。作用:goto语句的作用是在不需要任何条件的
情况下直接使程序跳转到该语句标号所标识的语句去执行。例:求1~100的累计和#include<stdio.h>main(){inti=1,sum=0;loop:if(i<=100)loop:if(i<=100)//如果i小于或等于100sum=sum+i;i++;gotoloop;//转到标号
为loop的语句去执行printf("sum=%d\n",sum);}大学计算机应用基础安徽师范大学数学与计算机科学学院5910.6.5三种语句的选用1.循环结构类型的选择原则如果循环次数在执行循环体之前就已确定,一般用f
or循环;如果循环次数是由循环体的执行情况确定的,一般用while循环或者do-while循环。当循环体至少执行一次时,用do-while循环,反之,如果循环体可能一次也不执行,选用while循环。
2.循环结构类型之间的相互转换尽管上面对于循环结构的选择给出了原则性指导意见,但是我们应注意到其实这三种循环结构彼此之间可以相互转换。下面的例子就说明了这一点。例如:把50~100之间的不能被3整除的数输
出。【例10.6.9】用while语句实现#include"stdio.h"main(){intn=50;/*循环变量初始化。*/while(n<=100)/*先判断条件,再决定执行与否*/{if(n%3!=0)printf("%4d"
,n);n++;}}【例10.6.10】用do-while语句实现#include"stdio.h"main(){intn=50;/*循环变量初始化。*/do/*先执行一次循环体,再判断条件,决定是否继续执行循环体*/{if(n%3!=0)printf("%4d",n);n++;}while(
n<=100);}【例10.6.11】用for语句实现#include"stdio.h"main(){intn;/*循环变量初始化、条件判断、循环变量自增在一条语句中实现。*/for(n=50;n<=100;n++){if(n%3!=0)pr
intf("%4d",n);}}【例10.6.12】用if和goto语句构成的循环实现#include"stdio.h"main(){intn=50;loop:if(n%3!=0)printf("%4d",n);n++;if(n<
=100)gotoloop;/*非结构化程序设计方法,不提倡。*/}大学计算机应用基础安徽师范大学数学与计算机科学学院6010.6.6break和continue语句break语句功能:在终止对switch语句或循环语句的执行,即跳出这两种语句,而转入下一语句执行。说
明:(1)break不能用于循环语句和switch语句之外的任何其它语句之中。(2)break只能终止并跳出最近一层的结构。while(表达式1){……if(表达式2)break;……}语句……do{……if(表达式2)break;……}while(表达式1);语句……for(;表达式1;){…
…if(表达式2)break;……}语句……for(;表达式1;){for(;表达式1;){……break;}语句……}……大学计算机应用基础安徽师范大学数学与计算机科学学院61【例10.6.13】从键盘
上连续输入字符,并统计其中大写字母的个数,直到输入“换行”字符时结束。#include"stdio.h"main(){charch;intsum=0;while(1){ch=getchar();if(ch=='\n')break;/*跳
出整个while循环结构*/if(ch>='A'&&ch<='Z')sum++;}printf("sum=%d\n",sum);}运行结果:HOWAREYOU↙sum=9大学计算机应用基础安徽师范大学数学与计算机科学学院62continue语句功能:结束本次循环,跳过循环体中尚未执行的语句
,进行下一次是否执行循环体的判断。说明:(1)仅用于循环语句中。(2)在嵌套循环的情况下,continue语句只对包含它的最内层的循环体语句起作用。for(…){while(…){……if(…)continue;……}语句……}大学计算机应用基础安徽师范大学数学与计算机科学学
院63【例10.6.16】在循环体中continue语句执行示例。#include"stdio.h"main(){intk=0,s=0,i;for(i=1;i<=5;i++){s=s+i;if(s>5){print
f("***i=%d,s=%d,k=%d\n",i,s,k);continue;/*终止本轮循环,但未跳出循环结构*/}k=k+s;printf("i=%d,s=%d,k=%d\n",i,s,k);}}运行结果:i=1,s=1,k=1i=2,s=3,k=4***i=3,s=6,k=4*
**i=4,s=10,k=4***i=5,s=15,k=4大学计算机应用基础安徽师范大学数学与计算机科学学院6410.6.7应用举例intx=23;do{printf(“%2d”,x--);}while(!x)inti=0,sum=1;do{sum=s
um+i++;}while(i<6);printf(“%d\n”,sum);for(x=3;x<6;x++)printf((x%2)?(“**%d”):(“##%d\n”),x);【例】求执行下面程序片段的结果输出的结果为:**3##4**5输出结果为16输出的结果为23大学计算机应用基础
安徽师范大学数学与计算机科学学院65【例10.6.20】求以下程序的输出结果#include<stdio.h>main(){inta,b=1;for(a=1;a<=100;a++){if(b>=20)break;if(b%3==1){
b=b+3;continue;}b=b-5;}printf(“%d\n”,a);}运行结果8大学计算机应用基础安徽师范大学数学与计算机科学学院66【例10.6.21】.在执行以下程序时,如果从键盘上输入:ABCdef<回车>,则
输出结果是什么。#include<stdio.h>main(){charch;while((ch=getchar())!=‟\n‟){if(ch>=‟A‟&&ch<=‟Z‟)ch=ch+32elseif(ch>=‟a‟&&ch<=‟z‟)ch=ch-32;printf(“%c”,ch);}p
rintf(“\n”);}输出结果为:abcDEF。大学计算机应用基础安徽师范大学数学与计算机科学学院67【例10.6.22】从键盘输入一个大于2的整数n,判断n是不是素数。main(){intn,m,i,flag;doscanf("%d"
,&n);while(n<=2);m=sqrt(n);flag=0;for(i=2;i<=m;i++){if(n%i==0){flag=1;break;}}if(flag==1)printf("%disNOTaprimenumber.\n",n);elseprintf
("%disaprimenumber.\n",n);}问题分析:只能被1和它本身整除的数是素数。为了判断n是不是素数,可以让n除以2到n的平方根(sqrt(n))之间的每一个整数,如果n能被某个数整除,则说明n不是素数,否则,n一定是素数。程序如
下:大学计算机应用基础安徽师范大学数学与计算机科学学院68【例10.6.23】求100-200之间的所有素数main(){intn,m,i,flag;for(n=101;n<=200;n=n+2){m=sqrt(n);flag=0;for(i=2;i<=m;i++)
{if(n%i==0){flag=1;break;}}if(flag==0)printf("%5d",n);}}程序运行结果:1011031071091131271311371391491511571631671731791811
91193197199大学计算机应用基础安徽师范大学数学与计算机科学学院69ij【例10.6.24】求输出下三角形式九九乘法表。12345678912436991827364554637281……………
..main(){inti,j;printf("***九九乘法表***\n");/*输出表头*/for(i=1;i<=9;i++)/*外层循环,控制行*/printf("%-4d",i);printf("\n");for(i=1;i<=9;i++)/*内层循环,控
制列*/{printf("%-4d",i);for(j=1;j<=i;j++)printf("%-4d",i*j);printf("\n");}}大学计算机应用基础安徽师范大学数学与计算机科学学院70【例10.6.25】求Fibonacci数列的前50项。Fibonacci数列的第
一项为1,第二项为1,从第三项开始,每项等于前两项之和。#include"stdio.h"main(){inti;longf1=1,f2=1,f;printf("%10d%10d",f1,f2);/*输
出数列的前两项*/for(i=3;i<=50;i++){f=f1+f2;printf("%10d",f);f1=f2;/*这两行为下一次循环作准备*/f2=f;}}程序分析可以引入三个变量f1、f2和f,分别存放数列的前两项和当前项,其中f=f1+f2。用一个循环来求
解数列的前50项,每次求下一项时,令f1=f2,f2=f,f=f1+f2。