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

本文详细解析了PTA实验中的三个编程题目:简化版插入排序、出生年计算和个人加法口诀表。针对每个题目提供了设计思路、调试过程及代码实现,同时分享了学习心得与总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、PTA实验作业

题目1.简化的插入排序

1. 本题PTA提交列表

1231987-20171203154358788-967516299.png

2. 设计思路

定义数组a[10],x为插入的整数,n存放n个整数,i为循环变量,temp为中间值;
输入数据n
for(i=0;i<n;i++)
    将输入的数据赋值给数组元素
输入要插入的数x
for(i=0;i<n;i++){
    如果x<a[i],
        temp=a[i];
          a[i]=x;
        x=temp;
}
循环结束后将最后一个值赋给a[i] 
for(i=0;i<n+1;i++)
    输出数组元素  

3.代码截图

1231987-20171203152631976-1492320181.png

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

①初步代码,3插入序列中,但最后一个7输出错误。
1231987-20171203152839444-490790193.jpg
1231987-20171203153533538-1947506548.png

②初步改正,循环结束后将x赋给最后一个数组元素,题目中一组数据验证正确。
1231987-20171203153704960-830490295.png

③贴到pta中,提示错误,将0和8代入验证发现错误。
1231987-20171203154000804-974831948.png
1231987-20171203154018569-1184245141.jpg1231987-20171203154057538-414314409.jpg

④最后一个数组元素赋值错误,应该将x赋值给它,而不是temp。
1231987-20171203154247147-935554882.jpg
1231987-20171203154420882-556857729.png
⑤修改后验证正确。
1231987-20171203154630897-1735579359.png

题目2.出生年

1. 本题PTA提交列表

1231987-20171203155107929-1612257990.png

2. 设计思路

定义数组a[4],循环变量i,j,year1,year2备份年份,old为岁数,year为年份,n为规定不同数字个数,count存放实际不同数字个数;
赋值count=4; 
输入年份year,不同数字个数n;
备份year,year2=year;
while(year2>0){
    备份year2,year1=year2;
    for(i=0;i<4;i++)
        将年份的各位数赋给数组元素;
    for(i=0;i<4;i++)
        for(j=i+1;j<4;j++)
            算出不同数字的个数:
            如果a[i]==a[j],count--;跳出循环;
    如果count==n
        年龄old=year2-year;
        输出年龄和年份;
        跳出循环;
    否则
          年份year2递增继续循环 
        count重新赋值为4进行循环 
} 

3.代码截图

1231987-20171203155119882-1680791554.png

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

①初步代码,输出结果错误。
1231987-20171203161040210-788448713.jpg

②先修改输出格式,上网查询了如何在输出结果前加上0并初步修改代码。
1231987-20171203161138413-1000215875.png
1231987-20171203161220054-37947654.png

③初步修改后输出格式正确,但答案错误,通过调试发现数组元素为0时反复比较,使count重复递减。
1231987-20171203161915288-1476452577.jpg
1231987-20171203161935694-108154747.png1231987-20171203161946569-1227717129.png1231987-20171203161958069-1912744946.png

④应该在比较a[i]等于a[j],count减一后跳出循环进行下一组数据的比较,同一个a[i]与几个a[j]比较会使count递减重复进行。
1231987-20171203162407226-568686473.jpg

题目3.加法口诀表

1. 本题PTA提交列表

1231987-20171203163632319-1515174971.png

2. 设计思路

定义数组a[11][11],i,j,k为循环变量,n为整数个数,repeat为循环次数;
输入repeat;
for(k=1;k<=repeat;k++){
    输入n表示整数个数
    for(i=0;i<=n;i++){
        for(j=0;j<=n;j++){
            如果i==j==0,输出加号;跳过后面的语句继续循环
            如果是第一行的加数,
                a[0][j]=j
            否则,
                如果是第一列的被加数, 
                    a[i][0]=i
                否则 
                    a[i][j]=i+j
            如果是下三角的数或第一行的数, 
                如果是一行的最后一个数,输出每行最后一个数后面没有空格
                否则,输出数组元素,占四列
        }
        输出换行
    } 
} 

3.代码截图

1231987-20171203163715663-783534413.png

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

①初步代码,输出答案错误。
1231987-20171203173114101-625150106.jpg

②调试后发现在输出加号后程序继续进行并输出,此处错误。
1231987-20171203173223272-1930477109.jpg

③加上break使程序在输出加号后跳出此循环继续下一个循环,发现改完后第一行的加数没有输出。
1231987-20171203173332913-456256712.jpg
1231987-20171203174132069-903361773.jpg

④把break改成continue,仅跳过后面的语句,不跳出循环,改完后输出正常。
1231987-20171203173453444-991895997.png

⑤提交后提示格式错误,于是在每行最后一个数的输出后面加#号输出,发现第一行最后一个数没有考虑到。
1231987-20171203174149788-1632473134.jpg

⑥代码中加上第一行最后一个数后面不加空格的条件。
1231987-20171203174512741-1303201611.jpg

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

PTA排名

1231987-20171203174836538-1434829994.png

PTA提交列表

1231987-20171203174853679-644649575.png
1231987-20171203174901491-767529086.png

三、同学代码结对互评

互评同学名称:田亚琴
互评题目:出生年

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

我的代码

1231987-20171203193338226-909188663.png

同学的代码

1231987-20171203195425194-2070918646.png

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

不同:
①将年份的各位数赋给数组元素中。田亚琴同学的是通过一个个算出后赋值;我是通过循环得出后赋值。
②找出有几个数字不同中。田亚琴同学另外定义一个数组存放0~9的数,再统计出现不同数字的个数;我是通过双重循环统计相同数字的个数。

各自优势:
我目前还比较少碰到需要定义两组数组的题,田亚琴同学的思路值得学习,比如a[num[i]]++的用法。

四、本周学习总结

1.你学会了什么?

1.1 C中如何存储字符串?

字符串可以存放在一维字符数组中。

  • ①字符串的储存——数组初始化
    例:static char s[6]={'H','a','p','p','y','\0'};static char s[6]={''Happy''};
    static char s[6]=''Happy'';
  • ②字符串的储存——赋值和输入
    例:static char s[80]; s[0]='a'; s[1]='\0'; static char s[80]="a";

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

  • 结束标志:'\0'
  • 字符串没有显式地给出有效字符的个数,只规定在字符串结束符'\0'之前的字符都是字符串的有效字符,一般通过比较数组元素的值是否等于'\0'来决定是否结束循环,即用结束符'\0'来控制循环。

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

  • ch=getchar();
  • scanf("%s",s); //假设s为字符型数组
    注:该函数遇回车或空格输入结束,并自动将输入的数据和字符串结束符'\0'送入数组中。
  • gets(s);
    注:函数gets()输入的字符串允许带空格,遇回车输入结束。

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

定义字符数组str[10],number为输入的数,i为循环变量;
赋值i=0;
while((str[i]=getchar())!='\0')
    i++;
    遍历数组str[i]
赋值number=0;
for(i=0;str[i]!='\0';i++)
    如果str[i]>='0'&&str[i]<='9'
        number=number*10+str[i];
输出number;

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

16进制字符串转10进制
定义变量number存放十进制数,a [ i ]存放十六进制字符串,i为循环变量;
number=0;
for( i=0 ; a[i]!='\0' ; i++);
    如果a[i]为字符0~9:number=number16+a[i]-'0';
    如果a[i]为字符A~Z:number=number16+a[i]-'A'+10;
    如果a[i]为字符a~z:number=number*16+a[i]-'a'+10;
输出十进制数number;
二进制字符串转10进制
定义数组str[80]存放2进制数,number存放十进制数,i为循环变量;
i=0;
输入字符串 
while((str[i]=getchar())!='\0')
    i++;
    遍历数组str[i]
赋值number=0;
for(i=0;str[i]!='\0';i++)
    number=number*2+pow(i,2)
输出十进制数number

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

PTA
图书馆一题,对题意的理解还不太清晰,没想出具体思路,因此还没写。

课堂派
预习时对字符串的输入输出方式等一些知识点没有理解透,导致改错题时有的明显错误没改出来。
比如题目提示有多个单词,单词之间有空格隔开,因此应该用gets(sent)。

1231987-20171203200621897-589603808.png

3.期中考试小结

3.1 你认为为什么没考好?

  • 平时做题过于依赖编译器,自己寻找代码错误点及手写代码的能力不足,在平时课堂互动时手写代码就有困难,但平时做题都用devc可以调试,所以没太注重这个问题,到考试时写编程题就力不从心。
  • 选择题中考到的一些基础知识点不熟悉,比如进制转化、基础概念。导致选择题花的时间多,正确率不高。
  • 平时做课堂派的预习作业时,碰到一些要求填写输出结果的题,遇到不会做的就把代码打到devc中运行出结果,缺乏自身的思考,因此这次期中考分析程序的题目耗时长,得分低。
  • 第一次考试,对如何分配时间没有一个正确的概念,到编程题时没时间写。

3.2 罗列错题。

  • 选择题
    不熟悉运算符的用法,本题中结合方向应该是从右向左。
    1231987-20171203220846851-1772254200.jpg

  • 分析程序
    ASCII码不熟悉,本题中输出的应该是ASCII码对应的大写字母,而我输出的是ASCII码。
    1231987-20171203221920944-2022944800.jpg

  • 阅读程序填空
    没有认真思考,t为double类型,i为int类型,因此应该是1.0不是1。
    1231987-20171203222336304-1041491713.jpg

  • 改错题
    分析程序时间花太多,本题改错题没用太多时间看,因此有些错误点没找出来。
    正确答案
    1231987-20171203223042851-1275195011.jpg
    1231987-20171203223242147-1552107152.jpg
  • 编程题
    不知道如何做到产生随机数,写代码的时候没有先写伪代码打草稿,写出来的代码拼拼凑凑也没有注释。
    1231987-20171203223652413-982195415.jpg
    1231987-20171203232448038-1897898114.jpg
    1231987-20171203232458772-2116120101.jpg

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

  • 逐渐锻炼阅读代码的能力,在做课堂派预习作业时,尽量自己阅读代码得出结果,实在不会再用devc运行,得出结果后再此阅读代码验证答案,如果还不懂可以借助调试器观察其变量变化过程。
  • 经常翻看博客园中的知识总结,巩固书中的基础知识、概念。
  • 尝试写代码前先写在纸上,再打到devc中运行,锻炼手写代码的能力。

转载于:https://www.cnblogs.com/smtwula/p/7966250.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值