C语言教案 ppt课件_第1页
C语言教案 ppt课件_第2页
C语言教案 ppt课件_第3页
C语言教案 ppt课件_第4页
C语言教案 ppt课件_第5页
已阅读5页,还剩168页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

语言程序设计,主讲:周小勇,QQ:542936950,EMail:zxyworking,手机1.1程序设计语言,1.1.1程序设计语言的发展,(1)机器语言,CPU的指令系统。计算机能够识别的机器代码。(,),(2)汇编语言,低级语言,用一些“助记符号“代替“,“编程。,第章语言概述,(3)面向过程的语言,汇编语言和机器语言是面向机器的。,把解题过程看作是数据被加工的过程。基于这种方法的程序设计语言被称为面向过程的程序设计语言。,()面向对象的程序设计语言,把现实世界看成是由许多对象组成的。,1.1.2程序设计语言的支持环境,不同的操作系统下编译和运行C语言程序的方式和命令是不同的。,注意:(1)FORTRAN语言是历史上的第一门计算机高级语言。,(2)语言称为程序员设计的语言,可以作为系统描述语言,既可以写系统软件,又可以写应用软件。用C语言编写的UNIX比用汇编语言编写的更易于理解修改和扩充。并因此于1983年获得了计算机的最高奖-图灵奖,要学UNIX必须先掌握C语言。,(3)FORTAN、Algol和Pascal称为计算机科学家设计的语言。,1.1.3编辑、编译、连接、运行语言程序,()编辑源程序。(*.c)()对源程序进行编译。(*.obj)()对编译生成的.obj文件进行连接,生成可执行程序.exe()执行可执行代码,验证结果的正确性,以确定是否要进行修改。,#includemain()inta,b,sum;printf(“EnterTwoNumbers:”);scanf(“%d%d”,例1,1.2用库函数组装C程序,例2,main()inta,b,c;scanf(“%d,%d”,结论:()程序是由函数构成的。一个源程序至少包含一个main函数和若干个其它函数。()一个函数由两部分组成.函数的说明部分:函数名,函数类型,函数属性,函数参数(形参)名形参类型.函数体:变量定义。执行部分,由若干个语句组成注:在某些情况下可以没有变量定义部分,甚至可以既无变量定义,又无执行部分。如:dump()/*空函数*/,()一个程序总是从main函数开始执行的而不论main函数在整个程序中的位置如何。()程序书写格式自由,一行内可以写几个语句,一个语句可以分写在多行上。()每个语句和数据定义的最后必须有一个分号。如:c=a+b;()语言本身没有输入输出语句,输入和输出的操作由库函数scanf和printf等完成()/*.*/可以对程序中的任何部分作注释。,语言的特点(1)语言简洁、紧凑、使用方便、灵活。(2)运算符丰富(共有34种运算符)。(3)数据结构丰富。如:整型、实型、字符型.(4)具有结构化的控制语句。如:ifelsewhiledowhilefor.(5)语法限制不太严格、程序设计自由度大。(6)语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。(7)生成目标代码质量高,程序执行效率高。(8)用C语言写的程序可移植性好。,2.1数据类型,语言的词法记号:是指程序中具有独立含义的不可进一步分割的单位。分为以下5类:()关键词是语言中预定义的符号,有固定的含义,用户自定义的任何名字不能够与之重复。关键词如下:autobreakcasecharcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile准关键词:defineendifincludeifdefifndeflineundef,第2章数据描述与基本操作,()标识符用户自已定义的符号。标识符的定义必须满足以下条件:.只能由字母、数字,下划线构成。.第一个字符必须为字母或下划线。.标识符不能和关键词同名.标识符最长只能是32个字符(TurboC中).用大写字母来表示常量标识符,用小写字母表示变量或其它标识符,()分隔符:分隔符用于分隔各种词法记号,常用的分隔符有:()*.:=;#,()运算符,()常量,C语言的数据类型:,()基本类型(简单类型),.数值类型,整型短整型(short),整型(int),长整型(long),实型(浮点型),单精度型(Float),双精度型(double),B.字符类型(char),C.枚举类型(enum),(2)构造类型(组合类型),.数组类型,.结构类型,.共用类型(union),D.文件类型(FILE),(3)指针类型,(4)空类型(void),2.1.1数值的定点表示形式与浮点表示形式,()语言中的指数形式的表示法:,3.14159e00.314159e+10.0314159e+2,=3.14159,=3.14159,=3.14159,(数字部分)尾数,指数(阶码),浮点数:小数点的位置是浮动的。,注意:在计算机内部实数(以小数形式表示的数)都以浮点形式存储,实数用4个字节存储,3个字节存放数字部分,一个字节存放指数部分。,()定点数,不带指数部分的数称为定点数。如:,3.14159,10,-20,1992,注意:()虽然不带指数部分的实数称为定点数,但在计算机内部会自动转换成浮点形式存放。()整数属于定点数。,2.1.2字符类型数据的表示和存储形式,字符类型的数据在内存中以ASCII码的形式存放。,a0110000197,注意:()字符变量可以以整数的形式输出。()字符以单引号形式出现。,()a-A=32,Main()charch;Scanf(“%c”,2.1.3数据的存储空间长度及取值范围,Int,short2个字节,Long4个字节,Float4个字节,Double8个字节,2.1.4带符号的数据类型与无符号的数据类型,在内存中数值以补码的形式存放。,16位的整数中,最高位0表示正,1表示负。,注意:()正数的补码是它的本身。()负数的补码:先取该数的绝对值,再以二进制的形式表示,再对各位取反,取后加1。,无符号型整数:必须为正数或零。又分为:无符号整型(unsignedint)、无符号短整型(unsignedshort)和无符号长整型(unsignedlong),注意:实型数据没有unsigned与signed之分,均带符号。,求一种类型数据占用的存储空间的长度:sizeof(类型标识符),在程序的运行过程中其值不能被改变的量。(整型常量、浮点型常量、字符型常量、字符串常量和符号常量)。()0开头的是八进制数。0516()0X或0 x开头的为十六进制数0 x1c0d0X4600()1或结尾时为长整型常量49876L0X4F8DAL()浮点型常量有十进制形式和指数形式(E后必须为整数。)3.14-9.5681.5E52.9E-7,2.2常量和变量,()字符型常量是用单引号括起来的单一字符,其值即为它的ASCII码值。s、S、如2的值为50语言还允许一种特殊形式的字符常量,以开头的字符序列。表转义字符表,注意:字符串所需存储空间比字符串的字符个数多一个字节。,字符串常数:用双引号括起来的零个或多个字符序列称为字符串常数。如:”hello”,“a”内存中的存储方式:hello0,实际的存储形式为:1041011081081110,2.2.3变量,其值可以改变的量称为变量。一个变量由一个名字来标识,此名字称为该变量的标识符。同一个变量名对应的变量在不同的时刻可以有不同的值。,变量说明的实例如下:inti;/*说明i为整型变量*/shortc,d,e;/*说明c,d,e为短整型变量*/unsignedlongp,g;/*说明p,g为无符号长整型变量*/floatx,y;/*说明x,y为单精度型变量*/doublez;/*说明z为双精度型变量*/charch1,ch2;/*说明ch1,ch2为字符型变量*/,(1)算术运算符和算术表达式算术运算符包括:(加)、(减)、(乖)、(除)、(取模)、(增一运算符)、(减一运算符)。+i、-i在使用i之前,先使i的值增减。i+、i-在使用i之后,使i的值增减1。必须说明的是+、运算符只能用于变量,而不能用于常量或表达式。,2.3运算符和表达式,Main()intj;j=9;j+;Printf(“/n%d”,j);,Main()intj;j=9;+j;Printf(“/n%d”,j);,(2)关系运算符和关系表达式关系运算符有(大于)、(大于等于)、(小于等于)、(等于)和!(不等于),它们的优先级低于算术运算符的优先级。下面有几个实例:i5chbfloatpi=3.1416;charc=w;也可对被说明的一部分初始化,如:inti,sum=o,j;,2.5数据的输入和输出,2.5.2赋值语句赋值语句是由赋值表达式加上一个分号组成的,如“sum=a+b;”就是一个赋值语名,而“sum=a+b”则是一个赋值表达式。可见赋值表达式与赋值语句是两个不同的概念,赋值表达式是语言特有的。下列语句者是赋值语句:x=0.3;y=z=-1;y=y*(z+1);x=(7+6)%5/2;,2.5.3数据输出,一般形式:printf(格式控制参数,输出项1,输出项2,),格式说明,它由“%”和转换字符组成,如%d、%f等,作用是将输出的数据转换成指定的格式输出。普通字符,即按照原样输出的字符。,Printf(“%d+%d=%d”,a,b,a+b);,输出项1,输出项2,输出项3,Main()intj;j=2;Printf(“j=%d,j+=%d”,j,j+);,格式字符:,对于不同的数据用不同的格式字符。,d格式符。用来输出十进制整数。,()%d按整型数据的实际长度输出。()%mdm为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。()%ld输出长整型数据,注意:如果长整型数据(32767)用%d输出,就会发生错误。对于long型数据应当用%ld格式输出,也可以指定字段宽度。如%8ld。,2.O格式符以8进制数形式输出整数,输出的数值不带符号,将符号位也一起作为八进制数的一部分输出。,inta=-1;Printf(“%d,%o”,a,a);,-1,177777,注意:不会输出带负号的八进制整数。对于长整型可以用%lo格式输出,同样可以指定宽度。如:%8o,3.X格式符,以16进制数形式输出整数。同样不会出现负的十六进制。,inta=-1;Printf(“%x,%o,%d”,a,a,a);,ffff,177777,-1,4.u格式符用来输出unsigned型数据,以十进制的形式输出。一个有符号的整数也可以用%u格式输出。Unsigned型数据也可以用%d,%o,%x格式输出。,main()unsignedinta=65535;intb=-2;printf(“%d,%o,%x,%un”,a,a,a,a);printf(“%d,%o,%x,%un”,b,b,b,b);,-1,177777,ffff,65535-2,177776,fffe,65534,5.c格式符用来输出一个字符。,注意:一个整数,只要它的值在0255范围内,也可以用字符的形式输出,转换成ASCII字符。,6.s格式符用来输出一个字符串。,printf(“%s”,”china”);,(1)%s,(2)%ms输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。,(3)%-ms右补空格。,(4)%m.ns,输出占m列,但只取字符串左端n个字符。这n个字符输出在m列的右侧,左补空格。,(5)%-m.ns,右补空格。,7.f格式符用来输出实数(包括单,双精度),以小数的形式输出。单精度的有效位数为7位,双精度为16位,(1)%f,(2)%m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m则左补空格。,(2)%m.nf右补空格。,8.e格式符以指数形式输出实数。,()%e,printf(“%e”,123.456);,1.23456e+02,指数部分占列,小数占列,尾数部分占列,注意:%e格式输出的实数点11列宽度。,()%m.ne和%-m.ne,占m列宽度,保留n-1位小数。,8.g格式符用来输出实数,它根据数值的大小,自动选择f格式或e格式,选择输出时占宽度较小的一种,且不输出无意义的零。,注意:,1.用printf函数输出时,应注意数据类型与上述格式说明匹配,否则将会出现错误。,.有些系统要求格式字符要用小写字母,如:%d不能写成%D。,3.可以在printf函数中的“格式控制“字符串内包含“转义字符“。,4.如果要输出字符“%“,应在“格式控制“字符串中用连续两个“%“表示或一个“%“。,5.不同的系统在实现格式输出时,输出结果可能有一些小的差别。如:%e时,指数有的是4位,有的是5位,尾数有的是5位,有的是6位。,2.5.数据输入,一般形式:scanf(格式控制参数,地址,地址2,.),格式说明:,()标准C在scanf中不使用%u说明符,对unsigned型数据,以%d,%o,%x格式输入。,()可以指定输入数据所占列数,系统自动按它截取所需数据。,main()inta,b;scanf(“%3d%3d”,main()chara,b;scanf(“%3c%3c”,(3)%后的“附加说明符,用来表示跳过它相应的数据。,main()inta,b;scanf(“%3d%*3d%3d”,(3)输入数据时不能规定精度。如:,scanf(“%7.2f”,scanf(“%f”,输入:1.2o45,输出:1.200000,2.5.5getchar函数与putchar函数,getchar函数:输入一个字符,不带参数。,putchar函数:输出一个字符,带参数。,注意:使用getchar函数或putchar函数之前要加上:,#include“stdio.h”,例:,#includemain()inta=0,b=4,c=3;intx,y,z;printf(“%d%dn”,!a,!b);printf(“%dn”,abc);x=y=z=1;+x|+y,程序输出结果为:x=2y=1z=1x=2y=2z=1x=2y=2z=2,3.1算法,第3章程序的流程设计,算法+数据结构程序,瑞士NiklausWirth:,算法和数据结构也是面向过程的程序的两个大要素。,3.1.1算法的性质与组成要素,(一)算法的性质,算法:进行操作的方法和操作步骤。,算法的性质:()输入性()输出性()有穷性()确定性()可行性,(二)算法的组成要素,()操作算述运算,逻辑运算,关系运算,函数运算,位运算,I/O操作等。,()控制结构,控制结构:控制组成算法的各操作的执行顺序。,有如下三种控制结构:,.顺序结构,.选择结构,.循环结构或重复结构,3.1.2算法的描述,(一)流程图与算法的结构化,特点:用图框表示各种类型的操作,用线表示这些操作的执行顺序。,数据,处理,特定处理,准备,判断,循环(上)界限,可注明数据名称,来源,用途或文字说明。,可注明处理名称或其简要功能。,表示已命名的处理。,注明判断的条件。,循环(下)界限,连接符,端点符,注解符,流线,省略符,虚线,并行方式,直线表示执行的流程,流程自上向下或由左向右时,流程线可不带箭头,其它情况应加箭头表法流程。,程序流程的起,始点。,例:求n的阶乘.,调用,参数n,是,否,fac=1,fac=1i=1,当iz)max=max;elsemax=z;printf(max=%d,max);,例1:求三数中的最大数,例2:公鸡一只值五钱,母鸡一只值三钱,小鸡三只值一钱,一百钱买一百只鸡,请问可以买公鸡,母鸡,小鸡各几只?,main()intx,y,z,max;x=0;while(x=20)y=0;while(y=33)z=100-x-y;if(5*x+3*y+z/3.0=100)printf(n%-6d%-6d%-6dn,x,y,z);y+;x+;,3.2用C语言来描述算法,3.2.1语句,语句是语言源程序的重要组成部分。语言的语句可以分为五大类:(1)表达式语句表达式的后面加一个分号就构成了一个语句,如sum=a+b;i+;y=2事实上,语言中有使用价值的表达式语句主要有种:A.赋值语句。B.自加减运算符构成的表达式语句。C.逗号表达式语句。,(2)空语句光有一个分号“;”,作为语句结束符,它表示什么也不做。,(3)复合语句由“”和“”把一些变量说明和语句组合在一起,称之为复合语句(Block),又称语句块。,inta=0,b=1,sum;sum=a+b;printf(“%d”,sum);,(4)函数调用语句它是由一个函数调用加上一个分号组成一个语句。如:printf(“Thisisafunctioncall”);,3.2.2停止函数exit,作用:停止当前程序,退回到操作系统状态。,加上预编译命令:#include“stdlib.h”,exit()带参数。参数为0时,正常停止,为其它值时,指出停止的错误类型。,3.3选择型程序设计,3.3.1if语句的一般形式,if语句的一般形式:if(表达式)语句else语句,求分段函数的值:,0 x=0include“stdio.h”main()intx,y;printf(“请输入x的值:”);scanf(“%d”,运行结果:请输入的值:当时,f(x)=7,例1:,请输入两个数a,b,比较a+b和a*b哪个大,输出判断结果。#include”stdio.h”main()inta,b,s1,s2;printf(“请输入两个整数a,b:”);scanf(“%d,%d”,运行结果为:请输入两个整数:,a与b的积大于等于a与b的和,例2:,3.3.2if-else中的复合语句如果两个分支中需要招待的语句不止一条,必须有“”括起来,作为一个复合语句使用。若只是一条语句,“”可以省略。请年下面的例子。例4.4输入一个学生成绩,若成绩大于等于,提示成绩合格,否则提示需要努力学习。程序实现如下:includemain()intscore;chargrade;printf(“pleaseinputascore:”);scanf(“%d”,elsegrade=F;printf(“yourgradeis%c,youshouldworkharder.”,grade);,注意:A.if后面的表达式一定要有括号。B.if和else同属于一个if语句,else不能作为语句单独使用,它只是if语句的一部分,与if配对使用。因此程序中不可以没有if而只有else.C.只能执行与if有关的语句或者招待与else有关的语句,而不可能同时执行两者。D.如果语句和语句是非复合语句,那么该语句一定要以分号结束。,if语句的表达式可以是任意类型的C语言的合法的表达式,但计算结果必须为整型、字符型或浮点型之一。,3.3.3if语句的缺省形式从if语句的一般形式也可以年出:由于条件语句中“else语句“部分是可选项,因此可以缺省,此时条件语句变成:if(表达式)语句其执行过程是:如果表达式的值不为零,执行语句,否则什么也不执行,跳if语句的下面,继续招待程序中的其他语句。缺省else时的条件分支语句也经常使用。,3.3.4较复杂的条件表达式在程序中,if语句中的表达式起着关键的作用,千变万化的表达式可以派生出各种功能不同的程序。前面看到的是一些简单的关系表达式,而在实际的应用中可能会用到复杂的表达式。例4.6判断某一年是否为闰年。判断闰年的条件为下面二者之一:能被整除,但不能被100整除。能被400整除。#include“stdio.h”main()intyear;scanf(“%d#,3.3.5非关系或逻辑表达式构成的条件表达式if后面圆括号中的表达式表示分支的条件,表达式的类型不限于逻辑关系表达式,可以是任意的c语言的有效的表达式(如赋值表达式算术表达式,因此也可以是作为表达式特例的党量或变量。include“stdio.h”main()ints;if(s=2)printf(“hello”);elseprintf(“error);,3.3.6同一个条件的多种表达方式if语句能够实现分支,主要看表达式的结果。#include“stdio.h”main()intx,y;scanf(“%d”,现把程序中if(x)改成if(x!=0),这样虽然条件表达式写法不同,但是完成的功能是相同的。下面两种表示方法经常使用:if(x)等价于if(x!=0)if(!x)等价于if(x=0),3.3.7if语句的嵌套,C语言规定:else与前面最接近它而又没有和其他else语句配对的if语句配对。同时从书写格式上了要注意,要有层次感。如果if的数目和else的数目相同,从内层到外层一一对应,不易出错,如果if与else的数目不一样,为实现编者的意图,必要的时候必须加“”,来强制确定配对关系。否则,就不能实现编程者的真正意图。,例:求方程,从代数知识可以知道:,有两个不等的实根。,有两个相等的。,的根的值?,有两个虚根。,#include“math.h”main()flosta,b,c,delta,x1,x2,realpart,imagepart;scanf(“%f,%f,%f”,printf(“有两个不等的实根:%8.4f和%8.4fn”,x1,x2);else,realpart=-b/(2*a);imagepart=sqrt(-delta)/(2*a);printf(“有两个虚根:n”);printf(“%8.4f+%8.4fin”,realpart,imagepart);printf(“%8.4f-%8.4fin”,realpart,imagepart);,3.3.8elseif语句,一般形式:,if(条件1)(语句1)elseif(条件2)(语句)elseif(条件3)(语句)elseif(条件4)(语句)else(语句),注意:各条件是并列关系,而不是包含关系。,例:大学里对不同性质的学生听课收费不同。某校是这样规定的:本校全日制学生不收费。本校夜大学生选课学分及以下付400元,然后每增加一个学分付50元。对外校学生选课12学分及以下付800元,然后每增加一个学分付100元。输入某个学生的编号,选课分以及学生应付的学费。分析:学分_n,收费_x,编号_number,学生的类别_p。根据题意,分3种情况考虑:,A.本校全日制:x=0B.本校夜大:n12,x=400+(n-12)*50C.外校:n12,x=800+(n-12)*100,main()intn,x,number,p;printf(“学生收费管理n”);printf(“=n”);printf(“1-本校全日制学生n2-本校夜大学生n3-外校学生n”);printf(“请输入学生的类别(13):”);scanf(“%d%d”,elseif(p=2)if(n=12),x=400;elsex=400+(n-12)*50;,elseif(n=12)x=800;elsex=800+(n-12)*100;printf(“学生%4d应交费%4d元”,number,x);,3.3.9switch结构的应用,if语句只能实现两路分支,在两者中选择其一。虽然嵌套的if语句可以实现多路的检验,但有时不够简洁。同时一定程度上影响可读性。为此c语言提供了实现多路选择的另一个语句switch,称为开关语句。用switch语句。,switch语句的般形式是:,switch(表达式)case常量表达式:语句序列case常量表达式:语句序列.case常量表达式n:语句序列ndefault:语句序列n+1,注意:.case后面发布是常量表达式,因此不能是包含变量的表达式。case和常量之间要有空格,case后面的常量之后有“:”,且所有case包含在“”里。,例2000年元旦是星期六,求出2000年的任何一个日期是星期几(用06表示星期日星期六)。,main()intmonth,day,week,todalday;interr=0;printf(“请输入月,日:n”);scanf(“%d,%d”,case7:totalday+=182;break;case8:totalday+=213;break;case9:totalday+=244;break;case10:totalday+=274;break;case11:totalday+=305;break;case12:totalday+=335;break;default:printf(“输入错误”);err=1;,if(err=0)week=(totalday+5)%7;printf(“2000年d月%d日是星期%d”,month,day,week”);,3.4循环型程序设计,3.4.1穷举与迭代算法,()穷举,穷举是一种重复型算法。它的基本思想是:对问题的所有可能状态进行一一测试,直到找到解或全部可能状态都测试过为止。,循环控制有两种方法:A.计数法:先确定循环次数,然后逐次测试,完成测试次数后,循环结束。B.标志法:达到某一目标后,使循环结束。,()迭代,迭代是一个不断用新值取代变量的旧值,或由旧值递推出变量的新值的过程。,3.4.2while结构的应用,一般形式:,While(条件),循环体,例:从1加到1000,并将结果打印出来。#include“stdio.h”main()longsum=0;inti=1;while(i=1000)sum+=i;i+;printf(“总和是%ldn”,sum);,#includestdio.hmain()charc;while(c=getchar()!=EOF)putchar(c);,例:将输入的字符原样输出。,注意:“EOF“是一个符号常数,称为文件结束标志。当从键盘输入CtrlZ(或遇到文件结束标志),c的值得到-1,等于EOF.使用前要加上:”#includestdio.h,例:求,!,的值?,main()inti,sum,fac,n;scanf(%d,例:爱因斯坦的阶梯问题。,设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶时,正好到阶梯顶。问共有多少阶梯?,main()intladders=7;while(ladders%3!=2|ladders%5!=4|ladders%6!=5)ladders+=14;printf(flightofstairs=%dn,ladders);,3.4.3dowhile结构的应用,一般形式为:do循环体while(条件表达式);,3.4.4for结构的应用,for(表达式1;表达式2;表达式3)循环体语句,一般形式为:,for(循环变量赋初值;循环条件;循环变量自增)循环体语句,常用形式为:,例:fibonacci数列f(n)是一个算术序列n的所有值是正整数序列,这个序列根据下面的算法求得,1n=1f(n)=1n=2f(n-2)+f(n-1)n,如:f(3)=f(3-2)+f(3-1)=f(1)+f(2)=1+1=2,3,main()longintf,f1=1,f2=1;intI,n;printf(“请输入n”:“);scanf(“%d”,f1=f2;存放第一个数f2=f;存放第二个数printf(“%8ld”,f);if(i%5=0)printf(“n”);,例相传古代印度国王舍罕要褒奖他的聪明能干的宰相达依尔(国际象棋发明者),问他需要什么,达依尔回答:“国王只要在国际象棋的棋盘上第一个格子放粒麦子,第二个格子放上粒,第三格子放粒,以次类推,每格加一倍,直到放到64格,我就感恩不尽了”。国王答应了,结果全印度的粮食用完还不够,国王很纳闷,怎么也算不清这笔帐。现在用语言编程来算一下。,需要计算sum=,算出小麦的颗粒数。,小麦大约1.42,main()intn;doublev,sum=0.0,t=1.0;for(n=0;n64;n+)sum+=t;t*=2;printf(“sum=%en”,sum);v=sum/1.42e8;printf(“v=%e”,v);,粒,为体积。,例求整数3100中的素数。如果是一个大于等于2的整数,并且只有1和本身是它的因子,没有别的正因子,则称是一个素数(质数)。即除1和它本身之外不能被其他整数整除。为了检查某数是否是素数,采用的方法是,从起不断增加,直到,逐个相除,只要有一个数能整除,说明该数不是素数。,main()inti,n,numfor(n=3,num=0;n=100;n+)i=2;While(i=Awhile(1),continue语句:continue语句的一般形式为:continue;其语义为:结束本次循环,即跳过循环语句中尚未执行语句,接着进行循环条件的判定。comtinue语句只用在for,while,do-while等循环体中,常与if语句在一起使用,用来加速循环,例求1100之间不能被12整除的数。#include“stdio.h”main()intn;for(n=1;ny)returnx;elsereturny;注意:不能把x,n的说明放在函数体内部。,()函数说明语法:);main()doublefun(intn);intn;scanf(“%d”,注意:在函数调用之前要有函数说明,或函数定义。但如果被调用的函数的返回值是int,可先进行调用,再进行函数定义。,(4)函数的嵌套调用与递归调用所有的函数都是平行的。例:用函数递归调用求Fibonacci数列的值。longfib(intn)if(n=1)return;elseif(n=2)return1;elsereturnfib(n-1)+fib(n-2);,main()longr;r=fib(5);printf(“fib(5)=%ld”,r);,4.2变量的存储属性,4.2.1auto变量没有指明的变量的存储类型都是auto变量,均出现在函数的内部。intf(inta)autointb,c;floatd,e;.,生命周期:是变量占据内存的时间期限,一旦参应于某变量的内存空间被释放,该变量的生命期就结束了。,4.2.2extern变量在一函数中合法出现的同时,又可以在其他函数中合法出现。这样的变量是外部(extern)变量。inta,b;voidf()a+=2;b+=3;main()a=1;b=2;f();,4.2.3static变量它的生命周期是整个程序的执行期,当函数的调用结束后,static变量的存储空间依然保留。例:求15的阶乘#includelongfactor(intn)staticlongintf=1;f=f*n;returnf;main()inti;for(i=1;i=5;i+)printf(“%ldn”,factor(i);,4.2.4register变量、当一变量被说明为register变量时,其值存放在寄存器中,这样对寄存器变量的存取速度就很快,因此寄存器变量通常用来存放循环变量,用来提高程序执行速度。例:#includelongfactor(intn)registerintI;longr;for(i=1,r=1;i=n;i+)r*=i;returnr;main()intk;for(k=1;k=5;k+)printf(“%ldn”,factor(k);,4.3编译预处理4.3.1文件包含语法:#include“文件名”或#inclue该控制行一般放在源文件的起始部分,它告诉编译程序把由标识的文件的整个内容来替换该控制行。除了C语言提供的头文件外,还可以自定义头文件。如:#include#include4.3.2宏替换分为不带参数的宏定义和带参数的宏定义。不带参数的:#define,#definePi3.14.16带参数的:#define()#definesquare(x)x*x,例:,#definesquare(n)(n)*(n)main()inti=1;while(i=10)printf(%8d,square(i+);,结果:,212305690,(i+)*(i+),(1)宏名与宏体之间应以空格相隔。所以宏名中不能含有空格。,(2)宏名不能用引号括起来。,较长的定义在一行中写不下时,可在本行末尾使用反斜杠表示要续行。,(4)对带参数的宏定义,宏体及其各个形参应用圆括号括起来。,()宏定义可以写在程序的任何地方,但一定要写在程序中引用宏之前,通常写在一个文件之首。,(6)已定义的宏可以用命令#undef撤消。,第5章数组,.1一维数组,5.1.1一维数组的定义:,一维数组用下面的方法表述的:或常量表达式,intstudent40;,一般形式:类型标识符数组名元素个数;,注意:在C语言中,说明数组时必须给出数组的元素个数,并且在程序运行时是不可改变的,这样的数组称为静态数组。在程序运行中说明,并且可以改变的,这样的数组称为动态数组。从C语言数组说明的一般形式可以看出,在C语言中不允许有动态数组。,数组元素的引用是通过数组名和下标来确定的。它的一般形式是:数组名下标表达式,下标表达式表示了数组中的某一元素的顺序好,必须是整型常量、整型变量或整型表达式,在C语言数组元素的下标总是从0开始,因此下标为i时表示的是数组第i+1个元素。,通过对一维数组元素的引用,数组元素就可以像普通数据一样进行赋值和算术运算以及输入和输出操作。,在说明一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素。,5.1.2一维数组的初始化,一维数组的初始化具体有以下集中形式:,(1)对数组全部元素初始化,如:staticinta10=0,1,2,3,4,5,6,7,8,9;此时将数组元素的初值依次放在一对花括号内。初值个数与数组的元素个数一致,并且从左到右将花括号中的每个赋予数组中相应的元素,即相当于执行语句a0=0,a1=1,a9=9,从而完成对数组的初始化。,(2)对数组部分元素初始化,如:staticinta6=0,1,2,3;这种形式同第一种形式基本是一样的,在这里是前4个元素显示赋值,而对后面个元素隐式赋值零,相当于:staticinta6=0,1,2,3,0,0,(3)对数组全部元素显示赋值时可不指定数组长度,如:statica=0,1,2,3,4,5.1.3一维数组的应用举例:,一维数组的输入与输出#includemain()inti;inta4;printf(“n输入数组a(共4个整数):”);for(i=0;i4;i+)scanf(“%d”,例1:,例2:,求数组元素中的最大值最小值?#includemain()intterm10inti,max,min;printf(“请输入10个整数”);for(i=0;imax)max=termi;printf(“最大数为%d,”,max);printf(“最小数为%d”,min);,例:冒泡排序冒泡排序又称为交换排序,是一种简单而又经典的排序方法。排序一般分为两种:升序排序和降序排序,升序排序是将元素从小到大进行排序,而降序排序正好相反。,main()inti,j,a10,t;for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;,for(i=0;i10;i+)printf(%8d,ai);,例:折半查找法:条件:数据已按升序或降序排列好。,main()inti,j,a10,t,last,first,find=0,mid,seek;for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;,for(i=0;iamid)first=mid+1;if(find=0)printf(n%8dnotbeenfound.n,seek);,.2二维数组和多维数组,5.1.1二维数组和多维数的概念及其定义:具有多个下标的数组称为多维数组,其中最常用的是二维数组,即具有两个下标的数组。其一般形式:在C语中,二维数组的元素是按行存储的,即在内存中先放第一行元素,再放第二行元素,就存储而言,一维数组和二维数组是一样的。,例:inti,a3,b34,c25;,inta234;,5.1.2二维数组和多维数组的引用,一般形式:数组名下标下标,5.1.3二维数组和多维数组的初始化,二维数组同样存在初始化的问题。有以下4种形式:行依次对二维数组赋初值,即把二维数组看做是一维数组的一维数组。(2)将所有数据写在一个花括号内,按数组排列的顺序对各数组元素赋初值。实质上,二维数组本质上是一个一维数组,它在机器中与一维数组的处理是一样的。(3)同一维数组一样可以对部分元素显示赋初值。(4)若对全部元素显示赋初值,则数组第一维元素个数在说明时可以不指定,但第二维的元素个数仍然不能缺省。,5.1.4二维数组程序举例:,例:求一个44的阶矩阵元素的最小值#includemain()staticinta44=12,76,4,1,-19,28,55,-6,2,10,13,-2,3,-9,112,111inti,j,row,colum,min;min=a00;for(i=0;i4;i+)for(j=0;j4;j+)if(aijmin)min=aij;row=i,colum=j;printf(“最小值=%d,位于矩阵第d%行,第%d列n”,min,row+1,colum+1);,例:矩阵转置,即将矩阵的行和列互换。#include#definerow3#definecol4main()intarowcol,bcolrow;inti,j;printf(“请输入矩阵a的元素(%d%d)n”,row,col);for(i=0;irow;i+)for(j=0;jcol;j+)scanf(“%d”,i+),for(j=0;jrow;j+)printf(“%5d”,bij);printf(“n”);,main()inti,j,score53;floatsum,avg;for(i=0;i5;i+)for(j=0;j3;j+)scanf(%d,例:有5个学生,每个学生有3门课,输入学生的各门课的成绩,输出每门课的平均成绩和每个学生的平均成绩。,printf(“每个学生的平均成绩为:);for(i=0;i5;i+)for(j=0,sum=0;j3;j+)sum+=scoreij;avg=sum/3;printf(%8.1f,avg);printf(“n每门课的平均成绩为:);for(j=0;j3;j+)for(i=0,sum=0;istr2函数值为一正整数;str1str2函数值为一负整数;,main()charstr10,i,minstr10;gets(minstr);for(i=0;i0)strcpy(minstr,str);puts(minstr);,(4)字符串长度函数strlen,函数的值为“0“之前的字符的个数。,main()charstr10;gets(str);while(1)if(strlen(str)=6)if(strcmp(str,123456)=0)printf(“n密码输入成功!);break;elseprintf(“n密码输入有误!);gets(str);elseprintf(“请输入6位密码:);gets(str);,5.3.6二维字符数组,main()charstr36;gets(str);printf(n%s,str1);,main()charstr30,str130,i,n,j=0;gets(str);scanf(%d,删除指定位置的字符:,例:从键盘上输入3行字符,每行不超过60个字符,统计其中有多少个小写英文字母,多少个大写英文字母,多少个数字字符?,main()charletters360;inti,j,upper

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论