实验四
part 1
数组内的元素都是同一类型的数据,在元素前加‘&’即可输出元素像对应的地址,可证元素间的地址是连续的,地址间的差是元素类型的字节长度。
part 2
数组定义时要写类型,且元素个数需是常量。在定义时可以直接将数组初始化,也可以利用循环进行,引用时通过数组名和下标进行引用,下标从0开始。定义时对数组全部初始化可以省略数组大小,如果只对部分元素初始化,剩下的元素将自动设为0.
part 3
数组作为形式参数出现在函数声明和定义中时数组名后要加‘[]’,函数调用时作为实际参数可以直接写数组名。而关于函数调用时参数传递过程,我在调试part 5的一个程序时结合PPT里和上课时的说明搞清楚了:


调用函数时把实参的地址复制给了形参,形参和实参共用一个地址,从上图可以看到它们地址时一样的。那么在函数里形参变化的同时,在同一地址的主函数中实参也发生了变化。
part 4
冒泡排序法,算法还是挺好理解的, 但是边界条件从零开始让人感到迷糊,我把边界改为了从零开始,冒泡函数部分的代码如下:
1 // 函数定义 2 // 函数功能描述:对一组整型数据由小到大排序 3 // 形参描述:x是待排序的数组名,n是数组中元素个数 4 // 排序算法:冒泡法 5 void bubbleSort( int x[], int n) { 6 int i,j,t; 7 for (i=1; i<=n-1; i++) { 8 for(j=1; j<=n-i; j++) { 9 if( x[j-1] > x[j] ) { 10 t = x[j-1]; 11 x[j-1] = x[j]; 12 x[j] = t; 13 }
这样和原来运行情况时一样的,而且看起来好懂些。修改这部分代码后的运行截图:

part 5
练习1:
源代码:
1 // 功能描述:输入一组整数,输出最大值 2 #include <stdio.h> 3 int findMax(int a[], int n); // 函数声明 4 const int N = 5; 5 int max, n; 6 int main() { 7 int a[N]; 8 printf("输入%d个整数: \n", N); 9 for (n = 0; n < N; n++) // 利用循环输入N个整数给数组a 10 scanf("%d", &a[n]); 11 12 max = findMax(a, n); // 调用子函数max求数组a的最大元素值,并赋值给max 13 14 printf("数组a中最大元素值为: %d\n\n", max);// 输出最大值 15 getchar(); 16 return 0; 17 } 18 int findMax(int b[], int n) { // 函数定义 19 max = b[0]; 20 for (n = 1; n < N; n++) // 功能描述:找出整型数组a中元素的最大值,并返回次此最大值 21 { if (max<b[n ]) 22 max = b[n]; 23 } 24 return max; 25 }
运行结果:

练习2:
源代码(嗯,这是不对的):
1 #include <stdio.h> 2 const int N = 4; 3 void output(char x[], int n); // 函数声明 4 void reorder(char x[], int n);// 排序函数声明 5 int main() { 6 char string[N] = { '2','0','1','9' }; 7 int i; 8 printf("排序前: \n"); 9 10 output(string, N); 11 reorder(string, N);// 调用排序函数对字符数组中的字符由大到小排序 12 13 printf("\n排序后: \n"); 14 output(string, N); 15 printf("\n"); 16 return 0; 17 } 18 // 函数定义 19 // 函数功能描述:输出包含有n个元素的字符数组元素 20 // 形参:字符数组,以及字符数组元素个数 21 void output(char x[], int n) { 22 int i; 23 for (i = 0; i < N; i++) 24 printf("%c", x[i]); 25 } 26 // 函数定义 27 // 函数功能描述:对一组字符由大到小排序 28 // 形参:字符数组,以及字符数组元素个数 29 int t, j; 30 void reorder(char x[], int n) { 31 for (j = 1; j <= N - 1; j++) { 32 for (n = 1; n < (N - j); n++) 33 { 34 if (x[n - 1] < x[n]) 35 t = x[n]; x[n] = x[n - 1]; x[n - 1] = t; 36 } 37 } 38 39 }
在vs里的debug结果:


在Dev-c里的运行结果:

这次重新下载了vs来写程序(找不到Dev-c里的调试功能啊\拍桌,网上的设置方法也不太行啊\拍桌,而且想试试用vs),然后不知道为什么运行窗口老是闪退,对各种功能也在慢慢熟悉,再加上时间比较仓促,练习二就出现了很迷的状况···
在写这两个程序的过程中用调试功能,能检查到边界条件和各个变量的值。练习2我感觉我的边界没有设错···可是x和t的值让我十分迷惑···我还需要时间再想想,现在只能先把作业交了···
------更新-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
改正后练习二源代码:
1 #include <stdio.h> 2 const int N = 4; 3 void output(char x[], int n); // 函数声明 4 void reorder(char x[], int n);// 排序函数声明 5 int main() { 6 char string[N] = { '2','0','1','9' }; 7 int i; 8 printf("排序前: \n"); 9 10 output(string, N); 11 reorder(string, N);// 调用排序函数对字符数组中的字符由大到小排序 12 13 printf("\n排序后: \n"); 14 output(string, N); 15 printf("\n"); 16 return 0; 17 } 18 // 函数定义 19 // 函数功能描述:输出包含有n个元素的字符数组元素 20 // 形参:字符数组,以及字符数组元素个数 21 void output(char x[], int n) { 22 int i; 23 for (i = 0; i < N; i++) 24 printf("%c", x[i]); 25 } 26 // 函数定义 27 // 函数功能描述:对一组字符由大到小排序 28 // 形参:字符数组,以及字符数组元素个数 29 int t, i, j; 30 void reorder(char x[], int n) { 31 for (j = 1; j < n ; j++) { 32 for (i = 1; i <= (n - j ); i++) 33 { 34 if (x[i] > x[i - 1]) 35 { t = x[i]; 36 x[i] = x[i - 1]; 37 x[i - 1] = t; 38 } 39 } 40 } 41 42 }
运行结果:

把边界来回推了好多次,为了方便观察每个变量和x的值,我把错误代码中35行的那几个语句分了行,分完行惊觉···我忘加‘{}’了···练习1也是因为把findMax写成findmax找了好久的错误(软件只给出了“Id returned 1 exit status”的提示)
part5的心得体会,就是要注意边界条件,以及:格式不规范,结果两行泪TAT
另外,把vs的闪退现象解决了,dev-c的调试功能也找到了,但是个人觉得还是vs比较好用,把光标停留在变量名上的时候会自动显示变量的值,还会显示类型、地址等信息,在这里安利一波>-<
选做
题目:尝试编写一个输入函数,完成字符串输入。然后,修改main()程序,在其中调用输入函数,使得,程序可以在运行时对用户输入的任意字符进行由大到小排序。
源代码:
1 //编写一个输入函数,完成字符串输入。然后,修改main()程序,在其中调用输入函数,使得程序可以在运行时对用户输入的任意字符进行由大到小排序 2 #include <stdio.h> 3 const int N = 5; //n为字符串的实际长度 4 void scan(char string[], int n); //输入函数声明 5 void reorder(char string[], int n); //排序函数声明 6 int main() { 7 char string[N+1]; 8 printf("请输入%d个字符:", N);//输入提示 9 scan(string, N);//调用输入函数,将string初始化 10 reorder(string, N);//调用排序函数对字符进行从大到小排序 11 printf("将字符从大到小重新排序后:%s", string);//输出排序后的字符串 12 return 0; 13 } 14 void scan(char string[], int i){ 15 for (i = 0; i < N; i++) 16 { 17 scanf_s("%c", &string[i],sizeof(string[N+1])); 18 } 19 } 20 int i,j,t; //用冒泡法进行排序 21 void reorder(char string[], int n) { 22 for (i = 1; i <= n-1; i++) 23 { 24 for (j = 1; j <= (n - i); j++) { 25 if (string[j - 1] < string[j]) 26 { 27 t = string[j]; 28 string[j] = string[j - 1]; 29 string[j - 1] = t; 30 } 31 } 32 } 33 }
运行结果:

但是在别的软件里运行结果时这样的:

在vs里出现了乱码(这么烫吗???)。最开始警告了我“scanf_s”没有为格式字符串传递足够的参数,我按照https://blog.csdn.net/joy2008yh/article/details/49385377这个博主的说法在后面又加了一个参数,警告是没有了,不过运行结果还是出错了。不知道是什么地方出了问题。

浙公网安备 33010602011771号