版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言Part 4 for NOI1. 数组2. 函数问题:有如下几组数据,它们分别该如何存储呢?一个班学生的学习成绩一行文字一个矩阵这些数据的特点是:具有相同的数据类型使用过程中需要保留原始数据 C语言为这些数据,提供了一种构造数据类型:数组。数组是一组具有是一组具有相同数据类型相同数据类型的数据的的数据的有序集合。有序集合。一维数组类型说明符 数组名常量表达式;例如: intint a a1010; ;它表示定义了一个整形数组,数组名为a a,此数组有1010个元素。数组名定名规则和变量名相同,遵循标识符定名规则。在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个
2、数,即数组长度。例如,指定a10,表示a数组有10个元素,注意下标是从0开始的,不存在数组元素a10。C89规定常量表达式中可以包括常量和符号常量,但不能包含变量,即不允许对数组的大小作动态定义,数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:一位数组变长数组(C89C89不允许,C99C99允许)float afloat a0 0; ; / /* * 数组大小为0 0没有意义 * */ /intint b(2)(3); b(2)(3); / /* * 不能使用圆括号 * */ / 下标可以是整型常量,也可以是整型表达式A2+1, a2A2+1, a2* *3, a7
3、/3 3, a7/3 int n; scanf(%d, &n); int arrayn; if(n 0) array0 = 100; printf(array0=%dn, array0); else printf(array length is zero.n);数组的存储 一维数组: floatfloat markmark100;100;一个元素占4个字节 每个数据元素占用的字节数,就是基本类型的字节数 int i, a10; for (i = 0; i 0; i-) printf(%d , ai); printf(n);例7.1:10元素一维数组倒序输出初始化在定义数组时对数组元素赋
4、以初值。例如: :intint a a1010=0=0,1 1,2 2,3 3,4 4,5 5,6 6,7 7,8 8,9;9;将数组元素的初值依次放在一对花括弧内。可以只给一部分元素赋值。例如: :intint a a1010=0=0,1 1,2 2,3 3,4;4; 定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。如果想使一个数组中全部元素值为0 0,可以写成intint a a1010=0=0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0; 0; 或 intint a a1010=0;=0;不能写成:intint a
5、 a1010=0=0* *10;10;这是与FORTRAN语言不同的,不能给数组整体赋初值。在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如: :intint a a5 5=1=1,2 2,3 3,4 4,5; 5; 也可以写成 int a=1,2,3,4,5; 在第二种写法中,花括弧中有5个数,系统就会据此自动定义a数组的长度为5。但若数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成 intint a a1010=1=1,2 2,3 3,4 4,5; 5; 只初始化前5个元素,后5个元素为0例7
6、.2 用数组来处理,求解Fibonacci数列 Fibonacci数列公式:已知: : a a1 1=a=a2 2=1, a=1, an n=a=an-1n-1+a+an-2 n-2 即:1,1,2,3,5,8,13:1,1,2,3,5,8,13 int i; int f20=1, 1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i = 0; i 20; i+) if(i%5 = 0) printf(n); printf(%12d, fi); 使用冒泡排序,按升序排序例7.3 假如有n个人,希望按年龄对他们进行排序 例7.3input 10 numbers:1 2 3
7、 6 5 4 7 8 9 11the sorted numbers:1 2 3 4 5 6 7 8 9 11 int a10; int i,j,t; printf(input 10 numbers:n); for(i=0; i10; i+) scanf(%d, &ai); printf(n); for(j=0; j9; j+) for(i=0; i ai+1) t = ai; ai = ai+1; ai+1 = t; printf(the sorted numbers:n); for(i=0; i10; i+) printf(%d , ai); printf(n); 类型说明符 数组名
8、常量表达式常量表达式; 例如:定义a a为3 34(34(3行4 4列) )的数组,b b为5 510(510(5行1010列) )的数组。如下: float afloat a3 34 4,b b5 51010; 不能写成 float afloat a3 3,4 4,b b5 5,1010; ;二维数组 二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素 a34数组存放二维数组在内存中的存放二维数组元素的表示形式为:二维数组元素的表示形式为:数组名下标下标数组名下标下标 例如:例如: a a2 23 3下标可以是整型表达式,下标可以是整型表达式,如如
9、a a2-12-12 2* *2-12-1数组元素可以出现在表达式中,也可以被赋值,例如数组元素可以出现在表达式中,也可以被赋值,例如:b b1 12 2=a=a2 23 3/2/2不要写成不要写成 a a2 2,3 3,a a2-12-1,2 2* *2-12-1形式形式二维数组的引用数据类型 数组名 常量表达式1常量表达式2初始化数据;分行赋初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;写在一个大括号中,按排列顺序赋初值,如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;对部分元素赋初值,如: int a34=1,5,9; 也可以对
10、各行中的某一元素赋初值,如 int a34=1,0,6,0,0,11;也可以只对某几行元素赋初值。如:int a34=1,5,6; 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a4=0,0,3,0,10;二维数组初始化例7.4 将一个二维数组行和列元素互换,存到另一个二维数组中642531a642531b int a32 =
11、1, 2, 3, 4, 5, 6; int b23, i, j; printf(array a:n); for (i=0; i=2; i+) for (j=0; j=1; j+) printf(%5d, aij); bji = aij; printf(n); printf(array b:n); for (i=0; i=1; i+) for(j=0; j=2; j+) printf(%5d, bij); printf(n); int i,j,row=0,colum=0,max; int a34=1,2,3,4, 9,8,7,6, -10,10,-5,2; /此处初始化应该改为输入函数 max=
12、a00; for (i=0; i=2; i+) for (j=0; jmax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn, max, row, colum);例7.5: 有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号 定义方法与前面介绍的类似。例如: char cchar c1010; ; 用来存放字符数据的数组是字符数组。字符数组中的一个元素存放一个字符。字符数组字符数组初始化 对字符数组初始化,最容易理解的方式是逐个字符赋给数组中各元素。如: char c10= I, ,a,m,,h,a
13、,p,p,y; 如果在定义字符数组时不进行初始化,则数组中各元如果在定义字符数组时不进行初始化,则数组中各元 素的值是不可预料的。素的值是不可预料的。 如果花括弧中提供的初值个数如果花括弧中提供的初值个数( (即字符个数即字符个数) )大于数组大于数组长度,则按语法错误处理。长度,则按语法错误处理。 char cchar c1010=c=c, ,pp,rr,oo,gg,rr,aa,m; m; 字符数组的部分初始化 如果初值个数小于数组长度,则只将这些字符赋如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空给数组中前面那些元素,其余的元素自动定为空字符字符( (
14、即即0)0)。例如:。例如: 数字数组初始化时自动确定长度 如果提供的初值个数与预定的数组长度相同,在定义时可如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。以省略数组长度,系统会自动根据初值个数确定数组长度。例如:例如: 也可以定义和初始化一个二维字符数组。例如:也可以定义和初始化一个二维字符数组。例如: char diamondchar diamond5 55 5= = , ,* *, ,* *, ,* *,* *, , , ,* *, ,* *, ,* *, , ,* *char cchar c=I, ,a,m, ,h,=I, ,a,
15、m, ,h,a,p,p,y;a,p,p,y;数组数组c c的长度自动定为的长度自动定为1010。 char c=I, , a, m, , a, , b, o, y, .; int i, len = 0; len = strlen(c); printf(strlen(c)=%dn, len); len = sizeof(c); printf(sizeof(c)=%dn, len); for(i = 0; i len; i+) printf(%c, ci); printf(n);例7.6 输出一个字符串 char diamond5= , , *, , *, , *, *, , , , *, , *
16、, , *, , , *; int i, j; for (i=0; i5; i+) for (j=0; j5; j+) printf(%c, diamondij); printf(n); 例7.7 使用星号模拟一个钻石图形 为了测定字符串的实际长度,C C语言规定了一个语言规定了一个“字符串字符串结束标志结束标志”,以字符,以字符00作为标志。作为标志。如果有一个字符串,前面9个字符都不是空字符(即0) ,而第10个字符是0,则此字符串的有效字符为9个。系统对字系统对字符串常量也自动加一个符串常量也自动加一个00作为结束符。作为结束符。 00代表代表ASCIIASCII码为码为0 0的字符,从
17、的字符,从ASCIIASCII码表中可以查到,码表中可以查到,ASCIIASCII码为码为0 0的字符不是一个可以显示的字符,而是一个的字符不是一个可以显示的字符,而是一个“空操作符空操作符”,即它什么也不干。用它来作为字符串结束,即它什么也不干。用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。别的标志。字符串结束符 /char c=I, , a, m, , a, , b, o, y, ., 0; /如果c不加0, strlen(c)值和sizeof(c)有什么不同 /char c11=I, , a, m, ,
18、a, , b, o, y, .; /char c=I, , a, m, , a, , b, o, y, .; /char c=“I am a boy.”; /相当于加0初始化 /char c20=“I am a boy.”; /11之后使用0填充 char c=I am a boy.; int i, len = 0; len = strlen(c); printf(strlen(c)=%dn, len); len = sizeof(c); printf(sizeof(c)=%dn, len); for(i = 0; i len; i+) printf(%c, ci); printf(“n”);
19、字符串初始化字符数组并不要求它的最后一个字符为0,甚至可以不包含0 。例如:char char c=c=C,h,i,n,aC,h,i,n,a;这样写完全是合法的。但是由于系统对字符串常量自动加一个0 。因此,人们为了使处理方法一致,在字符数组中也常人为地加上一个0 。如: char char c=c=C,h,i,n,aC,h,i,n,a,0;,0;这样做,这样做是为了便于引用字符数组中的字符串。char c=Pascal Program;printf(Please input Hello:n);for (int i=0; i5; i+) char ch = getchar(); ci = ch
20、;printf(%s, c);例7.8从键盘输入Hello覆盖Pascal Pragramchar c=Pascal Program;printf(Please input Hello:n);scanf(%s, c);printf(%s, c);char ch;scanf(%c, &ch);字符串存储(1)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。如:写成下面这样是不对的:printf(%s,c0);(2)如果数组长度大于字符串实际长度,也只输出到遇0结束。(3)输出字符不包括结束符0。如:char c10=China; /* 字符串长度为
21、5,连0共占6个字节 */printf(%s,c);只输出字符串的有效字符“China”,而不是输出10个字符。这就是用字符串结束标志的好处。(4)如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。(5)可以用scanf函数输入一个字符串。例如 scanf(%s,c);scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。例如,定义 char c6;从键盘输入: China系统自动在China后面加一个0结束符。函数printf和scanf printf(Please input 3 words:n); char str15, str25, str
22、35; scanf(%s%s%s, str1, str2, str3); printf(string 1:%s, string 2:%s, string 3:%s, str1, str2, str3);例7.9 从键盘输入三个单词到三个字符串中 printf(Please input a sentence:n); char str20; scanf(%s, str); printf(string:%s, str);例7.10 空格在scanf中的作用输入How are you输出How编译器沿用英语句子的习惯,把空格作为scanf函数的分隔符号str不能写为&str printf(Pl
23、ease input a sentence:n); char str20; scanf(%s, str); printf(address:%o, str);例7.11 使用八进制输出一个字符串的地址%o 有符号八进制整数%i 有符号整数%u 无符号十进制整数%d 有符号十进制整数%s 字符串%x 有符号十六进制整数%a, %e, %f, %g 浮点数%c 字符% 转义% 所期望的字符集函数形式函数形式功能功能gets(字符数组)从终端输入一个字符串到字符数组puts(字符数组)输出一个字符串(0结尾)到终端strcat(字符数组,字符数组)把两个字符串连接起来strcpy(字符数组,字符数组)
24、复制字符串strcmp(字符数组,字符数组)比较两个字符串,相等返回0,大于返回正整数,否则返回负整数strlen(字符数组)返回字符串长度strlwr(字符数组)转换为小写字母strupr(字符数组)转换为大写字母字符串处理函数 char string500; int i, num=0, word=0; char c; gets(string); for (i=0; (c=stringi)!=0; i+) if(c = ) word=0; else if(word = 0) word = 1; num+; printf(“There are %d words in the line.n”,
25、num);例7.12统计一段话的单词数量 char string20; char str320; printf(Please input 3 sentences:n); for (int i=0; i 0) strcpy(string, str0); else strcpy(string,str1); if (strcmp(str2,string) 0) strcpy(string,str2); printf(nthe largest string is:n%sn, string);7.13 找出三个字符串中的最大者Please input 3 sentences:How are you.I
26、am a bad boy.Happy new year.the largest string is:I am a bad boy.1. 数组2. 函数 部件 组装 一个C程序由一个或者多个源程序文件组成 一个源程序文件由一个或者多个程序模块(部件)组成模块化程序设计Function: 实现特定功能的程序模块库函数和用户自定义函数无参函数: 类型名 函数名() 函数体 有参函数: 类型名 函数名(形式参数列表) 函数体 函数定义C89中标准的头文件 定义宏assert() 字符处理 错误报告 定义与实现相关的浮点值勤 定义与实现相关的各种极限值 支持函数setlocale() 数学函数及其各种定
27、义 支持非局部跳转 定义信号值 支持可变长度的变元列表 定义常用常数输入输出函数及其各种定义 动态存储分配函数及其他各种声明 字符串函数及其各种定义 支持系统时间函数C99新增的头文件和库 支持复数算法 给出对浮点状态标记和浮点环境的其他方面的访问 处理最大宽度整数的函数,包含stdint.h 定义标准的、可移植的整型类型集合。 用于定义对应各种运算符的宏 支持布尔数据类型类型。定义宏bool,以便兼容于C+ 定义一般类型的浮点宏 支持多字节和宽字节函数支持多字节和宽字节分类函数 无参函数的调用语句 函数名() 有参函数的调用语句 函数名(实参列表) 函数表达式 函数出现在表达式中,例如:c=
28、max(x,y)*2-100; 函数参数 另外一个函数的参数,例如:printf(“%d”, max(a,b);函数调用#include void print_star();void print_message();int main() print_star(); print_message(); print_star(); return 0;void print_star() printf(*n);void print_message() printf( How are you!n);例8.1 使用无参函数输出* How are you!*#include int main() int ma
29、x(int x, int y); int a, b, c; printf(Please input two number:); scanf(%d, %d, &a, &b); c = max(a, b); printf(The max is %dn, c); return 0;int max(int x, int y) int z; if(x y) z = x; else z = y; return (z);例8.2 输入两个整数,输出最大者。要求在主函数输入两个数,用用户自定义函数max求最大值,并在主函数中输出最大值。int max(int, int); orint max(
30、int a, int b); 针对被调用函数的形参分配内存单元 将实参对应的值传递给形参 执行被调用函数的函数体的语句 通过return语句将函数值带回调用函数 调用结束,释放形参单元函数调用过程 在函数调用之前要求进行被调用函数声明delaration 函数原型便于编译器对函数调用进行合法性检查 合法性检查内容包括函数名、函数值类型、参数个数、参数类型、参数顺序 检查通过标准:一致或者兼容 兼容检查能否进行类型转换 被调用函数在调用位置之前,不用声明 在源文件开头声明是全局性的,就不必在函数开头声明了函数原型function prototype函数原型的一般形式为函数原型的一般形式为(1)(
31、1) 函数类型函数类型 函数名函数名( (参数类型参数类型1 1,参数类型,参数类型2)2);(2)(2) 函数类型函数类型 函数名函数名( (参数类型参数类型1 1,参数名,参数名1 1,参数类型,参数类型2 2,参数名参数名2)2); 参数:通过形式参数和实际参数 返回值:用return语句返回计算结果 全局变量:外部变量函数间传递数据的方法在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。 只有在发生函数调用时,函数中的形参才被分配内存单元。 在调用结束后,形参所占的内存单元也被释放。实参可以是常量、变量或表达式,如: (,); 但要求它们有确定的值。在调用时将实参的值赋给形参。在被定义的函数中,必须指定形参的类型实参与形参的类型应相同或赋值兼容。在语言中,实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。形参和实参return语句将被调用函数中的一个确定值带回主调函数中去如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。如果不需要从被调用函数带回函数值可以不要return语句。 一个函数中可以有一个以上的return语句,执行到哪一个return语
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 粪便处理工核心技能知识考核试卷含答案
- 拍卖服务师岗中实操模拟考核试卷含答案
- 味精原料粉碎工岗位理论考核试卷含答案
- 工业型煤工岗中实践综合技能考核试卷含答案
- 2026年碳捕捉高级研发师招聘笔试试卷 招录11人
- 2026年楼宇智能化高级工程师招聘笔试试卷 招录11人通关秘籍题库
- 2026年云南省大理市高三数学下册期末考试模拟测试卷附答案(完整版)
- 2026届陕西省咸阳市兴平市三年级数学第二学期期中复习检测模拟试题含解析
- 2026届长治市襄垣县四年级数学第二学期期末教学质量检测模拟试题(含答案解析)
- 2026年湖北省枣阳市高三数学下册期末考试模拟检测卷含答案【模拟题】
- 2023年江苏省公考《申论》题(A卷)及参考答案
- 工程造价专业毕业外文文献、中英对照
- 《大学语文》课件22 《归园田居(其二)》
- 公司经营情况简要说明模板
- JGT233-2017 建筑门窗用通风器
- 动物学实验之扇贝解剖
- 康复技能大赛备考试题库汇总(供参考)
- 关于要求XX人寿全额退还被误导保费的投诉信
- GB/T 9724-2007化学试剂pH值测定通则
- GB/T 17738.4-2013射频同轴电缆组件第4部分:半硬同轴电缆组件分规范
- CB/T 749-1997固定钢质百叶窗
评论
0/150
提交评论