第七章数组上机作业
第七章数组
通过本章实验作业应达目标
1.学习并掌握一维数组与二维数组的定义、使用及初始化方法。
2.熟练掌握字符数组和字符串的使用方法。
3.掌握数组的一种排序算法。
4.学会用数组保存多个相关的同类数据,并对这一组数据进行各类操作。
本章上交作业
程序7_1.c、7_3.c、7_5.c、7_7.c上传至211.64.135.121/casp。
实验一一维数组的定义和简单应用
【实验目的】
学会定义一维数组,掌握一维数组的遍历操作,掌握在一组数组中求最大值、最小值的方法。
【实验内容】
从键盘读入5个成绩到一个数组中,求其中的最大值,最小值和平均成绩。在屏幕上显示输入成绩的提示信息,用键盘输入一个成绩,接着提示输入下一个,直到结束。以7_1.c命名本程序并上交。
程序运行界面
【实验提示】
求最大(小)值通常用“打擂台”的方法。首先设计两个变量,如max和min分别用来存放最大值和最小值,并将数组的首元素赋给这两个变量,这就是到目前为止的最大(小)值,然后利用循环依次比较其他的元素,总是将当前最大(小)值赋给max和min,直至比较到最后,max和min中的数据就是最大值和最小值。
求平均值还要设置一个变量sum,用来累加各元素的值。
实验二一维数组的排序
【实验目的】
熟练掌握一维数组三种基本排序方法:选择法,冒泡法,比较法。
【实验内容】
从键盘上接收10个成绩,存放到一个一维数组score中,分别利用三种排序方法,将数组从小到大排序并在屏幕上显示排序结果。分别以7_2_1.c、7_2_2.c和7_2_3.c命名三个程序。
【实验提示】
所谓排序是指把一组杂乱无章的数据按照大小顺序排列。
将被排序的n个数据存放在一个数组中, 假如按升序排列。我们将数组定义为a[n],数据存放在a[0] 到 a[n-1] 中。
1.比较排序法
将a[0]与a[1]比较,若a[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]中的数对调,其余数据位置不变。 例如,程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。以7_3.c 命名本程序并上交,部分程序如下。 #define N 10 main() {int a[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是否在数组内,若在,则在屏幕上输出其下标值。若不存在,则在屏幕上显示“Not found!”。假设数组a[10] 的每个元素分别为{1,2,3,4,6,7,9,10,11,15},若从键盘上读入数x为9,则在屏幕上输出“the number’s position is 7”,若读入数为8,则屏幕上输出“Not found!”。 1. 顺序查找法编写的程序如下,请完善程序,并以7_4_1.c命名本程序。 # include #define N 10 void main( ) {int a[N]={1,2,3,4,6,7,9,10,11,15}; int i,x; scanf("%d", &x); for(i=0;i if (________ ) {printf("the number's position is %d\n",i+1); _________ ; } if(i==N) printf("Not found!\n"); } 2. 折半查找法编写的程序如下,请完善程序,并以7_4_2.c命名本程序。 #include #define N 10 void main( ) {int a[N]={1,2,3,4,6,7,9,10,11,15}; int low, high, mid, i, x; scanf("%d", &x ); for(low=0,high=N-1;; ) {mid =_________ ; if(a[mid]==x) {printf("the number's position is %d\n",mid+1); break; } if( _________ ) { printf("Not found\n"); _________ ; } if (a[mid]< x ) low=mid+1; if (a[mid]> x ) _________ ; } } 【讨论与思考】 比较一下两种两种查找方法的优缺点。 实验五统计指定字符个数 【实验目的】 熟悉字符串的存取和结束标记。 【实验内容】 编写程序从键盘上输入一个字符串和一个字符,统计所指定字符的个数。 例如:从键盘输入字符串为"abaaAAbcaaaca",指定字符为'a',则在屏幕上输出结 果是7。以7_5.c命名本程序并上交。 下面给出程序的部分代码。 #include void main( ) {char a[200], b; int num; puts("Please inp ut a string:"); gets(a); puts("Please enter a character:"); b=getchar( ); ………… /* 编写程序,实现功能 */ pirntf(“The result is %d\n”, num); } 实验六从字符串中删字符 【实验目的】 熟悉字符串的存取和结束标记。并掌握从一维数组中删除元素的方法。 【实验内容】 编写程序从键盘上输入一个字符串和一个字符,实现从字符串中删除该字符。 例如:从键盘输入字符串为"abaaAAbcaaaca",要删除的字符为'a',则在屏幕上输出"bAAbcc"。 下面给出程序的部分代码。请完善程序,并以7_6.c命名本程序。 void main( ) {char s[20], ch; int i,j; printf("Please input a string:\n"); gets(s); printf("Please input a character:\n"); ch=getchar(); for( i=0; _________; i++ ) { …………/* 编写程序,实现功能*/ } puts(s); } 【实验提示】 要考虑被删除的字符在字符串出现多次,而且连续排列的情况。 实验七数据加密 【实验目的】 学习通过字符数据的ASCII值进行加密的方法。 【实验内容】 某个单位要传递机密数据,数据是10位以内的整数(从键盘输入)。在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用该和除以10的余数代替该数字。在屏幕上显示加密后的数字。以7_7.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。 下面给出不考虑负数的程序,请在下述程序的基础上补充完善为也能考虑负数的程序,并以7_8.c命名本程序。 #include void main() {char str[100]; int i,sign;double x,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); else if(str[i]=='.') sign=0; else break; else if(str[i]>='0'&&str[i]<='9') {x+=(str[i]-48)*k; k*=0.1; } else break; } printf("x=%lf\n",x); /* x中记录的是转换后得到的数值*/ } 【实验提示】 只有起始的负号-才能作为负数标志,中间的-只能被看做非法字符,使转换结束。 实验九万年历问题 【实验目的】 学会使用二维数组解决万年历问题。 【实验内容】 已知1900年12月31号是星期一,编写程序,键盘输入1901 ~2300年内任意一个日期,程序输出这一天是星期几。以7_9.c命名本程序。 【实验提示】 1.第四章中有一个实验要求是给出当前日期,求出该日期是本年度中的第几天的程序。大家可以回想以下那个程序中的case语句对应的每一个天数是如何得到的,我们将这个问题用数组来解决。 2.假设我们要求x 年y 月z日是星期几,必须知道两个日期相间隔的天数。 3.使用二维数组来存放每月的天数,第一行存放平年的每月天数;第二行存放闰年的各月天数。 3.普通年份有365天,365%7=1;所以求总天数时可以不必将年份差×365天。【讨论与思考】 既然是万年历问题,就应能测任一日期。如果要求能够测任何一日期(1900年之前和之后的任何一天)为周几,本题应如何处理?注意前推和后推的方法有所不同。 习题 1.定义如下变量和数组: int k ; int a[3][3]={ 1, 2, 3, 4, 5, 6, 7, 8, 9 } ; 则下面语句的输出结果是() for(k=0;k<3;k++) printf("%d",a[k][2-k]); A、357 B、369 C、 159 D、 147 2.执行下面的程序段后,变量k中的值为() int k=3,s[2]; s[0]=k;k=s[1]*10; A、不定值 B、33 C、30 D、10 3.设有数组定义:char array [ ]="China";则数组 array所占的空间为() A、4个字节 B、5个字节 C、6个字节 D、7个字节 4. 如下程序的输出结果是( ) main( ) { int n[5]={0,0,0},i,k=2; for(i=0;i printf("%d\n",n[k]); } A、不确定的值 B、2 C、1 D、0 5.有如下程序 main( ) { int a[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、18 B、19 C、20 D、21 6.以下程序的输出结果是() main( ) { 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" main( ) { char ss[10]="1,2,3,4,5"; gets(ss); strcat(ss,"6789"); printf("%s\n",ss); } A、ABC6789 B、ABC67 C、12345ABC6 D、ABC456789 8.以下程序段的输出结果是() char s[ ]= "\\141\141abc\t"; printf("%d\n",strlen(s)); A、9 B、12 C、13 D、14 9. 下面是对s的初始化,其中不正确的是() A、char s[5]={“abc”}; B、char s[5]={‘a’,’b’,’c’}; C、char s[5]=“”; D、char s[5]=”abcde” 10.以下程序的输出结果是____________________ main( ) {char s[ ]="abcdef"; s[3]= '\0'; printf("%s\n",s); } 11.下列程序段的输出结果是_____________ main( ) { char b[]="Hello,you"; b[5]=0; printf("%s \n", b ); } 12.在C语言中,二维数组元素在内存中的存放顺序是_____________ 13.设有定义语句“ int a[3][4]={{1},{2},{3}} ” ,则a[1][1]值为_____________, a[2][1]的值为_____________ 14.若在程序中用到“putchar() ”函数时,应在程序开头写上包含命令 _____________,若在程序中用到“ strlen() ”函数时,应在程序开头写上包含命令_____________ 15.下面程序的功能是输出数组s中最大元素的下标,请填空。 main() { int k,p; int s[]={1,-9,7,2,-10,3}; for(p=0,k=p;p<6;p++) if (s[p]>s[k]) _____________ ; printf("%d\n",k); } 16.以下程序执行时输入Language Programming #include main() { char str[30]; scanf("%s",str); printf("str=%s\n",str); } 17. 以下程序可把输入的十进制长整型数以十六进制数的形式输出,请填空。 main() { char b[17]={"0123456789ABCDEF"}; int c[64],d,i=0,base=16; long n; printf("Enter a number:\n"); scanf("%1d",&n); do{c[i]= _____________; i++; n=n/base; }while(n!=0); printf("Transmite new base:\n"); for (--i;i>=0;--i) {d=c[i]; printf("%c",b[ ____________ ]; } } 18.以下数组定义中,错误的是() A、 int a[]={1,2,3}; B、 int a[5]={1,2,3}; C、 int a[3]={1,2,3,4}; D、 int a[5],b; 19.以下数组定义中,正确的是() A、 int n=4,a[n]={1,2,3,4}; B、 int a[][2]={1,2,3,4}; C、 int a[2][]={1,2,3,4}; D、int a[][]={{1,2},{3,4}}; 20.设有如下定义:int a[8][10];在C中一个整数占用4字节,设a的起始地址为1000, 则a[1][1]的地址是() A、 1000 B、 1004 C、 1036 D、 1044 21.有数组定义:int a[ ][3]={1,2,3,4,5,6,7,8,9},则a[1][2]的值是() A、 2 B、 5 C、 6 D、 8 22.设已定义char str[6]={'a','b','\0','c','d','\0'}; 执行语句 printf(("%s",str)后,输出结果为() A、 a B、 ab C、 abcd D、 ab\0cd\0 23.引用数组元素时,数组元素下标不可以是() A、字符常量 B、整型变量 C、字符串 D、算术表达式 24.下面程序段的运行结果是() void main() {char a[]="abcd",b[]="123"; strcpy(a,b); printf("%s\n",a); } A、 123 B、 123d C、 abcd D、 abcd123 25.下面程序段的运行结果是() void main() {char a[]="123",b[]="abcd"; if(a>b) printf("%s\n",a); else printf("%s\n",b); } A、 123 B、编译时出错 C、 abcd D、运行时出错 C语言(数组) 一、选择题 1. 设有程序: main() { int i,a[11]; printf("给数组赋值:\n"); for (i=0;i<=10;i++) scanf("%d",( )); ... ... printf("输出数组:\n"); for(i=0;i<=10;i++) printf("%d,",( )); } 则在程序中的两个园括号中分别应填入:C A) &a[i]和&a[i] B) a[i]和&a[i] C) &a[i]和a[i] D) a[i]和a[i] 2. 设已定义:int a[15]; 则数组a占用的内存单元数是( C ). A) 15 B) 16 C) 30 D) 32 3. 阅读程序: main() { int a[2]={0},i,j,k=2; for(i=0;i return r; } main() { int x,a[]={2,3,4,5,6,7,8,9}; x=f(a,3); printf("%d\n",x); } 以上程序的输出结果是( D ). A) 720 B) 6 C)24 D) 120 5. 以下定义语句中,错误的是( B ). A) int a[ ] = {6,7,8}; B) int n=5, a[n]; C) char a[ ]= "string"; D) char a[5 ]={'0','1','2','3','4'}; 6. 以下描述中正确的是( D ). A) 数组名后面的常量表达式用一对圆括弧括起来 B) 数组下标从1开始 C) 数组下标的数据类型可以是整型或实型 D) 数组名的规定与变量名相同 7. 若定义数组并初始化char a[10]={'0','1 ','2','3','4','5','6','7','8','9'};指出以下错误语句( AB ). A) scanf("%c",a[0]); B) scanf("%s",&a); C) printf("%c",a[3]); D) printf("%s",a); 8.若定义数组int a[10] ,其最后一个数组元素为( C ). A) a[0] B) a[1] C) a[9] D) a[10] 9. 若定义数组并初始化int a[10]={ 1,2,3,4},以下语句哪一个不成立( B )? A) a[8] 的值为0 B) a[1] 的值为1 C) a[3] 的值为4 D) a[9] 的值为0 10. 指出以下错误语句( A ). 数组的基本操作专项 1.下列VB程序功能为:根据文本框Text1中各字符的大小关系,计算各字符升序排列的序号,并将序号保存在数组y中。如文本框内容为“2011”,程序运行后y(1)~ y(4)各元素的值分别为“4,1,2,3”。 s = Text1.Text:n = Len(s) For i = 1 To n y(i) = 1 Next i For i = 1 To (1) For j = (2) To n If (3) Then y(j) = y(j) + 1 Else y(i) = y(i) + 1 End If Next j Next i 上述程序段3各方框处的表达式分别为() A. (1)n (2)1 (3)Mid(s, j, 1) >= Mid(s, i, 1) B. (1)n (2)1 (3)Mid(s, j, 1) > Mid(s, i, 1) C. (1)n-1 (2)i+1 (3)Mid(s, j, 1) >= Mid(s, i, 1) D. (1)n-1 (2)i+1 (3)Mid(s, j, 1) > Mid(s, i, 1) 2. 有如下VB程序段: inS = Text1.Text n = 0 For i = 1 To Len(inS) m=0 c = Mid(inS, i, 1) If c >= "a" And c <= "z" Then m = 1 ElseIf c >= "A" And c <= "Z" Then m = 2 ElseIf c >= "0" And c <= "9" Then m = 3 End If b(m) = b(m) + 1 If b(m) = 2 Then n = n + 1 Next i 已知数组b各元素初始值都为0,文本框Text1中的内容为“Welcome,2019!”,执行该程序段后,变量n的值为 A.0 B.1 C.2 D.3 3. 有如下 VB 程序段: For i = 2 To 8 For j = 1 To 8 - i If d(j) > d(j + 2) Then temp = d(j): d(j) = d(j + 2): d(j + 2) = temp Next j Next i 数组元素d(1)到d(8)的值依次为“71,54,58,29,31,78,2,77”,经过该程序段 1.选择法排序 1.1.题目要求: 输入一个正整数n (1 一.插入:C语言数组怎么插入一个元素#include for(i=0;i 1、判断一个数组{1,2,3,1,0}中是否存在相同的元素,如果存在相同的元素则输出“重复”,否则输出“不重复”。 2、编写一个程序,求出整数数组中最小元素和最大元素的下标,如果这样的元素个数不止一个,则返回最小的数的下标和最大的数的下标。 3、现在有如下一个数组:int oldArr[]={1,2,5,4,0,0,5,5,0,6,7};要求将以上数组中值为0的项去掉,将不为0的值存入一个新的数组newArr[];并输出两个数组中的所有元素值。 4、自己定义两个整型数组a[]和b[],初始化 数组a,循环输入值到数组b,然后将a,b两个数组合并为数组c,按升序(从低到高)排列。并输出数组a,b,c的值。 5、有一个数组,请按从大到小的顺序排好序,然后输入一个数,要求按原来排序的规律将它插入数组中。如:排序后的数组为:54,48, 35,23,21,12,8,4, 插入40,则应插入到48和35之间。 6、编写程序,在5行7列的二维数组中查找第一次出现的负数。 7、编写程序,定义数组int a[4][6],b[4][6],c[4][6],并完成如下操作: (1)从键盘上输入数据给数组a,b; (2)将数组a与数组b各对应元素作比较,如果相等,则数组c的对应元素为0,若前者大于后者,则数组c的对应元素为1;若前者小于后者,则数组c的对应元素为-1; (3)输出数组c各元素的值。 8、读以下程序并注释,并分析运行结果。 (1) #include 1、向量的创建 1)直接输入: 行向量:a=[1,2,3,4,5] 列向量:a=[1;2;3;4;5] 2)用“:”生成向量 a=J:K 生成的行向量是a=*J,J+1,…,K+ a=J:D:K 生成行向量a=*J,J+D,…,J+m*D+,m=fix((K-J)/D) 3)函数linspace 用来生成数据按等差形式排列的行向量 x=linspace(X1,X2):在X1和X2间生成100个线性分布的数据,相邻的两个数据的差保持不变。构成等差数列。 x=linspace(X1,X2,n): 在X1和X2间生成n个线性分布的数据,相邻的两个数据的差保持不变。构成等差数列。 4)函数logspace用来生成等比形式排列的行向量 X=logspace(x1,x2) 在x1和x2之间生成50个对数等分数据的行向量。构成等比数列,数列的第一项x(1)=10x1,x(50)=10x2 X=logspace(x1,x2,n) 在x1和x2之间生成n 个对数等分数据的行向量。构成等比数列,数 列的第一项x(1)=10x1,x(n)=10x2 注:向量的的转置:x=(0,5)’ 2、矩阵的创建 1)直接输入:将数据括在[]中,同一行的元素 用空格或逗号隔开,每一行可以用回车或是 分号结束 如:a=[1,2,3;3,4,5],运行后: a = 1 2 3 3 4 5 2)函数eye,生成单位矩阵 eye(n) :生成n*n阶单位E eye(m,n):生成m*n的矩阵E,对角线元素为1,其他为0 eye(size(A)):生成一个矩阵A大小相同的单位矩阵 eye(m,n,classname):对角线上生成的元素是1,数据类型用classname指定。其数据类型可以是:duoble、single、int8、uint8、int16、uint16、int32、uint32 。 3)函数ones 用ones生成全1的矩阵ones(n) : 生成n*n的全1矩阵 ones(m,n) : 生成m*n的全1矩阵 ones(size(A)) : 生成与矩阵A大小相同的全1矩阵 ones(m,n,p,…)生成m*n*p*….的全1的多维矩阵 ones(m,n,…,classname)制定数据类型为 classname 4)函数zeros 函数zeros生成全0矩阵zeros(n):生成n*n的全0矩阵 zeros(m,n:)生成m*n的全0矩阵 zeros(size(A)): 生成与矩阵A大小相同的全0矩阵 zeros (m,n,p,…)生成m*n*p*….的全0的多维矩阵 zeros (m,n,…,classname)指定数据类型为 classname 1、写一个二分搜索法算法的代码,一个冒泡排序的代码,写一个杨辉三角的代码,并认真理解代码,这个很重要。 2、求二进制[用递归],用递归的方式实现二分搜索法。 3、用java编写程序输出1,2……n这n个自然数,要求用递归算法 4、求阶乘由用户输入一个数,求这个数的阶乘并输出(用两种方式实现,提示:可使用递归的方法) 5、在数组中的某个位置插入一个任意数 题目:已知有一个整型数组,原始长度为6,现在数组中已经放置了5个无素。要求能够根据用户的需求在数组的某个位置插入用户输入的数字。 如图: 6、随机生成50个数字(整数),每个数字的范围是[10,50]统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,如果某个数字出现次数为0,则不要打印它,打印时按按照数字的升序排列。 7、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 8、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 9、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大? * 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数, * 依次类推,推到第一人(10岁),再往回推。 10、求1+2!+3!+...+20!的和. 11、使用所学栈的思想,完成下面的需求: A、首先让用户输入一个字符串,然后在控制台把字符串逆输出来,比如:用户输入world,控制台输出dlrow。 B、让用户输入一个符合某种规则的字符串:此字符串中充许包括一些分隔符,但是必须要保证此字符串中的分隔符是成对出现的,如果不成对,程序显示用户所输入的字符串不符合规则。比如用户所输入的字符串是a{b[c(d)e]}此字符串是符合规则的。但是如果是a{b[c]不是符合规则的,因为前后的分隔符没有相互匹配,并提示是那个分隔符没有匹配项。 请从里面选择1/2的题目做 第五章数组练习题及答案 一、选择题 1、判断字符串a和b是否相等,应当使用() A、if(a==b) B、if(a=b) C、if(strcpy(a,b)) D、if(strcmp(a,b)) 2、以下正确的定义语句是() A、int a[1][4]={1,2,3,4,5}; B、float x[3][]={{1},{2},{3}}; C、long b[2][3]={{1},{1,2},{1,2,3}}; D、double y[][3]={0}; 3、以下各组选项中,均能正确定义二维实型数组a的选项是() A、float a[3][4]; float a[ ][4]; float a[3][ ]={{1},{0}}; B、float a(3,4); float a[3][4]; float a[ ][ ]={{0},{0}}; C、float a[3][4]; static float a[ ][4]={{0},{0}}; auto float a[ ][4]={{0},{0},{0}}; D、float a[3][4]; float a[3][ ]; float a[ ][4]; 4、下面程序的运行结果是() 1—5 DDCBA 6—10 BDABB 11—15 CCCBC 16—20 DDCBB 21—25 BBAAA 26—30 DBDDB #include "stdio.h" main() { char str[]="SSSWLIA",c; int k; for(k=2;((c=str[k])!='\0');k++) { switch(c) {case 'I':++k;break; case 'L':continue; default:putchar(c);continue; } putchar('*'); } } A、SSW* B、SW* C、SW*A D、SW 5、下面程序段是输出两个字符串中对应相等的字符。横线处应填入() char x[]="programming"; char y[]="Fortran"; int i=0; while(x[i]!='\0'&&y[i]!='\0') 数组常用算法: 查找: /*线性查找*/ int find(int num,int x[],int key) { int i,m=-1; for(i=0;i k++; return -1; } 分词: /*方法一*/ void fen(char s[][10],char str) { int i,j,k; for(i=0,j=0,k=0;str[i]!=0;i++) if(isalpha(a[i])) s[j][k++]=str[i]; else { s[j][k]=0; k=0; j++; } } } /*方法二*/ #include 1、请先用记事本创建文件original.txt,往其中写入一组已排好序的整型数,今输入一个整数,要求按原来排序的规律将它插入数中,仍写入文件。例如:原来整数依次为4、6、8、41、56、77、102(数据间的分隔符为空格)。若将42插入数中,则插入后整数依次为4、6、8、41、4 2、56、77、102。 答案: #include i=0; while(!feof(fp)) { fscanf(fp"%d"&a[i++]); fgetc(fp); } number=i-1; //number中存最后一个数据的下标 fclose(fp); scanf("%d"&n); //以下的while循环用来找n要放的位置循环结束时正好是a[i]的位置i=0; while(n>a[i]) { i++; } //for循环的功能是将a[i]到最后一个元素全后移一个位置 for(j=number;j>=i;j--) a[j+1]=a[j]; //将n放入找到的位置 a[i]=n; number=number+1; //加入n后,元素个数增1,用来控制向文件中的写入次数 fp=fopen("e:\\C语言\\original.txt""w"); if(fp==NULL) { printf("open error"); exit(0); } //写入数据 for(i=0;i<=number-1;i++) fprintf(fp"%d "a[i]); fprintf(fp"%d"a[i]); //最后一个数据后没有空格 fclose(fp); } 2、假定整型数组中的元素值不重复。今输入一个整数,先查找,如数组中存在此元素,则删除,否则不做操作。例如:原来数组的元素依次为14、6、28、41、96、77、89、102。若将96删除,则删除后数组元素依次为14、6、28、41、77、89、102。 答案: 一填空题 1)数组的元素通过下标来访问,数组Array的长度为Array.length 。 2)数组复制时,"="将一个数组的引用传递给另一个数组。 3)JVM将数组存储在栈(堆或栈)中。 4)数组的二分查找法运用的前提条件是数组已经排序。 5)Java中数组的下标的数据类型是整型。 6)数组最小的下标是0 。 7)arraycopy()的最后一个参数指明复制元素的个数。 8)向方法传递数组参数时,传递的是数组的引用。 9)数组初始化包括数组的申明,创建和初始化。 10)数组下标访问超出索引范围时抛出数组越界异常 11)浮点型数组的默认值是0.0f 。 12)数组创建后其大小不能改变。 二选择题 1.下面错误的初始化语句是_ABD__ A. char str[]="hello"; B. char str[100]="hello"; C. char str[]={'h','e','l','l','o'}; D. char str[]={'hello'}; 2.定义了一维int型数组a[10]后,下面错误的引用是_B__ A. a[0]=1; B. a[10]=2; C. a[0]=5*2; D. a[1]=a[2]*a[0]; 3.下面的二维数组初始化语句中,正确的是____ A. float b[2][2]={0.1,0.2,0.3,0.4}; B. int a[][]={{1,2},{3,4}}; C. int a[2][]= {{1,2},{3,4}}; D. float a[2][2]={0}; 4.引用数组元素时,数组下标可以是_D___ A. 整型常量 B. 整型变量 C. 整型表达式 D. 以上均可 5.定义了int型二维数组a[6][7]后,数组元素a[3][4]前的数组元素个数为____ A. 24 B. 25 C. 18 D. 17 6.下列初始化字符数组的语句中,正确的是__B__ A. char str[5]="hello"; B. char str[]={'h','e','l','l','o','\0'}; C. char str[5]={"hi"}; D. char str[100]=""; 7.数组在Java中储存在 C 中 A. 栈 B. 队列 C. 堆 D. 链表 8.下面程序的运行结果是____ main() { int a[][]={{1,2,3},{4,5,6}}; System.out.printf("%d", a[1][1]); } A. 3 B. 4 C. 5 D. 6 9.下面程序的运行结果是_C___ main() { 数组的综合应用例子 时间:2009-6-19 8:54:45 点击:1409 数组的综合应用 为了加深对数组的理解,下面结合一些常用算法的编程来更加深入地学习和使用数组。由于一维数组和二维数组是程序设计中最常用的数组形式,因此这里的举例均为一维和二维数组。 1.数组元素的输入和输出 [例5-12] 由用户输入5个数组元素的值并把它们输出在窗体上。 Option Explicit Private Sub Command1_Click() Dim a(1 To 5) As Integer, i As Integer For i=1 To 5 a(i)=InputBox("请输入第" & Str(i) & "个元素") Next For i=1 To 5 Print "a (";i; ")="; a(i) Next End Sub 程序运行后,单击命令按钮,执行事件过程Command1_Click。若输入5个值10,20,30,40,50,则窗体上显示的输出结果是: a(1)=10 a(2)=20 a(3)=30 a(4)=40 a(5)=50 程序中声明了一个具有5个元素的一维整型数组,分别用循环语句输入、输出数组元素的值。在循环体内,数组元素用循环控制变量i作下标,i值的不同就表示数组元素的不同。在程序中引用数组元素时,其下标可以使用表达式。只要表达式的结果不超出数组定义的上界和下界范围,下标表达式就是合法的。例如本例中,若i=2,则: a(i+1)的值为30; a(a(i+3)\10)的值为50。 下标表达式的值还可以是实数,此时VB将自动对其进行四舍五入取整。例如: a(1+0.4)的值是10; a(2+0.5)的值30。 2.数组元素插入删除 字符数组 1、编写程序,从键盘输入一任意字符串(不包含空格),然后输入所要查找字符。如果存在则输出它在字符串中第一次出现的位置,否则输出NO。 样例输入:Hello a 样例输出:NO 样例输入:Hello l 样例输出:2 #include 第七章数组 通过本章实验作业应达目标 1.学习并掌握一维数组与二维数组的定义、使用及初始化方法。 2.熟练掌握字符数组和字符串的使用方法。 3.掌握数组的一种排序算法。 4.学会用数组保存多个相关的同类数据,并对这一组数据进行各类操作。 本章上交作业 程序7_1.c、7_3.c、7_5.c、7_7.c上传至211.64.135.121/casp。 实验一一维数组的定义和简单应用 【实验目的】 学会定义一维数组,掌握一维数组的遍历操作,掌握在一组数组中求最大值、最小值的方法。 【实验内容】 从键盘读入5个成绩到一个数组中,求其中的最大值,最小值和平均成绩。在屏幕上显示输入成绩的提示信息,用键盘输入一个成绩,接着提示输入下一个,直到结束。以7_1.c命名本程序并上交。 程序运行界面 【实验提示】 求最大(小)值通常用“打擂台”的方法。首先设计两个变量,如max和min分别用来存放最大值和最小值,并将数组的首元素赋给这两个变量,这就是到目前为止的最大(小)值,然后利用循环依次比较其他的元素,总是将当前最大(小)值赋给max和min,直至比较到最后,max和min中的数据就是最大值和最小值。 求平均值还要设置一个变量sum,用来累加各元素的值。 实验二一维数组的排序 【实验目的】 熟练掌握一维数组三种基本排序方法:选择法,冒泡法,比较法。 【实验内容】 从键盘上接收10个成绩,存放到一个一维数组score中,分别利用三种排序方法,将数组从小到大排序并在屏幕上显示排序结果。分别以7_2_1.c、7_2_2.c和7_2_3.c命名三个程序。 【实验提示】 所谓排序是指把一组杂乱无章的数据按照大小顺序排列。 将被排序的n个数据存放在一个数组中, 假如按升序排列。我们将数组定义为a[n],数据存放在a[0] 到 a[n-1] 中。 1.比较排序法 将a[0]与a[1]比较,若a[1]a[1],则二者交换,否则不变,a[1]再与a[2]比较,前者大就交换,…,依次两两比较至到a[n-2]与a[n-1]比较,经过一轮以后,最大者“沉”到了最后,小数往上“冒”,所以得名“冒泡法”。第二轮比较数组的前n-1个,即a[0]~a[n-2] 。重复此过程,直到所有的元素比较完毕。 实验三一维数组元素的调换 【实验目的】 进一步加强对数组的应用。 【实验内容】 找出数组中的最小数和次小数,并把最小数和a[0]中的数对调、次小数和a[1]中的数对调,其余数据位置不变。 例如,程序运行时若输入:2 4 6 11 3 9 7 0 5 8,则输出:0 2 6 11 3 9 7 4 5 8。以7_3.c 命名本程序并上交,部分程序如下。 #define N 10 main() 第四部分数组 4. 1 选择题 1.以下关于数组的描述正确的是(c ) 。 A.数组的大小是固定的,但可以有不同的类型的数组元素 B.数组的大小是可变的,但所有数组元素的类型必须相同 C.数组的大小是固定的,所有数组元素的类型必须相同 D.数组的大小是可变的,可以有不同的类型的数组元素 2.以下对一维整型数组a的正确说明是(d )。 a(10); B. int n=10,a[n]; n; D. #define SIZE 10 scanf("%d",&n); int a[SIZE]; int a[n]; 3.在C语言中,引用数组元素时,其数组下标的数据类型允许是(c)。 A.整型常量 B.整型表达式 C.整型常量或整型表达式 D.任何类型的表达式 4.以下对一维数组m进行正确初始化的是(c )。 A.int m[10]=(0,0,0,0) ; B. int m[10]={ }; C. int m[ ]={0}; D. int m[10]={10*2}; 5.若有定义:int bb[ 8] ;。则以下表达式中不能代表数组元bb[1] 的地址的是(c ) 。 A.&bb[0]+1 B. &bb[1] C. &bb[0]++ D. bb+1 6.假定int 类型变量占用两个字节,其有定义:int x[10]={0,2,4}; ,则数组x 在内存中所占字节数是(d ) 。 A. 3 B. 6 C. 10 D. 20 7.若有以下说明: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g; 则数值为4的表达式是(d ) A.a[g-c] B. a[4] C. a['d'-'c'] D. a['d'-c] 8.以下程序段给数组所有的元素输入数据,请选择正确答案填入(a ) #include<> main() { int a[10],i=0; while(i<10) scanf("%d", _______ ); 实验一Matlab的基本操作及变量、数组 一、实验目的: 1. 熟悉Matlab的开发环境,基本类型的Matlab窗口、工作空间和如何获得在线帮助。 2. 熟悉和掌握Matlab变量和数组的基本操作 二、实验内容: 1. Matlab的基本操作 1.3 先自定义一个变量,然后分别用8种不同的数字显示格式显示查看。 >> format compact >> a=3.14159265358979 a = 3.14159265358979 >> format long >> a a = 3.141592653589790 >> format short e >> a a = 3.1416e+000 >> format long e >> a a = 3.141592653589790e+000 >> format hex >> a a = 400921fb54442d11 >> format bank >> a a = 3.14 >> format + >> a a = + >> format rat >> a a = 355/113 >> format short >> a a = 3.1416 1.4 下面的语句用于画出函数()0.2 2x y x e- =在[0,10]区间的值 x = 0:0.1:10; y = 2*exp(-0.2*x); plot(x,y) 用Matlab编辑器创建一个m文件,把上述语句写入这个m文件并命名为“test1.m”,保存在当前路径中,然后在命令窗中键入test1,观察结果和运行程序后工作空间的变化. 如何清空工作区间数据? 键入 clear ; 如何关闭图像窗口? 键入close ; 除了在命令窗输入文件名,还可以怎样运行一个m 文件程序? 点击file ,打开m 文件,点击Run 按钮,运行m 文件程序。 如果希望在命令窗中显示x 和y 的所有取值,应对程序做出怎么样的修改? x = 0:0.1:10; y = 2*exp(-0.2*x); plot(x,y); x,y 1.5 通过以下两种方式得到关于exp 函数的帮助: (1) 在命令窗中输入help exp 命令; (2) 运用帮助空间窗口。思考,用什么指令可以直接打开帮助空间中关于exp 函数的说明? 键入doc exp ;或者点击help ,再点击product help ,键入exp 搜索. 1.6 假设x =3,y = 4,用Matlab 计算下列表达式: (1) () 23 2 x y x y - (2) 43x y (3) 24x x π- (4) 3 3x x x y - >> format compact >> x=3,y=4 x = 3 y = 4 >> x^2*(y^3)/(x-y)^2 ans = 576 >> 4*x/(3*y) ans = 1 >> 4/x*(pi*x^(-2)) ans = 0.4654 >> x^3/(x^3-y^x) ans = -0.7297 1.7 在当前目录下创建一个m 文件, 键入以下程序并保存,先把文件保存为“2.m ”,运行后观察结果,总结m 文件的文件名(包括Matlab 标识符)命名规则。对该文件重新命名后运行,保存运行结果。 t = -2*pi:pi/10:2*pi; y = abs(sin(t)); plot(t,y) >> 2 ans = 2 重新命名m 文件后运行的结果: 上机作业6 1.输入10个学生的一门课成绩,用一维数组存放其成绩,请输出最高分。 #include for(i=0;i<10;i++) { s=s+x[i]; } j=s/10; printf("平均值是%lf\n",j); } 3.输入10个学生的一门课成绩,用一维数组存放其成绩,统计并输出不及格人数及其百分比。 #include 4.定义一个有10个元素的数组,用其代表10个学生的考试成绩,从键盘输入10个成绩,分别统计优、良、中、及格、不及格的人数。 #include using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int []A1 = new int[] { 0, 1, 2, 3 }; Console.WriteLine("The first Arry:\n"); foreach (int i in A1) Console.WriteLine(i.ToString() + " "); Console.WriteLine(); int []A2 = new int[] { 4, 5, 6, 7 }; Console.WriteLine("The Second Arry:\n"); foreach (int j in A2) Console.WriteLine(j+ " "); Console.WriteLine(); int[] A = new int[A1.Length + A2.Length]; Array.Copy(A1, A, 4); Array.Copy(A2, 0, A, 4, 4);//参数为别为(原数组,原数组起始位置,目标数组,目标数组起始位置,复制个数) Console.WriteLine("The Destination Array:\n"); foreach (int k in A) Console.WriteLine(k + " "); Console.WriteLine(); Array.Clear(A, 0, A.Length); foreach (int c1 in A) Console.WriteLine(c1 + " "); Console.WriteLine(); int []C1={0,1,2,3,4,5,6,7,8,9}; Array.Clear(C1, 1, 3); foreach(int c2 in C1) Console.WriteLine(c2+" "); Console.WriteLine(); int f = 2; int loca1 = Array.BinarySearch(A1, f); if (loca1 < 0) Console.WriteLine("不存在此元素\n");C语言练习3(数组)=参考答案
VB数组的基本操作专项
北京工业大学C语言作业9-数组
C语言一维数组的基本操作
数组课后作业
MATLAB数组基本操作
数组作业二
数组练习题及答案
C语言算法锦集(六) 数组常用操作
C语言数组作业编程题答案
Java数组练习题(带答案)
数组的综合应用例子
C++作业(字符数组及函数)
第七章数组上机作业
C语言数组练习及答案
Matlab的基本操作及变量、数组及其答案
数组程序设计作业-1
C#数组的基本操作