实验四

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这个博主的说法在后面又加了一个参数,警告是没有了,不过运行结果还是出错了。不知道是什么地方出了问题。

 

posted @ 2019-04-25 23:39  ningchenyang  阅读(206)  评论(1)    收藏  举报