




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章程序设计ABC
计算机与人工智能计算机行业的梦想让计算机(Computer)能像人一样地思考,与人自然交流,人工智能(ArtificialIntelligence)图灵测试
计算机与人工智能1997年,IBM公司研制的深蓝超级计算机在一场“人机大战”中打败了国际象棋大师卡斯帕罗夫被誉为“人工智能的一大胜利”
深蓝的主要研制者之一许峰雄博士:胜利靠的只是不知疲倦地高速运算,并不是什么智能计算机与信息技术计算机技术与通信技术结合,构成了信息技术(InformationTechnology),诞生了一个新词:IT嵌入式系统是IT未来的主要发展方向之一典型的嵌入式系统有:机器人、手机和智能家电等计算机计算机是用来延伸人的能力的工具,需要人来驾驭我们的职责是让非计算机专业的人更容易驾驭它完成这一目标的主要手段之一就是
“编程(Programming)”计算机基本工作过程整个过程的执行者是硬件,但硬件是受软件控制的编程,就是编写软件,使硬件按照人的意图工作计算机基本工作过程输入/输出设备存储器运算器控制器源程序和输入数据输出结果取出数据存入数据操作命令存取命令取出程序指令输入输出命令计算结果CPU“冯·诺依曼机”结构大脑记忆装置眼睛和耳朵程序和数据硬盘CPU内存执行结果软件的形成软件(Software)的形成程序员(Programmer)编写程序源代码(SourceCode)编译器(Compiler)把源代码转换为可被计算机理解的机器代码(MachineCode)并把机器代码以可执行文件(ExecutableFile)的形式保存在磁盘上软件运行过程的简单描述软件的运行计算机把机器代码读入到内存(Memory)由CPU运行这些代码读取输入(Input)产生输出(Output)完成程序员预定的功能计算机专业后续课程计算机原理编译原理操作系统程序设计语言(ProgrammingLanguage)是人与计算机进行交流的语言计算机直接能读懂的语言机器语言(MachineCode),也叫机器代码一种纯粹的二进制语言程序设计语言的故事程序设计语言的故事计算机为什么用二进制呢?为什么不用我们日常熟悉的十进制呢?二进制在在电器元件中容易实现计算机进行二进制运算比进行十进制运算要简单得多程序设计语言的故事机器语言编写的1+1程序汇编语言(AssembleLanguage)编写的1+1程序101110000000000100000000000001010000000100000000MOVAX,1ADDAX,1程序设计语言的故事BASIC语言编写的1+1程序C语言编写的1+1程序PRINT1+1#include<stdio.h>main(){ printf("%d\n",1+1);}程序设计语言一种程序设计语言对应一种编译器程序员按照该语言的语法编写程序源代码,把自己的意图融入到代码中编译器读入源代码,把程序员的意图转换成可执行程序,供他人使用程序设计语言编辑(Edit)扩展名为.c的文件编译(Compile)扩展名为.obj的文件链接(Link)形成最后的可执行文件扩展名为.exe的文件运行(Run)流行语言应用编程语言机器语言汇编语言BasicPascalCC++JavaC#专项编程语言LotusNotesPowerBuilderWeb编程语言HTMLXMLPHPASPJSPJavaScriptVBScript其他perlpythonVBAC程序设计语言简称C语言BCPL语言进化成B语言,B语言又进化为C语言是一种高级语言高级语言并不是“高级”,只是相对低级语言,在一个高的级别上进行编程历史悠久,战勋卓著诞生于上世纪70年代初,成熟于80年代“ANSIC”标准的发布是C语言成熟的标志很多重量级软件都是用C写的上天入地,无所不能几乎没有不能用C写出来的软件,没有不支持C的系统C程序设计语言硬件(Hardware)操作系统(OS)应用程序
(Application)应用
平台基于
平台的
应用
程序低级语言的地盘高级语言的地盘C语言的地盘C程序设计语言C语言被分类位高级语言,但实际上它是一种介于高级语言和低级语言之间的语言。很多流行语言、新生语言都借鉴了它的思想、语法从C++,到Java,再到C#正确地学好C语言,是学习这些流行语言的基础。C语言的设计者
DennisM.Ritchie和Unix的设计者KenThompson
接受美国国家技术勋章内容提要基本数据类型;常量和变量;标识符命名;常用运算符和表达式;运算符的优先级与结合性一个简单的C程序例子#include<stdio.h>/*函数功能:计算两个整数相加之和
入口参数:整型数据a和b
返回值:整型数a和b之和*/int
Add(inta,intb){
return(a+b);}/*主函数*/main(){
intx,y,sum=0; printf("Inputtwointegers:"); scanf("%d%d",&x,&y);/*输入两个整型数x和y*/ sum=Add(x,y);/*调用函数Add计算x和y相加之和*/ printf("sum=%d\n",sum);/*输出x和y相加之和*/}C程序常见符号分类关键字(Keyword)又称为保留字,C语言中预先规定的具有固定含义的一些单词标识符(Identifier)系统预定义标识符用户自定义标识符运算符(Operator)34种,详见附录2
分隔符(Separator)空格、回车/换行、逗号等其它符号大花括号“{”和“}”通常用于标识函数体或者一个语句块“/*”和“*/”是程序注释所需的定界符数据(Data)变量(Variable)常量(Constant)数据类型(DataType)数据为什么要区分类型?不同类型的数据代表不同的数据表示形式合法的取值范围占用内存空间大小可参与的运算种类从基本数据类型到抽象数据类型无数据类型基本数据类型构造数据类型抽象数据类型数据类型(DataType)数据类型基本类型构造类型指针类型空类型整型实型(浮点型)字符型枚举类型数组类型结构体类型共用体类型单精度实型双精度实型基本整型长整型短整型无符号整型标识符命名变量名函数名由英文字母、数字和下划线组成,大小写敏感不可以是数字开头直观,见名知意,便于记忆和阅读最好使用英文单词或其组合切忌使用汉语拼音下划线和大小写通常用来增强可读性variablenamevariable_nameVariableName,variableName不允许使用关键字作为标识符的名字
int,float,for,while,if等某些功能的变量采用习惯命名如:for语句所采用的循环变量习惯用i,j,kWindows风格UNIX风格b,B,KB,MB,GB,TBMegabyte(MB),中文叫法:兆Kilobyte(KB),中文叫法:
KByte,中文叫法:字节bit,中文叫法:位Gigabyte(GB),中文叫法:GTerabyte(TB),中文叫法:T1TB==
1,024GB1GB
==
1,024MB1MB
==
1,024KB1KB
==
1,024B1B==
8bb,B,KB,MB,GB,TB一个位有多大?只能是“0”或者“1”,这叫二进制一个字节有多大?保存一个字符(英文字母、数字、符号)ASCII(美国标准信息交换码)编码两个字节保存一个汉字GB编码可以表示数字0~255基本数据类型int整数,在目前绝大多数机器上占4个字节。TC2中是2个字节float单精度浮点数,一般是4个字节长double双精度浮点数,一般是8个字节长char字符,一般是1个字节长用来表示256个ASCII字符,或者0~255的整数数据类型修饰符shortshort
int,短整数,一般2个字节长。通常简写为shortlonglong
int,长整数,一般是4个字节长。通常简写为longlong
double,长双精度(高精度)浮点数,一般是10个字节长。signed用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略unsigned用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0)使用变量要注意不要对变量所占的内存空间字节数想当然用sizeof获得变量或者数据类型的长度现场演示程序在TurboC2.0和VisualC下的运行结果注意!#include<stdio.h>main(){
printf("DatatypeNumberofbytes\n");
printf("---------------------------------\n");
printf("char%d\n",sizeof(char));
printf("int%d\n",sizeof(int));
printf("shortint%d\n",sizeof(short));
printf("longint%d\n",sizeof(long));
printf("float%d\n",sizeof(float));
printf("double%d\n",sizeof(double));}变量声明使用变量的基本原则变量必须先定义,后使用所有变量必须在第一条可执行语句前定义声明的顺序无关紧要一条声明语句可声明若干个同类型的变量声明变量,是初始化变量的最好时机不被初始化的变量,其值为危险的随机数 charesc='a'; inti=1; intsum=0; floateps=1.0e-5;实型数据提供的有效数字位数float型数据提供7位有效数字double型数据提供16位有效数字使用不当导致舍入误差#include<stdio.h>main(){
floata;
doubleb; a=123456.789e4; b=123456.789e4;
printf("%f\n%f\n",a,b);}数据在内存中的存储格式整型实型字符型阶码符号阶码的数值尾数符号尾数的数值阶码j尾数Schar型与int型之间的关系小写字母转换为大写字母#include<stdio.h>main(){
charch='b';
ch='b'-32;
printf("%c,%d\n",ch,ch);}#include<stdio.h>main(){
charch='b';
ch='b'-('a'-'A')
;
printf("%c,%d\n",ch,ch);}常数(Constant)整型常数18、-31长整型常量123l、123L、123456l、123456L无符号型常量123u、123U浮点常数十进制小数形式123.45、456.78指数形式1e-2、4.5e3单精度实型常量123.45f、456.78F、1e-2f、4.5e3F长双精度型常量123.45l、456.78L、1e-2l、4.5e3L八进制与十六进制常数以数字“0”开始的整型常数是八进制数022、-037010和10大小不一样因为八进制并不常用,所以此种表示法比较少见以“0x”或者“0X”开始的整型常数是十六进制A~F和a~f用来表示十进制的10~15十六进制的形式比较常用,尤其在进行位一级的控制的时候0x12、-0x1F,-0x1f字符(Character)常数字符常数的表示方法’a’,’A’,’5’,’%’,’$’……单引号内只能有一个字符,除非用“\”开头就是一个普通整数,也可以参与各种数学运算每个字符具有一个0~255之间的数值,可从ASCII表查出注意:’5’和整数5的区别字符的数学运算在密码学内用得比较多字符常数转义字符一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示字符串(String)常数用双引号括住的由0个或多个字符组成的字符序列"Iamastring"""表示空字符串转义字符也可以在字符串中使用引号只作为字符串开始和结束的标志C语言内部用’\0’表示字符串的结束除注释外,是唯一可以出现中文的地方"x"和’x’是不同的<string.h>里定义了一系列专门的字符串处理函数枚举(Enumeration)常量一个被遗忘的角色从程序来窥其一斑
enumweeks{MON,TUE,WED,THU,FRI,SAT,SUN};
enumweekstoday;enumresponse{no,yes,none};enumresponseanswer;today=TUE;answer=yes;
if(answer==yes)printf("TodayisTuesday.\n");
elseprintf("TodayisNOTTuesday.\n");宏常量宏常量也称符号常量一般采用大写字母表示#define标识符字符串不是语句,而是一种编译预处理命令宏替换(MacroSubstitulition)#include<stdio.h>#definePI3.14159#defineR5.3main(){
printf("area=%f\n",PI*R*R);
printf("circumference=%f\n",2*PI*R);}宏常量宏常量也称符号常量一般采用大写字母表示#define标识符字符串不是语句,而是一种编译预处理命令宏替换(MacroSubstitulition)#include<stdio.h>#definePI3.14159#defineR5.3main(){
printf("PI*R*R=%f\n",PI*R*R);
printf("2*PI*R=%f\n",2*PI*R);}const常量用const修饰定义的变量为常量const
floatpi=3.1425926;
常量只能在定义时赋值,然后不能再改变其值常数、const常量、宏常量和枚举常量,都可以用来表示一个永远不会改变的数前者不建议直接使用,而用后三者代替算术运算符+,-,*,/加、减、乘、除运算四则混合运算中,先算乘除,后算加减,
按从左向右的顺序计算,左结合%求余运算常用的标准数学函数函数名功能函数名功能sqrt(x)计算x的平方根,x应大于等于0exp(x)计算ex的值fabs(x)计算x的绝对值pow(x,y)计算xy的值log(x)计算lnx的值sin(x)计算sinx的值,x为弧度值log10(x)计算lgx的值cos(x)计算cosx的值,x为弧度值关系运算符>,>=,<,<=,==,!=大于,大于等于,小于,小于等于,等于,不等于关系运算符运算出的结果为0和非00,表示假,即该关系不成立非0,表示真,即该关系成立绝大多数编译器,关系运算得到的非0结果为1,但是不要利用这个1逻辑运算符逻辑运算也被称为布尔(Boolean)运算&&与运算(a>b&&b>c);a大于b,并且b大于c||或运算(a>b||b>c);a大于b,或者b大于c!求反(!a);如果a是0,结果非0;如果a是非0,结果是0并不改变a的值实例ch是英文大写字母(ch>='A')&&(ch<='Z')判断某一年year是否是闰年的条件是满足下列两个条件之一:能被4整除,但不能被100整除;能被400整除;((year%4==0)&&(year%100!=0))||(year%400==0)类型转换在进行赋值操作时,会发生类型转换将取值范围小的类型转为取值范围大的类型是安全的反之是不安全的如果大类型的值在小类型能容纳的范围之内,则平安无事但是,浮点数转为整数,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关。避免如此使用字符串与数值类型之间的转换inti="123"这样用是不行地atof(),atoi(),atol()把字符串转为double,int和long定义在stdlib.h中sprintf()可以用来把各种类型的数值转为字符串定义在stdio.h中自动类型转换同种数据类型的运算结果,还是该类型不同种数据类型的运算结果,是两种类型中取值范围更大的那种long
double>double>float>long>int>short>char把数据赋值给另外一种类型变量也会发生自动类型转换从小到大,顺利转换从大到小,可能丢失信息(好的编译器会发出警告)类型强转(Casting)消除从大到小的警告l=(long)i;可以通过“(类型)表达式”的方式把表达式的值转为任意类型强转时,你必须知道你在做什么强转与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将#include<stdio.h>main(){
intm=5;
printf("m/2=%d\n",m/2);
printf("(float)(m/2)=%f\n",(float)(m/2));
printf("(float)m/2=%f\n",(float)m/2);
printf("m=%d\n",m);}增一和减一运算符n++,n--,++n,--n++让参与运算的变量加1,--让参与运算的变量减1作为后缀运算符时,先取n的值,然后加/减1作为前缀运算符时,先加/减1,然后取n的值m=n++;
等价于m=n;n++;m=++n;
等价于n++;m=n;增一和减一运算符良好的程序设计风格提倡:在一行语句中,一个变量只能出现一次加1或者减1运算过多的加1和减1运算混合,不仅可读性差,而且因为编译器实现的方法不同,导致不同编译器产生不同的运行结果位操作运算符&按位与运算|按位或运算^按位异或运算<<按位左移运算>>按位右移运算~按位求反赋值运算符下面两个语句是等价的i=i+2;i+=2;+、-、*、/、%、<<、>>、&、^、|运算符都可以按此种方式处理这种形式看起来更直观,而且执行效率一般也能更高一些逗号运算符表达式1,表达式2,…..,表达式n多数情况下,并不使用整个逗号表达式的值,更常见的情况是要分别得到各表达式的值主要用在循环语句中,同时对多个变量赋初值等
for(i=0,j=0;i<j;i++,j++)条件表达式把a和b中的最大值放入z中if(a>b)
z=a;
else
z=b;
z=(a>b)?a:b;
此种表达式切忌用得过于繁杂优先级()[]->.!~++--+-*&(类型)sizeof*/%+-<<>><<=>>===!=&^|&&||?:=+=-=*=/=%=&=^=|=<<=>>=,优先级能背下优先级表的人凤毛麟角用括号来控制运算顺序更直观、方便,并减少出错的概率结合性多数运算符为左结合少数为右结合:一元运算符赋值运算符条件运算符这一章我们学到了变量的命名规则数据类型char,short,int,long,float,double,long
doublesigned,unsignedenum常数、转义字符运算符算术运算符、关系运算符、逻辑运算符、增一/减一运算符、位运算符、赋值运算符、类型强转运算符、逗号运算符、条件运算符(?:)、
sizeof类型转换优先级和结合性内容提要字符输入输出函数格式输入输出函数C语言中的语句变量声明语句intx,y;表达式语句i++;i=i+1;空语句;复合语句{t=x;x=y;y=t;}控制语句顺序结构程序的基本操作如何在程序中给变量赋值?赋值表达式语句赋值表达式;Total=m*pow(1+r,n);如何进行数据的输入输出?输入:从标准输入设备上输入数据到计算机内存输出:将计算机内存中的数据送到标准输出设备C语言中输入输出操作通过调用标准库函数来实现#include"stdio.h"
在当前目录和TC指定的目录中找该文件#include<stdio.h>在由TC指定的文件目录中找该文件复合语句在什么情况下使用复合语句?条件语句和循环语句在语法上只允许带一条语句当分支和循环中需要进行多项操作时{
t=x;x=y;y=t;}被当作一条语句来处理例3.1main(){
inta=0; {
inta=1;
printf("In:a=%d\n",a); }
printf("Out:a=%d\n",a);}In:a=1Out:a=0空语句空语句有什么作用?什么也不做,只表示语句的存在自顶向下程序设计时用在那些未完成的模块中main(){DataInitialze();DataProcess();DataOutput();}DataInitialze(){;}字符输入输出函数字符输出函数putchar(ch)输出一个字符ch字符输入函数getchar()无参数函数值为从输入设备接收的字符#include<stdio.h>main(){
charch;
printf("PressakeyandthenpressEnter:"); ch=getchar();
printf("Youpressed");
putchar(ch);
putchar('\n');}运行程序PressakeyandthenpressEnter:311A↙YoupressedA例3.2格式输出函数格式输出函数printf(格式控制字符串,输出项表列);输出若干个任意类型的数据printf("a=%db=%f",a,b);函数名输出表列普通字符格式说明d以带符号十进制整数输出o以八进制无符号整数输出(无前导0)x以十六进制无符号整数输出(无前导0x)u以十进制无符号整数输出c以字符形式输出单个字符s输出一个字符串f以小数形式输出浮点数(6位小数)e以标准指数形式输出(6位小数)g选用%f,%e中输出宽度较小的一种格式printf格式字符l
长整型整数,加在d、o、x、u前Llongdouble型数,加在f、e、g前m表示数据占用的最小宽度数据宽度大于m,按实际宽度输出数据宽度小于m时,补空格n对实数表示输出n位小数对字符串表示最多输出的字符个数-改变输出内容的对齐方式缺省为右对齐printf附加格式说明符#include<stdio.h>main(){
floatf1=100.15799,f2=12.55,f3=1.7;
intn1=123,n2=45,n3=6;
printf("printfWITHOUTwidthorprecision specifications:\n"); printf("%f\n%f\n%f\n",f1,f2,f3); printf("%d\n%d\n%d\n",n1,n2,n3); printf("printfWITHwidthandprecision specifications:\n"); printf("%5.2f\n%6.1f\n%3.0f\n",f1,f2,f3); printf("%5d\n%6d\n%3d\n\n",n1,n2,n3);}例3.8格式输入函数格式输入函数scanf(格式控制字符串,地址表列);scanf("%d,%f”,&a,&b);非格式字符格式说明地址表列格式输入函数常见错误scanf("%d,%f\n”,&a,&b);scanf("%d,%f”,a,b);scanf("%7.2f",&a);d以带符号十进制形式输入整型数据o以八进制无符号形式输入(无前导0)x以十六进制无符号形式输入(无前导0x)c以字符形式输入单个字符s输入字符串,以非空字符开始,遇第一个空白字符结束f以小数形式输入浮点数e以标准指数形式输入scanf格式字符l
加在d、o、x、u前:输入长整型
加在f、e前:输入双精度型L加在f、e前:输入longdouble型h加在d、o、x前:输入短整型m表示数据占用的宽度*本输入项在读入后不赋给相应的变量scanf附加格式说明符输入数据时,遇以下情况时该数据认为结束遇空格、回车、TAB键遇宽度:%3d遇非法输入格式输入函数#include<stdio.h>main(){
inta,b; printf("Pleaseinputaandb:"); scanf("%2d%*2d%2d",&a,&b); printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}Pleaseinputaandb:a=12,b=56,a+b=68123456↙例3.9#include<stdio.h>main(){
inta,b; printf("Pleaseinputaandb:"); scanf("%2d%*2d%2d",&a,&b); printf("a=%d,b=%d,a+b=%d\n",a,b,a+b);}Pleaseinputaandb:a=12,b=5,a+b=1712345a↙例3.9#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题1:当要求程序输出结果为
a=12,b=34时,用户应该如何输入数据?
1234↙输入数据的格式控制——例3.10#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题2:当限定用户输入数据以逗号为分隔符,即输入数据格式为:12,34↙时,应修改程序中的哪条语句?怎样修改?scanf("%d,%d",&a,&b);
输入数据的格式控制——例3.10#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题3:语句scanf("%d%d",&a,&b);修改为scanf("a=%d,b=%d",&a,&b);时,用户应该如何输入数据?a=12,b=34↙输入数据的格式控制——例3.10#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}
问题4:限定用户输入数据为以下格式为
1234↙
同时要求程序输出结果为a=12,b=34scanf("%2d%2d",&a,&b);输入数据的格式控制——例3.10#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}
问题5:限定用户输入数据为以下格式为12↙34↙
同时要求程序输出结果为a="12",b="34"scanf("%d%d",&a,&b);printf("a=\"%d\",b=\"%d\"\n",a,b);输入数据的格式控制——例3.10#include<stdio.h>main(){
inta,b; scanf("%d%d",&a,&b); printf("a=%d,b=%d\n",a,b);}问题6:设计程序使得用户可以以任意字符(回车、空格、制表符、逗号、其它)作为分隔符进行数据的输入scanf("%d%*c%d",&a,&b);
输入数据的格式控制——例3.10#include<stdio.h>main(){
intdata1,data2,sum;
charop;
printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2
第1次测试12+3↙123129=3141C格式符存在的问题及其解决—例3.11#include<stdio.h>main(){
intdata1,data2,sum;
charop;
printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2
第2次测试123↙123=5C格式符存在的问题及其解决—例3.11#include<stdio.h>main(){
intdata1,data2,sum;
charop;
printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%c%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}Pleaseentertheexpressiondata1+data2
第3次测试12+3↙12+3=5C格式符存在的问题及其解决—例3.11#include<stdio.h>main(){
inta;
charb;
floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%c",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:希望得到的运行结果12↙Pleaseinputancharacter
:a↙Pleaseinputafloatnumber:3.5↙integer:12character
:afloatnumber:3.500000C格式符存在的问题及其解决—例3.12#include<stdio.h>main(){
inta;
charb;
floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%c",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:结果好像很奇怪嘛!12↙Pleaseinputancharacter
:a↙Pleaseinputafloatnumber:3.5↙integer:12floatnumber:3.500000C格式符存在的问题及其解决—例3.12#include<stdio.h>main(){
inta;
charb;
floatc;printf("Pleaseinputaninteger:");scanf("%d",&a);printf("integer:%d\n",a);printf("Pleaseinputacharacter:");scanf("%1s",&b);printf("character:%c\n",b);printf("Pleaseinputafloatnumber:");scanf("%f",&c);printf("float:%f\n",c); }Pleaseinputaninteger:程序修改后得到的运行结果12↙Pleaseinputancharacter
:a↙Pleaseinputafloatnumber:3.5↙integer:12character
:afloatnumber:3.500000C格式符存在的问题及其解决—例3.12#include<stdio.h>main(){
intdata1,data2,sum;
charop;
printf("Pleaseentertheexpression data1+data2\n"); scanf("%d%1s%d",&data1,&op,&data2); printf("%d%c%d=%d\n",data1,op,data2,data1+data2);}12+3↙12+3↙12↙+↙3↙再回头来看例3.10,想以任意分割符输入加法算式,可能吗?这一章我们学习了字符输入函数getchar()字符输出函数putchar()格式输入函数scanf()格式输出函数printf()格式控制问题——难点内容提要算法的描述方法基本控制结构基本控制语句常用算法,如累加、累乘、统计、递推、迭代、穷举等程序的基本版式结构化程序设计的基本思想算法的概念
数据结构+算法=程序算法:为解决一个具体问题而采取的确定的有限的操作步骤,这里仅指计算机能执行的算法算法特性:有穷性确定性
有效性
没有输入或有多个输入
有一个或多个输出
算法的分类
数值运算算法:解决的是求数值解的问题,例如用辗转相除法求两个数的最大公约数等非数值运算算法:主要用于解决需要用分析推理、逻辑推理才能解决的问题,例如人工智能中的许多问题,查找、分类等问题算法的表示方法自然语言表示传统的流程图表示N-S结构化流程图表示
伪代码表示C程序结构C程序源程序文件1源程序文件2源程序文件3编译预处理命令全局变量声明函数1函数n…函数首部函数体局部变量声明执行语句构成程序的三种基本结构顺序结构选择结构循环结构已经证明,任何程序均可只用这三种结构综合描述只用这三种结构编制的程序,叫结构化程序程序必须符合结构化规则结构化程序设计的核心思想
采用顺序、选择和循环三种基本结构作为程序设计的基本单元只有一个入口;只有一个出口;无死语句,即不存在永远都执行不到的语句;无死循环,即不存在永远都执行不完的循环。采用“自顶向下、逐步求精”和模块化的方法进行结构化程序设计BANS图传统流程图顺序结构BABN如果
成绩<60
那么
通知补考否则
告知你考试成绩AY条件PABNY条件P分支结构(选择结构)条件PA当型循环直到型循环真假假条件PA假真循环结构当型循环A真假假条件P循环结构当P为真A当P为真A直到型循环条件PA假真循环结构直到P为假A直到P为假A复合语句{}括住的若干条语句构成一个复合语句语句块内可以定义变量变量仅在定义它的复合语句内有效变量必须在复合语句的开头定义复合语句可以用在任何可以使用语句的地方if-else选择结构的一种最常用形式if(表达式)
语句1;
else
语句2;
语句3表达式值非0时,执行语句1,然后语句3;
表达式值为0时,执行语句2,然后语句3else部分可以没有。if(表达式)
语句1;
语句3当表达式值为0时,直接执行语句3if-else嵌套使用时,注意else和谁配对的问题else-ifif的一种扩展形式if(表达式)
语句1;
elseif(表达式)
语句2;
elseif(表达式)
语句3;
…………
else
语句4;
语句5;else部分可以没有现场编程完成例4.5体型判断。按“体指数”对肥胖程度进行划分:体指数t=体重w/(身高h)2(w单位为公斤,h单位为米)当t<18时,为低体重;当t介于18和25之间时,为正常体重;当t介于25和27之间时,为超重体重;当t>=27时,为肥胖。编程从键盘输入你的身高h和体重w,根据给定公式计算体指数t,然后判断你的体重属于何种类型。用3种方法编程:算法1:用不带else子句的if语句编程算法2:用在if子句中嵌入if语句的形式编程算法3:用在else子句中嵌入if语句的形式编程switch多路选择switch(表达式){
case
常数1:
语句序列1;
case
常数2:
语句序列2;
…………
default:
语句序列3;
}default可以没有,但最好不省略不要忘记break现场编程完成计算器程序……例4.8编程设计一个简单的计算器程序,要求根据用户从键盘输入的表达式:操作数1运算符op操作数2然后,计算表达式的值,指定的运算符为加(+)、减(-)、乘(*)、除(/)循环——while,forwhile(表达式)
{
语句;}for(表达式1;表达式2;表达式3)
{
语句;}whilewhile(表达式)
{
语句;}只要表达式的值为非0,就重复执行语句,直到表达式值为0时止forfor(表达式1;表达式2;表达式3)
{
语句;}首先执行表达式1。如果表达式2的值为非0,就重复执行语句和表达式3,直到表达式2的值为0时止相当于:
表达式1;
while(表达式2){
语句;
表达式3;
}表达式1和表达式3可以没有或者是用逗号分隔的多个表达式的组合。但最好不要有太多的表达式组合注意在for和while语句之后一般没有分号有分号表示循环体就是分号之前的内容(空循环体)while(i<100);
i++;for(i=0;i<100;i++);
printf("%d",i);for通常有一个循环变量控制循环的次数,不要在循环体内改变这个变量do-whiledo
{
语句;
}while(表达式);首先执行语句,然后判断表达式的值。如果表达式为0,继续向下执行,否则,再次执行语句,再次判断表达式的值语句会被至少执行一次条件PA当型循环直到循环真假假条件PA假真假条件P条件PA假当循环条件第一次就为假时选择三种循环的一般原则如果循环次数已知,用for如果循环次数未知,用while如果循环体至少要执行一次,用do-while这只是“一般”原则,不是“原则”现场编程完成例4.6,例4.9例4.6:猜数游戏:先由计算机“想”一个数请人猜,如果人猜对了,则计算机给出提示:“Right!”,否则提示:“Wrong!”,并告诉人所猜的数是大还是小。例4.9:先由计算机“想”一个1到100之间的数请人猜,如果人猜对了,则结束游戏,否则计算机给出提示,告诉人所猜的数是太大还是太小,直到人猜对为止。计算机记录人猜的次数,以此来反映猜数者“猜”的水平。猜数游戏用到的库函数随机函数rand()#include<stdlib.h>RAND_MAX在stdlib.h中定义,不大于双字节整数的最大值32767产生[0,RAND_MAX]之间的随机数magic=rand();产生[0,b-1]之间的随机数magic=rand()%b;产生[a,a+b-1]之间的随机数magic=rand()%b+a;现场编程完成例4.6,发现问题猜数游戏用到的库函数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”通过键入随机数种子,产生[0,100]之间的随机数scanf("%u",&seed);srand(seed);magic=rand()%100+1;猜数游戏用到的库函数随机函数srand为函数rand()设置随机数种子来实现对函数rand所产生的伪随机数的“随机化”使用计算机读取其时钟值并把该值自动设置为随机数种子,产生[0,100]之间的随机数函数time()返回以秒计算的当前时间值,该值被转换为无符号整数并用作随机数发生器的种子#include<time.h>srand(time(NULL));magic=rand()%100+1;死循环永远不会退出的循环为死循环for(;;){}while(1){}do
{}while(1)一般情况下,要极力避免死循环绝大多数程序不需要死循环。如果出现,往往都是bug时间过长的循环会造成“假死”效果,也要考虑解决现场编程完成例4.11国王的许诺。相传国际象棋是古印度舍罕王的宰相达依尔发明的。舍罕王十分喜欢象棋,决定让宰相自己选择何种赏赐。位聪明的宰相指着8×8共64格的象棋盘说:陛下,请您赏给我一些麦子吧,就在棋盘的第一个格子中放1粒,第2格中放2粒,第3格放4粒,以后每一格都比前一格增加一倍,依此放完棋盘上的64个格子,我就感恩不尽了。舍罕王让人扛来一袋麦子,他要兑现他的许诺。
国王能兑现他的许诺吗?试编程计算舍罕王共要多少麦子赏赐他的宰相,这些麦子合多少立方米?(已知1立方米麦子约1.42e8粒)
总粒数为:sum=1+2+22+23+…+263
方法1#defineCONST1.42e8#include<stdio.h>#include<math.h>main(){
intn;
doubleterm,sum=0;/*累加求和变量赋初值*/
for(n=1;n<=64;n++){
term=pow(2,n-1);/*根据累加项的规律计算累加项
*/sum=sum+term;/*作累加运算*/}
printf("sum=%e\n",sum);/*打印总麦粒数*/
printf("volum=%e\n",sum/CONST);/*打印折合的总麦粒体积数*/}
方法2#defineCONST1.42e8/*定义符号常量CONST值为1.42e8*/#include<stdio.h>main(){
intn;
doubleterm=1,sum=1;/*累乘求积、累加求和变量赋初值*/
for(n=2;n<=64;n++){term=term*2;/*根据后项总是前项的2倍计算累加项*/sum=sum+term;/*作累加运算*/}
printf("sum=%e\n",sum);/*打印总麦粒数*/
printf("volum=%e\n",sum/CONST);/*打印折合的总麦粒体积数*/}
使用嵌套的循环体时,应注意以下问题
在嵌套的各层循环体中,使用复合语句(即用一对大花括号将循环体语句括起来)保证逻辑上的正确性
内层和外层循环控制变量不应同名,以免造成混乱
嵌套的循环最好采用右缩进格式书写,以保证层次的清晰性
循环嵌套不能交叉,即在一个循环体内必须完整的包含着另一个循环
合法的嵌套循环现场编程完成例4.14编程输出如下形式的乘法九九表
#include<stdio.h>main(){
intm,n;
for(m=1;m<10;m++)
printf("%4d",m);/*打印表头*/
printf("\n");
for(m=1;m<10;m++)
printf("-");
printf("\n");
for(m=1;m<10;m++) {
for(n=1;n<10;n++) {
printf("%4d",m*n); }
printf("\n"); }}现场编程完成例4.15将上例输出格式改成如下的下三角格式打印
#include<stdio.h>main(){
intm,n;
for(m=1;m<10;m++)
printf("%4d",m);/*打印表头*/
printf("\n");
for(m=1;m<10;m++)
printf("-");
printf("\n");
for(m=1;m<10;m++) {
for(n=1;n<=m;n++) {
printf("%4d",m*n); }
printf("\n"); }}现场编程完成例4.16马克思手稿中有一道趣味数学题:有30个人,其中有男人、女人和小孩,在一家饭馆里吃饭共花了50先令,每个男人各花3先令,每个女人各花2先令,每个小孩各花1先令,问男人、女人和小孩各有几人?
解方程组穷举法方法1:采用三重循环穷举x,y,z的全部可能的组合
#include<stdio.h>main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=30;x++)
for(y=0;y<=30;y++)
for(z=0;z<=30;z++)
if(x+y+z==30&&3*x+2*y+z==50)
printf("%3d\t%5d\t%8d\n",x,y,z);}
方法2:改进算法
#include<stdio.h>
main(){
intx,y,z;
printf("Man\tWomen\tChildern\n");
for(x=0;x<=16;x++)
for(y=0;y<=25;y++){z=30–x-y;
if(3*x+2*y+z==50)printf("%3d\t%5d\t%8d\n",x,y,z);}}
流程的转移控制break语句continue语句goto语句return语句标准库函数exit()
break和continue对for、while、do-while循环进行内部手术break,退出循环continue,中断此次循环体的执行,开始下一次break和continue少用为妙break和continue假假真真break表达式1表达式2循环语句的下一条语句循环语句的下一条语句假假真真
contiue表达式1表达式2continue标号举例error:goto举例gotoerror;一般形式goto语句标号;……
语句标号:……或语句标号:…………goto语句标号;goto与标号(label)exit()函数exit(0)作用是终止整个程序的执行,强制返回操作系统调用该函数需要嵌入头文件<stdlib.h>输入一个整数,判断它是否是素数
方法1#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
printf("Yes!\n");end:
printf("Programisover!\n");}Pleaseenteranumber:
6
Programisover!No!方法1#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++) {
if(m%i==0) {
printf("No!\n");
gotoend; } }
printf("Yes!\n");end:
printf("Programisover!\n");}Pleaseenteranumber:
5
Programisover!Yes!方法2#include<math.h>main(){
intm,i,k;
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k;i++){
if(m%i==0)
break; }
if(i>k)
printf("Yes!\n");
else
printf("No!\n");
printf("Programisover!\n");}Pleaseenteranumber:
6
Programisover!No!方法3#include<math.h>main(){
intm,i,k,flag=1;/*标志变量flag初值置为1*/
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=k&&flag;i++) {
if(m%i==0)flag=0; }
if(flag)
printf("Yes!\n");
else
printf("No!\n");
printf("Programisover!\n");}这个程序是做什么的?#include<math.h>main(){
intm,i,k,flag=1;/*标志变量flag初值置为1*/
printf("Pleaseenteranumber:");
scanf("%d",&m); k=sqrt(m);
for(i=2;i<=m-1;i++) {
if(m%i==0)flag=0;
printf("%d\n",i);
}
if(flag)
printf("Nodivisor!Itisaprimenumber.\n");
printf("Programisover!\n");}Dijkstra和
gotoE.W.Dijkstra,生于1930年,卒于2002年8月6日软件体系结构,结构化程序设计,……Dijkstra和
gotoDijkstra早在1968年就指出:“Gotoconsideredharmful”
,“Ibecameconvincedthatthegotostatementshouldbeabolishedfromall"higherlevel"programminglanguages.”“Thegotostatement…istoomuchaninvitationtomakeamessofone'sprogram.”糟糕的gotoSTART_LOOP:if(fStatusOk){
if(fData
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 老人中考语文作文
- 玻璃熔化工艺模拟与优化考核试卷
- 什么中的身影初一语文作文
- 难忘的友谊初一语文作文
- 绿色初二语文作文
- 河南省洛阳市新安县2023-2024学年七年级下学期期末考试数学试卷(含答案)
- 磷肥生产设备结构与原理考核卷考核试卷
- 玩具行业人才培养需求考核试卷
- 宁波九校高二上学期语文作文
- 烘炉设备维护与管理考核试卷
- GB/T 30727-2014固体生物质燃料发热量测定方法
- GB/T 28731-2012固体生物质燃料工业分析方法
- 年度店长销售工作总结5篇
- 中小学生学习心理问题与疏导课件
- 自然地理学-第五章-地貌精课件
- 《骨折概论》课件
- 暨南大学-萧惠琳-毕业论文答辩PPT模板
- 数理统计(第三版)课后习题答案
- 工程竣工结算审计申请书
- (精选word)洪恩识字-生字卡片1-200
- CNC作业指导书及操作规范
评论
0/150
提交评论