实验四
Part1
通过实验观察验证数组中数据是否是连续存放的?
demo1.cpp
// 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的 #include <stdio.h> const int N=5; int main() { int a[N] = {1,2,3,4,5}; // 定义一维数组a,包含5个整型数据,并对其初始化,5个元素初始值分别是1,2,3,4,5 int i; // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 for(i=0; i<N; i++) printf("%d: %d\n", &a[i], a[i]); return 0; }
结果
由图可知,5个元素地址连续,每个元素占4个字节。
字符型
// 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的 #include <stdio.h> const int N=5; int main() { char a[N] = {'h','e','l','l','o'}; // 定义一维数组a,包含5个字符型数据,并对其初始化,5个元素初始值分别是'h','e','l','l','o' int i; // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 for(i=0; i<N; i++) printf("%d: %c\n", &a[i], a[i]); return 0; }
结果
由图可知,5个元素地址连续,每个元素占1个字节。
double型
// 这个程序用于观察数组中的一组数据元素在内存中是否是连续存放的 #include <stdio.h> const int N=5; int main() { double a[N] = {1.0,2.0,3.0,4.0,5.0}; // 定义一维数组a,包含5个double型数据,并对其初始化,5个元素初始值分别是1.0,2.0,3.0,4.0,5.0 int i; // 以"地址:值"的形式打印数组a中每一个数据元素的地址,和数据元素值 for(i=0; i<N; i++) printf("%d: %.2f\n", &a[i], a[i]); return 0; }
结果
由图可知,5个元素地址连续,每个元素占8个字节。
Part2~Part3省略
Part4
用冒泡法对一组数据从小到大排序
// 对一组整型数据由小到大排序(采用冒泡排序算法) #include <stdio.h> const int N=5; void bubbleSort( int [], int); // 函数声明 int main() { int i,a[N]; printf("请输入%d个整型数据: \n", N); for(i=0; i<N; i++) scanf("%d",&a[i]); printf("排序前的数据: \n"); for(i=0; i<N; i++) printf("%d ",a[i]); printf("\n"); bubbleSort(a,N); // 调用函数bubbleSort()对数组a中的N个元素排序 printf("排序后的数据: \n"); for(i=0; i<N; i++) printf("%d ",a[i]); printf("\n"); return 0; } // 函数定义 // 函数功能描述:对一组整型数据由小到大排序 // 形参描述:x是待排序的数组名,n是数组中元素个数 // 排序算法:冒泡法 void bubbleSort( int 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; } } } } // 注意内外层循环的边界条件 // 冒泡排序算法的归结起来是: // 对n个数排序,共需要扫描n-1遍 // 变量i用于控制要扫描多少遍 // 变量j用于控制每一遍扫描需要比较多少次 // 由于数组中第一个元素下标从0开始,所以j的取值是从0~n-1-i而不是,从1~n-i
结果截图
实验结论
1、①数组名作为函数参数时,函数名后面出现的是形式参数,数组名后面要加[ ]。例:demo3_3中的void init(int a[],int n, int value);
函数调用时,函数中对应于形式参数的量是实际参数,直接写数组名,即init(b,N,-1)。
②形式参数只能是变量,实际参数可以是常量,变量,表达式和函数等。
③实际参数和形式参数在数量上、类型上、顺序上应严格保持一致,否则会发生“类型不匹配”的错误。
2、函数调用的一般形式为:函数名(实际参数列表)。如:当发生函数调用时,即init(b,N,-1);被执行时,将发生函数调用,转入子函数init()去执行。
3、冒泡法排序:①先将输入的n个数据扫描一遍,从前两个数据开始比较,每比较完一次就将较大的数存放到后一位,又开始将第二个数和第三个数比较,将更大 的数存放到第三位,依次完成第一次排序,将最大的数放置在第n位。要比较n-1次。
②扫描前n-1个数据,继续进行比较,就这样扫描再比较,总共要扫描n-1次,第i次扫描要比较n-i次。
边界函数:由于数组中第一个元素下标从0开始,所以j的取值是从0~n-1-i而不是从1~n-i。
Part5
练习1
// 功能描述:输入一组整数,输出最大值 #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]);// 利用循环输入N个整数给数组a max=findMax(a,N);// 调用子函数max求数组a的最大元素值,并赋值给max printf("数组a中最大元素值为: %d\n\n", max); // 输出最大值 return 0; } int findMax(int a[], int n)// 函数定义 { int i,max; max=a[0]; for(i=0;i<N;i++)// 功能描述:找出整型数组a中元素的最大值,并返回次此最大值 { if(max<a[i]) max=a[i]; } return max; }
结果截图
练习2
#include <stdio.h> const int N=4; void output(char x[], int n); // 函数声明 void sort(char x[], int n);// 排序函数声明 int main() { char string[N] = {'2','0','1','9'}; int i; printf("排序前: \n"); output(string, N); sort(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 sort(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; } } } }
结果截图
评论
https://www.cnblogs.com/lxzblogs/p/10731748.html#4234670
https://www.cnblogs.com/lsy17/p/10695954.html#4236578
https://www.cnblogs.com/qwer9107/p/10720286.html#4234704