第四次计算机实验
实验结论
Part1 数组数据结构
// 这观察数组中元素在是否是连续存放的 #include <stdio.h> const int N=5; int main() { int a[N] = {1, 2, 3, 4, 5}; // 定义一维数组a int i; int b=5,c=6,d=2; // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 for(i=0; i<N; i++) printf("%d: %d\n", &a[i], a[i]*); printf("%d %d %d", &b,&c,&d); //非数组数据的数据储存不连续 return 0; }
char a[5] = {'h','e','l','l','o'}; printf("%d: %c\n", &a[i], a[i]);
double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0}; printf("%d: %.2f\n", &a[i], a[i]);
不同数组类型的显示
数组是存放另两个或两个以上相邻存储单元的集合,每个存储单元存储相同数据类型的数据。在一个具有相同名称和相同类型的连续存储结构中要引用某个元素,就要指定数组中元素的位置和索引。在使用数组时应注意数组的声明,及其类型与大小,以便编译器为其分配连续空间。
Part2 一维数组的定义、初始化以及数组元素的引用方法
#include <stdio.h> int main() { int a[5] = {1, 9, 8, 6, 0}; int i; for(i=0; i<5; i++) printf("a[%d] = %d\n", i, a[i]); return 0; }
// 对部分元素初始化 #include <stdio.h> int main() { int a[5] = {1, 9}; int i; for(i=0; i<5; i++) printf("a[%d] = %d\n", i, a[i]); return 0; }
一维数组元素的引用:
printf("%.2lf",x[3]) 显示x[3]的值
x[0]=25.0 将浮点数25.0存入x[0]
c[7]=1000 将1000存入c[7]
sum=c[0]+c[1]
x[2]+1=x[3] 非法赋值语句,左侧非变量
使用for语句可以容易地完成对数组元素的顺序操作(存储 调用)
Part3 数组作为函数参数
数组元素作为函数实参
// 示例:数组元素作为函数参数 #include <stdio.h> const int N=5; int main() { int score[N] = {99, 82, 88, 97, 85}; int i; for(i=0; i<N; i++) printf("%d ",score[i]); // 数组元素score[i]作为实参 return 0; }
此处实参的值依赖于索引i,在上例中把a[i]作为printf的参数,将对应的值传递到此处。倘若a[i]出现在调用函数中与在主函数中区别不大,较容易理解。
数组名作为函数实参
// 示例:数组名作为函数实参 #include <stdio.h> const int N=5; void init(int a[],int n, int value); // 函数声明 int main() { int b[N],i; init(b,N,-1); // 函数调用 for(i=0;i<N;i++) printf("%3d",b[i]); return 0; } // 函数功能描述: 把一个含有n个元素的整型数组的元素值全都设为value void init(int a[], int n, int value) { int i; for(i=0;i<n;i++) a[i] = value; }
init(&b[0],N,-1); //因为调用函数所调取的数组是其地址,所以函数调用处可以更换为此处的表达
在此处的调用中直接改变了数组中的值。是因为实际参数中数组b的起始地址0被复制给了形式参数a,在函数init()中,通过形式参数a这 个地址去对数组元素进行赋值操作的时候,实际上就是对实参数组b的赋值操作。如果要创建新的存储空间不改变实参数组,可以使用const关键字修饰形参。
Part4 用冒泡法对一组数据由小到大排序
ex1
// 功能描述:输入一组整数,输出最大值 #include <stdio.h> int findMax(int a[], int n); const int N=5; int main() { int a[N]; int max, i; printf("输入%d个整数: \n", N); for(i=0; i<N; i++) scanf("%d",&a[i]); max=findMax(a,N); printf("数组a中最大元素值为: %d\n\n", max); return 0; } // 功能描述:找出整型数组a中元素的最大值,并返回次此最大值 int findMax(int a[], int n){ int i,max; for (i=0; i<n-1; i++) { if(a[i]>a[i+1]) a[i+1]=a[i]; //将最大的数字浮到最后 } max=a[i]; return (max); }
ex2
//实现功能:实现字符数组中的字符由大到小排序 #include <stdio.h> const int N=4; void output(char x[], int n); void order(char x[], int n);// 排序函数声明 int main() { char string[N] = {'2','0','1','9'}; int i; printf("排序前: \n"); output(string, N); order(string,N) ; //// 调用排序函数对字符数组中的字符由大到小排序 printf("\n排序后: \n"); output(string, N); printf("\n"); return 0; } // 函数功能描述:输出包含有n个元素的字符数组元素 void output(char x[], int n) { int i; for(i=0; i<N; i++) printf("%c", x[i]); } // 函数功能描述:对一组字符由大到小排序 void order( char x[], int n) { int i,j,t; for (i=0; i<n-1; i++) { for(j=0; j<n-1-i; j++) { if( x[j] < x[j+1] ) { t = x[j]; x[j] = x[j+1]; x[j+1] = t; } } } }
实验总结与体会
这次的实验报告做的是有一点赶得,毕竟周三晚上的高数考试久违的用了脑子,实在懈怠。好在提前把补全程序完成了,不至于太过匆忙。这次的实验主要是对数组的介绍与应用,还穿插有自定义函数的使用,可能会稍微显得困难一点。在周一的时候我想实现对任意长度数组元素进行排序,本以为问题应该只是简单的改变一下变量。打好框架才意识到我可能需要新定义一个数组长度。我希望是在输入任意长度之后,自动生成长度。但在这过程中又出现了很多的问题以致于现在还没写出来。是的,还没写出来。在线求一个思路。
另外,在这次作业中,我知道为什么有那么多人有随手保存的习惯了,都是血淋淋的教训。