版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、输入一个正整数n (1n50),再输入n个整数,用选择法将它们从小到大排序后输出。,习题讲解 7.2,a0 a1 a2 a3 a4 a5 a6 a7 an-2 an-1,/比较法对n个数排序 for (i= 0; i n-1; i+) for (k = i+ 1; i n; k+) if (ak ai) temp = ai;ai = ak;ak = temp; ,/核心程序段:选择法对n个数排序 for (i = 0; i n-1; i+) index = i; for (k = i + 1; k n; k+) if (ak aindex) index = k; temp = aindex;
2、aindex = ai; ai = temp; ,/选择法对数组的排序的完整程序 #include int main(void) int i, index, k, n, temp; int a50; /定义1个数组a,它有50个整型元素 printf(Enter n: ); /* 提示输入n */ scanf(%d, ,/* 选择法对n个数排序 */ for(i = 0; i n-1; i+) index = i; for (k = i+ 1; k n; k+) if(ai aindex) index = k; temp = aindex; aindex = ai; ai = temp; ,p
3、rintf(After sorted: , n); /* 输出n个数组元素的值 */ for (i = 0; i n; i+) printf(%d , ai); printf(n); return 0; ,P153 练习7.9 折半查找法 ( 只适用于有序数列 )。,习题讲解 7.9,a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 1 3 6 7 9 12 23 34 35 39 41,num=35,left=0 middle=(left+right)/2 right=10,什么是折半查找法?,amiddle=num?,left=middle+1, right不变,left
4、不变, right=middle-1,yes,no,amiddlenum?,找到,yes,no,num=3,假设没有要查找的这个数?,1, 对给定的数组a和要找的数num,首尾下标first和last用纪录; 2,如果 last = first 6, 如果xmiddlenum,则只需要找middle右边的数组,即再查找下标middle+1last区间的数,将first=middle+1, goto 2).,解题思路:,void main(int argc, char* argv) int a11=1,3,6,7,9,12,23,34,35,39,41, num=35; int first=0,
5、 last=9, middle; while (1) if (last=first /打印中间结果 ,第七章 数组二维数组和字符数组,教 学 目 标,二维数组的元素在内存中按什么方式存放? 什么是字符串? 字符串结束符的作用是什么? 如何实现字符串的存储和操作,包括字符串的输入和输出?,先看一个例子: 某校近三年招收各专业毕业生情况如下:,计算机 电子 管理 数学 1999 90 40 80 30 2000 100 50 90 40 2001 95 45 100 50,怎样组织这些数据?, 按从左到右从上到下的顺序存入一个一维数 组中。(查询困难), 每年用一个一维数组,把这些数据分别存入 三
6、个数组中。 (增加一年数据困难),(3)用二维数组 int a34;,1.定义: 类型说明符 变量名常量表达式常量表达式 例如:float a34; a00 a03 a10 a13 a20 a23,7.2 二维数组的定义和引用,二维数组在内存中是按行的顺序存放的,即先存放第一行的元素,再存放第二行的元素。,存储形式:,2.引用 数组名下标下标 程序中引用的是数组中一个元素,必须用下标来指定。 float a44 ; a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a31 a32 a33,注意:数组的定义和引用的区别,int i, a101
7、0; for (i=0;i10;i+) for (j=0;j10;j+) int aij=i*j; x,int a44 ; a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a31 a32 a33,void main() int a44; int i,j,sum=0; for (i=0;i4;i+) for (j=0;j4;j+) scanf(%d, ,scanf(%d,有区别吗?,例:求数组a44各元素之和。,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23 a30 a31 a32 a33,注
8、意:循环变化的节奏最好与数组的存储形式一致。即下标变化最快的一维用最内一层循环控制,最慢的一维用最外一层循环控制。,for ( i=0;i2;i+) for (j=0;j3;j+) for (k=0;k4;k+) aijk=0;,三维数组的定义与二维数组相同。 如:float a234; 234共有24个元素 float a100100100 ; 有1000000个元素,a010,a000,a999999,k,i,j,i j k,a0099,a0199,a0990,多维数组的空间想象 一维数组: 一列长表或一个向量 二维数组: 一个表格或一个平面矩阵 三维数组: 三维空间的一个方阵 多维数组:
9、 多维空间的一个数据列阵,3. 二维数组的初始化,这里主要介绍定义时初始化,其它方法初始化和一维数组类似。定义时初始化有两种方法:,分行初始化,例如: int a23=1 , 2 , 3 , 4 , 5 , 6 ;,省略掉内层的花括号 即按数组元素在内存中排列的顺序赋初值。,例如: int a23=1 , 2 , 3 , 4 , 5 , 6 ;,二维数组的定义和引用 第七讲 二维数组和字符数组,说明:, 在对二维数组初始化时,也可以只对部分数组元素初始化,未被初始化的数组元素将自动赋 0 。,在对二维数组初始化时,如果对全部元素都赋初值,或分行赋初值(每行至少一个数据),则可以省略第一维数组长
10、度。但是,第二维数组长度不允许省略。,int a10=1,0; float f2=1.1,2.2;,int a23=5,6,7,8; int a23=5,6,7,8;,1.用scanf语句由用户输入 for (i=1;i=3;i+) for (j=1;j=4;j+) scanf(%d, 2.由循环变量自动构成 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,for (i=0;i4;i+) for (j=0;j4;j+) aij = 4*i+j+1;,计算公式,在程序中为数组赋值的方法:,例7.4 将一个二维数组行和列元素互换,存到另一数组中 。 1 4 a= 1
11、2 3 b= 2 5 4 5 6 3 6,4. 二维数组程序举例,a00 a01 a02 a10 a11 a12,b00 b01 b10 b11 b20 b21,for (i=0;i2;i+) for (j=0;j3;j+) bji=aij;,观察数组a 和 b 行列下标的变化情况:,例7.5 求出3*4矩阵中的最大值及下标。 解题思路: 1.设一个变量存放最大值max; 2 设两个变量存放最大值在数组中的行i和列j; 3.遍历数组中的每一个元素,记录最大值及下标。,void main() int i,j,row,column,max; int a34=7,9,3,4,8,6,2,5,1,11
12、,12,10 ; max=a00; for (i=0;imax) max=aij; row=i; column=j; printf(“最大元素是%d,位于第%d行,第%d列n”, max,row,column); ,一 二 三 四 五 六 七 大卡车 1600 2300 4000 7500 2400 2400 3200 小卡车 7500 6300 7200 5900 5900 6000 5500 小汽车 3000 2900 3100 2700 2700 3500 400,例: 车队各车型一星期行程表及如耗油情况如下,计算车队一星期的油费。,油费=路程*单位油价,大卡车15元/公里 小卡车10元
13、/公里 小汽车08元/公里,组织数据 : float a37; float dis3,price3;,dis0= a00+a01+a02+ +a06; dis1= a10+a11+a12+ +a16; dis2= a20+a21+a22+ +a26;,total=0; for (i=0;i3;i+) total+=disi*pricei;,total = dis0*price0 +dis1*price1 +dis2*price2;,for (i=0;i3;i+) for (j=0;j7;j+) disi=disi+aij;,void main() int dis7=0,0,0,0,0,0,0;
14、 float price3=1.5,1.0,0.8; int a37=1600,2300,4000,7500,2400,2400,3200, 7500,6300,7200,5900,5900,6000,5500, 3000,2900,3100,2700,2700,3500,4000; int i,j,total=0; for (i=0;i3;i+) for ( j=0;j7;j+) disi=disi+aij; total=total+disi*pricei; printf(本周总消耗为%d,total); ,【完善程序】下列程序的功能是显示如下图形:,1 0 0 0 0 2 1 0 0 0
15、3 2 1 0 0 4 3 2 1 0 5 4 3 2 1,main() int a55,i,j; for (i=0;i5;i+) for (j=0;j5;j+) if ( 【6】 ) aij=0; else aij=【7】; printf(%3d,aij); printf(n); ,a55分析: a00 a01 a02 a03 a04 a10 a11 a12 a13 a14 a20 a21 a22 a23 a24 a30 a31 a32 a33 a34 a40 a41 a42 a43 a44,答案:【6】ij 【7】i+1-j,用随机数模拟导弹打靶落点分布。设导弹落在50*50的矩形区内,发
16、20枚导弹,每枚导弹的落点各不相同,请用显示落点。,分析: ,定义数组m5050,若m49=1,则表示该 单元落有导弹,反之则无,初值全为; ,用随机函数产生下标i,j,i,j=rand()*49/32767.0 , 其中i,j: 049; 3, 若mij为,则mij=1,并计数count+; 4,若count=20则发射结束; ,按行列打印数组m5050,若mij为0,打印 ,若mij为1,打印*。,50*50: num=50; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *,i=1/32767.0*rand()*(
17、num-1);,j=1/32767.0*rand() *(num-1);,#include #include void main(int argc, char* argv) int num,m5050,i=0,j=0,count=0,missile; num=50; /调整数组空间 missile=20; /发射枚数 for (i=0;inum;i+) /数组赋初值 for (j=0;jnum;j+) mij=0; ,srand(time(NULL);/设置随机数种子 while (count=missile) /产生导弹落点的坐标i,j i=(num-1)/32767.0*rand(); j
18、=(num-1)/32767.0*rand(); if ( mij=0 ) mij=1; count+; ,for (i=0;inum;i+) /打印落点分布 for (j=0;jnum;j+) if (mij=1) printf(*); else printf( ); printf(n); ,注意避免: 整数/整数,7.3 字符数组,1.字符数组的定义 char c4; c0=c;c1=h;c2=a;c3=r; 字符数组和整型数组可以通用 int c4; 2.字符数组的初始化 char c4=c, h, a,r; 或char c=c, h, a, r; 当给出的数据多于数组维数时,语法错误;
19、 小于时,赋给前面的元素,其余的补0(空字符) 例如: char c10=c, h, a, r; c h a r 0 0 0 0 0 0,3.字符数组的引用 void main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for (i=0;i10;i+) printf(%c,ci); printf(n); ,4.字符串和字符串结束标志 在C语言中将字符串作为字符数组来处理; 有效长度以0为结束标志; 以字符串形式给数组赋值时,末尾自动加0; 系统在对字符数组操作时,如输出时,自动判断0 。 char c=char; c1 c h a r 0 c2 c h a
20、r,printf(%s,c1); char printf(%s,c2); char +乱码,char c15=c, h, a, r, 0; char c24=c, h, a, r;,5.字符串数组的输入输出 (1)逐个输入输出,用格式符”%c”。 (2)整串输入输出,用格式符“%s”。 char c10 = China; 输出中不显示0; %s格式不带下标,%c带下标; printf(“%c”,c3); printf(“%s”,c); 以字符串输出时以第一个0为终止符。,for (int i=0;i10;i+) printf(%c,ci);,注意:,printf(%s,c);,China,整串
21、输入的情况 用scanf函数,系统自动在末尾加0 scanf(%s,c); 同时输入多个字符串,输入数据时以空格为分隔符 char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); 当输入项是数组名时,不需要加地址符号。 char str13; scanf(%s,str);,C h i n a 0,6.字符串处理函数 函数是一个提供某种功能的程序段,可以通过名字调用,需要参数,返回结果。 (1) 输出字符串 使用形式:puts(字符数组) 功能:在显示器上输出字符数组中的字符串。 例如: char str=ChinanBiejing; puts(
22、str); 结果是:,China Beijing,使用形式: gets(字符数组) 功能: 从键盘接受一个字符串到数组中。 例如: char str20; gets(str); 输入为How are you? 则str中存有整个字符串及0,scanf(%s,str);,?,(2) 输入字符串,H o w a r e y o u ? 0,How0,课堂练习 1. 已知char a20,b20; 正确的输出语句是()。 A、puts(a,b); B、printf(%s%s,a ,b ); C、putchar(a,b); D、puts(a);puts(b); 2. 程序段运行的结果是()。 char
23、 c5=a, b, 0, c, 0; printf(%s,c); A、a b B、ab C、ab c D、以上答案均不对,D B,(3) 字符串连接 strcat()函数,功能:连接两个字符串,把字符串2连接到字符 串1的后面,连接后的字符串放在字符 数组1中。,说明:字符数组1必须足够大以便能够容纳字符串2。 连接时只在新串最后保留一个0。,STRing CATenate,char a20=NOKIA,b5=3310; strcat(a,b); printf(%s,a);,#include ,例如:,使用形式:strcpy(字符数组,字符串2); 功能:将字符串2拷贝到字符数组中,相当于赋值
24、语句。 例如: char str110,str2=China; strcpy(str1,str2); 字符数组1必须是写成数组名,字符数组2可以是数组名也可以是一个字符串。 又如:strcpy(str1, china);,字符串copy函数,不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。但可以给一个字符变量或字符数组元素赋值。 如下面的赋值是不合法的: char str1=“China”,str220; str2=str1;() 下面的赋值是合法的: char a5,c1,c2; c1=A; c2=B; a0=C;a1=h,a2=i;a3=n;a4=a (),使用格式:strc
25、mp(字符串1,字符串2) 功能:比较两个字符串的大小,ASCII值大的为大。 返回值 注意:两个字符串不能用关系运算符比较: if (str1=str2) printf(”yes”); () if (strcmp(str1,str2)=0) printf(“yes”); (),零 两个串相等 正数 str1str2 负数 str1str2,char s18,s28; int v; v=strcmp(s1,s2);,(5) 字符串的比较函数,if ( flagi-1=0 ,7. 字符数组应用举例,例题7.8 统计字符串中的单词数。,I am a boy 001011001000111,flag
26、i:,stringi:,#include void main() char string81,c; int i,word=0,flag81=0,n; gets(string); for (i=0; stringi != 0; i+) if (stringi = ) flagi=0; else flagi=1; n=strlen(string); if (flag0 = 1 ) word+; for (i=1; in; i+) if (flagi-1 = 0 ,/串的结束标记0,例题7.8 解法二,void main() char string81,c; int i,word=0,flag=0; gets(string); for (i=0; stringi != 0; i+) /串的结束标记0 if (stringi = ) flag=0; /过滤空格 else if (flag = 0) / flag记录了 stringi-1的内容 /flag=0 ,I am a boy 001011001000111,flag:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省成都市温江县2026届初三三诊考试数学试题试卷含解析
- 南安市2026届联盟测试语文试题含解析
- 山东省济宁梁山县联考2026届初三下学期“三诊”模拟考试语文试题含解析
- 山东省聊城市莘县市级名校2025-2026学年初三下学期中考适应性月考(八)英语试题含解析
- 天津市大港区第六中学2026年初三下学期教学质量监测(一模)物理试题含解析
- 辽宁省抚顺本溪铁岭辽阳葫芦岛市重点中学2026年初三下学期期末英语试题试卷含解析
- (正式版)DB37∕T 1627-2010 《植株全氮的测定 凯氏定氮法》
- 细节管理在神经内科一病区的应用
- DB35-T 2304-2026互花米草除治滩涂生态修复及监测评估技术规程
- GB 29742-2026 镁及镁合金冶炼安全规范
- 知道网课《劳动教育(西安理工大学)》课后章节测试答案
- 医疗耗材销售培训课件
- 2025中国农业科学院棉花研究所第二批招聘7人备考考试题库附答案解析
- 人教版八年级物理上册 第六章《质量与密度》单元测试卷(含答案)
- 网络舆情培训课件
- 北航大航空航天概论课件第7章 空间技术与空间科学
- HACCP体系知识培训课件
- 2025年中青班笔试题目及答案
- 学校管理特色工作汇报
- 《婚姻家庭继承法(第八版)》课件全套 房绍坤
- 第8课 动物的耳朵 课件 青岛版六三制一年级科学下册
评论
0/150
提交评论