C教材(第三版)全套课件_第1页
C教材(第三版)全套课件_第2页
C教材(第三版)全套课件_第3页
C教材(第三版)全套课件_第4页
C教材(第三版)全套课件_第5页
已阅读5页,还剩230页未读 继续免费阅读

下载本文档

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

文档简介

1高级语言程序设计第1章C语言基础知识.ppt第2章C语言的基本控制结构.ppt第3章计算机算法初步.ppt第4章数据的组织结构(一).ppt第5章程序的组织结构.ppt第6章基于指针的程序设计.ppt第7章数据的组织结构(二).ppt第1章C语言基础知识1.3数据类型、常量、变量、输入输出与基本运算1.2C程序的基本结构和运行过程

1.1计算机与程序设计语言1.4标准函数和EasyX库函数1.1计算机与程序设计语言计算机系统的基本组成包括计算机硬件和计算机软件。硬件指构成计算机系统的元器件、部件和设备,其中包括运算器、控制器、存储器、输入和输出设备,运算器和控制器是计算机的核心部分,人们将它们称为中央处理器(CPU)。软件是用户操纵计算机的接口界面,通常,按照应用层次可以将软件划分成系统软件、支撑软件和应用软件三个层次。程序设计程序设计是指设计、编写和调试程序的方法与过程,大致经历了以下几个阶段。1)面向计算机的程序设计2)面向过程的程序设计3)面向对象的程序设计程序设计语言程序设计语言是用于编写计算机程序的语言。按照语言级别可以将它分为两个类别:低级语言和高级语言。低级语言是一种与特定计算机体系结构密切相关的程序设计语言,主要包括机器语言和汇编语言。

高级语言是一类采用接近数学语言,并力求与具体机器无关的程序设计语言形式,它具有描述能力强,便于阅读理解,易于修改维护等特点。C语言支持结构化程序设计,C++语言和Java语言支持面向对象程序设计。6CC++Java0100100100110110100000111001101000110001计算机程序员机器语言编译器程序设计语言C语言发展过程及特点C语言是应用最广的一种高级程序设计语言,由美国贝尔实验室的D.Ritchie设计,最早用于书写UNIX操作系统。C语言本身比较简单,具有简明的数据定义和流程控制机制。它提供的函数机制用于描述程序模块,使得开发者可以通过模块的组合来构造结构化的复杂程序,并且允许软件系统不同程序模块的分别开发。同时,C语言支持底层程序设计。利用C语言提供的指针等功能,可以面向计算机硬件,直接描述内存单元的地址运算和二进制运算,从而编制出高性能的计算程序和控制程序。1.2C程序的基本结构和运行过程

C程序是由若干个函数组成的,每个函数用于描述一项操作的具体实现过程。任何一个完整的C程序都必须有且仅有一个名为main的主函数。当程序运行后,系统将率先自动调用主函数。例1:文本行的输出#include<stdio.h>main(){printf(“\nThisisaCprogram.”);}主函数(程序入口)标准函数(用于输出)头文件字符串换行符例2:计算1~100的整数和

#include<stdio.h>main(){inti,sum;

sum=0; for(i=1;i<=100;i++){/*循环*/ sum=sum+i;}printf("\n1+2+3+...+99+100=%d",sum); }说明变量i,sum是整数类型赋值输出格式控制注释例3:通过键盘输入两个整数,输出其中较大的整数

#include<stdio.h>intmaxValue(intx,inty){intmax;

if(x>y)max=x;elsemax=y;returnmax;}

main(){intx,y,z;

printf("Enter2integers:");scanf("%d%d",&x,&y);z=maxValue(x,y);printf("Thelargervalueis%d.",z);}运行C程序的基本过程VisualStudio2010集成环境1、用户界面2、创建工程

3、创建文件

4、编译、连接和运行

5、运行界面Dev-C++集成环境1、用户界面2、创建一个新文件或打开一个已经存在的C源文件3、编译、运行

4、运行界面1.3数据类型、常量、变量、输入输出与基本运算基本数据类型与数据的表示1、整型:整型指不带小数点的数据类型。例如,123、-89、0。常用的整型是基本整型int。对于32位系统,int类型的数据用4字节(32位二进制位)表示,字节(32位二进制位)表示,包括1位符号,有效位数为31位,取值范围为-2

147

483

648~2

147

483

647。2、实型

实型是指带小数点的数据类型。例如,78.34、0.0、-765.2、76.0。在C语言中,常用的实型是双精度型,用double表示。double类型的数据用8字节(64位二进制位)表示,包括1位符号,11位指数和52位尾数,

取值范围为-1.797

693

134

862

32E308~1.797

693

134

862

32E308。3、字符型字符型是指其值仅含有一个字符的数据类型。在C语言中,字符类型的名称是char,字符值用一对单引号括起来,并且每个字符对应一个ASCII编码,用1个字节(8位二进制位)表示。例如,‘0’、‘B’、‘#’对应的ASCII编码分别为48、66和35。

常量

常量是指在程序运行过程中始终不发生变化的量。1、整型常量

在C语言中,整型常量常用十进制形式。例如,120、3

270、-987、2、实型常量

在C语言中提供了两种实型常量的书写形式。一种是十进制小数形式,一种是指数形式。十进制小数形式:123.45、509.0、-0.98、0.0指数形式:1.87E+10表示1.87

10103、字符常量

字符常量由一对单引号(

)括起来,其内部存储表示是相应字符的ASCII编码。普通字符:例如:

P

@

9

转义符是指用一个反斜杠(\)后跟一个特定字符或一个八进制或十六进制数值表示的字符。例如:

\n,\101

4、字符串常量

字符串常量用一对双引号(

)括起来。例如:

ThisisaCprogram.

3871

K

都是字符串常量。变量变量是指其值可以改变的量,每个变量代表了不同的存储单元。C语言规定:程序中的每一个变量,必须先定义后使用定义变量的语法格式为:<数据类型><变量名>[,<变量名>[,<变量名>...]];例如:intcount;C语言规定:变量名用标识符表示。标识符是由字母、数字和下划线(_)组成的字符序列,其中第1个字符必须是字母,字母需要区分大小写。变量的赋值变量定义之后并没有一个确切的初始值,变量赋值就是将变量所属数据类型的某个数值(介于取值范围之中)放入系统为这个变量分配的存储空间中的操作。在定义变量的同时为变量赋予一个初始值。

<数据类型><变量名>=<常量表达式>;例如:intdata=100;通过赋值操作为变量赋值。

<变量名>=<表达式>

例如:x=64;例4:根据圆半径,计算圆的面积和周长。

#include<stdio.h>main(){doubleradius,area,perimeter;radius=20; area=radius*radius*3.14159;perimeter=2*radius*3.14159;printf("Theradiusofthecircleis%lf\n",radius);printf("Theareaofthecircleis%lf\n",area); printf("Theperimeterofthecircleis%lf\n",perimeter);}基本的输入输出1、字符的非格式化输入getchar()

基本执行过程为:等待用户从标准输入设备—键盘输入一个字符。如果输入成功,函数返回这个字符的ASCII编码。例如:charch;ch=getchar();2、字符的非格式化输出putchar()

putchar(ch),输出参数ch代表的字符。例5:通过键盘输入两个字符,分别在两行上显示这两个字符,每行显示2次。#include<stdio.h>

main(){charch; /*定义变量ch*/

ch=getchar(); /*从键盘读取一个字符*/putchar(ch); /*在屏幕上显示2次输入的字符*/putchar(ch);putchar('\n'); /*在屏幕上显示换行*/ch=getchar(); /*从键盘读取下一个字符*/putchar(ch); /*继续在屏幕上显示2次输入的字符*/putchar(ch);putchar('\n'); /*在屏幕上显示换行*/}3、格式化输入scanf()scanf(<格式控制字符串>,<变量地址>,<变量地址>...);例如:scanf(“%d%d%f%f”,&x,&y,&f1,&f2);常用的格式控制说明符由“%”后跟一个特定字符或字符序列组成“%d”表示这个位置应该输入一个十进制整型数值;“%c”表示这个位置应该输入一个字符;“%f”表示这个位置应该输入一个实型数值,“%ld”表示这个位置应该输入一个长整型数值<变量地址>是准备用来存放输入数据的变量地址。例如,&a、&value分别表示变量a、value的存储地址例6:将输入的角度转换成弧度。#include<stdio.h>main(){intdegree; doubleradian;

printf("Enterdegree<int>:");scanf("%d",°ree);radian=3.14159*degree/180;printf("%ddegreesequalto%lfradians.",degree,radian);}

4、格式化输出printf()

printf(<格式控制字符串>,<表达式>,<表达式>...);例如:printf(“Thisvalueis%d\n”,x);<格式控制字符串>的含义与scanf()函数相同。但在这里,还可以包含一些直接显示的字符串。printf()函数的基本功能是将每个表达式的结果按照格式控制说明符的规则显示到标准输出设备——显示器上。格式控制说明符需要与将要输出的表达式一一对应。在很多情况下,人们希望能够更加准确地控制每个数值输出时所占据的列数,为此,C语言提供了相应的功能。其格式为:%m和%m.nm表示数值输出时在屏幕上占据的列数,又称为场宽,n表示输出实型数值时小数点后的位数例如:

inta=365;charc='Z’;doublee=7865.298;printf("%6d%3c%12.6lf",a,c,e);算术运算符加(+)、减(-)、乘(*)、除(/)、取余(%)注意:*不能省略%(求余)运算对象只能是整型整型/整型相当于取整,一个为实型即为除法C语言允许char类型的变量或常量参与各种算术运算,但在运算时,它将被看成一个整型数值,其值为字符对应的ASCII编码。例如:‘A’+32等于用大写字符’A’的ASCII编码65与32相加结果为9737/两个整数相除,结果仍为整数

5/2

的结果为2

5.0/2的结果为2.5

%求余运算判奇偶时用此运算符

5%3的结果为23%5的结果为

3#include<stdio.h>main(){intd1,d2,d3,d4,value;

printf("Enter4characters:");d1=getchar()-'0'; /*输入数字字符,并转换为个位数*/d2=getchar()-'0';d3=getchar()-'0';d4=getchar()-'0';value=d1*1000+d2*100+d3*10+d4; printf("Thevalueis%d\n",value); /*输出结果*/}

例7:将连续输入的4个数字字符拼成一个int类型的数值。自增、自减运算符++--++--可以实现变量的加1、减1操作。这两个运算符既可以置于变量的前面,也可以置于变量的后面。也就是说,++i、--i、i++、i--、都是正确的书写形式,它们的区别只有在表达式中才能够显现出来。a=10;b=++a;

表达式的值取修改后的值a为11,b为11a=10;b=a++;

表达式的值取修改前的值a为11,b为10算术表达式算术表达式是指仅包含算术运算符或自加(++)、自减(--)运算符的表达式。算术表达式的结果一定是数值类型的,即整型或实型C语言规定,在书写表达式时,应该遵循下列规则:(1)所有内容都必须写在一行上,例如:必须写成7/8(2)在表达式中只允许使用圆括号。为了确保表达式中的每个运算符能够按照所期望的顺序进行计算,应该适当地添加括号。(3)表达式中的乘号(*)不允许省略,例如:(a+1)(a-1)必须写成(a+1)*(a-2)C语言提供了大量标准函数,包括前面介绍过的getchar、putchar、printf、scanf等输入/输出函数,也包括各种数学计算函数。1.4标准函数和EasyX库函数数学标准函数函数原型 功能描述intabs(intx);返回int型x的绝对值doublefabs(doublex);返回double型x的绝对值doublesin(doublex);返回x的正弦,x是弧度doublecos(doublex);返回x的余弦,x是弧度doubletan(doublex);返回x的正切,x是弧度doubleexp(doublex);返回exdoublepow(doublex,doubley);返回xydoublesqrt(doublex);返回x的开平方doublefloor(doublex);返回小于x的最大整数doubleceil(doublex);返回大于x的最小整数#include<stdio.h> #include<math.h> /* 引入数学函数的声明*/

main(){ inta,b,c; doubleS,A,B,AB; printf("输入两个角度和一个边长:"); scanf("%d%d%d",&a,&b,&c); /*输入两个角和一条边 */ A=3.14159*a/180; /*转换为弧度*/ B=3.14159*b/180; AB=3.14159*(a+b)/180; S=c*c*sin(A)*sin(B)/sin(AB)/2; /*计算三角形面积*/ printf("\nS=%lf\n",S);}例8:三角形面积的计算。函数原型功能描述HWNDinitgraph(intwidth,intheight,intflag=0);初始化一个宽width高height的绘图环境,返回窗口句柄voidcleardevice();用当前背景色清空屏幕voidclosegraph();关闭绘图环境voidcircle(intx,inty,intradius);绘制以(x,y)为圆心,半径为radius的圆voidellipse(intleft,inttop,intright,intbottom);以(left,top)为左上角,(right,bottom)为右下角形成的矩形为外接矩形,绘制一个空心椭圆voidrectangle(intleft,inttop,intright,intbottom);以(left,top)为左上角,(right,bottom)为右下角,绘制一个空心矩形voidpolygon(constPOINTpts[],intnum);以数组pts中的num个点作为顶点,绘制一个空心的椭圆voidmoveto(intx,inty);设置绘图当前点为(x,y)voidlineto(intx,inty);在当前点和(x,y)之间绘制直线,并设置(x,y)为当前点voidline(intx1,inty1,intx2,inty2);从绘图点(x1,y1)到(x2,y2)绘制一条直线voidputpixel(intx,inty,COLORREFcolor);在指定点(x,y)绘制一个颜色为color的像素点voidouttextxy(intx,inty,LPCTSTRtext);在指定点(x,y)输出text给定的字符串EasyX函数第2章C语言的基本控制结构2.3循环结构2.2选择结构2.1顺序结构2.1顺序结构顺序结构是指按照语句的书写顺序依次执行每条语句的语句结构。2.2选择结构选择结构是指根据某些数据的取值或计算结果选取不同操作的处理方式。选择结构的描述由两个基本部分组成,一是对选择条件的描述;二是对处理分支的描述。

关系运算与逻辑运算

关系运算符运算符><>=<===!=功能大于小于大于等于小于等于等于不等于

逻辑运算符逻辑运算符&&||!功能逻辑与逻辑或逻辑非注意:对于数学表示形式0<a<10,不能直接地采用这种方式书写,而需要将它分解成两个关系运算,即分解成0小于a并且a小于10,并按照下列格式书写:0<a&&a<10例如,对于逻辑表达式x>=0&&y++,如果x小于0,将不计算y++。对于逻辑表达式x>=0||y++,如果x大于或等于0,将不计算y++if语句

if(<条件表达式>)<真分支语句>if语句

if(<条件表达式>)<真分支语句>else<假分支语句>if(num<0){ value =-num;}else{ value =num;}value=num;if(num<0){ value =-num;}例1:北京地铁票价的计算。#include<stdio.h>main(){ doublenum; intprice; printf("请输入千米数(实数):"); scanf("%lf",&num); if(num>=0&&num<=6) price=3; elseif(num>6&&num<=12) price=4; elseif(num>12&&num<=22) price=5; elseif(num>22&&num<=32) price=6; elseif(num>32) price=(num-32)/20+7; if(num<=0) printf("非法输入!\n"); else printf("票价是%d元\n",price); }多路选择和switch语句

switch(<表达式>){case<常量>: <语句序列>case<常量>: <语句序列>......case<常量>: <语句序列>default: <语句序列>}执行的基本过程:首先计算充当开关角色的表达式;然后,根据计算结果进行控制的转移,即用开关值与下面每个case语句中的常量进行比较;如果开关值等于某个常量,则执行该case语句中的语句序列;如果不存在等于开关值的case常量,则执行default语句中的语句序列。

在switch语句中,所有的case常量不允许重复。在实际应用中,经常将break语句作为每个case分支的语句序列的最后一条语句,以表示该分支的计算结束,并随后跳出switch语句,终止switch语句的继续执行。例2:通过键盘读取两个复数和运算符,完成复数运算的操作,并输出计算的结果。#include<stdio.h>intmain(){ doublea,b,c,d,x,y,t; charop; /*保存运算符*/ printf(“\nEnterthefirstcomplexnumber:”); scanf(“%lf%lf”,&a,&b); getchar();printf(“\nEnteraoperator:”); scanf(“%c”,&op); /*输入运算符*/ printf(“\nEnterthesecondcomplexnumber:”); scanf(“%lf%lf”,&c,&d);

switch(op){ /*检查运算符*/

见下页

}printf("Theresultis%lf+%lfi\n",x,y);}

case'+': x=a+c; y=b+d; break; case'-': x=a-c; y=b-d; break; case'*': x=a*c-b*d; y=b*c+a*d; break; case'/': t=c*c-d*d; if(t==0){ printf("Thedenominatoris0.\n"); return 0; } x=(a*c+b*d)/t; y=(b*c-a*d)/t; break; default: printf("Invalidationoperator.\n"); return 0; 2.3循环结构while语句语法格式:while(<条件表达式>)<语句>例3:从键盘输入10个整数,计算它们的平均值

#include<stdio.h>main(){ intsum=0,i=1; intx;/*保存当前输入的数据*/ printf(“\nEnter10integers:”); while(i<=10){ scanf(“%d”,&x); /*读入整数x*/ i++; /*累加已输入的数据个数*/ sum=sum+x; /*累加输入的数据总和*/ } printf(“Theaveragevalueis%lf\n”,sum*1.0/(i-1));}for语句

语法格式:for(<初值表达式>;<条件表达式>;<增量表达式>)<语句>例4:从键盘读入5个字符,找出其中ASCII值最大的字符,并将该字符输出10次。#include<stdio.h>main(){ inti,x,max=0; for(i=0;i<5;i++){ x=getchar(); if(x>max) max=x; } for(i=0;i<10;i++) putchar(max); }dowhile语句语法格式:do<循环体语句>while(<条件表达式>);

例 intch,num=0; do{ ch=getchar(); if(ch>='0'&&ch<='9') num++; }while(ch!='\n');

#include<stdio.h>#include<math.h>#include<graphics.h>#include<conio.h>

intmain(){ doubleA,w,q,k; intx,y;

printf("请输入正弦曲线的振幅、角速度、初相和偏距:\n"); scanf("%lf%lf%lf%lf",&A,&w,&q,&k);

initgraph(640,480); setorigin(40,240); line(-40,0,600,0); line(0,240,0,-240); setaspectratio(1.0,-1.0); for(x=0;x<640;x+=10){ y=A*sin(w*x+q)+k; if(x==0) moveto(x,y); else lineto(x,y); } _getch(); closegraph(); return0;}第3章计算机算法初步

3.3递推与迭代法3.2穷举法3.1算法的概念3.1算法的概念利用计算机求解问题的一般过程(1)问题分析阶段(2)数据结构设计阶段(3)算法设计阶段(4)编码与调试阶段

算法描述在计算机科学的发展过程中,人们已经提出了很多种类的算法描述方法。一种是自然语言的描述方法。鉴于自然语言本身过于灵活且又缺乏严谨性,所以容易产生理解上的歧义。还有一种算法的图形描述方式——流程图。它采用一些标准的图形符号描述算法的操作过程,从而避免了人们对非形式化语言的理解差异。

起止框I/O框处理框判断框调用框连接框有向边

常用流程图符号例1:求解一元二次方程问题分析假设一元二次方程可以书写成ax2+bx+c=0。可以看出,任何一个一元二次方程都由三个系数a、b、c惟一确定,所以,首先需要用户输入三个系数,然后再根据一元二次方程的求解规则计算最终的结果,并将结果显示输出。算法描述

#include<stdio.h>#include<math.h>main(){ inta,b,c,t; printf(“Inputa,b,c:”); scanf(“%d%d%d”,&a,&b,&c); t=b*b–4*a*c; if(t<0) printf(“Nosolution\n”); elseif(t==0) printf(“X=%lf\n”,-b/(2.0*a)); else{ doublet0; t0=sqrt((double)t); printf(“X1=%lf,X2=%lf\n”,(-b+t0)/(2*a),(-b-t0)/(2*a));} }程序代码

3.2穷举法概述穷举法,又称为枚举法,是人们日常生活中常用的一种求解问题的方法。穷举法的核心在于明确问题的所有可能性,并针对每种可能情况逐个进行判断,最终找出正确问题的答案。

穷举法应用实例1:素数的判断

所谓素数是指仅能被1和自身整除,且大于等于2的数值。判断一个给定的数值是否是素数是穷举法的典型实例。

例2:判断给定整数是否是素数。问题分析为了检查一个整数是不是素数,可以采用穷举法。假设给定的整数用x表示,则判断过程就是确认x不能整除以2~x-1之间的任何整数。这就需要一一列举出2~x-1之间的每个整数进行排查。

NY开始输入x2

tt<xt加1x%t==0结束输出“不是素数”输出“是素数”YNt==xYN算法描述

#include<stdio.h>main(){ intx,t; printf(“Enteraninteger:”); scanf(“%d”,&x); for(t=2;t<x;t++) /*列举小于x大于1的所有整数*/ if(x%t==0) break; if(t==x) /*是否通过循环条件出口*/ printf(“%disprime\n”,x); else printf(“%disn’tprime\n”,x);}程序代码

穷举法应用实例2:百钱买百鸡

“百钱买百鸡”是我国古代数学家张丘建提出的一个著名的数学问题。假设某人有钱百枚,希望买一百只鸡;不同的鸡价格不同,公鸡5枚钱一只,母鸡3枚钱一只,而小鸡3只1枚钱。试问:如果用百枚钱买百只鸡,可以包含几只公鸡、几只母鸡和几只小鸡。

例3:百钱买百鸡。

问题分析从题目要求可知:公鸡、母鸡和小鸡的数量是有限的,都不会超过100。通过对不同数量的公鸡、母鸡和小鸡进行组合,可以计算出购买这些鸡所用的花费,但这个题目要求找出那些花费正好100枚且鸡的总数也为100只的情况。因此,可以采用穷举法,将不同的公鸡、母鸡和小鸡的数量枚举一遍,找出那些符合题目要求的解。

算法描述

#include<stdio.h>#include<math.h>

main(){intx,y,z;

for(x=0;x<=100/5;x++)for(y=0;y<=100/3;y++) for(z=0;z<=100;z++){ if(x+y+z==100&&15*x+9*y+z==300) printf(“x=%d,y=%d,z=%d\n”,x,y,z); }}程序代码

3.3递推与迭代法概述递推常用于序列数据的计算。其基本策略是用已知结果和特定关系(递推公式)计算中间值。采用递推法进行问题求解的关键在于找出递推公式和边界条件。迭代也是计算机数值计算的一种基本算法,其基本策略是从初值出发,不断计算问题的近似解。递推与迭代法应用实例1:等比数列求和

所谓等比数列是指在一组数据中,后项和前项之前存在着一个固定的比例关系。例如:整数序列3、15、75、375的初值是3,后项与前项是5倍的关系,即前项乘以5得到后项。本题要求给定等比序列的首项和比例,计算这个数列的前10项之和。例4:等比数列求和。

问题分析等比数列的递推公式为:

itemi =itemi-1*ratio

后项等于前项乘以比例值sumi =sumi-1+itemi

前i项之和等于前i-1项之和加当前项由于在重复上述递推计算之前,需要将第1项的值累加到sum中,所以,需要先将item存入sum中。算法描述

#include<stdio.h>main(){ intitem,ratio,sum,i; printf(“\nEnterthefirstitemandratio:”); scanf(“%d%d”,&item,&ratio);

sum=item; for(i=1;i<10;i++){ item*=ratio; sum+=item; } printf(“Sumof10itemsis%d\n”,sum);}程序代码

递推与迭代法应用实例2:求圆周率π圆周率π的计算公式为:π=4–4/3+4/5–4/7+4/9–4/11+…例5:求圆周率π。问题分析圆周率π的计算公式为:π=4–4/3+4/5–4/7+4/9–4/11+…圆周率是通过将数列4、-4/3、4/5…求和得到的。在这个数列中,每个数据项的取值与前一项及该项的序号存在着一定的关系。可以通过迭代,逐个计算出每一个数据项,再将它们累加起来。为了满足要求的精度,可以通过检查数据项的大小来控制循环的终止。由于数据项的绝对值是递减的,且相邻项的符号不同,如果第n个数据项的绝对值已经小于精度值,则前n项之和一定已经满足精度要求了。算法描述

#include<stdio.h>#include<math.h>

main(){ inti=1,sign=1; doublePI=0.0,item; do{ item =sign*4.0/(2*i++-1); sign =-sign; PI +=item; }while(fabs(item)>1e-4); /*数据项精度控制循环*/

printf(“PI=%lf\n”,PI); }程序代码

第4章数据的组织结构(一)

4.3字符串的组织

4.2使用一维数组组织数据的应用实例

4.1数组类型

4.4字符串处理函数及应用实例

4.5二维数组

4.1数组类型数组类型的应用背景(1)同时存在若干个用来描述同一性质且不同个体的数据。(2)只有将这些数据组织在一起形成批量数据,共同参与处理,很多操作才具有实际意义。例如:要将表示每个学生考试成绩的所有整型数据组织在一起,以便共同参与诸如统计考试成绩的分布情况、按照考试成绩由高到低排名等一系列的操作。一维数组类型的定义

定义格式:<元素类型><数组变量名>[<元素数量>];例如:intvote[10];C语言规定:数组的下标从0开始,因此,表示这10个数据的下标为0~9

在C程序中,系统将会为每个数组型变量分配一片连续的存储空间,所需要分配的存储空间总数将取决于包含的元素个数和每个元素需要的存储空间。

一维数组的初始化基本格式为:<元素类型><数组变量名>[<元素数量>]={<元素初值1>,<元素初值2>,......,<元素初值n>};例如:doublescore[5]={9.2,9.1,8.7,9.1,8.5};说明:1)为数组型变量中的每一个元素都提供了一个初始值。此时,可以省略方括号内的数组元素数量。系统将根据花括号中包含的初值数目推测出数组含有的元素数量。

floatscore[]={9.2,9.1,8.7,9.1,8.5};2)对数组型变量的前面若干个元素赋予初值。此时可以使用下面这种书写形式:

intletter[26]={10,9,8,7};

它的执行结果是:将10、9、8、7分别赋予letter数组中下标为0、1、2、3的元素,后面的所有元素赋予初值0。

3)将数组型变量中的每一个元素赋予初值0。此时,可以使用下面这种简化的书写形式:

intvote[10]={0};一维数组元素的引用及基本操作数组元素的引用<数组变量名>[<下标表达式>]数组的赋值利用赋值语句为数组赋值

for(i=0;i<10;i++){vote[i]=0;}调用标准输入函数为数组赋值

for(i=0;i<13;i++){scanf(“%f”,&score[i]);}数组的输出

for(i=0;i<10;i++){printf(“%5d”,vote[i]);}查找问题

查找是指根据某个给定的条件,在一组数据中搜索是否存在满足该条件的数据的过程。4.2使用一维数组组织数据的应用实例例1:已知某个班级35名学生的某门课程的考试成绩。请编写一个程序,查看在这个班级中是否存在不及格的学生。

问题分析用一维数组记录每位学生的考试成绩,下标表示每个学生的编号,元素内容表示考试成绩。查找可以通过从前往后依次查看每个元素内容的过程实现。算法描述

#include<stdio.h>#include<stdlib.h>#include<time.h>#defineNUM35/*学生人数*/main(){ intscore[NUM]; inti;/*随机产生35个考试成绩*/srand(time(0));for(i=0;i<NUM;i++){ score[i]=rand()%100; } /*显示35名学生的考试成绩*/ for(i=0;i<NUM;i++){ printf("\nNo.%d:%d",i+1,score[i]); }程序代码

/*顺序查找是否存在不及格的学生*/ for(i=0;i<NUM;i++){ if(score[i]<60)break; }

/*输出查找结果*/ if(i<NUM) printf("\nNotallpass."); else printf("Allpass.");}例2:已知一个按非递减有序排列的整型数列(12,23,30,45,48,50,67,82,91,103)。请编写一个程序,查找其中是否存在与给定key相等的数值。

算法描述

#include<stdio.h>#defineNUM10main(){intvalue[NUM]={12,23,30,45,48,50,67,82,91,103};/*非递减整型数列*/intlow,high,mid,key;printf("\nEnterakey:"); /*输入查找的数值*/scanf("%d",&key);low=0; high=NUM-1;while(low<=high){ mid=(low+high)/2; if(value[mid]==key) break; if(value[mid]<key)low=mid+1; elsehigh=mid-1;}if(low<=high) printf("\n%disfoundat%d.",key,mid); /*确认break出口*/else printf("\n%disnotfound.",key); /*确认循环正常出口*/}程序代码

排序问题

将一组无序的数列重新排列成非递减或非递增的顺序是一种经常需要的操作。例如,在管理学生成绩的应用程序中,可以用一个数列表示一个班级的学生成绩,并按照从高到低的顺序重新排列,以便确定获得奖学金的学生。

例3:假设用户通过键盘输入一个整型数列。请编写一个程序,将其按照从小到大的顺序重新排列。问题分析(选择排序)首先从n个数据中选择一个最小的数据,并将它交换到第1个位置;然后再从后面n-1个数据中选择一个最小的数据,并将它交换到第2个位置;以此类推,直至最后从两个数据中选择一个最小的数据,并将它交换到第n-1个位置为止,整个排序操作结束。算法描述

#include<stdio.h>#defineNUM10 /*参与排序的数据个数*/main(){intdata[NUM]; /*存放参与排序的所有整数*/inti,j,min,temp;/*通过键盘输入待排序的整型数列*/printf("\nEnter%dintegers.",NUM);for(i=0;i<NUM;i++){scanf("%d",&data[i]);}/*显示原始整型数列*/printf("\n%dintegersare:",NUM);for(i=0;i<NUM;i++){printf("%5d",data[i]);}程序代码for(i=0;i<NUM-1;i++){min=i;for(j=i+1;j<NUM;j++){ if(data[j]<data[minValue]) minValue=j;}if(min!=i){ /*交换*/ temp=data[i]; data[i]=data[min]; data[min]=temp;}}/*输出排序后的结果*/printf("\nOrderinglistis:\n");for(i=0;i<NUM;i++){printf("%5d",data[i]);}}字符串的组织形式字符串是指一个有限长度的字符序列,字符串常量用一对双引号(“”)括起来。

字符串中所包含的字符个数被称为字符串长度。

4.3字符串的组织字符串的初始化charstr[]=“Cprogram”;charstr[]={‘C’,‘’,‘p’,‘r’,‘o’,‘g’,‘r’,‘a’,‘m’,‘\0’};

对于这种初始化形式,系统将其视为字符操作,而不是字符串操作,因此不会在尾部添加结束符‘\0’。

“Cprogram”的存储状态

0123456789C

program\0字符串的输入输出

1、gets(str);2、scanf(“%s”,str);gets以换行符作为输入结束标记,但不保存换行符。scanf以空格、换行符或制表符作为结尾。字符串的输出

1、puts(str);

2、printf(%s”,str);puts将字符串的内容显示到标准输出设备——屏幕上,并换行。

字符串标准函数

在C语言的标准函数库中,提供了30余种与字符串处理有关的标准函数,从而大大地提高了字符串处理的能力,降低了字符串处理的复杂程度。

4.4字符串处理函数及应用实例

计算字符串长度

strlen(str);这个函数的功能是返回字符串中所包含的字符个数,即字符串长度。字符串结束标志‘\0’不计算在内。字符串比较

strcmp(str1,str2);两个字符串进行比较时将依据每个字符对应的ASCII编码决定其大小。

例4:用户注册程序。#include<stdio.h>#include<string.h>

main(){ charuserid[32]; charpassword1[16],password2[16]; do{ puts("请输入用户名:"); gets(userid); if(userid[0]!='\0') break;

puts("用户名不能为空"); }while(1); do{ puts("请输入密码(六位以上):"); gets(password1); if(strlen(password1)<6){ puts("密码长度不足"); continue; } puts("请再次输入同一密码"); gets(password2); if(0==strcmp(password1,password2)) break; puts("两次输入密码不同,请重新输入"); }while(1); puts("祝贺您成功注册我们的网站");}

程序代码字符串拷贝

strcpy(str1,str2);其中str2是将要被拷贝的字符串,str1是用于存放拷贝结果的存储区域。字符串连接

strcat(str1,str2);其中str1和str2是两个字符串。这个函数的功能是:将str2连接在str1之后,并在结束处添加一个字符串结束符‘\0’字符串转换成数值类型

atof(str);atoi(str);atol(str);其中str是一个字符串。atof()的返回类型是double,它可以将字符串str转换成一个双精度数值;atoi()的返回类型是int,它可以将字符串str转换成普通整型;atol()的返回类型是long,它可以将字符串str转换成长整型(long)。#include<stdio.h>#include<stdlib.h>main(){charnum1[20],num2[20];doubled1,d2,sum;printf("\nEnterthefirstnumber:");gets(num1); /*输入第1个用字符串表示的实型数值*/printf("\Enterthssecondnumber:");gets(num2); /*输入第2个用字符串表示的实型数值*/d1=atof(num1);/*将第1个字符串转换成double类型*/d2=atof(num2);/*将第2个字符串转换成double类型*/sum=d1+d2;/*将2个double类型数值相加*/printf("\n%s+%s=%.3lf",num1,num2,sum);/*显示结果*/}程序代码大小写转换

strlwr(str);strupr(str);str是一个字符串。标准函数strlwr()可以将字符串str中出现的所有大写字母转换成小写字母;标准函数strupr()可以将字符串str中出现的所有小写字母转换成大写字母。4.5二维数组

二维数组的定义

定义格式:<元素类型><数组变量名>[<元素数量1>][<元素数量2>];例如:intvalue[5][4];

value数组的每个元素类型为int,包含5行4列共20个元素

一旦定义了一个二维数组型变量,系统就会立即为其分配相应的存储空间用于存放数组中的每个元素。存储空间的数量取决于数组元素的类型和所定义的行数、列数,即存储空间数量=每个元素所占用的字节数量

行数

列数,并按照行列顺序依次排列。

二维数组的初始化inta[4][3]={{12,11,10},{9,8,7},{6,5,4},{3,2,1}};inta[4][3]={12,11,10,9,8,7,6,5,4,3,2,1};inta[][3]={12,11,10,9,8,7,6,5,4,3,2,1};如果只对二维数组变量中的部分元素进行初始化,可以使用下面两种形式。intarray1[4][3]={{},{1},{1,2},{1,2,3}};intarray2[4][3]={10,9,8,7,6,5};二维数组元素的引用及基本操作数组元素的引用<数组变量名>[<下标表达式1>][<下标表达式2>]数组的赋值

for(i=0;i<ROWS;i++)for(j=0;j<COLS;j++)value[i][j]=i+j;数组的输入

for(i=0;i<ROWS;i++)for(j=0;j<COLS;j++)scanf(“%d”,&value[i][j]);数组的输出

for(i=0;i<ROWS;i++){for(j=0;j<COLS;j++)printf(“%4d”,value[i][j]);putchar(‘\n’);}二维数组的应用实例例5:判断给定方阵是否为对称矩阵。

问题分析对于一个给定的N

N矩阵array,如果矩阵中的每个元素都满足array[i][j]=array[j][i],则称这个矩阵为对称矩阵。在判断一个给定的矩阵是否为对称矩阵时,只需要用下三角部分的每个元素与对应的上三角元素进行比较。如果每一对元素都相等,这个矩阵就是对称矩阵,否则,就是非对称矩阵。算法描述

#include<stdio.h>#defineNUM5矩阵行列数main(){intm[NUM][NUM];/*定义二维数组变量*/inti,j;/*输入矩阵*/

printf("\Enter%drows%dcolsdatasforthemaxtrix:\n",NUM,NUM);for(i=0;i<NUM;i++)for(j=0;j<NUM;j++) scanf("%d",&m[i][j]);/*显示矩阵*/for(i=0;i<NUM;i++){for(j=0;j<NUM;j++) printf("%4d",m[i][j]);printf("\n");}程序代码/*判断矩阵是否对称并输出相应的结果*/for(i=0;i<NUM;i++)for(j=0;j<i;j++) if(m[i][j]!=m[j][i]){ printf("\nThematrixisn'tsymmetrical."); return0; }printf("\nThematrixissymmetrical.");}5.3函数与数组的应用实例5.2自定义函数5.1函数概述5.4递归算法与递归函数

5.5变量的作用域和生存期第5章程序的组织结构

5.1函数概述结构化程序设计方法的核心是功能分解、逐步求精,具体的实现策略是将复杂的问题逐步分解成相对简单的子问题,这样将有利于降低解决问题的难度,提高程序开发的效率。将一个问题分解成若干个子问题的过程称为模块化。在C程序中,模块用函数实现。函数是构成C程序的基本单位。它由函数首部和函数体两个部分组成,函数首部包含函数的返回类型、函数名称和参数表的声明,函数体包含实现特定功能所需要执行的语句序列。C语言提供了很多标准函数,它们被放置在一起,形成了一个标准函数库。函数原型函数原型是指不包含函数体的函数声明。

C语言规定,所有的函数必须先定义后调用。对于标准函数而言,由于它们的定义已经在C语言提供的标准函数库中,所以,人们在调用它们的时候,只需要在程序的前面利用编译预处理命令include将相应的函数原型加入到程序中就可以了。5.2自定义函数函数的定义基本格式

<函数返回类型><函数名>(<参数表>)

{ <函数体>;

}

例:

doubledistance(intx,inty){ doubled; d=sqrt(x*x+y*y); returnd;}C语言规定,一个函数可以有返回值,也可以没有返回值。如果有返回值,返回值的类型在函数名前声明,并在函数体中利用return语句将返回值返回;如果没有返回值,在函数名前声明void。

函数名不但应该符合C语言的自定义标识符命名规范,还应该“见名知意”。参数表是函数之间交换信息的接口。既可以通过它将外界的数据传递给函数,也可以通过它将函数的操作结果带出函数。如果形式参数属于一维数组类型,无须指出一维数组的元素个数。函数体是函数的具体实现。函数的调用

函数调用语句的基本格式为:

<函数名>(<实在参数表>);实在参数与形式参数的数据类型和个数一一对应。

函数的返回值在声明函数的时候,函数名前使用了保留字void,说明这个函数没有返回值;否则,这个函数执行完毕后,应该返回一个相应类型的数值。

return表达式;参数的传递

定义函数时所给的参数被称为形式参数,这是由于当函数没有处于执行状态时,系统并不为这些参数分配存储空间,因此,在调用函数时,参数传递需要经历两个基本步骤:首先,根据形式参数的声明格式,为每一个形式参数分配存储空间;然后再将实在参数的值赋给对应的形式参数。例1:给定的任意整数N可能存在两个素数,它们的和等于N。请编写程序,输入整数N,输出满足条件的所有素数。自定义函数的应用实例问题分析对于这个问题,枚举法显然是最直接的解决方法,也就是逐个检查小于N/2的每个整数n;如果是素数,则检查N-n是否是素数,从而找出所有结果。

#include<stdio.h>

intisprime(intx);

main(){ intn,m;

printf("请输出一个正整数:"); scanf("%d",&m); for(n=2;n<m/2;n++) { if(isprime(n)&&isprime(m-n)) printf("素数%d+%d等于%d\n",n,m-n,m); }}intisprime(intx){ intt;

for(t=2;t<x;t++) if(x%t==0) return0; return1; }例2:计算

要求精确度达到10-6。

问题分析在这个公式中,第i项的分子是xi;分母是i!。ex是一个常用的数学计算,因此有必要设置了一个函数expx专门用于该计算。此外,每个数据项都需要计算xi和i!。这些计算显然是相对独立的,都有各自的算法,因此分别设置函数power和factory来完成。算法描述

#include<stdio.h>longpower(intx,inty);longfactorial(intn);doubleexpx(intx);main(){intx;printf("\nEnterx:");scanf("%d",&x);printf("\ne^%d=%f",x,expx(x));}longpower(intx,inty) /*计算xy*/{intresult=1;for(;y>0;y--) /*循环y次*/ result*=x; /*x个y相乘*/returnresult;}程序代码intfactorial(intn) /*计算n!*/{ intresult=1;

while(n>1) /*n!=

温馨提示

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

评论

0/150

提交评论