一、PTA实验作业

题目一:简单的插入排序

题目1.本题提交列表

2.设计思路

定义整型变量N存放正整数的个数,X存放插入序列的数,index存放下标,i、j为循环变量
定义整型数组a[9]存放刚开始输入的序列,b[10]存放插入X后的序列
输入正整数N
for(i=0;i<N;i++)
    输入N个排列好的数
for(i=0;i<N;i++)
    用b[i]存放a[i]的数字
输入插入的数X
if(X==0)
    输出X
    return 0
for(j=0;j<N;j++)
    if(a数组最后一位小于插入的X)
        b数组的倒数第二位换成a数组的最后一位
        b数组最后一位为X
    else if(a数组有一位大于等于X)
        后一位的值换成这位的值
        这位的值换为X的值
        for(i=j+1;i<N;i++)
            将数组a剩下的数有序的放到数组b内
        跳出循环
for(i=0;i<=N;i++)
    输出数组b的值
    输出空格

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

问题1.没有考虑到X插在最后面的情况
解决方法:在输入X后加入判断最后一位与X的关系的代码
2.没有考虑到N=0的情况
解决方法:发现输出的结果变成了随机数,加入判断N=0的情况的代码

题目2:打印加法口诀表

1.本题提交列表

2.设计思路

定义整型变量repeat存放运算次数,n存放加数和被加数的最大值,add1存放加数,add2存放被加数,count1存放加数的行数,add2存放被加数的行数,循环变量i,j,k
定义整型二维数组a[10][10]存放和,b[10][10]存放加数,c[10][10]存放被加数
for(k=1;k<=repeat;k++)
    输入n
    for(i=0,j=1;j<=n;j++)
        将add1的值按坐标存入数组b内
        每次循环add1加一
    for(j=0,i=1;i<=n;i++)
        将add2的值按坐标存入数组c内
        每次循环add2加一
    for(i=1;i<=n;i++)
        for(j=1;j<=i;j++)
             将b数组与a数组的和存入a数组内
    输出加号后空三格
    for(i=0,j=1;j<=n;j++)
        if(count2==n-1)
        输出加数的值
        else
        输出加数的值后空三格
        每次循环完count1加一
    初始化count2的值
    输出换行
    for(i=1;i<=n;i++)
        for(j=0;j<=i;j++)
            if(count1==0)
                输出被加数的值
                每次循环完count1加一
                每次循环完count2加一
            else
                 if(count2==i)
                     输出和的值
                 else
                     输出和的值后空三格
                 每次循环完count1加一
                 每次循环完count2加一
    输出换行
    初始化count1的值
    初始化count2的值
初始化add1的值
初始化add2的值

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明
输出完加数后count2的值忘记初始化导致count2的值一直在累加,导致第二次输出的口诀表错误,在输出玩加数跳出循环后添加count2=0即可

题目3:杨辉三角

1.本题PTA提交列表

2.设计思路

定义整型变量n存放行数,i、j是循环变量
定义整型数组a[10][10]存放杨辉三角的值
输入正整数n
for(i=0;i<n;i++)
    每行的第一个数值为0
    每行最后一个数值为0
for(i=2;i<n;i++)
for(j=0;j<i;j++)
除首尾以外的数的值都等于上一行列数相同和列数加一的数的和
for(i=0;i<n;i++)
    for(j=0;j<=i;j++)
    输出数组a的值后空三格
    打印完一行的数后换行

3.代码截图

4.本题调试过程碰到问题及PTA提交列表情况说明

没注意到这个杨辉三角是直角三角形,是等腰三角形的变式,仍然用以前等腰三角形的做法打印数字,调试时将for循环里的条件从i=0改成i=2且删除判断空格个数的代码即可

二、截图本周题目集的PTA最后排名

三、同学代码结对互评

1.互评同学名称

徐宏伟

2.我的代码、互评同学代码截图

选取的题目:简单的插入排序
我的代码:
同学的代码:

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题

首先,我和宏伟的思路不一样,我是定义两个数组,一个输入序列,一个存放插入数字后的序列,判断X与序列数字的关系后再输出后一个数组;宏伟的思路是在一个数组内定义一个多一个单位长度的数组,判断输入的X和序列数字的关系,然后插入,后面的数字就不用继续判断,直接进行交换即可。其次,我在判断条件上显得很啰嗦,一一判断了无序列、插入在尾的特殊情况,没有宏伟判断条件的简洁方便,这是我的不足之处,如果让我选择,我会选择宏伟的代码,因为他的判断条件很巧妙简洁

四、本周学习总结

1.你学会了什么?

1.1C中如何存储字符串?

可以用getchar()循环将字符串输入数组内,如for(i=0;i<n;i++) str[i]=getchar(),也能用while((str[i]=getchar())!=‘\0’)存储字符串

1.2字符串的结束标志是什么,为什么要结束标志?

字符串的结束标志是‘\0’,‘\0’可以用来控制字符数组的输入与输出,控制循环

1.3字符串输入有哪几种方法?

1.使用gets()直接吸收整个字符串
2.定义数组和循环变量,用循环结构for(i=0;i<n;i++) str[i]=getchar()即可
3.while((str[i]=getchar())!=‘\0’)

1.4数字字符怎么转整数,写个伪代码?

定义整型变量number存放输入的数,i为循环变量
定义字符数组str[10]存放字符串
i=0
while((str[i]=getchar())!=‘\0’)
    每次循环完i的值加一
遍历整个数组
number=0
for(i=0;str[i]!=‘\0’;i++)
    if(str[i]>=‘0’&&str[i]<=‘9’)
        number=number*10+str[i]
输出number

1.5 16进制、二进制字符串如何转10进制?写伪代码?

十六进制字符串转换成十进制

定义整型循环变量i,k
定义字符数组hexad[80],str[80]
定义长整型变量number存放十进制数
i=0
while((str[i]=getchar())!=‘\0’)
    每次循环结束后i的值加一
遍历数组hexad[i]
k=0
for(i=0;str[i]!=‘\0’;i++)
字符数组str[i]输入的字符存在十六进制的字符
    数组hexad[k]存放str[i]的字符
遍历hexad数组
number=0
for(i=0;hexad[i]!=‘\0’;i++)
    如果数组hexad存放0~9的字符
    number=number*16+hexad[i]-‘0’
    如果数组hexad存放A~F的字符
    number=number*16+hexad[i]-'A'+10
    如果数组hexad[i]存放a~f的字符
    numbe=number*16+hexad[i]-‘a’+10
输出十进制的值number

二进制字符串转换成十进制

定义整型循环变量i,k
定义字符数组hexad[80],str[80]
定义长整型变量number存放十进制数
i=0
while((str[i]=getchar())!=‘\0’)
    每次循环结束后i的值加一
遍历数组hexad[i]
k=0
for(i=0;str[i]!=‘\0’;i++)
字符数组str[i]输入的字符存在二进制的字符
    数组hexad[k]存放str[i]的字符
遍历hexad数组
number=0
for(i=0;hexad[i]!=‘\0’;i++)
    如果hexad[i]不等于零
    number=number+pow(2,i)
输出十进制数number

2.本周的内容,你还不会什么?

预习时候被概念搞混了,现在明白绝大部分字符数组的定义要多储存一位‘\0’
之前看书不够认真疏忽了,进过做题和老师上课讲解记住了

  • PTA字符数组中有一题字符串的冒泡排序,不是很懂字符串的冒泡排序如何进行
  • 对于gets的用法还没有掌握得很好,总是使用不当造成错误

3.期中考试小结

3.1你认为为什么没考好?

  • 基础知识点疏漏,看书的时候知识点没有完全吸收,只是预习的时候翻一翻书,课后很少详细的去看书上的知识点,导致选择题速度慢得分低
  • 阅读程序能力不强,特别是改错题,得分率远远低于别人,这让我很头疼,可能是平时看同学的代码看得还不够多,脑袋没有形成一种框架,不知道易错点在哪
  • 离开编译器编写程序能力下降了很多,平时写的程序可读性还行,离开编译器完全就没有可读性可言,各种错误层出不穷
  • 第一次考试没把握好时间,没有将该得的分数全部拿下,反而在一些题目上耗着,赔了夫人又折兵

3.2罗列错题

  • 选择题第9题考查逻辑运算符的知识点,题目要求选择值为0的表达式,当时我对逻辑运算符的理解不深,导致这一简单题随便选丢了分。后来认真的看了一遍有关的知识点,明白了逻辑运算符&&和||相当于数学概念的交并集,之前选的(a1)&&(!b0)的值明显为1,而(a-1)&&!(b+b)&&(c-a)中的c-a的值不等于0所以整体的值为0
  • 填空题第四题中的1.0/(i*I)和我想的思路是一样的,可是表达出来就不一样了,我写成了pow(1/i,2)就变成了整型数,题目要是给小数会导致答案错误;科学计数法的1e-15不能够写成pow(10,-15)
  • 改错题第一题犯了很多低级错误,如scanf要加&和do while取余中while的条件应该为除数不等于0才能继续执行循环,这些问题考试的时候都没认真看
  • 编程题第一题中不知道怎么产生随机数,想起PTA中有一题是让我们手动输入的,就跟着那样的思路做了,时候才知道随机数rand()的存在和用法,令我印象非常深刻;当16级的学长在为我们讲课时给我们讲了一个小技巧,手写代码时可以先写出框架再填写内容,速度快效率高

3.3下半学期要怎么调整C的学习?

首先,我一个月前曾经说要少玩游戏,我做到了,整个十一月以来没有碰过网游,希望能够坚持到期末结束。这次的期中考试让我受打击,虽然达到了平均水平,但是仍然没有达到我考前定下的目标,我下定决心要多看书多翻书多敲代码多看代码,如果没有逼自己一把永远也不知道自己的潜力有多大,虽然感觉现在已经学得有点吃力,但是还是会咬牙坚持下去。再者,做PTA的题目偶尔会借鉴同学的代码,但是事后没有再反复看几遍或者过一段时间再自己检验一下能否敲得出来,导致脑海中储存的代码格式和一些巧妙的方法丢没有刻在脑海里,做题效率自开学降低了很多(虽然题目越变越难,有一点题目的关系),但是我还是觉得大部分的原因都源于自身的不够认真。就这样,下半学期认真学习!!!

 posted on 2017-12-02 22:05  Ljy1999  阅读(399)  评论(8编辑  收藏  举报