C语言博客作业--一二维数组

一、PTA实验作业

题目1.出生年

1. 本题PTA提交列表

  • 1232035-20171202093351979-756160741.png

    2. 设计思路

  • 1.定义数组r[10],后面用于存放位数
  • 2.如果年份小于10000,接下来使用memset让r[10]里的每个元素都为0
  • 3.让b存放year,i存放年份的个位,再用b存放去除个位的年份,再让r[i]等于1,循环直至b=0结束
  • 4.用一个for循环,定义一个整型sum求r[10]里所有元素的和,也就是求有几位数不相同
  • 5.如果继续判断year是否<1000且year%10!=0,说明这个年份不为10的倍数,最前面补充0被当做不同位,需要sum++;
  • 6.如果sum==n,跳出条件为sum!=n的从2开始的while循环结束程序并以%04d的方式输出,否则year++,count++(count计算与最开始的年份相差多少年份)
  • 补充:%04d是不足4位在该数前补0补到4位

    3.代码截图

  • 1232035-20171202095453870-319653412.png

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

  • 问题:部分正确,错在这里:1232035-20171202095624917-435599439.png
    这个地方出现问题,比如输入2013 3 ,2013被当做3位数字不同
  • 解决问题的方法:原先算法存在错误,一开始我是让2与0,1,3,比较,如果都不相同则让sum++,再让0与1,3比较,以此类推
    最后一个3就不判断,所以最开始sum为0,最后变为3,导致程序错误,所以后面改用r[10]数组存放(每次存放前数组里的元素都为0),
    比如2013为r[2]=1,r[0]=1,r[1]=0,r[3]=1,2011为r[2]=1,r[0]=1,r[1]=1,r[1]=1,有相同位数在数组里项数是一样的,最后将r[10]里所以元素相加,得sum(不同位数)

题目2.判断上三角矩阵

1. 本题PTA提交列表

  • 1232035-20171202101233167-32778000.png

2.设计思路

  • 1.输入T为待测矩阵的个数,n为n阶方阵,之后输入二维数组
  • 2.用falg=0作为判断是否为上三角矩阵的标记,先让flag=0,之后进入循环判断
  • 3.for(i=0;i<n;i++),for(c=0;c<n;c++) 遍历每个元素,if(i>c)中if(a[i][c]!=0)成立 说明下三角是否有不为0的数,有则标记flag为1
  • 4.最后判断flag,为0输出YES,为1输出NO

    3.代码截图

  • 1232035-20171202102000433-1315647.png

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

  • 问题:自己学术不精,认为对角线上有0存在的话就不为对角矩阵,所以特地写了算法判断对角线1232035-20171202102343808-716738948.png
    1232035-20171202102652026-1156314868.png

    发现PTA上是错误的
  • 解决方法:发现问题后与同学交流,了解对角线上有0也能是上三角矩阵,删除判断对角线的算法,答案正确
    1232035-20171202102851026-836138934.png

题目3.找出不是两个数组共有的元素

1. 本题PTA提交列表

  • 1232035-20171202103040198-981092269.png

2.设计思路

  • 1.读取两行一维数组
  • 2.让第一行数组里的每个元素与第二行的每个数组里的元素进行比较,有相同让flag=1
    每个数比较完之后,如果flag不等于1,说明该数与第二行数组的数都不相同,存入c[p]数组,p++;
  • 3.同理,第二行数组也是如此,将不相同的数存入c[p]数组,p++,c数组用于存放两个数组不相同的数
  • 4.遍历c数组,for(k=0;k<p for(j=0;j<k;j++)(这个循环是让c[k]与k项之前的元素比较)如果发现c[k]=c[j] 则跳过该项
    如果结束第二个循环发现j>=k的话,说明前面没有跟c[k]相同的元素,将它存放入d数组
  • 5.输出:最开始让mark为0,如果mark不为0,则输出“ %d”(数前带空格),如果mark为0(说明为第一次输出),则输出“%d”(数前不带空格),并让mark=1

    3.代码截图

  • 1232035-20171202105001120-1902490726.png

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

  • 部分正确:错在输出的时候,1232035-20171202105151261-1515390224.png
    发现最开始多输出了1个3
  • 解决方法:调试过程中发现输出第一个数后让mark=1,这样也能进入另一种输出方式,结果输出两个3
    1232035-20171202105942667-1846731558.png
    所以调换两个输出方式的位置
    正确:1232035-20171202110045136-1847135922.png
    错误:1232035-20171202110132886-1755166432.png

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

1232035-20171203155853022-1358523056.png

三、同学代码结对互评

1.互评同学名称

  • 熊志坚

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

  • 我的代码:1232035-20171202185925366-1716767617.png

  • 志坚的代码:1232035-20171202185657960-431646397.png

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

  • 不同:志坚同学用了一个二维数组,输出二维数组条件为for(i=0;i<n;i++) for(j=0;j<=i;j++),输出数的个数与行数和列数相同,同时还使用了#include<string.h>,memset函数将二维数组的数全部赋值为0,才能运算a[i][j]=a[i-1][j]+a[i-1][j-1]
    挺不错的,这点我不如他,否则a[i][j]的值不确定,无法实现,但是我也觉得麻烦,一开始定义static int a[100][100]也是能实现的1232035-20171202191528210-1714821915.png
    我用了两个一维数组,奇数行用a数组表示,偶数行用b数组表示,b数组的值用上一行a数组的值来表示b[j]=a[j-1]+a[j],同理a数组a[j]=b[j-1]+b[j],当j==i或j==0时,b[j]或a[j]=1,还有我是一行一行的赋值一行一行的输出,志坚同学是先全部赋值,再全部输出

  • 没有发现错误,代码挺不错的 ,我说实话我喜欢志坚同学的代码的风格,确实比我的好

    四、本周学习总结

    1.你学会了什么?

    1.1 C中如何存储字符串?

  • 字符串可以存放在一维字符数组中并以空字符‘\0’作为结束标志
    例如:static char s[6] = {‘H’,‘E’,‘L’,‘L’,‘O’,‘\0’};

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

  • 结束标志是‘\0’
  • 因为普通数组元素的个数是确定的,一般用下标控制循环,而字符串没有显示地给出有效字符的个数
    只规定‘\0’之前的字符为有效字符,所以通过判断字符是否为‘\0’来决定是否要结束循环

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

  • 三种种
  • 1.scanf("%s”,s),遇回车或者空格结束,并自动将'\0'输入字符串,字符串中不能带空格
  • 2.gets("%s",s),遇回车结束,并自动将'\0'输入字符串,字符串中能带空格
  • 3.for(i=0;s!='\n';i++) scanf('%c",&s[i]),循环结束后s[i]=‘\0’,字符串中能带空格

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

  • 1.先输入所有数字字符op存入字符数组a
  • 2.再运用算法(number为int型)number=op-‘0’,再把number存放入普通数组b

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

    二进制:
  • 1.将字符串存放入字符数组a,sum=0;
  • 2.将字符串里的每个字符进行sum=sum*2+a[i]-'0'累加累乘求和,直至a[i]=‘\0’结束,输出sum
    十六进制:
  • 1.将字符串存放入字符数组a,sum=0;
    -2. 判断字符串里的每个元素是否为十六进制数
    if(a[i]>='0'&&a[i]<='9') sum=sum16+a[i]-'0';
    if(a[i]>='a'&&a[i]<='f') sum=sum
    16+a[i]-'a'+10;
    if(a[i]>='A'&&a[i]<='F') sum=sum*16+a[i]-'A'+10;
    直至a[i]=‘\0’结束,输出sum

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

  • 课堂派字符数组第14题,1232035-20171202114337448-899894324.png
    k值为2,n[k]不是超出了定义数组的范围了吗? 为什么还是值是2?
  • 当调用函数时,实参是一个数组名,则向函数传送的是数组的首地址,不是数组每一个元素的地址。

    3.期中考试小结

    3.1你认为为什么没考好?

  • 1.考前没有仔细复习
  • 2.基础知识还是不够扎实,面对问题需要思考较长时间
  • 3.概念题几乎全军覆没,对概念知识需要全面巩固
  • 4.粗心

    3.2 罗列错题

  • 选择题:第四题
    1232035-20171203124308429-213938357.png

    错因:字节和数的概念模糊不清
    1.字节通常用英文单词“bit”来表示,有时也可以写做“b” 改: bit是比特,Byte才是字节,也可以写做B
    2.目前广泛使用的Pentium机其字长为16个字节 改:为32个字节
    3.计算机中不是所有数的运算均为补码计算 正确 :逻辑运算就不为补码计算
    4.计算机的字长并不一定是Byte的整数倍 改:一定是Byte的整数倍

  • 填空题:第三题:
    1232035-20171203124332429-47635233.png

    错因:以为之前的代码中有输入语句
    改:((ch=gerchar())!='\n')
  • 改错题:第二题:
    1232035-20171203124516866-1601749975.png
    1232035-20171203124530038-107187039.png

    错因:没看清题,以为之前做过类似的题目直接下手,认为是n++;
    改n++为n+=2;
  • 编程题:第三题:从n个不同的数中取r个数的所有选择的个数。其个数值为:
    1232035-20171203124554101-1485681194.png

    错因:定义函数时用返回值为int型,其他大体对
    改正:将返回值改为double型

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

  • 下学期有几门课已经考完试了,所以有较多的时间可以花在C语言上,贯彻两全精神,全力以赴,全神贯注,话不多说,用行动证明!

转载于:https://www.cnblogs.com/wlgczjw/p/7953826.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值