第4章数组上机作业汇总.docx

上传人:b****6 文档编号:8486873 上传时间:2023-01-31 格式:DOCX 页数:17 大小:43.17KB
下载 相关 举报
第4章数组上机作业汇总.docx_第1页
第1页 / 共17页
第4章数组上机作业汇总.docx_第2页
第2页 / 共17页
第4章数组上机作业汇总.docx_第3页
第3页 / 共17页
第4章数组上机作业汇总.docx_第4页
第4页 / 共17页
第4章数组上机作业汇总.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第4章数组上机作业汇总.docx

《第4章数组上机作业汇总.docx》由会员分享,可在线阅读,更多相关《第4章数组上机作业汇总.docx(17页珍藏版)》请在冰豆网上搜索。

第4章数组上机作业汇总.docx

第4章数组上机作业汇总

第4章构造数据类型

第一部分数组

通过本节实验作业应达目标

1.学习并掌握一维数组与二维数组的定义、使用及初始化方法。

2.熟练掌握字符数组和字符串的使用方法。

3.掌握数组的一种排序算法。

4.学会用数组保存多个相关的同类数据,并对这一组数据进行各类操作。

本章必须上交作业

第一部分数组作业要求:

程序4_3.c、4_4_2.c、4_5.c、4_7.c、4_8.c上传至http:

//121.251.227.27:

8080/c。

源程序可以.cpp命名。

第二部分结构体作业要求

程序4_11.c、4_12.c上传至http:

//121.251.227.27:

8080/c。

源程序可以.cpp命名。

实验一一维数组的定义和简单应用

【实验目的】

学会定义一维数组,掌握一维数组的遍历操作,掌握在一组数组中求最大值、最小值的方法。

【实验内容】

从键盘读入5个成绩到一个数组中,求其中的最大值,最小值和平均成绩。

在屏幕上显示输入成绩的提示信息,用键盘输入一个成绩,接着提示输入下一个,直到结束。

以4_1.c命名本程序。

程序运行界面

【实验提示】

求最大(小)值通常用“打擂台”的方法。

首先设计两个变量,如max和min分别用来存放最大值和最小值,并将数组的首元素赋给这两个变量,这就是到目前为止的最大(小)值,然后利用循环依次比较其他的元素,总是将当前最大(小)值赋给max和min,直至比较到最后,max和min中的数据就是最大值和最小值。

求平均值还要设置一个变量sum,用来累加各元素的值。

实验二一维数组的排序

【实验目的】

熟练掌握一维数组三种基本排序方法:

选择法,冒泡法,比较法。

【实验内容】

从键盘上接收10个成绩,存放到一个一维数组score中,分别利用三种排序方法,将数组从小到大排序并在屏幕上显示排序结果。

分别以4_2_1.c、4_2_2.c和4_2_3.c命名三个程序。

【实验提示】

所谓排序是指把一组杂乱无章的数据按照大小顺序排列。

将被排序的n个数据存放在一个数组中,假如按升序排列。

我们将数组定义为a[n],数据存放在a[0]到a[n-1]中。

1.比较排序法

将a[0]与a[1]比较,若a[1]

然后a[1]再与a[2]比较,方法同上,小者交换到a[1],……第二轮比较n-2次,这样a[1]也就确定了,第三轮a[2]与其后面的数比较,……,共比较n-1轮以后,数组中各元素的值就按升序排列好。

2.选择排序法

选择排序法就是对比较法的改进。

它的算法思想是:

仍然是a[i]与其后的a[j]进行比较,但是当比较出a[j]小于a[i]时,先不急于交换(因为a[j]并不一定是这一轮中最小的,可能还有更小的),用一个变量p记下j的下标(即第几个数),继续比较下去,将最小数的下标j存放在p中,一轮比较完毕,a[p]便是最小的,这样只要a[i]与a[j]交换即可。

一轮只交换一次,大大提高了程序的效率.其中,一维数组既是数据的存放位置,也是交换的场所,这样可以很好的利用数据的内存空间。

3.冒泡排序法

将要排序的数放在某一个数组中,如a[0]~a[n-1],然后比较数组相邻两元素的值,即a[0]与a[1]比较,假如按升序排列,且a[0]>a[1],则二者交换,否则不变,a[1]再与a[2]比较,前者大就交换,…,依次两两比较至到a[n-2]与a[n-1]比较,经过一轮以后,最大者“沉”到了最后,小数往上“冒”,所以得名“冒泡法”。

第二轮比较数组的前n-1个,即a[0]~a[n-2]。

重复此过程,直到所有的元素比较完毕。

实验三一维数组元素的调换

【实验目的】

进一步加强对数组的应用。

【实验内容】

找出数组中的最小数和次小数,并把最小数和a[0]中的数对调、次小数和a[1]中的数对调,其余数据位置不变。

例如,程序运行时若输入:

24611397058,则输出:

02611397458。

以4_3.c命名本程序并上交,部分程序如下。

#defineN10

voidmain()

{inta[N],i;

for(i=0;i

scanf("%d",__________);

…………/*编写程序,实现功能*/

for(i=0;i

printf("%d",a[i]);

printf("\n");

}

【实验提示】

本题既可以套用选择法排序,只排序两轮。

也可以两次求最值再互换。

实验四一维数组的查找

【实验目的】

掌握数组的基本查找方法:

顺序法和折半查找法。

【实验提示】

查找是计算机中经常要遇到的一种操作,其含义是在一组数据中查找到所查数据的位置。

比较简单的是顺序查找法,效率较高的是折半查找法。

1.顺序查找法

顺序查找也叫线性查找,当一组数据无序时,一般采用顺序查找。

其基本思想是:

从数据集的第一个元素开始,依次将关键字x与数据集中的每一个元素进行比较,直到找到要找的数据。

或者数据集遍历完毕,没有找到匹配元素。

2.折半查找法

若是已经排好序的数据,最好采用折半查找法。

折半查找法的基本思想是:

首先取第一个元素a[low]和最后一个元素a[high]中间的那个元素a[mid]与x比较(其中mid=(low+high)/2),如果a[mid]==x则正好找到,否则要看x比a[mid]大还是小,因假设数组已按降序排好,则当x>a[mid]时,则要查找的x在数组的前半部分,这样数组的后半部分就不用去查找了,查找范围缩小为一半。

然后在前半部分再找一个中点,与x比较,如此一半一半缩小,如果x在数组当中,终能找到x==a[mid]。

由于每次缩小近一半的范围,所以数组的上、下界是要变化的,不妨用变量low、high、mid分别表示数组当前的上界、下界和中点。

问题:

如果x不在数组当中,最终怎样知道?

【实验内容】

在一个已经排好序的数组(升序)中,从键盘上输入某数x,查找x是否在数组内,若在,则在屏幕上输出其下标值。

若不存在,则在屏幕上显示“Notfound!

”。

假设数组a[10]的每个元素分别为{1,2,3,4,6,7,9,10,11,15},若从键盘上读入数x为9,则在屏幕上输出“thenumber’spositionis7”,若读入数为8,则屏幕上输出“Notfound!

”。

1.顺序查找法编写的程序如下,请完善程序,并以4_4_1.c命名本程序。

#include

#defineN10

voidmain()

{inta[N]={1,2,3,4,6,7,9,10,11,15};

inti,x;

scanf("%d",&x);

for(i=0;i

if(_________)

{printf("thenumber'spositionis%d\n",i+1);

_________;

}

if(i==N)

printf("Notfound!

\n");

}

2.折半查找法编写的程序如下,请完善程序,并以4_4_2.c命名本程序并上交。

#include

#defineN10

voidmain()

{inta[N]={1,2,3,4,6,7,9,10,11,15};

intlow,high,mid,i,x;

scanf("%d",&x);

for(low=0,high=N-1;;)

{mid=_________;

if(a[mid]==x)

{printf("thenumber'spositionis%d\n",mid+1);

break;

}

if(_________){printf("Notfound\n");_________;}

if(a[mid]

if(a[mid]>x)_________;

}

}

【讨论与思考】

比较一下两种两种查找方法的优缺点。

实验五二维数组使用

【实验目的】

掌握二维数组的使用方法。

【实验内容】

一个小组五位同学,选修了相同的4门功课。

请输入每位同学的成绩,计算每位同学的总分,找出总分最高的同学是第几号同学,最后按总分对二维数组排序,并输出排序后的每位学生信息。

以4_5.cpp或4_5.c命名本程序并上交。

每位同学的信息如下表:

学号

S1

S2

S3

S4

total

1001

45

68

78

91

1002

65

78

84

88

1003

92

86

68

78

1004

66

74

73

81

1005

90

70

65

67

示例的输入输出窗口如下:

【实验提示】

定义的二维数组需要保存学号与总分信息。

学号可以初始化的方式记录在第0列中。

本题涉及到求最大值与排序操作。

注意,排序交换数据时需要一整行都交换。

实验六统计指定字符个数

【实验目的】

熟悉字符串的存取和结束标记。

【实验内容】

编写程序从键盘上输入一个字符串和一个字符,统计所指定字符的个数。

例如:

从键盘输入字符串为"abaaAAbcaaaca",指定字符为'a',则在屏幕上输出结果是7。

以4_6.c命名本程序。

下面给出程序的部分代码。

#include

voidmain()

{chara[200],b;

intnum;

puts("Pleaseinputastring:

");

gets(a);

puts("Pleaseenteracharacter:

");

b=getchar();

…………/*编写程序,实现功能*/

pirntf(“Theresultis%d\n”,num);

}

实验七从字符串中删字符

【实验目的】

熟悉字符串的存取和结束标记。

并掌握从一维数组中删除元素的方法。

【实验内容】

编写程序从键盘上输入一个字符串和一个字符,实现从字符串中删除该字符。

例如:

从键盘输入字符串为"abaaAAbcaaaca",要删除的字符为'a',则在屏幕上输出"bAAbcc"。

下面给出程序的部分代码。

请完善程序,并以4_7.c命名本程序并上交。

voidmain()

{chars[20],ch;

inti,j;

printf("Pleaseinputastring:

\n");

gets(s);

printf("Pleaseinputacharacter:

\n");

ch=getchar();

for(i=0;_________;i++)

{…………/*编写程序,实现功能*/

}

puts(s);

}

【实验提示】

要考虑被删除的字符在字符串出现多次,而且连续排列的情况。

实验八数据加密

【实验目的】

学习通过字符数据的ASCII值进行加密的方法。

【实验内容】

某个单位要传递机密数据,数据是一组的整数数字(从键盘输入,长度不大于30个字符)。

在传递过程中是加密的,加密规则如下:

每位数字都加上5,然后用该和除以10的余数代替该数字。

在屏幕上显示加密后的数字。

以4_8.c命名本程序并上交。

例如:

输入数据327895123,

显示结果为:

872340678。

【实验提示】

1.应用字符数组来解决该问题。

2.主程序中将各位数字以字符的形式存放,在加密的过程中应该注意‘0’跟0的区别。

实验九将数字字符串转换为相应实数

【实验目的】

学习数字字符串与数值之间的转换问题。

【实验内容】

将键盘上输入的一个数字字符串转换为相应的实数,在屏幕上输出。

转换时遇到第一个非数字字符时停止(不包含第一个小数点和起始的负号-)。

例如:

若输入字符串“123a45”,得到实数x=123.0;

若输入字符串“-123.45.765”,得到实数x=-123.45;

若输入字符串“123-56.78”,得到实数x=123.0;

若输入字符串“-.123”,得到实数x=-0.123。

下面给出不考虑负数的程序,请在下述程序的基础上补充完善为也能考虑负数的程序,并以4_9.c命名本程序。

#include

voidmain()

{charstr[100];

inti,sign;doublex,k;

gets(str);/*str中存放的是一个数字字符串*/

sign=1;k=0.1;/*sign是一个标志,标识是否出现了第一个小数点*/

x=0;

for(i=0;str[i];i++)

{if(sign==1)

if(str[i]>='0'&&str[i]<='9')

x=x*10+(str[i]-48);

elseif(str[i]=='.')

sign=0;

elsebreak;

elseif(str[i]>='0'&&str[i]<='9')

{x+=(str[i]-48)*k;

k*=0.1;

}

elsebreak;

}

printf("x=%lf\n",x);/*x中记录的是转换后得到的数值*/

}

【实验提示】

只有起始的负号-才能作为负数标志,中间的-只能被看做非法字符,使转换结束。

实验十万年历问题

【实验目的】

学会使用二维数组解决万年历问题。

【实验内容】

已知1900年12月31号是星期一,编写程序,键盘输入1901~2300年内任意一个日期,程序输出这一天是星期几。

以4_10.c命名本程序。

【实验提示】

1.第四章中有一个实验要求是给出当前日期,求出该日期是本年度中的第几天的程序。

大家可以回想以下那个程序中的case语句对应的每一个天数是如何得到的,我们将这个问题用数组来解决。

2.假设我们要求x年y月z日是星期几,必须知道两个日期相间隔的天数。

3.使用二维数组来存放每月的天数,第一行存放平年的每月天数;第二行存放闰年的各月天数。

3.普通年份有365天,365%7=1;所以求总天数时可以不必将年份差×365天。

【讨论与思考】

既然是万年历问题,就应能测任一日期。

如果要求能够测任何一日期(1900年之前和之后的任何一天)为周几,本题应如何处理?

注意前推和后推的方法有所不同。

 

第二部分结构体

通过本章实验作业应达目标

1.掌握结构类型变量与数组的定义和使用。

2.掌握使用结构变量名访问结构成员的方法。

实验一结构体类型的定义

【实验目的】

理解并掌握结构体类型的概念和定义方法,测试这几种自定义类型变量所占内存空间的字节数,掌握各类变量的定义和引用。

【实验内容】

定义一个结构体类型,其成员包括:

学号、姓名、性别(char型)、年龄、高数、计算机、物理、英语、总分、平均分。

同时定义一个该类型的变量,保存一个学生信息:

203212022李明f2187969285。

计算并保存该学生的总分与平均分。

请以4_11.c命名本程序并上交。

实验二结构体数组的管理程序(综合类)

【实验目的】

掌握使用结构体数组组织与管理数据的方法。

【实验内容】

以本章“实验一结构体类型的定义”中的结构体类型定义一个结构体数组,编写程序实现以下功能:

1.从键盘输入表4-1中数据给数组。

表4-1用以创建结构体数组的原始数据

学号

姓名

性别

年龄

高数

计算机

物理

英语

总分

平均分

1001

Jack

m

23

34

56

78

12

1002

Sam

f

56

67

65

87

54

1003

Marry

f

45

54

68

67

56

1004

David

m

78

34

56

98

44

2.计算每个同学的总分和平均分,并在对应的结构体中填上数据。

3.根据每位学生的总分降序排列。

4.输出数组中的数据,每位同学一行。

请以4_12.c命名本程序并上交。

【实验提示】

结构体类型在函数外定义,结构体数组在main()中定义。

三个函数都是对main()中定义的数组进行操作,因而函数的参数必须是指向结构体类型的指针,使用指针访问一维数组。

如果还未学习函数与指针,可以在main()中实现所有的功能。

功能段请加注释信息。

【讨论与思考】

扩充编写排序程序,能按任意字段排序。

(怎样根据用户的键盘输入决定排序关键字?

如果我们需要对表中的数据进行增删应怎样操作?

体会使用数组组织数据的局限(增删不易,容量不能实现动态指定)。

第一部分数组习题

1.定义如下变量和数组:

intk;

inta[3][3]={1,2,3,4,5,6,7,8,9};

则下面语句的输出结果是()

for(k=0;k<3;k++)printf("%d",a[k][2-k]);

A、357B、369C、159D、147

2.执行下面的程序段后,变量k中的值为()

intk=3,s[2];

s[0]=k;k=s[1]*10;

A、不定值B、33C、30D、10

3.设有数组定义:

chararray[]="China";则数组array所占的空间为()

A、4个字节B、5个字节C、6个字节 D、7个字节

4.如下程序的输出结果是()

voidmain()

{intn[5]={0,0,0},i,k=2;

for(i=0;i

printf("%d\n",n[k]);

}

A、不确定的值B、2C、1D、0

5.有如下程序

voidmain()

{inta[3][3]={{1,2},{3,4},{5,6}},i,j,s=0;

for(i=1;i<3;i++)

for(j=0;j<=i;j++) s+=a[i][j];

printf("%d\n",s);

}

该程序的输出结果是()

A、18B、19C、20D、21

6.以下程序的输出结果是()

voidmain()

{int i,x[3][3]={1,2,3,4,5,6,7,8,9};

for(i=0;i<3;i++) printf("%d,",x[i][2-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"

voidmain()

{charss[10]="1,2,3,4,5";

gets(ss);

strcat(ss,"6789");

printf("%s\n",ss);

}

A、ABC6789B、ABC67C、12345ABC6D、ABC456789

8.以下程序段的输出结果是()

chars[]="\\141\141abc\t";

printf("%d\n",strlen(s));

A、9B、12C、13D、14

9.下面是对s的初始化,其中不正确的是()

A、chars[5]={“abc”};B、chars[5]={‘a’,’b’,’c’};

C、chars[5]=“”;D、chars[5]=”abcde”

10.以下程序的输出结果是____________________

voidmain()

{chars[]="abcdef";

s[3]='\0';

printf("%s\n",s);

}

11.下列程序段的输出结果是_____________

voidmain()

{charb[]="Hello,you";

b[5]=0;

printf("%s\n",b);

}

12.在C语言中,二维数组元素在内存中的存放顺序是_____________

13.设有定义语句“inta[3][4]={{1},{2},{3}}”,则a[1][1]值为_____________,a[2][1]的值为_____________

14.若在程序中用到“putchar()”函数时,应在程序开头写上包含命令_____________,若在程序中用到“strlen()”函数时,应在程序开头写上包含命令_____________

15.下面程序的功能是输出数组s中最大元素的下标,请填空。

voidmain()

{intk,p;

ints[]={1,-9,7,2,-10,3};

for(p=0,k=p;p<6;p++)

if(s[p]>s[k])_____________;

printf("%d\n",k);

}

16.以下程序执行时输入LanguageProgramming的结果是_____________

#include

voidmain()

{charstr[30];

scanf("%s",str);

printf("str=%s\n",str);}

17.以下程序可把输入的十进制长整型数以十六进制数的形式输出,请填空。

voidmain()

{charb[17]={"0123456789ABCDEF"};

intc[64],d,i=0,base=16;

longn;

printf("Enteranumber:

\n");

scanf("%1d",&n);

do{c[i]=_____________;

i++;

n=n/base;

}while(n!

=0);

printf("Transmitenewbase:

\n");

for(--i;i>=0;--i)

{d=c[i];

printf("%c",b[____________];

}

}

18.以下数组定义中,错误的是()

A、inta[]={1,2,3};B、inta[5]={1,2,3};

C、inta[3]={1,2,3,4};D、inta[5],b;

19.以下数组定义中,正确的是()

A、intn=4,a[n]={1,2,3,4};B、inta[][2]={1,2,3,4};

C、inta[2][]={1,2,3,4};D、inta[][]={{1,2},{3,4}};

20.设有如下定义:

inta[8][10

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1