C程序设计教程(中)清华ppt.ppt

上传人:za****8 文档编号:16060153 上传时间:2020-09-16 格式:PPT 页数:97 大小:1.51MB
返回 下载 相关 举报
C程序设计教程(中)清华ppt.ppt_第1页
第1页 / 共97页
C程序设计教程(中)清华ppt.ppt_第2页
第2页 / 共97页
C程序设计教程(中)清华ppt.ppt_第3页
第3页 / 共97页
点击查看更多>>
资源描述
程序设计教程(中),朱小菲 主 编,清华大学出版社,21世纪高等学校计算机教育实用规划教材,第5章循环结构第6章数组第7章指针,清华大学出版社,3,第5章 循环结构,5.1循环的构成,一,5.2循环语句,二,5.3循环的嵌套,三,5.4循环应用实例,四,4,5.1 循环的构成,【例5.1】判断某一正整数是否能够被3整除。,5,【例5.2】找出100以内能被3整除的正整数。,6,5.2 循环语句,5.2.1 while语句 while语句是当型循环语句,一般形式为: while(表达式) 语句;,例如:找出100以内能被3整除的正整数。 main() int m=1; while(m=100) if(m%3=0) printf(%8d,m); m=m+1; ,7,【例5.3】求n!,8,main() int n=1,m; long int s=1; printf(please input m:); scanf(%d, ,9,【例5.4】求100以内能被3整除的数之和,10,main() int n=1,sum=0; while(n=100) if(n%3=0) sum=sum+n; n+; printf(%dn,sum); ,11,5.2.2 dowhile语句,dowhile的一般形式为: do 语句 while;,12,【例5.5】计算sin(x)=x-x3/3!+x5/5!-x7/7!+直到最后一项的绝对值小于10-7时为止。,13,#include math.h #include stdio.h main() float sum=0,t,x,n=3; printf(please input x :); scanf(%f, ,14,5.2.3 for语句,它的一般形式为: for(表达式1;表达式2;表达式3) 语句,表达式1:循环的初始条件,一般为赋值表达式,给循环的控制变量赋初值; 表达式2:循环条件,该表达式的值为逻辑量,一般为关系表达式或逻辑表达式; 表达式3:循环的步长,一般为赋值表达式。 语句:循环体,当有多条语句时,必须使用复合语句。,15,【例5.6】计算自然数1到n的平方和。,#include main ( ) int i,n; float sum=0; printf(please input n :); scanf(%d, ,16,for语句的几种格式,for语句的三个表达式都是可以省略的,但分号“;”绝对不能省略。 (1)for( ; ;) 语句; (2)for( ;表达式2;表达式3) 语句; (3)for(表达式1;表达式2;) 语句; (4)for(i=1,j=n;ij;i+,j-) 语句;,17,【例5.7】求两个正整数的最大公约数,#include #include main ( ) int m,n,i,t,max; printf(Please input m,n :); scanf(%d%d, ,18,5.2.4 break和continue,1break语句 break语句的一般形式为: break;,【例5.8】判断某个一位数是否在一个不高于四位的整数中出现。,19,main() int m,n; int flag=1; scanf(%d%d, ,20,2continue语句,一般格式是: continue;,执行了continue语句,程序就跳过循环体中位于该语句后的所有语句,提前结束本次循环周期并开始新一轮循环。,21,【例5.9】输出11000之间能被3,5,7同时整除的数。,main() int n; for(n=1;n=1000;n+) if (n%3!=0) continue; if (n%5!=0) continue; if(n%7!=0) continue; printf(%8d,n); printf(n); ,22,5.2.5三种语句的选用,1while和dowhile语句的区别 while语句对作为循环条件的表达式求值和验证在执行循环体之前,而do-While语句对作为循环条件的表达式求值和验证在执行循环体之后。对于do-while语句,它的循环体至少被执行一次。,23,2三种语句在程序设计中的选择,(1)如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是由循环体的执行情况确定的,一般用while语句或者dowhile语句。 (2)当循环体至少执行一次时,用dowhile语句,反之,如果循环体可能一次也不执行,选用while语句。,24,5.3 循环的嵌套,【例5.10】判断某一正整数是为否素数,25,main() int m,n; printf(Please input m:n); scanf(%d, ,26,【例5.11】找出1000以内的所有素数。,27,#include math.h main() int m,n,t,flag; printf(The all prime numbers in 1000 are:n); for(m=3;m1000;m+) flag=1; t=(int)sqrt(m); for(n=2;n=t;n+) if(m%n=0) flag=0; break; if(flag=1) printf(%8d,m); ,28,1循环的概念 2循环的基本形式,(1) (2) while() while() while() do while(); ,29,(3) (4) do for(; ; ) do while() while(); while(); ,30,5.4 循环应用实例,【例5.12】 找出1000以内的所有水仙花数。 main() int m,a,b,c; printf(The all narcissus numbers in 1000 are:n); for(m=100;m1000;m+) a=m/100; b=m%100/10; c=m%10; if(a*a*a+b*b*b+c*c*c=m) printf(%8d,m); ,31,【例5.13】求Fibonacci数列的前20项之和。,第1项:1 f1=1 第2项:1 f2=1 第3项:2 f3=f1+f2 第4项:3 t=f2,f2=f3,f1=t,f3=f1+f2 第5项:5 t=f2,f2=f3,f1=t,f3=f1+f2 第6项:8 t=f2,f2=f3,f1=t,f3=f1+f2 第20项:10946 t=f2,f2=f3,f1=t,f3=f1+f2,32,main() float sum; int f1,f2,f3; int i,t; f1=1; f2=1; f3=f1+f2; sum=f1+f2+f3; for(i=4;i=20;i+) t=f2; f2=f3; f1=t; f3=f1+f2; sum+=f3; printf(The sum of Fibonacci is:%.0fn,sum); ,33,【例5.14】输入一字符串,统计其中字母、数字以及其他字符的个数。,#include stdio.h main() int letter,number,other; char c; letter=number=other=0; c=getchar(); while(c!=n) if(c=a ,34,第6 章 数组,6.1数组的概念,一,6.2一维数组,二,6.3二维数组,三,6.4多维数组,四,四,6.5字符数组,35,6.1数组的概念,6.1.1 数组的引入 【例6.1】求全班30位同学某门功课的平均成绩。 6.1.2 数组的概念 数组概念的讲述数组具有如下的特性: (1)数组中的每个元素具有相同的类型; (2)各元素之间空间连续且等间距。,36,6.2一维数组,6.2.1 一维数组的定义 1一维数组的定义 一维数组定义的语法格式为: 数据类型 数组名常量表达式; 例如,下面定义了3个不同类型的数组: int a10; float b15; char c20;,37,2数组的引用,数组的引用方式为: 数组名下标 例如,有数据描述为:int a5 a是数组名,方括号中的5表示数组的长度,即该数组包含5个数组元素,分别是a0、a1、a2、a3和a4。a数组中的每个元素的数据类型为基本整型。,38,在定义和使用数组时,应注意以下几点:,(1)数组名的命名规则同变量名的命名,要符合C语言标识符的命名规则。 (2)数组名后面的 是数组的标志,不能用圆括号或其它符号代替。 (3)数组元素的个数必须是一个固定的值,可以是整型常量、符号常量或者整型常量表达式,但不能是变量。 (4)C语言规定,数组元素的下标(序号)从0开始。 (5)数组元素的类型也可以是组合类型数据,如结构体。,39,3一维数组元素的初始化,其语法格式为: 类型 数组名常量表达式=元素值表列; 数组元素初始化时应注意以下几点: (1)中的数组元素值与数组的每一个元素具备左对应关系。例如: char a5=a, b, c, d, e; (2)中的元素值表列,可以是数组所有的元素的初值,也可以是前面部分元素的初值,元素值之间使用逗号间隔。 (3)当给数组部分元素的赋初值时,其余元素的值为零。 (4)在对全部数组元素赋初值时,可以不指定数组长度。 例如: int a5=1,2,3,4,5; 可以写成 int a = 1,2,3,4,5;,40,6.2.2 一维数组元素的引用及示例,【例6.2】一维数组元素的输入输出。 参考程序: main( ) int a5,i; for(i=0;i5;i+) scanf (“%d”, ,41,【例6.3】利用数组求出Fibonacci数列前20项之和。 main( ) int f20=1,1; int i,sum=0; for (i=2;i20;i+) fi=fi-1+fi-2; sum+=fi; printf (sum=%4d,sum); printf (n); ,42,【例6.4】编写程序,用起泡法对10个数排序 main() int a10; int i,j,t; printf(input 10 numbers:n); for (i=0;iai+1) t=ai;ai=ai+1;ai+1=t; printf(the sorted numbers :n); for(i=0;i10;i+) printf(%d ,ai); ,43,6.3 二维数组,6.3.1 二维数组的定义 1二维数组类型说明 二维数组类型说明的一般形式是: 数据类型 数组名常量表达式1常量表达式2 ; 例如:int a34;,即: a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22,a23,44,6.3.2 二维数组元素的表示方法,表示的形式为:数组名下标下标 例如:a34 表示a数组三行四列的元素。 6.3.3 二维数组的初始化 例如对数组a53: (1)按行分段赋值可写为: int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 ; (2)按行连续赋值可写为: int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 ;,45,对于二维数组初始化赋值还有以下说明: 1可以只对部分元素赋初值,未赋初值的元素自动取0值。 例如: int a33=1,2,3; 是对每一行的第一列元素赋值,未赋值的元素取0值。 赋值后各元素的值为: 1 0 0 2 0 0 3 0 0 int a 33=0,1,0,0,2,3; 赋值后的元素值为 0 1 0 0 0 2 3 0 0 2如对全部元素赋初值,则第一维的长度可以不给出。 例如: int a33=1,2,3,4,5,6,7,8,9; 可以写为: int a3=1,2,3,4,5,6,7,8,9;,46,6.3.4 二维数组的引用,【例6.5】一个学习小组有5个人,每个人有三门课的考试成绩,求全组各科的平均成绩和各科总平均成绩。 main() int i,j,s=0,l,v3; int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 ; printf(input scoren); for(i=0;i3;i+) ,47,for(j=0;j5;j+) scanf(%d, ,48,【例6.6】在二维数组a中选出各行最大的元素组成一个一维数组b,其中a数组各元素的值为: 3 16 87 65 4 32 11 108 10 25 12 37,49,main() static int a4=3,16,87,65,4,32,11,108,10,25,12,27; int b3,i,j,l; for(i=0;il) l=aij; bi=l; printf(narray a:n); for(i=0;i=2;i+) for(j=0;j=3;j+) printf(%5d,aij); printf(n); printf(narray b:n); for(i=0;i=2;i+) printf(%5d,bi); printf(n); ,50,6.4 多维数组,6.4.1 多维数组的定义 多维数组的定义类似二维数组的定义,格式为: 类型标识符 多维数组名元素个数1元素个数2元素个数n; 例如:float y102030;,51,6.4.2 多维数组的初始化,多维数组的初始化和二维数组的初始化方法基本相同,例如有定义:int a323;,对其进行初始化为: int a323=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18; 也可如下初始化: int a323=1,2,3,4,5,6,7,8,9,11,12,13,14,125,16,17,18;,52,6.4.3 多维数组的引用,多维数组名下标1下标2下标n 其中下标的取值范围类似于二维数组,并且多维数组的元素同样可以赋值和出现在表达式中。例如,xijk=45+2*k;,53,6.5 字符数组,6.5.1 字符数组的定义 用来存放字符常量的数组称为字符数组。字符数组类型说明的形式与前面介绍的数值数组相同。 例如:char c10;,54,6.5.2 字符数组的初始化,1初始化为字符 例如:static char c10=c,p,r,o,g,r,a,m; 2初始化为字符串 例如:char str10=China; 对于字符串的存储也可以采用以下几种形式进行初始化: char str10=China; 去掉花括号,字符串是一个整体 char str=China; 可以不说明长度,实际是六个元素 3利用printf和scanf函数处理字符串,55,例如下面一段程序: #include stdio.h main() char st15; printf(input string:n); scanf(%s,st); printf(%sn,st); ,56,6.5.3 字符串常用函数,1字符串输出函数puts 格式:puts(字符数组名); 功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。 #includestdio.h main() static char c=BASICndBASE; puts(c); ,57,2字符串输入函数gets,格式:gets(字符数组名); 功能:从标准输入设备键盘上输入一个字符串。本函数得到一个函数值,即为该字符数组的首地址。 #includestdio.h main() char st15; printf(input string:n); gets(st); puts(st); ,58,#include stdio.h #include string.h main() static char st130=My name is ; char st210; printf(input your name:n); gets(st2); strcat(st1,st2); puts(st1); ,59,4字符串拷贝函数strcpy,格式:strcpy(字符数组名1,字符数组名2); 功能:把字符数组2中的字符串拷贝到字符数组1中。字符串结束标志0也一同拷贝。字符数名2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。,60,#include stdio.h #includestring.h main() static char st115,st2=C Language; strcpy(st1,st2); puts(st1); printf(n); ,61,3字符串连接函数strcat,格式:strcat(字符数组名1,字符数组名2); 功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志0。本函数返回值是字符数组1的首地址。,62,5字符串比较函数strcmp,格式:strcmp(字符数组名1,字符数组名2); 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果,返回结果如下: 字符串1=字符串2,返回值=0; 字符串2字符串2,返回值0; 字符串1字符串2,返回值0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。,63,#include stdio.h #includestring.h main() int k; static char st115,st2=C Language; printf(input a string:n); gets(st1); k=strcmp(st1,st2); if(k=0) printf(st1=st2n); if(k0) printf(st1st2n); if(k0) printf(st1st2n); ,64,6测字符串长度函数strlen,格式:strlen(字符数组名); 功能:测字符串的实际长度(不含字符串结束标志0)并作为函数返回值。 #include stdio.h #includestring.h main() int k; static char st=C language; k=strlen(st); printf(The lenth of the string is %dn,k); ,65,6.6 综合例题,【例6.7】编写程序,用选择法对N个数排序。 #define N 10 main() int aN,min,i,j,t; for(i=0;i=ai) min=i; t=amin;amin=aj-1;aj-1=t; for(i=0;iN;i+) printf(%d ,ai); ,66,【例6.8】把一个整数按大小顺序插入已排好序的数组中。,67,main() int i,j,p,q,s,n; int a11=127,3,6,28,54,68,87,105,162,18; /*注意:概述组元数为11个*/ printf(The 10 number order is:n); for(i=0;i10;i+) p=i;q=ai; for(j=i+1;j10;j+) if(qaj) p=j;q=aj; if(p!=i) s=ai; ai=ap; ap=s; ,68,printf(%d ,ai); printf(nInput number:n); scanf(%d, ,69,【例6.9】求23矩阵的转置矩阵。,设有源矩阵为a,转置矩阵为b,矩阵转置是将a矩阵的第一行元素变成b矩阵的第一列元素,即a的第i行变成b的第i列,例如:,70,#define M 2 #define N 3 #include stdio.h main( ) int aMN,bNM,t ; int i,j; for (i=0;iM;i+) for(j=0;jN;j+) scanf(%d,71,for (i=0;iM;i+) for(j=0;jN;j+) printf(%d ,aij); printf(n); printf(array b:n); for (i=0;iN;i+) for(j=0;jM;j+) printf(%d ,bij); printf(n); ,72,第7章 指针,7.1 变量的地址和指针变量,一,7.2 数组的指针与指向数组的指针变量,二,7.3 字符串的指针和指向字符串的指针变量,三,7.4 指针数组与指向指针的指针,四,73,7.1 变量的地址和指针变量,7.1.1 变量的地址以及变量的存取方式 (1)直接访问 (2)间接访问,间接访问示意图,74,7.1.2 指针变量的定义和指针变量的基类型,1指针变量定义 基类型 *变量名; 2示例 int *pointer_1,*pointer_2; float *f; char *pc;,75,7.1.3 指针变量赋值,将指针变量指向某个变量的方法是将被指变量的地址赋值给该指针变量,这里就要用到取址运算符“”。例如 int i; int *p; p=,76,7.1.4 指针变量引用,1指针运算符 char ch1 = A; puts( 变量名称 变量值 内存地址 ); puts( - ); printf( num1t %dt %pn, num1, ,78,【例7.2】通过指针变量访问整型变量,int main() int i=100,j=10; int *pi,*pj; pi= ,79,7.2 数组的指针与指向数组的指针变量,7.2.1 指向数组的指针变量 int a10,*p; p=,80,7.2.2 通过指针引用数组元素,1地址表示法 例如数组元素a5的地址有三种不同的表示形式 p+5, a+5, clrscr(); for(i=0;i=0;i-) printf(%d ,ai); ,82,【例7.5】计算并输出一个数组中所有元素的和、最大值、最小值、值为奇数的元素个数。,#include main() int i,a10,*p,sum,max,min,count; for(i=0;i10;i+) ai=i; /* 用下标方式为数组元素赋值 */ p=a; /* 通过数组名对指针变量p赋初值*/ sum=0; for(i=0;i10;i+) sum=sum+*(p+i); /* 指针变量加偏移量方式计算数组元素的和 */ max=*a;,83,for(i=1;i*p) min=*p; /* 指针移动方式计算数组元素最小值 */ p= ,84,7.2.3 指向多维数组的指针和指针变量,1.多维数组的地址 2.行转列的概念 3.指向多维数组的指针变量,【例7.6】用指向元素的指针变量输出数组元素的值。 int main() int a34= 0,2,4,6,1,3,5,7,9,10,11,12; int *p; for(p=a0;pa0+12;p+) if (p-a0)%4=0) printf(n); printf(%4d,*p); return(0); ,85,【例7.7】输出二维数组中任一行任一列元素的值。,main() int s34= 0,2,4,6,1,3,5,7,9,10,11,12; int (*p)4,i,j;/*一定要加括号注意与后面介绍的指针数组区别*/ p=s; scanf(%d,%d, ,86,7.3 字符串的指针和指向字符串的指针变量,1.字符数组 将字符串的各字符(包括结尾标志0)依次存放到字符数组中,利用下标变量或数组名对数组进行操作。,【例7.8】字符数组应用 main() char string=I am a student. ; printf(%sn,string);,87,2字符指针,对字符串而言,也可以不定义字符数组,直接定义指向字符串的指针变量,利用该指针变量对字符串进行操作。,【例7.9】字符指针应用 main() char *string=I am boy ; printf(%sn,string); ,88,【例7.10】输入两个字符串,比较是否相等,如果相等则输出YES,如不等则输出NO。,#include “stdio.h” #include “string.h” main() int t=0; char *s1,*s2; gets(s1); gets(s2); while (*s1!=0 ,89,7.3.2 字符数组与字符串指针区别,1.存储方式的区别 2.赋值方式的区别 3.定义方式的区别 4.运算方面的区别,【例7.11】指针变量的运算 main() char *string=”I am a student.”; string=string+7; printf(“%sn”,string);,90,【例7.12】用指针变量处理字符串的复制,【例7.12】用指针变量处理字符串的复制 #include #include #include void main() char *s1=Hello World!n,*s2,*t; puts(s1); s2=calloc(strlen(s1)+1,sizeof(char); t=s2; while(*s1!=0) *s2=*s1; s1+; s2+; *s2=0; /*复制循环中未复制的字符串结束标志*/ s2=t; puts(s2); ,91,7.4 指针数组与指向指针的指针,7.4.1 指针数组的概念 一维指针数组的定义格式为: 类型名 *数组名 数组长度; 例如:int *p4;,92,【例7.14】利用指针数组显示下列菜单信息 File Edit Search Option,#include “stdio.h” main() char *menu=“File” ,“Edit”,“ Search”, “Option”; int i; for(i=0;i4;i+)printf(“%s ”,menui); ,93,7.4.2 指向指针的指针,【例7.15】指向指针的指针变量应用,main() char *name =“C Program”,”BASIC”,”Computer English”,”Word”; char *p; for(p=name;pname+4;p+) printf(“%sn”,*p); ,94,7.5 指针与动态内存分配初步,C语言中动态内存分配其实就是使用一个标准的库函数malloc,其函数的原型为: void *malloc( unsigned int size );,分配数量*sizeof(内存单元类型符),动态内存分配的基本步骤 (1)了解需要多少内存空间,利用动态分配函数来分配所需要的存储空间。 (2)使指针指向获得的内存空间,以便用指针在该空间内实施运算或操作。 (3)当使用完毕内存后,释放这一空间。,95,【例7.16】简单的动态分配内存,#include #include int main() int* piVal=(int*)malloc(sizeof(int); printf(请输入piVal的值 =); scanf(%d,piVal);/* 输入piVal的值 */ printf(n); printf(piVal 所指向的地址为 %pn,piVal); printf(piVal 所指向的地址内容为 %dnn,*piVal); printf(释放 piVal 所指向的内存空间.nn); free(piVal);/* 将指针piVal的空间释放 */ printf(piVal 所指向的地址为 %pn,piVal); printf(piVal 所指向的地址内容为%dnn,*piVal); system(pause); return 0; ,96,【例7.17】先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。,int main ( ) int n, sum, i, *p; printf(Enter n: ); scanf(%d, ,97,谢 谢,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!