实验五 数组
一 实验目的
1 掌握一维数组和二维数组的定义、赋值和输入输出的方法;
2 掌握字符数组和字符串函数的使用;
3 掌握与数组有关的算法(特别是排序算法)
二 实验内容
1 程序功能:输入12个整数,按每行3个数输出,最后输出它们的平均值。
#include <stdio.h>
#define N 12
main()
{ int i,a[N],av;
for(i=0;i<N;i++) scanf("%d",a[i]);
for(i=0;i<N;i++)
{ printf("%d",a[i]);
if(i%3==0) printf("\n");
}
for(i=0;i<N;i++) av+=a[i];
printf("av=%f\N",av);
}
上面给出的程序有错误,请改正并运行,记录输出结果。
【提示】请注意输入提示、变量赋初值、循环结束条件、输出格式等问题。
修改正确的程序如下:
#include<stdio.h>
#define N 12
main()
{ int i,a[N],av=0;
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<N;i++)
{ printf("%d",a[i]);
if((i+1)%3==0) printf("\n");
}
for(i=0;i<N;i++) av+=a[i];
printf("av=%d\n",av/N);
}
运行结果如下图:
2 选择排序(升序):最常用的排序方法除了冒泡排序外,还有选择排序。
【算法】n个数的选择排序的算法:
⑴ 定义变量、输入n及数组a各元素
⑵ n个数排序要进行n-1遍
以下是一遍排序(第i遍)的方法:
① 设最小数的下标k=i,则最小数为a[k]
② 从下标j=i+1的元素起,到最后一个元素(j=n-1),将a[j]与最小数a[k]比较,确定最小数的下标k
③ 交换a[i]与最小数a[k]
⑶ 输出已排序的n个数
请根据上面的算法编写选择排序程序,并编辑运行、记录输入输出数据。
3 编写程序,输出由1~N×N的整数组成的N阶方阵和它的上、下三角阵。例如,N=3时,输出:
1 2 3 1 2 3 1
4 5 6 5 6 4 5
7 8 9 9 7 8 9
N阶方阵 上三角阵 下三角阵
【提示】N阶方阵用二维数组表示,用二重循环输出:外循环控制输出多少行,内循环输出每行中的整数。输出上、下三角阵时注意内循环控制变量的取值。
程序如下:
#include<stdio.h>
main()
{
int n=3,i,j,a[10][10];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(j<i)printf(" ");
else printf("%d ",a[i][j]);
printf("\n");
}
}
输出结果如下图:
4 按照下面算法编一个程序,将两个字符串连接起来,不能用strcat函数。
⑴ 定义整型变量i、j,字符串s1、s2
⑵ 输入字符串s1、s2
⑶ 当字符串s1尚未结束,改变字符串s1的下标,使之到s1结束处
⑷ 当字符串s2尚未结束,将字符串s2逐个字符连接到字符串s1的后面
⑸ 为字符串s1添加结束标志
⑹ 输出连接后的字符串
程序如下:
#include<stdio.h>
int main()
{
int i=0,j=0,index=0;
char str1[50]={0};//存放拼接字符串1
char str2[50]={0};//存放拼接字符串2
char str12[100]={0};//存放拼接完的字符串
printf("请输入拼接的第一个字符串:");
scanf("%s",&str1);
printf("\n请输入拼接的第二个字符串:");
scanf("%s",&str2);
while(str1[i]!='\0')//获取长度
{
i++;
}
while(str2[j]!='\0')
{
j++;
}
for(index=0;index<i-1;index++)//不放字符串结束符
str12[index]=str1[index];//把s1放入目标数组
for(index=0;index<j;index++)
str12[index+i]=str2[index];
printf("\n拼接后的字%s",str12);
getchar();
getchar();
return 0;
}
三 思考题
编程将一个字符串中的字符按逆序重新存放,例如,
原字符串: Computer
逆序存放字符串:retupmoC
程序如下:
#include <stdio.h>
#include <string.h>
int main()
{
char a[100],temp;
int i,Len;
gets(a);
Len=strlen(a);
for(i=0;i<=Len/2;i++)
{
temp=a[i];
a[i]=a[Len-1-i];
a[Len-1-i]=temp;
}
puts(a);
}
实验总结:本次实验主要掌握一维数组和二维数组的定义、赋值和输入输出的方法和字符数组和字符串函数的使用,掌握与数组有关的算法,通过本次实验,加深对数组的了解,同时也能解决在数组中遇到的问题。
数组方法总结
1. 输入元素的值:
int i,a [10];
for ( i = 0; i < 9; i ++ );
a[i] = i;
(1) 正序排列: (2)倒序排列:
for ( i = 0; i < 10; i ++) for ( i = 9; i >= 0; i -- ) printf (“%d”, a[i]); printf(“%d”, a[i]);
2. 初始化元素的值:
(1) 在定义时,将数组元素一次放在一对花括号里;
eg: int a[10]={1,2,3,4,5,6,7,8,9,0};
(2) 可以只给一部分元素赋值:
eg: int a[10]={1,3};
(3) 使数组全部元素为0:
eg: int a[10]={0,0,0,0,0,0,0,0,0,0};或者 int a[10]={0};
(4) 在对全部元素赋初值的时候,由于元素数已经确定,因此,可以不指定数组长度。(注:数组长度与提供初值个数不相同时,则长度不可以省略。)
3. 巧妙地将两个元素列在一个循环中输出:(用for循环处理fobonacci数列); eg:int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
4. 数列Fobonacci数列核心:
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
5. 换行操作:
for (i=0;i<=20;i++) /*当然也可以在for循环中处理,直接将 {if (i%5= =0) printf(“\n”); if (i%5= =0) printf(“\n”);插入换行*/ Printf(“%12ld”,f[i]);
}
6. 起泡法:
int a[10];
for (j=0;j<9;j++) /*进行n-1趟比较*/
for (i=0;i<9-j;i++) /*在j趟比较中,比较n-1次*/
if(a[i]>a[i+i]) /*由小到大排列,if (a[i]<a[i+1])其它的不变由大到 {t=a[i];a[i]=a[i+1];a[i+1]=t;} 小排列*/
7. 初始化二维数组:
? 分行给二维数组赋初值;
? 将所有的元素都写在一个花括号里;
? 对部分元素赋值:
1) int a[3][3]={{3},{5},{9}}; 只讲0列元素赋值
2) int a[3][3]={{1}, {0,6},{0,0,11}}; 对部分元素赋值,对非0元素少使用方便
3) int a[3][3]={{1}, {5,6}}; 只对几行元素赋值
4) int a[3][3]={{1}, {},{9}}; 对第二行元素赋值
? 对全部元素赋值可以省略一维长度:
? 对部分元素赋初值,在省略一位长度时,应分行赋值:
8. 二维数组的输入输出:
? 输入:直接定义
? 输出:
for (i=0;i<=2;i++)
{for (j=0;j<=1;j++)
printf (“%5d”,b[i][j]);
printf (“\n”);
}
9. 二维数组的行列转换:
b[j][i]=a[i][j];
10. 数组中求最大值并输出行列号:
Eg: int i,row=0,colum=0,max;
int a[3][4]={1,2,3,4,5,6,,7,8,9,10,11,12};
max=a[0][0];
for (i=0;i<=2;i++)
for (j=0;j<=3;j++)
if (a[i][j]>max)
{max=a[i][j];
row=i;
colum=j;}
11. 字符数组的初始化方法:
? 逐个字符初始化:
eg:char c[10]={?I?, ??, ?a?, ?m?, ??, ?h?, ?a?, ?p?, ?p?, ?y?};
1) 在定义字符数组时,不初始化,则数组中的各元素的之不可预料;
2) 如果花括号中提供的初值个数(即字符个数)大于数组的长度,则按语法错误
处理;
3) 如果花括号中提供的初值个数(即字符个数)小于数组的长度,其余元素自动
定为空字符即(?\0?);
? 如果提供的初值个数与数组长度相同,则在定义时可以省略数组长度; ? 也可以定义一个二维数组:
eg: char diamond[5][5]={{ },{ },{ },{ },{ }}; ? 用字符串常量,使字符数组初始化:
eg: char c[ ]={“I am happy”}; 或 char c[ ]= “I am happy”;
12. 字符数组的输出:
一维: 二维:
for (i=0;i<=11;i++) for (i=0;i<=11;i++)
printf (“%c”,c[i]); for (i=0;i<5;i++)
printf(“\n”); printf(“%c”,diamond[i][j]);
13. 字符数组输出最大值:
eg: if (strcmp(string,str[1]>0)
strcpy (string,str[0]>0);
else
strcpy (string,str[1]);
if (strcmp (str[2],string>0)
strcpy (string,str[2]);
printf(“%s”,string);
学生实验报告实验课名称数组函数综合实验实验项目名称数组函数综合实验专业名称测控技术与仪器班学级20xx240801号20xx240…
学生实验报告学院软件与通信工程学院课程名称C语言与程序设计专业班级通信121姓名学号学生实验报告4一实验综述1实验目的及要求1一维…
一实验目的实验五数组1掌握一维数组和二维数组的定义赋值和输入输出的方法2掌握字符数组和字符串函数的使用3掌握与数组有关的算法特别是…
北京联合大学信息学院程序设计基础课程调研研究报告题目姓名学号专业计算机科学与技术编制时间20xx528版本指导教师北京联合大学信息…
1编写power函数该函数的功能是得到从键盘输入的两个数的X值要求在主函数中调用power函数实现求解从键盘上输入二进制数字要求将…
学生实验报告实验课名称数组函数综合实验实验项目名称数组函数综合实验专业名称测控技术与仪器班学级20xx240801号20xx240…
学生实验报告学院软件与通信工程学院课程名称C语言与程序设计专业班级通信121姓名学号学生实验报告4一实验综述1实验目的及要求1一维…
北京联合大学信息学院程序设计基础课程调研研究报告题目姓名学号专业计算机科学与技术编制时间20xx528版本指导教师北京联合大学信息…
C++实验总结报告研究课题:图形编辑器学校:华中科技大学院系:班级:姓名:指导老师:一、实验目的1.熟悉C++的一些重要性质,利用…