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

7-3 出生年:

1. 本题PTA提交列表:

2. 设计思路:

定义控制变量i,j,k,年份year,不同数字个数n,年份取代值digit,统计相同个数变量same;用sum=year+i;累加年份,用digit记录sum的值digit=sum;count=digit%10;a[j]=count;digit=digit/10,存放每个位的数字,对sum重新赋值same=0;将a[i]遍历数组,即嵌套循环for(k=0;k<4;k++)for(j=k+1;j<4;j++)如果(a[k]a[j])则same++;
如果(same
1&&n3)break;
如果((same
3||same2)&&n2)break;
如果(same0&&n4)break;
如果(same6&&n0)break;
输出i的值;
用循环for(j=3;j>=0;j--)依次逆序输出年份;

3.代码截图:

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

  • 1.一开始没注意到循环条件的自相矛盾,写成for(i=0;i>=0;i++),导致怎么也进不了循环内,后来在同学和老师帮助下改正;

  • 2.把digit=digit/10写成count=count/10;

  • 3.后来提交PTA时,发现n=2时错误,自己怎么也弄不懂为什么错,因为答案输出和sample一样,在同学帮助下终于知道了自己少写了一种情况,即same=2时,刚好也有两个不同的情况,而自己只考虑了3个相同时2个不同的情况,这是考虑问题不周全引发的错误;

7-2 求整数序列中出现次数最多的数:

1. 本题PTA提交列表:

2. 设计思路:

定义控制变量i,j,max存放最大值,,n为输入整数的个数,a[1000]存放整数,count2存放出现次数最多的数,count1统计统计每个整数出现的次数;
输入n,scanf("%d",&n);
循环输入整数存入数组a[1000],for(j=0;j<n;j++)scanf("%d",&a[j]);
令最大值为a[0],max=a[0];
for(i=0;i<n;i++) 令count1=0;
统计出现次数最多的数
for(j=0;j<n;j++)
如果(a[i]a[j])则count1++;
如果(j
(n-1)&&count1>count2)则 count2=count1;max=a[i];
输出"%d %d",max,count2”;

3.代码截图:

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

  • 1.一开始把统计次数的循环for(j=0;j<n;j++)写成for(j=i+1;j<n;j++),调试发现这样会使得统计数本身没有统计到,开始时以为干脆把每个数都从头到尾统计一遍就行,现在发现了一种更高效的做法,即写成for(j=i;j<n;j++),这样的话虽然不是每个数都会被完整统计一遍出现次数,只有那个数在出现第一次时才会完整统计个数,但依然可以得出出现次数最多的数

  • 2.如果条件满足(j==(n-1)&&count1>count2),则 max=a[i];而不是max=a[j];a[i]才是拿来比较的那个数,a[j]是用来将数组遍历一遍的数;

7-6 阅览室:

1. 本题PTA提交列表:

2. 设计思路:

定义time1[1001],time2[10]={0},time1存放初借书数间,time2存放不同天数借书的总时间,将time2的元素全归0;
定义count[10]={0},day,i=0,book=1,其中count统计不同天借阅总次数;
定义h和m,记录时间的时和分;定义ch;
输入day;
while(i<day)
输入("%d %c %d:%d",&book,&ch,&h,&m);
如果(ch'S'&&book!=0)则time1[book]=h*60+m;这是记录不同书号开始借的时间
如果(ch
'E'&&book!=0&&time1[book]!=0)则time2[i]=time2[i]+h60+m-time1[book]; count[i]++;当天借阅时间总和;
当book!=0时执行以上循环;
i++;
for(i=0;i<day;i++)
如果(count[i]==0)输出"%d %d\n",count[i],0;
否则输出"%d %0.f\n",count[i],time2[i]
1.0/count[i];

3.代码截图:

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

  • 1.如果要将time1[1001]归0,则需用循环来做,而不是像初始化定义那样令time1[1001]={0};
  • 2.scanf("%d%c%d:%d")时%d和%c之间要空格,即scanf("%d %c %d:%d");
  • 3.i此时是0,所以while(i<=day)改为while(i<day);
  • 4.time2[i]=h60+m-time1[book]改为time2[i]=time2[i]+h60+m-time1[book],这样才能做到累加;

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

三、同学代码结对互评

李琴的代码:

我的代码:

1.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?

  • 1.这题是7-4 简化的插入排序,我的代码主要是设置了两个数组,用数组a重新排列后给数组b赋值,而李琴的代码主要是插入排序法,我觉得她的代码比较简洁,但是不大容易理解,我的代码相对复杂,但可能更容易理解,但还是比较喜欢简洁的风格;

四、本周学习总结:

  • 1.1 C中如何存储字符串?
    存储方式和数组差不多,都是一个字符对应一个存储单元,最后一个一定是0;

  • 1.2 字符串的结束标志是什么,为什么要结束标志?
    是‘\0’,因为对字符数组的操作只能针对有效字符和字符串结束符,所以需要通过检测字符串结束符来判断是否结束对字符的操作;

  • 1.3 字符串输入有哪几种方法?
    方法一:char str[80]="HAPPY";
    方法二:s[0]='a';s[1]='\0';
    方法三:while((str(i)=getchar())!='\n')i++;str[i]='\0';

  • 1.4 数字字符怎么转整数,写个伪代码?
    number=number*16+hexad[i]-'0';

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

    1. 这一部分内容不熟练;

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

  • 1.字符转数值还不大懂;
  • 2.当使用选择排序法时,第一个循环的k应<n-1,即最后一个数不需要再进行筛选;
  • 3.while(i<n){if(a[i]>a[i-1])i++;}这样的输入可以确保输入的值是有序的;
  • 4.课堂派数组复习作业第4题没有看到a[0]已经单独输入一次,以为只能输入4个数值,导致错误;
  • 5.总是忘记字符串是以‘\0’结束这一重要前提,以后要时刻牢记,特别是做程序填空题时,可能会直接if(str[k+1])来判断是否进入条件,而这恰恰是通过是否读取‘\0’来判断的;
  • 6.忘记赋初值是填空和改错重要考点;
  • 7.第6题把a[i]>a[j]写成a[i]<a[j],执行条件判断错误,a[i]是前面的数,如果比后面小是应该的,如果比后面大则要进行交换;
  • 8.第7题开始时没弄清程序要我们干嘛,现在回头再看,发现程序就是把两个字符串合并,这个做法很值得学习,如下:i=0;j=0 ; while(c1[i]!='\0')i++;while(c2[j]!='\0')c1[i++]=c2[j++]
  • 9.输入字符串的格式不是很熟练,while((c=getchar())!='#'),错的原因是忘记在c=getchar()外面再加一个括号,这一点老师有在课堂上强调,但可能没注意听,反映了我的听课效率还很低;
  • 10.第8题第二个空为什么要填i+65?
  • 11.第9题输入字符串的格式不是很清楚,判断循环条件时没看出错误,题目的目的是将字符串遍历一遍,所以又要利用字符串以‘\0’结束这一特性,即for(i=0;sent[i];i++);
  • 12.当发现循环控制变量没有变化时,可以让其自加;第9题的正确答案sent[j]=‘\0’可以改成sent[i+1]=0吗,'\0'不是和0等价吗,i和j就差1,这样可以吗?
  • 13.对于将数组应用于函数,传参这一方面很生疏;
    详细罗列不明白地方,包括课堂派错题、PTA错题。

3.期中考试小结

3.1 你认为为什么没考好?

  • 1.平时对概念马马虎虎,一知半解,从函数开始知识点开始渐渐多了起来,不下意识取记忆和整理根本就没法完全掌握,以前的知识点要不断复习巩固,温故知新,PTA题目要扎实完成,一步一个脚印;

3.2 罗列错题。

请在选择题、填空题、改错题、编程题分别举一题说明为什么错了,怎么改?

  • 1.选择题第6题:错选C,正解B,因为C少了一个分号没注意,逻辑运算符==优先级大于赋值运算符,所以先算右边,真时为1,假时为0,再赋值给左边变量;
  • 2.分析程序第一题因为马虎没有看到前面几个数字也要输出;
  • 3.填空题定义完函数后要加分号;实参不需要int,欧几里得的辗转相除法的最大公约数最终是取商而不是余数;

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

  • 1.改善预习质量,做到老师未布置作业前先预习,等预习作业发布时再将书本看一遍理解会更透彻;
  • 2.经常复习巩固以前学过的知识,做到融汇贯通;
  • 3.每天都要做几题代码题,提升敲代码的效率;
  • 4.老师发布的课件要及时看,不懂的知识点及时巩固;
  • 5.敲代码前可先在纸上写一遍,有助于提升手写代码的质量;
posted @ 2017-12-03 22:44  哟呵~  阅读(333)  评论(2编辑  收藏  举报