C语言博客作业04--数组

1.本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

本周学习感受:经过这三周对于数组相关知识的学习以及在pta题目集中的练习,我学到了很多以前所掌握知识点所不能做到,亦或是以前学到的知识点很难完成的处理问题的方法,以及对于写代码有了更深刻的体会,以及我在敲代码上更加熟练了。首先是对于数组的定义与运用,它打破了以前面对大量数据只能无奈地去定义多个变量的尴尬局面,同时数据与数据间又有十分紧密的联系(内存与地址方面的),在用来处理大量需要相关联的数据时,再好用不过了。之后对于二维数组的学习和使用,更是将数据与矩阵联系在了一起,通过对二维数组的学习,我对于数组这个概念有了更好的理解,同时使用起来也更得心应手了。字符串与字符数组的引入,使得数组这个概念不单单只针对整型数了。一些字符串(或字符数组)的使用可以方便我们解决一些以前需要switch或大量if才能解决的问题,非常方便。在这三周的学习里,我学到了很多,同时也遇到了很多困难,但好在在老师、助教和同学们的帮助下最终还是解决了。

1.2.2 代码累计

2.PTA总分

2.1截图PTA三次题目集:

2.2 我的总分:

我的总分:455分

3.PTA实验作业

3.1 PTA题目1

在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。

3.1.1 算法分析

定义变量n存放输入数字个数,k存放次数,变量i、j为循环变量
定义长度为n的a数组
输入n、k
for i=0 to n-1 do
    输入 a[i]
end for
for i=0 to k-1 do//外循环执行k次
    for j=0 to k-1 do//内循环n-i-1次
        if a[j]>a[j+1] then//需要x交换时交换  
            temp=a[j];
	    a[j]=a[j+1];
	    a[j+1]=temp;
        end if
    end for
end for
for i=0 to n-1 do
    输出 a[i]
    if i!=n-1 then
        输出空格
    end if
end for

3.1.2 代码截图

3.1.3 PTA提交列表及说明

  • Q1:一开始打完代码,测试题目中所给的测试数据,能够对,并且自己也试了几个测试数据,开开心心地去pta上去提交了。但是却有一个点过不去,然后就想着把自己的测试数据往极端的方向去考虑,最终发现当所需要扫描的次数恰好为完全冒泡排序的时候会出现问题
  • A1:后来发现自己在写内循环条件的时候没有减去一,这就导致在最大扫描次数的时候会出现异常。这种比较细节的地方不容易发现,一旦在编写代码的时候没有注意,就很难找出来,所以因该多加注意。

3.2 PTA题目2

编写一个简单的图书借阅统计程序。借书时,输入书号并按下S键,程序开始计时;还书时,输入书号并按下E键,程序结束计时。当将0作为书号输入时,一天工作结束,输出当天的读者借书次数和平均阅读时间。注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。输入格式为:书号([1, 1000]内的整数) 键值(S或E) 发生时间(hh:mm)每一天的纪录保证按时间递增的顺序给出。

3.2.1 算法分析

定义变量day放输入的天数,book_Number为书号,minute为分钟,hour为小时,cnt为当天借书次数
定义字符变量input表示借/还信号
定义数组book[1001][2],书号对应为其行下标,列下标记录借还时间
定义数组flag[1001]数组(元素全为零),判断借还状况
输入数day
for repeat=0 to day do
    输入book_Number,input,hour,minute
    if book_Number=0 then
        if cnt=0 then
            输出未借书的结果
        else
            输出当天的读者借书次数和平均阅读时间
        end if
    else
        if input=‘S’ then
            记录借书时间 数组flag变化改变书本借阅状态
         end if
        if input=‘E’ then
            数组flag变化改变书本借阅状态
            cnt ++
        end if
end for

3.2.2 代码

3.2.3 PTA提交列表及说明

  • Q1:没有仔细考虑一本数被借多次时的情况,以第一次借为标准,而实际上题目的要求是,当遇到这种情况时,应该以的二次的情况为准。
  • A1:一开始这个问题确实没有找到,去问同学也不明确问题出在哪里,也没有测试数据,在多次测试无果之后,拿别的同学的代码来一一测试数据,最终找到问题所在并修改代码。

3.3 PTA题目3

3.3.1 算法分析

定义字符串a[10001]、b[10001]
定义变量lena、lenb存放a、b的长度,i、j、k为循环变量
输出字符a、b
for i=0 to lena-1 do
    for j=0 to lenb do
        if a[i]=b[j] then
            for k=i to lena-1 do
                a[k]=a[k+1]
            end for
            lena--
            i--
        end if
    end for
end for
for i=0 to lena-1 do
    输出a[i]
end for

3.3.2 代码

3.3.3 PTA提交列表及说明

  • Q1:一开始没有把lena每轮减一,导致输出时字符串a后面带有最后个字符。
  • A1:后来在每轮让lena减去一解决了。同时还使得运行时间缩短了。
  • Q2:然后就开开心心地去交pta了,结果没过。到底哪里出了问题呢?根据pta的提示,发现了当自己的测试数据中的字符串中的字符有大量相同字符连续出现时,无法达到预期要求(在这种情况下,我的代码的输出只能会保留一个本应该被删去的字符)。
  • A2:在经过思考和测试后,终于解决了这个问题。在删除一次字符后,都让i-1,这样可以在不大幅修改代码的情况下达到要的效果。再次出现这种问题,确实需要反省,以后在测试自己的代码的时候应该再让自己的测试数据往更加全面,尤其是一些极端值,以及一些特殊情况(包括可能导致程序崩溃的情况)。

4.代码互评

从同学中找一篇优秀代码,和自己写的代码比较下,说明下自己和同学代码区别,各自优势是什么?

4.1 代码截图

谢晓淞同学的代码:

自己的代码:

4.2 二者的不同

1.相同的地方:都是以数组的思想来解决这个问题。同样对两种不同的情况进行特殊讨论。
2.不同的地方:我的代码所有功能全部集中在main函数中,而晓淞的代码用了函数封装,无论是代码可读性还是拓展性都比我的强,这点值得学习。但是他的代码有些地方可以优化,如数组和字符串的清零没有必要自定义函数来实现,可以借助string.h头文件中的memset函数来实现,可以减少代码行数,使得代码更加简洁美观。
如:

void ArrayClear(char a[])
{
	for (int i = 0; i < 1001; i++) a[i] = 'E';
}

这个函数直接调用库函数用下面的一句就行:

memset(a,'E',sizeof(a));

另一个函数同理。另外不同的是,我的程序的主要功能是用二维数组实现的,而他的是由一维数组实现的。事实上我的代码用的二维数组作用其实不是特别有必要,这点还需要改进。

posted @ 2018-12-08 18:55  super饭团君  阅读(330)  评论(0编辑  收藏  举报