数组.docx

上传人:b****2 文档编号:12887787 上传时间:2023-04-22 格式:DOCX 页数:19 大小:53.60KB
下载 相关 举报
数组.docx_第1页
第1页 / 共19页
数组.docx_第2页
第2页 / 共19页
数组.docx_第3页
第3页 / 共19页
数组.docx_第4页
第4页 / 共19页
数组.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数组.docx

《数组.docx》由会员分享,可在线阅读,更多相关《数组.docx(19页珍藏版)》请在冰豆网上搜索。

数组.docx

数组

实验要求

1.掌握一维数组、二维数组的定义、使用及初始化

2.掌握字符数据和字符串函数的使用方法

3.掌握与数组有关的常用排序算法

实验内容

内容一:

运行程序

根据老师的演示,运行老师提供的源程序,观察每一个程序的输出结果。

1.Reverse_Array.c:

输入10个数,按输入数据的逆序输出这10个数

请输入如下数据,并观察程序的输出结果:

12345678910

158402928515

注:

要求输入10个数,并按照输入数据的逆序输出,这时需要首先保存输入的10个数,可考虑使用一维数组保存输入的数据;

变量在使用之前必须进行初始化,数据元素也如此,或通过输入语句进行初始化或使用赋值语句进行初始化;

表1.Reverse_Array.c源文件

/*

程序名:

Reverse_Array.c

功能:

输入10个数,按输入数据的逆序输入这10个数

时间:

21:

482011/10/30

作者:

秦兴国

*/

#include

#include

/*使用宏定义LENGTH长度为10*/

#defineLENGTH10

intmain()

{

intarray[LENGTH];

inti,temp;

printf("Pleaseinput%dnumbers\n",LENGTH);

/*使用循环输入10个数,依次存入数组array中*/

/*数组引用的下标从0开始,至LENGTH-1*/

for(i=0;i

{

scanf("%d",&array[i]);/*array[i]也是一个变量,输入时应加&取地址符*/

}

printf("方法一、使用循环逆序输出array数组中的元素,逆序引用数组元素时,下标从LENGTH-1开始,至0\n");

/*使用循环逆序输出array数组中的元素*/

/*方法一、逆序引用数组元素时,下标从LENGTH-1开始,至0*/

/*\t表示制表符*/

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

{

printf("%d\t",array[i]);

}

/*使用循环逆序输出array数组中的元素*/

/*方法二、将数组的首尾元素值进行交换,并按照下标顺序输出数组*/

/*\t表示制表符*/

printf("方法二、将数组的首尾元素值进行交换,并按照下标顺序输出数组\n");

for(i=0;i<=LENGTH/2;i++)

{

temp=array[i];

array[i]=array[LENGTH-1-i];

array[LENGTH-1-i]=temp;

}

for(i=0;i

{

printf("%d\t",array[i]);

}

getch();

return0;

}

2.Bubble_Sorting.c:

输入10个数,并按照从小到大的顺序输出10个数

请输入如下数据,并观察程序的输出结果:

10987654321

1521891012102

注:

Bubble排序是最常见的排序算法,掌握与数组相关的排序算法,对于解决实际问题常有帮助;

表2.Bubble_Sorting.c源文件

/*

程序名:

Bubble_Sorting.c

功能:

输入10个数,并按照从小到大的顺序输出10个数

时间:

21:

482011/10/30

作者:

秦兴国

*/

#include

#include

#include

/*使用宏定义LENGTH长度为10*/

#defineLENGTH10

intmain()

{

intelements[LENGTH];

inti,j,temp;

printf("Pleaseinput%dnumbers\n",LENGTH);

/*输入10个数,并存放至数组elements中*/

for(i=0;i

{

scanf("%d",&elements[i]);

}

for(i=0;i

{

/*执行完一次外层循环,则当前最小的元素被置于第i个元素中,i从0开始*/

for(j=i+1;j

{

if(elements[i]>elements[j])/*如果当前第i+1个元素小于第i个元素,则两个元素互换*/

{

temp=elements[i];

elements[i]=elements[j];

elements[j]=temp;

}

}

}

printf("Asendingorder:

");

for(i=0;i

{

printf("%4d",elements[i]);/*以宽度为4输出每一个数组元素*/

}

getch();

return0;

}

3.String_Statistic.c:

输入字符串,并统计该字符串中字母、数字、其他字符的个数

请自己组织测试数据,并测试给出的程序是否存在bug

表3.String_Statistic.c源文件

/*

程序名String_Statistic.c

功能:

输入10个数,并按照从小到大的顺序输出10个数

时间:

21:

482011/10/30

作者:

秦兴国

*/

#include

#include

#include/*包含所有与字符串操作相关的函数*/

#include

/*使用宏定义LENGTH长度为30*/

#defineLENGTH30

intmain()

{

charstr[LENGTH];

inti,length;

intcharacters,digits,alphabets;

characters=0;

digits=0;

alphabets=0;

printf("Pleaseinputastring:

");

gets(str);/*使用gets函数输入字符串,并将字符串保存至字符数组str中*/

length=strlen(str);/*求字符串的实际长度,注意与定义字符数组的长度不同*/

/*字符串以\0作为结束符,输入字符串时会默认加入\0作为结束*/

/*\0不包含在长度内*/

for(i=0;i

{

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

{

digits++;

}

elseif(str[i]>='a'&&str[i]<='z'

||str[i]>='A'&&str[i]<='Z')

{

alphabets++;

}

else

{

characters++;

}

}

printf("%shas%dcharacters,%ddigits,%dalphabets!

\n",

str,characters,digits,alphabets);

getch();

return0;

}

4.2D_Array.c:

输入一个二维数组(矩阵),并对该矩阵做归一化处理

请自己组织测试数据,并测试给出的程序是否存在bug

表4.2D_Array.c源文件

/*

程序名String_Statistic.c

功能:

二维数组操作实例

时间:

21:

482011/10/30

作者:

秦兴国

*/

#include

#include

#defineM5

#defineN4

intmain()

{

intelements[M][N];

inti,j;

printf("Pleaseinputthe%d*%dmatrix:

\n",M,N);

for(i=0;i

{

for(j=0;j

{

scanf("%d",&elements[i][j]);

/*对二维数组元素做归一化处理,>100则为1,否则则为0*/

if(elements[i][j]>100)

{

elements[i][j]=1;

}

else

{

elements[i][j]=0;

}

}

}

printf("Nowthematrixlookslikethis:

\n");

for(i=0;i

{

for(j=0;j

{

printf("%3d",elements[i][j]);

}

printf("\n");/*每输出一行后,进行换行输出*/

}

getch();

return0;

}

内容二:

改编程序

1.修改Reverse_Array.c程序,使得程序可完成如下功能:

a.输入10个数,按输入数据的逆序输入这10个数,并输入该数列中的最大值及其下标

b.输入10个数,求该数列的平均值,并输出数列中所有大于平均值的数

2.修改Bubble_Sorting.c程序,使得程序可完成如下功能:

a.输入10个数,并按照从小到大的顺序输出10个数;并从键盘中再输入一个数,将该数插入已排列好的数组中,使得数组仍然保持从大到小的顺序排列,输出最终的数组

注:

若将一个数插入已排好序的数组中,则该数组长度必须能容纳11个元素;实现本题功能有2个思路:

(首先画出思路的流程图,然后再编写相应代码)

思路1:

在已排序好的数组中,查找第一个比新输入的数的元素(记为:

Ai),记录该元素的坐标(i),并将该元素之后的所有元素(Ai~A9)依次往后移一位,最后将新输入的数存储Ai元素的位置中;

思路2:

将新输入的数放于当前数组的最后一个元素(A10,注当前数组的元素分别为A0~A9),对新的数组重新做一次排序操作;

3.修改String_Statistic.c程序,使得程序可完成如下功能:

a.输入以!

作为结束的字符串,并统计该字符串中字母、数字、其他字符的个数

注:

例题中,使用gets函数将输入字符串保存至str字符数组中,该函数以回车作为输入结束符;在本题中,需要使用!

作为输入的结束符,此时应该使用scanf(“%c”,&str[i])形式,并依次判断str[i]是否为!

符号,如果是则结束输入,否则继续输入。

在结束输入时,必须将str[i]中的’!

’替换为’\0’

内容三:

模仿创新

在实验三中的模仿创新环节,我们编写实现输出如下信息的程序:

在本次内容当中,你需要修改程序使得程序能实现如下功能:

a.程序能保存用户输入的学生的信息,学生的信息包括:

姓名、学号、英语成绩、数学成绩、语文成绩

注:

要保存用户输入的学生信息,需要定义能保存学生相应信息的数组。

假设现在有一个学生的信息如下:

姓名:

QinXingguo

学号:

030310117

英语成绩:

99

数学成绩:

80

语文成绩:

60

要保存上述学生信息则相应的数组该如何定义。

首先保存姓名的信息,每一个学生的姓名可看成是一个字符串。

假设使用charname[N]来保存一个学生的姓名,其中N是字符数组长度,可定义为满足要求的长度(例如:

20)。

如果需要保存的是一组学生的姓名,则你应该定义一个二维字符数组:

charname[M][N]。

其中,M是总共需要保存的学生人数,N则是保存每个学生姓名的最大字符长度(可假设每个学生的姓名长度不超过N-1个字符)。

要保存学生的学号,直观看来可一定一个int型变量。

需要考虑的一个问题是,int型变量是否足以保存学生的学号信息。

例如,我们学校11级某个新生的学号是1100430201,int型变量的最大值是0x7fffffff,对应十进制是2147483647,可表示该学号。

然而我们学校学生的序号除了有数字之外,还有可能包括字母,比如F110440201,这时使用int型则无法保存。

在设计程序时,应该考虑到程序通用性和可扩展性问题。

最好将学号也定义为字符数组,使用charid[N]来保存一个学生的学号,而使用charid[M][N]来保存M个学生的学号。

b.完成Inputthestudents’namesandscores菜单的功能,即当用户输入1时,程序能提示用户输入一个学生的信息,并将学生信息保存

注:

当用户输入1时,程序能提示用户输入一个学生的信息,并保存。

当用户多次选择菜单1输入学生信息时,你所编写的程序应该能保存用户输入的所有学生信息,并最终能够在用户选择菜单4时输出用户所输入的所有学生信息。

c.完成Listallstudents’scores菜单的功能,即当用户输入4时,程序能输出当前程序保存的所有学生信息

注:

如不能理解上述题目,请运行老师给出的Example.exe程序。

内容四:

问题求解

1、在实验二的内容四-问题求解中,曾要求完成如下程序:

学生选修课的成绩通常为5级制表示,所谓五级制即使用A、B、C、D、E这5个等级来表示学生的成绩。

现在要求你变成实现将学生百分制的成绩转换为5级制形式。

其中,百分制与5级制之间的对应关系如下所示:

90~100A

80~89B

70~79C

60~69D

59及以下E

现要求在此基础之上,完成如下功能:

一个班现有30个学生,该本刚参加完全国计算机一级考试,并已知道成绩,先要求统计这个班这门考试成绩的分布情况。

注:

30个学生的成绩从键盘输入,成绩分布以如下形式输出:

A:

**人占总人数的**%

B:

**人占总人数的**%

C:

**人占总人数的**%

D:

**人占总人数的**%

E:

**人占总人数的**%

2、据说最早的密码来自于罗马的凯撒大帝,为了有效指挥其部队作战并避免敌方结果其下达的命令,凯撒大帝对他发送给部队的命令进行了如下操作:

对于命令中的字母,用该字母之后的第5个字母替换,如原文中是A替换为F,Z替换为E),数字和其他符号不变,现假设凯撒大帝需要通过键盘发送作战命令给其部队

a.你作为传送命令的战士早已对这个加密工作感到乏味,于是想通过程序实现对凯撒大帝的命令进行加密的功能。

你的程序需完成从键盘输入凯撒大帝的作战指令,并将其加密后输出至屏幕中。

b.你作为凯撒大帝的敌对阵营,现截获了凯撒大帝对其部队的作战指令,由于其是密文形式,先需要编写一个程序完成对该密文的解密工作。

3、编写一个程序,实现对键盘输入的两个字符串进行比较,然后输出两个字符串中第一个不相同的字符的ASCII码之差。

例如:

输入的两个字符串分别为”Computer”和”Compare”,则输出为-20。

4、编写一个程序,实现如下功能:

从键盘输入一个M*N的整数矩阵,求这个矩阵的周边元素之和,例如,如果输入矩阵为:

1

3

5

7

9

2

9

9

9

4

6

9

9

9

8

1

3

5

7

0

则输出结果为:

61

5、给定一个整数N,生成一个N*N的矩阵,矩阵中元素取值为1-N2,1在左上角,其余各数按顺时针方向旋转前进,依次递增放置,如N=4,则生成矩阵如下

1234

1213145

1116156

10987

要求输入N,输出矩阵。

实验报告内容

实验报告内容必须包含内容二和内容三中的所有内容的源代码;内容四任意选取3道题目完成。

特别要求:

对于内容四中所选择的题目,请首先用流程图对问题解决方法进行描述,然后给出对应的源代码。

实验报告格式无具体限制。

课外阅读与资料查找

请安装老师提供给你的EasyX图形库函数。

安装好该图形库函数后,请在VisualC++6.0中新建一个Win32ConsoleApplication工程。

并将如下代码复制到该工程中。

尝试编译、运行该功能,看看程序的输出是什么。

表5.图形化程序3

/***************************

鼠标操作演示案例

作者:

秦兴国

日期:

2011/10/30

****************************/

#include

#include

#include

/*定义LENGTH宏*/

#defineLENGTH1000

/*定义保存坐标的结构体*/

typedefstructs_position

{

intx,y;

}Position;

Positionpre_pos;

Positionarray[LENGTH];/*array数组用于保存每次点击鼠标时鼠标的坐标位置*/

intcount=0;

intredraw(COLORREFcol)/*redraw函数用于重画所有交叉线*/

{

inti;

setcolor(col);

for(i=0;i<=count;i++)

{

line(0,array[i].y,640,array[i].y);

line(array[i].x,0,array[i].x,480);

}

return0;

}

intclear(void)/*clear函数用于擦除所有绘制的交叉线*/

{

inti;

redraw(BLACK);

for(i=0;i<=count;i++)

{

array[i].x=array[i].y=-1;

}

count=0;

return0;

}

voidmain()

{

//初始化图形窗口

initgraph(640,480);

chartextout[20];

MOUSEMSGm;/*定义鼠标消息*/

ShowMouse(0);/*在窗口界面中隐藏鼠标图标*/

while(true)

{

//获取一条鼠标消息

m=GetMouseMsg();

//BeginBatchDraw();

switch(m.uMsg)/*判断鼠标的消息*/

{

caseWM_MOUSEMOVE:

/*鼠标移动消息*/

//鼠标移动的时候画红色的小点

setcolor(BLACK);

line(0,pre_pos.y,640,pre_pos.y);

line(pre_pos.x,0,pre_pos.x,480);

sprintf(textout,"%d,%d",pre_pos.x,pre_pos.y);

outtextxy(pre_pos.x+15,pre_pos.y+5,textout);

redraw(RED);

setcolor(RED);

line(0,m.y,640,m.y);

line(m.x,0,m.x,480);

sprintf(textout,"%d,%d",m.x,m.y);

setcolor(GREEN);

outtextxy(m.x+15,m.y+5,textout);

pre_pos.x=m.x;

pre_pos.y=m.y;

break;

caseWM_LBUTTONDOWN:

/*单击鼠标左键消息*/

array[count].x=m.x;

array[count].y=m.y;

if(count

{

count++;

}

else

{

clear();

}

break;

caseWM_RBUTTONDOWN:

/*单击鼠标右键消息*/

clear();

break;

}

//EndBatchDraw();

}

//关闭图形窗口

closegraph();

}

注意事项

编程是一个积累的过程。

从学习编程开始,请保留自己所写的任何程序,以便以后复习或重新使用。

流程图反映了对问题的分析能力以及表述能力。

首先将问题解决方法用流程图进行描述,然后再用程序设计语言来实现流程图中的内容对锻炼同学们的思维能力具有积极作用。

编程风格

在第一次实验中,我们简要介绍了编程风格中的四个原则,请在实验过程当中谨记这些原则并使用它们。

老师所提供的程序均遵守这些原则和规范,同学们在上机实验及写程序时可进行模仿。

下面再介绍一些原则:

1.if、for、do、while、case、switch、default等语句自占一行,且if、for、do、while等语句的执行语句部分无论多少都要加括号{}。

示例:

如下例子不符合规范。

if(pUserCR==NULL)return;

应如下书写:

if(pUserCR==NULL)

{

return;

}

2.程序块要采用缩进风格编写,缩进的空格数为4个。

如下所示:

{}括号里面的语句需要使用缩进,一层缩进使用4个空格键,依次类推。

result=number*2;需要缩进2层,因此需要使用8个空格键。

intmain()

{

floatnumber,result;

scanf(“%d”,&number);

if(number%2==0)

{

result=number*2;

}

printf(“theresultis:

%d\n”,result);

getch();

return0;

}

3.在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如->),后不应加空格。

说明:

采用这种松散方式编写代码的目的是使代码更加清晰。

示例:

(1)逗号、分号只在后面加空格。

inta,b,c;

(2)比较操作符,赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。

if(current_time>=MAX_TIME_VALUE)

a=b+c;

a*=2;

a=b^2;

(3)"!

"、"~"、"++"、"

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

当前位置:首页 > 初中教育 > 英语

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

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