C语言第七次课讲义
- 格式:doc
- 大小:588.00 KB
- 文档页数:14
第七次课的概念
数组的概念
1.常规数组
常规数组声名语句如下:
全局数组Public 数组名(n) [as 类型名]
模块级数组Dim|Private数组名(n) [as 类型名]
过程级数组Dim|Static数组名(n) [as 类型名]
说明:如定义时没有特别说明,则下标是从0开始。
如在通用声明段中用了Option Base 1时,
下标从1开始
2.动态数组
动态数组声名语句如下:
声名语句和作用域与常规数组相同,但不指明数组元数的个数(既括号是空的),当使用时再用重定义语
句重新定义,其语法如下:
ReDim 数组名(n)
变量与数组的作用域
全局变量和数组的作用域是整个应用程序
模块级变量和数组的作用域是定义该变量和数组的模块
过程级变量和数组的作用域是定义该变量和数组的过程
动态变量(Dim)和静态变量(Static)的区别。
4、函数调用时实参的求值顺序(1)自定义函数的实参求值顺序标准没有规定,不同编译系统不一致。
TC:自右向左 VC:自左向右例:float aver(float x, float y, float z){ return (x+y+z)/3;}main(){ int x=1;printf(“%f”,aver(x+1, x, x++)) ;}TC运行结果:2 VC运行结果:1.333333(2) 系统库函数的实参求值顺序根据函数原型判断实参求值顺序:•函数原型为:函数类型 Cdecl 函数名(形式参数表);——该函数用C语言编写,依据编译系统不同而不同•函数原型为:函数类型 Pascal 函数名(形式参数表);——该函数用pascal语言编写,自左向右求值例如:math.h中包含以下函数原型:double _Cdecl pow(double x, double y) ;三、函数声明(function declaration)也称函数原型(function prototype)1、何时需要函数声明当函数定义在后,函数调用在前时需要在调用之前声明该函数。
例:float aver( int x,int y,int z);ave函数声明main(){ int x=1;printf(“ %f ”,aver (x+1, x, x++)) ;}float aver( int x,int y,int z){ return (x+y+z)/3; }2、函数声明一般格式函数类型函数名(数据类型 [形参变量名],数据类型 [形参变量名], . . .);形参变量名可缺省或换名。
例:函数定义:float aver( int x,int y,int z){ return (x+y+z)/3;}aver函数声明的几种形式:float aver( int x,int y,int z);float aver( int ,int ,int );float aver( int a ,int b,int c);3、缺少函数声明时编译器的处理方式•首先遇到函数定义时保存该函数的返回值类型和参数的个数及类型,用于后面调用该函数时检查实参的个数及类型。
一、上机资料1.VC++6.0软件2.校园网.新视野上机考试软件3.上机填空题技巧总结、上机该做题技巧总结、上机编程题技巧总结二、上机软件安装1.安装VC++6.0软件(1)双击“vc6.0精简版安装程序.exe”(2)(3)单击“下一步”,下图中可以根据需要更改安装的目录(4)单击“下一步”软件将进行安装(5)安装完成后将会出现以下对话框(6)如果在桌面显示下列的图标,则软件安装成功2.安装校园网.新视野上机考试软件(1)双击“校园网二级C语言上机模拟系统单机版.exe”(2)出现下面界面,单击“下一步”(3)单击“下一步”(4)完成后将在桌面上出现这样的图标三、打开上机考试中的填空题1.双击图标,进入抽题界面2.抽题界面3.抽题,例如抽取第2题4.单击“确定”后开始答题,单击“答题” “程序填空题”开始做题5.开始做程序填空题,将需要填空的地方补充完整四、讲解上机填空之与函数相关函数调用:P13第1题#include <stdio.h>double f1(double x) 定义了f1函数,有一个形参{ return x*x; }double f2(double x, double y) 定义了f2函数,有两个形参{ return x*y; }/**********found**********/__1__ fun(int i, double x, double y)→根据函数调用r = fun(1, x1, x2);可知函数返回值和r类型一致,double x1=5, x2=3, r;r为doule类型,则函数返回double{ if (i==1)/**********found**********/return __2__(x);→此处为函数调用,实参数为1,根据实参和形成个数一致可知,调用的为f1函数else/**********found**********/return __3__(x, y);→此处的实参数为2,则调用f2函数}main(){ double x1=5, x2=3, r;r = fun(1, x1, x2);r += fun(2, x1, x2);printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r);}五、填空题与数学公式相关1.解题方法:(1)如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0或者是0.0;如果以后用到的是乘除运算,则赋初值为1或者是1.0;(2)循环条件的填空,分析表达式的规律,看表达式中的最后一项的值是否到了第m项或者是第n项,如果到了第m或者第n项,则在循环中的第二个表达式中用到的是i<=m或者是i<=n;(3)循环条件中如果用的是while语句,则循环变量的初值应该在while的外面定义和赋初值,在循环语句中必须给变量自加或者是自减。
C语言程序设计教程第7章《C语言程序设计教程》第7章是关于数组和指针的内容。
本章从数组的定义、初始化、访问等基础知识开始讲解,然后介绍了二维数组、多维数组和字符数组,并通过具体的示例代码进行讲解。
此外,本章还讲解了指针的概念和用法,包括指针的定义、指针的运算、指针与数组的关系等内容。
首先,本章介绍了数组的定义和初始化的方法。
数组是由相同类型的数据元素组成的有序集合,使用方括号来定义数组的长度。
数组可以通过下标来访问和修改元素的值。
此外,本章还介绍了数组初始化的方法,包括静态初始化和动态初始化。
然后,本章详细讲解了二维数组和多维数组的概念和使用方法。
二维数组可以看作是由多个一维数组组成的,可以通过两个下标来访问和修改元素的值。
多维数组与二维数组类似,只是多维数组可以有更高维度的数组。
本章通过示例代码演示了如何定义和使用二维数组和多维数组。
接下来,本章介绍了字符数组的概念和使用方法。
字符数组是由字符组成的一维数组,可以用于存储和处理字符串。
本章通过示例代码演示了如何定义、初始化和使用字符数组,包括字符串的输入、输出和处理。
最后,本章详细讲解了指针的概念和用法。
指针是一种特殊的变量,可以存储变量的地址。
本章介绍了指针的定义和初始化的方法,以及指针的运算,包括指针的加法、减法和比较操作。
本章还讲解了指针与数组的关系,包括指针与一维数组的关系、二维数组的关系和字符数组的关系。
本章通过示例代码演示了指针的使用方法,包括指针与数组的遍历、指针与字符串的处理等。
总之,第7章《数组和指针》是《C语言程序设计教程》中比较重要和基础的章节。
通过学习本章的内容,读者可以了解数组和指针的概念和用法,掌握数组和指针的定义、初始化、访问等基本操作,以及掌握二维数组、多维数组和字符数组的使用方法。
通过本章的学习,读者可以更好地理解和运用C语言的数组和指针特性,提高自己的编程技能。
手把手教你学51单片机——之MCS-51基础篇主讲: 尹延辉策划:张勇开发板:LT-Super51QQ群:31646346网址:E-Mail:litianmcu@litianmcu@基础篇第三讲——C语言的三种语句结构◆本讲内容提要●C语句概述●程序的三种基本结构●顺序结构程序设计●逻辑运算与位运算符●选择结构程序设计●循环结构程序设计●习题ABPA B假真PA真假温故知新——C的数据类型与表达式●C语言的数据类型:字符型、整型、长整型,有符号、无符号●51单片机存储器结构:ROM、片内RAM数据区、片外RAM ●C51的变量类型修饰符:code、data、idata、xdata●C运算符与表达式:优先级、结合性的概念●算术运算符与表达式:加、减、乘、除、取模●赋值运算符与表达式:一般赋值表达式、复合赋值符与表达式●C程序的流水灯验证:软仿的概念释疑解惑——C数据类型与表达式(1)◆填空题●char型、int型、long int型变量分别占用1、2、4字节存储单元。
●有以下语句:char a=‘0’;则变量a用十六进制表示的值为0x30。
●对于单片机型号STC89C58,具有256字节的片内用户数据区,其中的128字节定义的C变量需要用data修饰、128字节需要用idata修饰。
想要存储一个1K字节的液晶显示器字符表,需要在定义变量时在其前加code 修饰使得字符表变量位于片内ROM存储器内。
◆实验题●设有char a=10;写出下面表达式的值,并编写程序通过流水灯输出验证①a+=a:20②a-=12:-2③a*=3+a:130④a/=a+a:0——C语句概述◆C语句的定义●和其他高级语言一样,c语言的语句用来向计算机系统发出操作指令。
一个语句经编译后产生若干条机器指令。
一个实际的程序应当包含若干语句。
应当指出,c语句都是用来完成一定操作任务的。
声明部分的内容不应称为语句。
如:int a;不是一个c语句,它不产生机器操作,而只是对变量的定义。
函数int he(int a,int b)/*形式参数*/{int s;s=a+b;return s;}main(){int aa=123,bb=456,ss;ss=he(aa,bb);/*实际参数*/printf("%d",ss);}函数的参数分为形式参数和实际参数:形参出现在函数定义及说明中。
实参出现在主调函数中,进入被调函数后,实参变量不能使用。
功能:形参与实参的功能是作数据传送。
形参与实参的特点:1)形参只在函数的内部有效,函数调用结束返回主调函数后不能再使用该形参变量。
2)实参可以是常量,变量,表达式,函数,它们必须有确定的值。
3)形参和实参的数量,类型,顺序应严格一致,否则会发生类型错误。
4)数据的传送是单向的,只能把实参的值传送给形参,不能把形参的值反向地传送给实参。
函数的返回值:函数的值是指函数被调用后,返回给主调函数的值。
函数的值只能通过return语句返回给主调函数。
一般形式:return 表达式;功能:计算表达式的值,并将表达式的值做为函数的返回值返回给主调函数。
注意:1)在函数中允许有多个return 语句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。
2)函数的返回值类型和函数定义中函数的类型应保持一致。
如果两者不一致,则以函数类型为准,自动进行类型转换。
3)如果函数值为整型,在函数定义时可以省去类型说明。
4)无返回值的函数,可以定义为“空类型”,类型说明符为“void”函数的调用:函数只能通过调用来使用。
调用一般形式:函数名(实际参数列表)要求:参数可以是常量,变量或其它构造类型数据及表达式。
各实参之间用逗号分隔。
函数的调用方式:1)函数表达式:z=max(x,y),适用于有返回值的函数。
2)函数实参:把函数值做为另一个函数的参数。
max(max(x,y),z) max((x,y中的最大值),z)3)函数语句:printf(“%d”,a);通常指的是无返回值的函数。
一、上机资料1.VC++6.0软件2.校园网.上机考试软件3.上机填空题技巧总结、上机该做题技巧总结、上机编程题技巧总结二、上机软件安装1.安装VC++6.0软件(1)双击“vc6.0精简版安装程序.exe”(2)(3)单击“下一步”,下图中可以根据需要更改安装的目录(4)单击“下一步”软件将进行安装(5)安装完成后将会出现以下对话框(6)如果在桌面显示下列的图标,则软件安装成功2.安装校园网.新视野上机考试软件(1)双击“校园网二级C语言上机模拟系统单机版.exe”(2)出现下面界面,单击“下一步”(3)单击“下一步”(4)完成后将在桌面上出现这样的图标三、打开上机考试中的填空题1.双击图标,进入抽题界面2.抽题界面3.抽题,例如抽取第2题4.单击“确定”后开始答题,单击“答题” “程序填空题”开始做题5.开始做程序填空题,将需要填空的地方补充完整四、讲解上机填空之与函数相关函数调用:P13第1题#include <stdio.h>double f1(double x) 定义了f1函数,有一个形参{ return x*x; }double f2(double x, double y) 定义了f2函数,有两个形参{ return x*y; }/**********found**********/__1__ fun(int i, double x, double y)→根据函数调用r = fun(1, x1, x2);可知函数返回值和r类型一致,double x1=5, x2=3, r;r为doule类型,则函数返回double{ if (i==1)/**********found**********/return __2__(x);→此处为函数调用,实参数为1,根据实参和形成个数一致可知,调用的为f1函数else/**********found**********/return __3__(x, y);→此处的实参数为2,则调用f2函数}main(){ double x1=5, x2=3, r;r = fun(1, x1, x2);r += fun(2, x1, x2);printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r);}五、填空题与数学公式相关1.解题方法:(1)如果在函数中定义变量,但是没有定义成静态存储变量,即变量前面没有static,应给变量赋初值,如果以后用到的是加减运算,则赋初值为0或者是0.0;如果以后用到的是乘除运算,则赋初值为1或者是1.0;(2)循环条件的填空,分析表达式的规律,看表达式中的最后一项的值是否到了第m项或者是第n项,如果到了第m或者第n项,则在循环中的第二个表达式中用到的是i<=m或者是i<=n;(3)循环条件中如果用的是while语句,则循环变量的初值应该在while的外面定义和赋初值,在循环语句中必须给变量自加或者是自减。
如果没有则一般填的是i++;(4)看表达式中的每一项的运算规则,按照运算的规则把每一项中的n值替换为i,特殊情况例外。
如果是表达式中用到的是间隔相加减的运算时,注意给中间变量赋初值为1或者是1.0;在后面的运算中给变量乘以一个-1,以改变中间变量的符号。
2.解题分析:(1)看清题目中要求的题意,题目要求做什么就只需考虑什么。
(2)找出题目中的表达式:当n=1时,表达式变为,当n=2时,表达式为,n不断的变化,得到的表达式值也不相同,题目中要求将n=1,n=2…n=n的值进行一个累加,最后得到一个结果赋值给变量s。
(3)通过以上的分析我们可以得到如下的信息:1)需要一个变量来存储结果值。
对应到程序中,我们使用s来表示,因为计算的结果可能为小数,因此将s定义为实型。
2)需要一个变量从1开始递增到n,对应到程序中用i表示。
3)需要用到循环的知识。
4)函数最后会将s的值进行返回。
double fun(int n){ int i; double s, t;/**********found**********/s=__1__;需要给s赋初始值,一般赋值为0或是1,这里面有规律,在填空题中一定填入的是0。
/**********found**********/for(i=1; i<=__2__; i++)需要填入的是i变量的初始值和结束值,结束值一般是通过实参传递给形参的,因此很多时候填入形参名即可。
{ t=2.0*i; 将2*i的值赋值给变量t,因此遇到直接用t*t代替就行。
/**********found**********/s=s+(2.0*i-1)*(2.0*i+1)/__3__; 需要在(2.0*i-1)*(2.0*i+1)/__3__;中填入适当的值来补充完整表达式,比较得知,(2.0*i-1)*(2.0*i+1)/__3__;缺少的是部分,上面分析过可以用t*t来代替,因此,第三个填入t*t就行!}return s;}3.类似题目:6、13、25、29、36、46、52、60、66、69、73、83、95六、使用了未定义的变量1.使用了未定义的变量:变量必须先定义后执行(1)0(零)和o(字母欧)的区别1)区别:零像鸡蛋,字母欧像乒乓球2)举例:上机题库P85第19题第一个出错点/************found************/a2=k/1o;3)类似题目:19题第一空、23题第二空、43题第二空、51题第二空、77、98、(2)P(大)和p(小)的区别1)区别:一般在定义时候p为小写,但是在使用的时候变为大写P,做题时候一定要细心2)举例:上机题库P91第33题第一出错点fun(int *a,int n,int x){ int p=0,i;a[n]=x;while( x!=a[p] )p=p+1;/**********found**********/if(P==n) return -1;3)类似题目:33题第一空、82(3)普通变量大小写的区别1)定义时候和使用时候变量的大小写不一致,违背了变量必须“先定义后执行”的原则2)举例:18题第2空int fun ( float *s, int n, float *aver ){ float ave, t = 0.0 ;int count = 0, k, i ;for ( k = 0 ; k < n ; k++ )/**************found**************/t = s[k] ;ave = t / n ;for ( i = 0 ; i < n ; i++ )if ( s[ i ] < ave ) count++ ;/**************found**************/*aver = Ave ;/*分析:定义时候float ave, t = 0.0 ;ave为小写,但是此时使用时候却是Ave大写,因此出错*/return count ;}3)类似题目:18题第2空、22题第2空、38题第1空、54题第2空七、改错题之逻辑错误1.运算符号出错:(1)C语言中除号是“/”不是“\”(2)赋值号(=)和等号(= =)混淆1)记住在if语句中出现赋值号(=)一般是讲它改为等号(= =)。
2)类似题目:14题第一空和29题第二空都是这样的错误、87、91、942.表达式的取值范围出错:(1)当遇到计算表达式的累加或是累减时,一定用到循环来完成相应的操作。
(2)例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i<m;i++)y-=1/(i*i);从题目中不难发现i是一个变量,它的取值范围从整数2开始到m-1结束,最终计算的结果为y=1-1/2*2-1/3*3-….-1/(m-1)*(m-1)和题目要求的不符,因此将i<m改为i<=m。
(3)做这样的题目看两点:一看题目中的表达式,二看for语句中变量的取值范围。
(4)类似题目:31题第二空、52第2空、81、88、3.C语言中的除法运算:(1)这个考点同样考查表达式的相关知识。
(2)例如:改错题第七题中要求计算t=1-1/2*2-1/3*3-….-1/m*m这个表达式,在这个题目中第一空有这样的for语句:for(i=2;i<m;i++)y-=1/(i*i);刚才我们将了表达式的范围,现在我们考虑y-=1/(i*i);是否正确?赋值号左边问题不大,我们看看右边1/(i*i),其中i是整数,那么i*i也是整数,在C语言中1除以比它大的数时值为零。
这样和题目的要求就不相符。
(3)记住:1/2的值为零,只有1.0/2或是1.0/2.0的值为0.5。
(4)类似题目:39题第一空也同样是这种错误、57、764.找最大值和排序问题:(1)遇到这种题目在改错题中最容易考查的是大于(>)、小于(<)等符号的变化,当你查找出错的地方没有语法错误,也没有使用了未定义的变量时,记住这个口诀:将大于改为小于,将小于改为大于!(2)类似题目:11题第二空、12题第一空和13题第二空、4题第二空、585.函数的返回值及其参数:重点int fun(int x,int y) main(){ {if(x>y)return x; int a,b,c;else return y; scanf(“%d%d”,&a,&b);} c=fun(a,b);printf(“最大值为:%d”,c);} (1)函数的返回类型:1)在上面的例子中fun函数的返回值是int,如果将int改为double,很明显是错误的。
从两个地方来看,首先return x;中x的类型必须和fun函数中的返回值相同,x是整型。
其次c=fun(a,b);中fun函数将一个返回值赋值给了变量C,说明函数返回的值一定是整型。
2)记住:函数调用、函数的返回值和ruturn中数据类型必须一致!3)类似题目:1.1、3.1、16.1、19.2、34.1、36.1、40.1、48.1、71都死这样的错误,(注1.1表示第一题第一空)。
78、89、90、(2)r eturn后面的表达式及其类型:19.2、30.2、39.2(3)函数传递的参数:int fun(int *x,int *y) main(){ {if(*x>*y)return *x; int a,b,c;else return *y; scanf(“%d%d”,&a,&b);} c=fun(&a,&b);printf(“最大值为:%d”,c);}1)一定注意:传递的是值还是地址。