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

1.本章学习总结

1.1 思维导图

1474714-20181201101411717-1686882000.png

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

1.2.1 学习体会

  • 通过这几周数组的学习,掌握了数组相关的基础使用方法及相应题型的掌握;
  • 可以用static对数组进行赋0初值,而不必使用for语句进行操作,省略了很多麻烦;
  • 然后在写字符数组代码过程中,不能确定字符数组的长度,如果用for语句去计数也显得相对繁琐,于是网上查找相应代码解决,发现strlen函
    数就可以解决了
  • 数组题型难度较之前也明显提升,写代码耗时也相对增加,而写代码思路也显得很重要,有时候思路不清晰就会导致代码写到一半然后中途短路,
    这也加大了之后调试等的难度,首先给自己代码做简单注释可以使回头想问题时更快整理思路,另一点很重要的是必要时候可以在外面草稿纸
    或者文档上写下自己的思路,都是比较好的思路整理方法;

1.2.2 代码累计

1474714-20181201102729852-1116298324.png

2.PTA总分

2.1截图PTA三次题目集:一维数组、二维数组和字符数组共3次题目集的排名得分

一维数组
1474714-20181212164110032-1334088017.png
二维数组
1474714-20181201172505449-1972238436.png
字符数组
1474714-20181201172557630-1712342821.png

2.2 我的总分:

一维数组:200分
二维数组:105分    
字符数组:150分
总分:455分

3.PTA实验作业

3.1 PTA题目1

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

3.1.1 算法分析

定义整型变量n用于表示数组长度
定义num数组用于输入一串数据 
定义并初始化same数组使其数组中的每个单元都为零
定义flag用于判断数据是否有重复 
输入n
for i=0 to n do
    输入nu[i]
end for
for i=0 to n do
    same[num[i]]++    //same数组用于计数num数组中一些数的个数 
    if same[num[i]]==2 then   //如果same数组中这个单元等于2,则说明num中存在两个重复的数 
        flag=1
        退出循环
    end if
end for
if flag==0 then
    输出NO    end if
if flag==1 then 
    输出YES end if

3.1.2 代码截图

1474714-20181204120848413-2134592753.png

3.1.3 PTA提交列表及说明

1474714-20181204121014587-1688943601.png

  • Q1:在Dev中运行例子的那个结果正确,然后调到pta中发现答案错误;
  • A1:试了一组不含重复数组的例子,发现输出了两个NO,阅读代码发现是循环中已经有含NO的输出,跳出循环后仍然有NO的输出,对此进行更改;
  • Q2:更改后发现依旧是部分正确,且显示运行超时;
  • A2:想到可能是运用嵌套循环使循环次数大大增加,而数据一大则导致了运行超时,所以改成了像现在的一层循环的代码;

3.2 PTA题目2

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。

3.2.1 算法分析

定义n表示要输出n行n列的矩阵
定义二维数组num
定义i,j,k用于循环;flag用于判断矩阵中的数是否为鞍点;count用于计数鞍点个数 
输入 n
输入n行n列的num矩阵
for i=0 to n do
    for j=0 to n do
        for k=0 to n do
            if k!=i then 
                if num[i][j]>num[k][j] then
                    flag=0 退出循环
                end if/*如果在j列上有其他的数大于判断的数,则该判断的数不是鞍点,将flag赋值为0,跳出循环*/ 
            end if
            if k!=j then
                if  num[i][j]<num[i][k] then
                    flag=0 退出循环
                end if/*如果在i行上有其他的数大于判断的数,则该判断的数不是鞍点,将flag赋值为0,跳出循环*/ 
            end if
        end for
        if flag==1 then
            输出i,j 
            count++//每发现一个鞍点,count加1 
        end if 
        flag=1//每次k循环结束后,重新将flag赋值为0,一遍下一个数的判断 
    end for
end for
if count==0 then
    输出NONE /*如果计数为0,则说明矩阵中不存在鞍点,输出NONE*/ 

3.2.2 代码截图

1474714-20181205144911241-1702804206.png
1474714-20181205144953725-1250910434.png

3.2.3 PTA提交列表及说明

1474714-20181205145138299-762755172.png

  • Q1:刚开始编译可以就转入pta中提交,但有部分答案错误,答案显示第一个例子不正确;
  • A1:检查代码和审题发现,是比较行列最大数和最小数弄反了,做此更改;
  • Q2:再次提交发现依旧有“最大规模,有并列极值元素,最后一个是鞍点”答案错误的提示;
  • A2:分析发现并列极值不能看作是鞍点,所以更改判断条件,将等号省略即可;

3.3 PTA题目3

输入2个大数,每个数的最高位数可达1000位,求2数的和。

3.3.1 算法分析

定义op1和op2两个字符数组用于存放两个大数; 
定义num1和num2两个整型数组用于存放两个大数倒过来的数,便于相加; 
定义i,j用于循环;
在两个数组op1,op2中输入两个大数;
定义n用于存放字符串长度较大的那个长度数值; 
for i=strlen(op1),j=0 to i>=0 do
    num1[j]=op1[i]-'0' 
    i--;j++
end for /*将字符数字转化为整型数字,并且逆序 */
for i=strlen(op2),j=0 to i>=0 do
    num2[j]=op2[i]-'0' 
    i--;j++
end for /*将字符数字转化为整型数字,并且逆序 */
n=(strlen(op1)>=strlen(op2))?strlen(op1):strlen(op2);//判断两个字符数组的长度,并将长的数组长度赋值给n 
for i=0 to n-1 do
    num1[i]=num1[i]+num2[i];//将两个数组中同个单元的数相加并赋值给num1数组 
    if num1[i]>=10 then
        num1[i]-=10;
        num1[i+1]+=1;
    end if      /*如果数组中同个下标的数相加大10,则该下标的数减去10,并该下标加1单元的数加1*/ 
end for
if num1[n]==1 then  //判断num[n] 是否为1,如果为1则说明两个大数的最后两个数相加大于10,输出的数组长度应加1 
    for i=n to 0 do 
        输出num1[i]
        i--
    end for 
else do
    for i=n-1 to 0 do
        输出num1[i]
        i--
    end for
end if 

3.3.2 代码截图

1474714-20181205151816290-1679912489.png
1474714-20181205151845704-2029040231.png

3.3.3 PTA提交列表及说明

1474714-20181205150851927-883295482.png

  • Q1:这题在Dev C编译了好久,发现有一直答案错误;
  • A1:经过printf法调试(调试结果如图1),觉得num函数中的值已经将字符数组中的值逆序了;
  • Q2:继续编译下面内容发现依旧得不到正确答案,且发现最后输出值按正序输出依旧是正序结果;
  • Q2:这点引起我的注意,如果前面的值已经逆序的话,按理说后面输出值的时候再逆序才会回到正序输出结果;
    检查发现果然一开始的时候只是让数值从数组最后单元输出,并未让数组中的数真正逆序过来,对此进行改正;

图1
1474714-20181206093346840-1966443315.png

4.代码互评

4.1 代码截图

同学的代码(陈梓灿)

1474714-20181206212825814-574836101.png
1474714-20181206213510996-1683969919.png

我的代码

1474714-20181206213444943-392210914.png
1474714-20181206213355691-1522107072.png

4.2 二者的不同

  • 我们两个人的思路基本相同,都是先分别对首行和首列的数组单元进行赋值,在计算相应行列中间的数组单元的值,最后实现加法表的输出;
  • 在输出加法表的代码可见,同学的代码更少且更直观,而我的则更长,但清晰;
  • 输出代码中,同学的代码通过条件让a[0][0]值不进入循环,且控制了第一行的条件,实现一个嵌套循环即可输出加法表;
    而我的代码则先用一个嵌套循环输出第一行比较特殊的情况,再用一个嵌套实现后面几行的输出;
  • 同学的代码将输出代码后的赋给数组单元0的代码省略,也没有影响;我的输出代码的输出第一行的代码可以使用单层循环也可以实现;二者可以相应简化代码;

转载于:https://www.cnblogs.com/vanishzeng/p/10048487.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值