




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 构造数据类型第一部分 数组通过本节实验作业应达目标1学习并掌握一维数组与二维数组的定义、使用及初始化方法。2熟练掌握字符数组和字符串的使用方法。3掌握数组的一种排序算法。4学会用数组保存多个相关的同类数据,并对这一组数据进行各类操作。本章必须上交作业第一部分 数组作业要求:程序4_3.c、4_4_2.c、4_5.c、4_7.c、4_8.c上传至7:8080/c。源程序可以.cpp命名。第二部分 结构体作业要求程序4_11.c、4_12.c上传至7:8080/c。源程序可以.cpp命名。实验一一维数组的定义和简单
2、应用【实验目的】学会定义一维数组,掌握一维数组的遍历操作,掌握在一组数组中求最大值、最小值的方法。【实验内容】从键盘读入5个成绩到一个数组中,求其中的最大值,最小值和平均成绩。在屏幕上显示输入成绩的提示信息,用键盘输入一个成绩,接着提示输入下一个,直到结束。以4_1.c命名本程序。程序运行界面【实验提示】求最大(小)值通常用“打擂台”的方法。首先设计两个变量,如max和min分别用来存放最大值和最小值,并将数组的首元素赋给这两个变量,这就是到目前为止的最大(小)值,然后利用循环依次比较其他的元素,总是将当前最大(小)值赋给max和min,直至比较到最后,max和min中的数据就是最大值和最小值
3、。求平均值还要设置一个变量sum,用来累加各元素的值。实验二一维数组的排序【实验目的】熟练掌握一维数组三种基本排序方法:选择法,冒泡法,比较法。【实验内容】从键盘上接收10个成绩,存放到一个一维数组score中,分别利用三种排序方法,将数组从小到大排序并在屏幕上显示排序结果。分别以4_2_1.c、4_2_2.c和4_2_3.c命名三个程序。【实验提示】所谓排序是指把一组杂乱无章的数据按照大小顺序排列。将被排序的n个数据存放在一个数组中, 假如按升序排列。我们将数组定义为an,数据存放在a0 到 an-1 中。1比较排序法将a0与a1比较,若a1<a0,则a0与a1交换,否则不变,再将a0
4、与a2比较,同样小者交换到a0,如此比较下去至到a0与an1比较,小者放到a0中,第一轮比较n-1次,a0中的值就是n个数中最小者。然后a1再与a2比较,方法同上,小者交换到a1,第二轮比较n-2次,这样a1也就确定了,第三轮a2与其后面的数比较,共比较n-1轮以后,数组中各元素的值就按升序排列好。2选择排序法选择排序法就是对比较法的改进。它的算法思想是:仍然是ai与其后的aj进行比较,但是当比较出aj小于ai时,先不急于交换(因为aj并不一定是这一轮中最小的,可能还有更小的),用一个变量p记下j的下标(即第几个数),继续比较下去,将最小数的下标j存放在p中,一轮比较完毕,ap便是最小的,这样
5、只要ai与aj交换即可。一轮只交换一次,大大提高了程序的效率. 其中,一维数组既是数据的存放位置,也是交换的场所,这样可以很好的利用数据的内存空间。3冒泡排序法将要排序的数放在某一个数组中,如a0an1,然后比较数组相邻两元素的值,即a0与a1比较,假如按升序排列,且a0>a1,则二者交换,否则不变,a1再与a2比较,前者大就交换,依次两两比较至到an-2与an-1比较,经过一轮以后,最大者“沉”到了最后,小数往上“冒”,所以得名“冒泡法”。第二轮比较数组的前n-1个,即a0an-2 。重复此过程,直到所有的元素比较完毕。实验三一维数组元素的调换【实验目的】进一步加强对数组的应用。【实验
6、内容】找出数组中的最小数和次小数,并把最小数和a0中的数对调、次小数和a1中的数对调,其余数据位置不变。例如,程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。以4_3.c命名本程序并上交,部分程序如下。#define N 10 void main() int aN,i;for(i=0;i<N;i+)scanf("%d",_ ); /* 编写程序,实现功能 */for(i=0;i<N;i+)printf("%d ",ai);printf("n");【实验提示】本题
7、既可以套用选择法排序,只排序两轮。也可以两次求最值再互换。实验四一维数组的查找【实验目的】掌握数组的基本查找方法:顺序法和折半查找法。【实验提示】查找是计算机中经常要遇到的一种操作,其含义是在一组数据中查找到所查数据的位置。比较简单的是顺序查找法,效率较高的是折半查找法。1顺序查找法顺序查找也叫线性查找,当一组数据无序时,一般采用顺序查找。其基本思想是:从数据集的第一个元素开始,依次将关键字x与数据集中的每一个元素进行比较,直到找到要找的数据。或者数据集遍历完毕,没有找到匹配元素。2折半查找法若是已经排好序的数据,最好采用折半查找法。折半查找法的基本思想是:首先取第一个元素alow和最后一个元
8、素ahigh中间的那个元素amid与x比较(其中mid=(low+high)/2 ),如果amid=x则正好找到,否则要看x比a mid大还是小,因假设数组已按降序排好,则当x>amid时,则要查找的x在数组的前半部分,这样数组的后半部分就不用去查找了,查找范围缩小为一半。然后在前半部分再找一个中点,与x比较,如此一半一半缩小,如果x在数组当中,终能找到x=amid。由于每次缩小近一半的范围,所以数组的上、下界是要变化的,不妨用变量low、high、mid分别表示数组当前的上界、下界和中点。问题:如果x不在数组当中,最终怎样知道?【实验内容】在一个已经排好序的数组(升序)中,从键盘上输入
9、某数x,查找x是否在数组内,若在,则在屏幕上输出其下标值。若不存在,则在屏幕上显示“Not found!”。假设数组a10 的每个元素分别为1,2,3,4,6,7,9,10,11,15,若从键盘上读入数x为9,则在屏幕上输出“the numbers position is 7”,若读入数为8,则屏幕上输出“Not found!”。 1. 顺序查找法编写的程序如下,请完善程序,并以4_4_1.c命名本程序。# include<stdio.h>#define N 10void main( )int aN=1,2,3,4,6,7,9,10,11,15; int i,x; scanf(&q
10、uot;%d", &x); for(i=0;i<N;i+) if ( _ )printf("the number's position is %dn",i+1); _ ; if(i=N) printf("Not found!n");2. 折半查找法编写的程序如下,请完善程序,并以4_4_2.c命名本程序并上交。#include<stdio.h>#define N 10void main( )int aN=1,2,3,4,6,7,9,10,11,15; int low, high, mid, i, x; scan
11、f("%d", &x ); for(low=0,high=N-1; ) mid =_ ; if(amid=x) printf("the number's position is %dn",mid+1); break; if( _ ) printf("Not foundn"); _ ; if (amid< x ) low=mid+1; if (amid> x ) _ ;【讨论与思考】比较一下两种两种查找方法的优缺点。实验五二维数组使用【实验目的】掌握二维数组的使用方法。【实验内容】一个小组五位同学,选修了相同
12、的4门功课。请输入每位同学的成绩,计算每位同学的总分,找出总分最高的同学是第几号同学,最后按总分对二维数组排序,并输出排序后的每位学生信息。以4_5.cpp或4_5.c命名本程序并上交。每位同学的信息如下表:学号S1S2S3S4total100145687891100265788488100392866878100466747381100590706567示例的输入输出窗口如下:【实验提示】定义的二维数组需要保存学号与总分信息。学号可以初始化的方式记录在第0列中。本题涉及到求最大值与排序操作。注意,排序交换数据时需要一整行都交换。实验六统计指定字符个数【实验目的】熟悉字符串的存取和结束标记。【
13、实验内容】编写程序从键盘上输入一个字符串和一个字符,统计所指定字符的个数。例如:从键盘输入字符串为"abaaAAbcaaaca",指定字符为'a',则在屏幕上输出结果是7。以4_6.c命名本程序。下面给出程序的部分代码。#include <stdio.h>void main( )char a200, b; int num; puts("Please input a string:"); gets(a); puts("Please enter a character:"); b=getchar( ); /*
14、编写程序,实现功能 */ pirntf(“The result is %dn”, num);实验七从字符串中删字符【实验目的】熟悉字符串的存取和结束标记。并掌握从一维数组中删除元素的方法。【实验内容】编写程序从键盘上输入一个字符串和一个字符,实现从字符串中删除该字符。例如:从键盘输入字符串为"abaaAAbcaaaca",要删除的字符为'a',则在屏幕上输出"bAAbcc"。下面给出程序的部分代码。请完善程序,并以4_7.c命名本程序并上交。void main( )char s20, ch;int i,j; printf("Pl
15、ease input a string:n"); gets(s); printf("Please input a character:n"); ch=getchar(); for( i=0; _; i+ ) /* 编写程序,实现功能 */ puts(s);【实验提示】要考虑被删除的字符在字符串出现多次,而且连续排列的情况。实验八数据加密【实验目的】学习通过字符数据的ASCII值进行加密的方法。【实验内容】某个单位要传递机密数据,数据是一组的整数数字(从键盘输入,长度不大于30个字符)。在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用该和除以10的余数代
16、替该数字。在屏幕上显示加密后的数字。以4_8.c命名本程序并上交。例如:输入数据 327895123,显示结果为 : 872340678。【实验提示】1应用字符数组来解决该问题。2主程序中将各位数字以字符的形式存放,在加密的过程中应该注意0跟 0 的区别。实验九将数字字符串转换为相应实数【实验目的】学习数字字符串与数值之间的转换问题。【实验内容】将键盘上输入的一个数字字符串转换为相应的实数,在屏幕上输出。转换时遇到第一个非数字字符时停止(不包含第一个小数点和起始的负号-)。例如:若输入字符串“123a45”,得到实数 x=123.0;若输入字符串“-123.45.765”,得到实数x=-123
17、.45;若输入字符串“123-56.78”,得到实数 x=123.0;若输入字符串“-.123”,得到实数 x=-0.123。下面给出不考虑负数的程序,请在下述程序的基础上补充完善为也能考虑负数的程序,并以4_9.c命名本程序。#include<stdio.h>void main()char str100; int i,sign;double x,k; gets(str); /* str中存放的是一个数字字符串 */ sign=1;k=0.1; /* sign是一个标志,标识是否出现了第一个小数点 */ x=0; for(i=0;stri;i+)if(sign=1)if(stri&
18、gt;='0'&&stri<='9') x=x*10+(stri-48);else if(stri='.') sign=0; else break; else if(stri>='0'&&stri<='9') x+=(stri-48)*k; k*=0.1; else break; printf("x=%lfn",x); /* x中记录的是转换后得到的数值 */【实验提示】只有起始的负号-才能作为负数标志,中间的-只能被看做非法字符,使转换结束。实
19、验十万年历问题【实验目的】学会使用二维数组解决万年历问题。【实验内容】已知1900年12月31号是星期一,编写程序,键盘输入1901 2300年内任意一个日期,程序输出这一天是星期几。以4_10.c命名本程序。【实验提示】1第四章中有一个实验要求是给出当前日期,求出该日期是本年度中的第几天的程序。大家可以回想以下那个程序中的case语句对应的每一个天数是如何得到的,我们将这个问题用数组来解决。2假设我们要求x 年y 月 z日是星期几,必须知道两个日期相间隔的天数。3使用二维数组来存放每月的天数,第一行存放平年的每月天数;第二行存放闰年的各月天数。3普通年份有365天,365%7=1;所以求总天
20、数时可以不必将年份差×365天。【讨论与思考】既然是万年历问题,就应能测任一日期。如果要求能够测任何一日期(1900年之前和之后的任何一天)为周几,本题应如何处理?注意前推和后推的方法有所不同。第二部分 结构体通过本章实验作业应达目标1掌握结构类型变量与数组的定义和使用。2掌握使用结构变量名访问结构成员的方法。实验一 结构体类型的定义【实验目的】理解并掌握结构体类型的概念和定义方法,测试这几种自定义类型变量所占内存空间的字节数,掌握各类变量的定义和引用。【实验内容】定义一个结构体类型,其成员包括:学号、姓名、性别(char型)、年龄、高数、计算机、物理、英语、总分、平均分。同时定义一
21、个该类型的变量,保存一个学生信息:203212022 李明 f21 87 96 92 85 。计算并保存该学生的总分与平均分。请以4_11.c命名本程序并上交。实验二 结构体数组的管理程序(综合类)【实验目的】掌握使用结构体数组组织与管理数据的方法。【实验内容】以本章“实验一 结构体类型的定义”中的结构体类型定义一个结构体数组,编写程序实现以下功能:1从键盘输入表4-1中数据给数组。表4-1 用以创建结构体数组的原始数据学号姓名性别年龄高数计算机物理英语总分平均分1001Jackm23345678121002Samf56676587541003Marryf45546867561004David
22、m78345698442计算每个同学的总分和平均分,并在对应的结构体中填上数据。3根据每位学生的总分降序排列。4输出数组中的数据,每位同学一行。请以4_12.c命名本程序并上交。【实验提示】结构体类型在函数外定义,结构体数组在main()中定义。三个函数都是对main()中定义的数组进行操作,因而函数的参数必须是指向结构体类型的指针,使用指针访问一维数组。如果还未学习函数与指针,可以在main()中实现所有的功能。功能段请加注释信息。【讨论与思考】扩充编写排序程序,能按任意字段排序。(怎样根据用户的键盘输入决定排序关键字?)如果我们需要对表中的数据进行增删应怎样操作?体会使用数组组织数据的局限
23、(增删不易,容量不能实现动态指定)。第一部分 数组习题1. 定义如下变量和数组 :int k ;int a33= 1, 2, 3, 4, 5, 6, 7, 8, 9 ;则下面语句的输出结果是( )for(k=0;k<3;k+) printf(%d,ak2-k);A、357B、369 C、 159D、 1472. 执行下面的程序段后,变量k中的值为()int k=3,s2;s0=k;k=s1*10;A、不定值B、33C、30D、103. 设有数组定义:char array ="China"; 则数组 array所占的空间为( )A、4个字节 B、5个字节 C、6个字节D
24、、7个字节4. 如下程序的输出结果是( )void main( ) int n5=0,0,0,i,k=2;for(i=0;i<k;i+)ni=ni+1;printf("%dn",nk);A、不确定的值B、2C、1D、05. 有如下程序void main( ) int a33=1,2,3,4,5,6,i,j,s=0;for(i=1;i<3;i+)for(j=0;j<=i;j+)s+=aij;printf("%dn",s);该程序的输出结果是()A、18B、19C、20D、216. 以下程序的输出结果是()void main( ) inti
25、,x33=1,2,3,4,5,6,7,8,9;for(i=0;i<3;i+)printf("%d,",xi2-i);A、1,5,9,B、1,4,7,C、3,5,7,D、3,6,9,7. 当执行下面的程序时,如果输入ABC,则输出结果是()#include "stdio.h"#include "string.h"void main( ) char ss10="1,2,3,4,5"gets(ss);strcat(ss,"6789");printf("%sn",ss);A、A
26、BC6789B、ABC67C、12345ABC6D、ABC4567898以下程序段的输出结果是( )char s = "141141abct"printf("%dn",strlen(s);A、9B、12C、13D、149. 下面是对s的初始化,其中不正确的是( )A、char s5=“abc” ;B、char s5=a,b,c;C、char s5=“”; D、char s5=”abcde”10. 以下程序的输出结果是_void main( )char s ="abcdef" s3= '0'printf("%s
27、n",s);11. 下列程序段的输出结果是_void main( ) char b="Hello,you"b5=0;printf("%s n", b );12. 在C语言中,二维数组元素在内存中的存放顺序是_13. 设有定义语句 “ int a34=1,2,3 ” ,则a11值为_,a21的值为_ 14. 若在程序中用到 “ putchar() ” 函数时,应在程序开头写上包含命令_ ,若在程序中用到 “ strlen() ” 函数时,应在程序开头写上包含命令_15. 下面程序的功能是输出数组s中最大元素的下标,请填空。 void main()
28、 int k,p; int s=1,-9,7,2,-10,3; for(p=0,k=p;p<6;p+) if (sp>sk) _ ; printf("%dn",k); 16. 以下程序执行时输入Language Programming<CR>的结果是_ #include <stdio.h> void main() char str30; scanf("%s",str); printf("str=%sn",str); 17. 以下程序可把输入的十进制长整型数以十六进制数的形式输出,请填空。 void
29、main() char b17="0123456789ABCDEF" int c64,d,i=0,base=16; long n; printf("Enter a number:n"); scanf("%1d",&n); doci= _;i+;n=n/base;while(n!=0); printf("Transmite new base:n"); for (-i;i>=0;-i)d=ci;printf("%c",b _ ; 18. 以下数组定义中,错误的是( )A、 int a=
30、1,2,3;B、 int a5=1,2,3;C、 int a3=1,2,3,4;D、 int a5,b;19以下数组定义中,正确的是( )A、 int n=4,an=1,2,3,4; B、 int a2=1,2,3,4;C、 int a2=1,2,3,4;D、 int a=1,2,3,4;20.设有如下定义:int a810;在C中一个整数占用4字节,设a的起始地址为1000,则a11的地址是( )A、 1000B、 1004C、 1036 D、 104421. 有数组定义:int a 3=1,2,3,4,5,6,7,8,9,则a12的值是( )A、 2B、 5C、 6D、 822.设已定义 char str6='a','b&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职场高效时间管理方法大全
- 工厂车间环境安全管理要点
- 眼科诊所市场推广活动策划
- 企业安全培训资料及竞赛题库
- 现代小说叙述视角分析教程
- 企业人力资源调研分析报告
- 小说环境描写提升训练全集
- 企业ISO9001质量体系认证流程
- 旅游电子商务在线作业范例
- 单位人事档案管理流程制度
- 宅基无偿转赠协议书
- GB/T 1040.1-2025塑料拉伸性能的测定第1部分:总则
- 学校食堂食品安全风险管控清单
- DB54/T 0316-2024藏香生产技术规程
- 车间8s管理制度培训
- 电力行业职业健康卫生管理制度
- 新22J01 工程做法图集
- 口腔诊所医患沟通与纠纷处理预案
- 奋斗青春勇担历史使命
- 《数据中心铅酸蓄电池应用技术规程》
- 钩针课件教学课件
评论
0/150
提交评论