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

一、PTA实验作业

题目1:7-3 出生年

1. 本题PTA提交列表


2. 设计思路

  • 定义循环变量i,year变化年份,year1出生年份,不同数字n,count不同数字数;
  • 定义数组num[4],a[10]={0},num[4]放对应数字及其个数,a[10]={0}年份不同的各数字;
  • 输入: scanf("%d %d",&year,&n);
  • 令 : year1=year;
  • 进入while()求出年份里4个数字并存于num[],如: 第1个数字 num[0]=year/1000 ;
  • for(i=0;i<4;i++) a[num[i]]++;得出的数字用a[]下标计数出现次数;
  • 判断: count==n ?,与 n 相同,跳出整个程序循环;
  • 否则: for(i=0;i<10;i++) a[i]=0; count=0;所有的记录清0,重来;year++;年份递增继续找,直到找到为止;
  • 最后:输出结果 printf("%d %04d",year-year1,year);

3.代码截图

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

  • 答案错误,年份没有实现并输出递增;
  • 在输出格式上出问题,需要补零时就不对,解决方法:在前面加上0,成04d进行尝试,解决;
  • 部分正确,最小边界0没考虑,当输入0时,答案错误,调试发现一开始数组a[i]的数不为0,已错误,说明数组a[i]需要数组初始化,才能保证数值正确开始,解决;


题目2:7-4 简化的插入排序

1. 本题PTA提交列表


2. 设计思路

  • 定义正整数变量N,插入变量X,循环变量i;
  • 定义整型数组a[9]放N个有序数列;
  • 输入N:scanf("%d",&N);
  • 输入N个排好序的整数:for(i=0;i<N;i++),scanf("%d",&a[i]);
  • 输入插入的数X:scanf("%d",&x);
  • 假设x于最后:a[N]=x;
  • 将x与N个整数从最后一位开始比较插入:for(i=N-1;i>=0;i--)
  • 判断如果a[i]比x大,x继续往前走比较,后面的数就进行覆盖退:if(a[i]>x) a[i+1]=a[i]; a[i]=x;循环;
  • 输出新的有序整数序列:for(i=0;i<N+1;i++);
  • 保证最后没有空格:if(i==(N-1)) printf("%d ",a[N-1]); else printf("%d ",a[i]);

3.代码截图

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

  • 答案错误:
  • 部分正确:对于N的多种情况解答不正确,中间还有为0时的格式错误,用#号检验又发现答案里多了7,还有空格问题,直接把最后一个单独考虑:

题目3:7-9 判断上三角矩阵

1. 本题PTA提交列表

2. 设计思路

  • 定义循环变量i,j,k,标志变量flag=1,矩阵个数T;
  • 定义整型数组a[10][10]确定矩阵规模;
  • 给定矩阵个数: scanf("%d",&);
  • 依次判断T个矩阵: for(k=1;k<=T;k++)
  • 输入矩阵行列大小:scanf("%d",&n);
  • 读入矩阵的数据:for(i=0;i<n;i++){for(j=0;j<n;j++){ scanf("%d",&a[i][j]);}}
  • 开始判断上三角矩阵:for(i=0;i<n;i++){for(j=0;j<i;j++)
  • 找主对角线以下的元素是否为0:if(a[i][j]!=0)
  • 判断: 若是则标志变 flag=0;否则:flag=1;
  • 最后根据标志得出结果:if(flag==1) printf("YES\n"); else printf("NO\n");

3.代码截图

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

  • 某个循环出现错误,判断变为连续输出,将数组循环一次就进行判断,然后进行下一次;
  • 最小n=1时判断出错,解决方法:在判断时对不符合题目要求的另行标志;

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

三、同学代码结对互评

1.互评同学名称:陈欢

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

我的代码:

同学代码:

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

  • 她的代码多次使用 if 结构来判断多种情况,一个个列出来考虑,然后从前往后找并插入;我的直接把要插入的数放在最后,从最后开始找再插入,避免多次判断;
  • 我更喜欢自己的代码,相对来说会比较简洁,程序不会看起来很复杂,但是她的代码是比较容易想到的,在一开始会较快的到解题思路;

四、本周学习总结

1.你学会了什么?

1.1 C中如何存储字符串?

  • 使用一维字符数组存储字符串,如:auto char str[ ] = "hello";

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

  • '\0' 是字符串结束符,控制循环是否结束,若没有 '\0’ ,字符串不能正常结束;

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

  • 1、使用函数scanf( ),如:scanf(“%s”,s);注意scanf("%s",&s)是错误的,因为数组名即表示数组的首地址,所以不能再加地址符&;遇空格或回车输入结束,自动将输入数据和字符串结束符'\0'送入数组,scanf函数不会对写入数组数据进行是否越界检查,只能输入不带空格字符串,scanf不能接受空格、制表符Tab、回车等;
  • 2、使用gets( )函数,如:gets(s);遇回车输入结束,不会对写入数组的数据进行否越界的检查,自动将输入数据和字符串结束符'\0'送入数组,允许带空格字符串的输入,gets能够接受空格、制表符Tab和回车;
  • 3、循环输入;注意后面要加一个语句 s [ i ] = '\0',否则字符串不能正常结束,影响后续操作;

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

1.定义循环变量i,整数变量number,字符数组char a[10];
2.初始化i=0;
3.如果a[i]=getchar()!='\n',i++;a[i]!='\0';
4.清零:number=0;
5.循环:for(i=0;a[i]!='\0';i++)
6.转换:number=number*10+a[i]-'0';

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

十六进制转十进制
1.定义变量number=0存放十进制数并清零,a [ i ]存放十六进制字符串,循环变量i;
2.for( i=0 ; a[i]!='\0' ; i++);
3.若a[i]为字符0~9:number=number16+a[i]-'0';
4.若a[i]为字符A~Z:number=number16+a[i]-'A'+10;
5.若a[i]为字符a~z:number=number*16+a[i]-'a'+10;
6.输出十进制数number;

二进制转十进制
1.定义变量number=0存放十进制数,a[i]放二进制字符串;
2.循环: for(i=n-1;i>=0;i--);
3.转换:number=number+a[i]*pow(2,n-1-i);
4.输出十进制数number;

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

  • 数组这块总体来说,从写PTA里发现存在很多问题,首先一开始对于数组定义会出错,会把变量直接写到数组[ ]内,说明一开始就对数组是不理解的;
  • 写题目时,数组的应用不熟悉,尤其是利用二维数组写矩阵这类题目,加上又要利用行、列下标找规律,若不理解好题和操作,就容易不会编写;
  • 还有数组的控制范围,课堂派里有道题,在i<N与i<N-1上错误,老师课上有提到,但仍不太清楚,感觉若 i <N-1会差一个数?
  • 还有对于重点强调的几种排序问题,冒泡法还不熟;

课堂派错题:统计从终端输入的字符中每个大写字母的个数,用#号作为输入结束标志,填空;
int num[26],i; char c;
for(i=0; i<26; i++) num[i]=0;
while( 【1】 != '#')/统计从终端输入的大写字母个数/
if( isupper(c)) num[c-65]+=1;
for(i=0; i<26; i++)/输出大写字母和该字母的个数/
if(num[i]) printf("%c:%d\n",【2】, num[i]);
我的作答: num[i] i
参考答案: (c=getchar()) i+65
改正:先要保证读入正常,还有字符间的转换

  • PTA不会的题:7-6 阅览室
    这题一开始思路就是不清晰的,借书还书,再加上要对时间和借阅人数的计数,会出现很多地方不能实现,里面要使用到switch( )等的写法,不止有数组,没理清题目写出来的程序也会是混乱的;

3.期中考试小结

3.1 你认为为什么没考好?

  • 第一:考前的复习不到位。没有针对前面学习过的知识进行整体复习;
  • 第二:平时对于C语言的学习不够。除了布置的预习作业看书,老师上课,就直接开始了PTA上紧张的答题,没有先对知识巩固理解,PTA上写了的题很多没有真正弄懂,写题目就经常犯错,然后盲目修改,就算是考到相似的题,因为课下没有好好整理至完全弄懂,到了考试遇上就还是不会,试卷上的填空题与选择题就可以知道基础的知识点没有掌握;
  • 第三:基础不扎实。这一点老师在一对一的了解中就直接点出,对于阅读代码的能力不够,改代码错误因为不扎实的编码就很难改出来,有时甚至把正确改成错的;
  • 第四:对考试时间没分配好。后面的手写代码时间很赶,基本没法得到分数;
  • 第五:习惯性错误。程序里一些小细节在手写,离开编译器帮忙查错后就容易出错,因为习惯编译器提醒再改,并没揪出记住,考试时就会顺着原来的错点写下去;

3.2 罗列错题

选择18题(考点:运算符优先级)

设字符型变量x的值是057,表达式"~ x ^ x << 2 & x"的值是(A);
A、0374 B、374 C、x2C D、020

解析:

  • ~最高,其次<<,其次&,其次^ ;
  • 057是八进制,转成2进制:00101111;
  • 先算~x,按位取反:11010000;
  • 再算x<<2,左移2位,00101111<<2:10111100;
  • 然后x<<2的结果和x执行&按位与,10111100&00101111:10010011;
  • 最后~x的结果与10010011按位异或,11010000^10010011:即为011111100,即为8进制0374;
  • 选A

填空10题(实型常量、程序理解):用公式ππ/6=1/11+1/22+1/33+。。。+1/n*n,求出π的值,直到最后一项小于1e-15;

double sum=0, pi,t;
int i=0;
do{
t=【9】;
sum=sum+t;
i++;
}while(【10】);
pi=sqrt(6*sum);
printf("pi=%.101f,n=%d\n",pi,i);

  • 我的答案:1.0/pow(i,2) sum>=1e15;
  • 参考答案:1.0/pow(i,2) t >=1e-15;

解析:科学计数法表示,书本125页,如6.01x10^(-27)可表示为6.01E-27,也可表示为0.601e-26;

编程2题:求解一元二次方程

代码:float a,b,c;
double delta, re, im;
scanf("%f,%f,%f",&a,&b,&c);
if (a0&&b0) printf("方程无根\n");
else if(a==0) printf("方程有一个根:%.6lf\n",-(double)c/b);
else{
delta=bb-4ac;
re=-(double)b/(2
a);
im=sqrt(fabs(delta))/(2*a);
if (delta<0){
printf(" 有 两 个 不 同 复 根 x1=%.6lf+%.6lfi ,x2=%.6lf-%.6lfi \n",re,im,re,im); }
else if(delta>0){printf("有两个不同实根:");
printf("x1=%.6lf,x2=%.6lf\n",re+im,re-im);}
else

解析:设计思路

  • 头函数包含数学<math.h>;
  • 定义实型变量float,double delta公式符,re,im表实根,整型变量a,b,c表方程系数;
  • 输入:scanf("%f,%f,%f",&a,&b,&c);
  • 判断:a=0且b=0时,输出方程无根;
  • 当a=0且b!=0时,方程有一个根,输出:printf("%.6lf\n",-(double)c/b);
  • 若两者均不满足,采用公式法:delta=bb-4ac;re=-(double)b/(2a);im=sqrt(fabs(delta))/(2*a);
  • 判断:if(delta<0),printf(" 有 两 个 不 同 复 根 x1=%.6lf+%.6lfi ,x2=%.6lf-%.6lfi\n",re,im,re,im);
  • 若(delta>0),输出有两个不同实根:printf("x1=%.6lf,x2=%.6lf\n",re+im,re-im);
  • 否则:printf("有两个相同实根:%.6lf\n",re);

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

  • 加强基础。除了课上的老师讲解外,课下多进行平时的复习巩固,不要临到考试还有许多知识点不会,导致时间不够复习要考的内容;
  • 多进行阅读程序的练习。除了要注重编程能力外,阅读程序也需要注意提高;
  • 调整时间分配。平时多花点时间在C语言专业课上,多看多理解多练习,在考试时也要注意时间控制,在前面的题上控制好答题速度;
  • 加强与同学的交流。多看看好的同学代码,总结不同,请教编程方法,尽量提高编程速度和遇题如何入手思考能力;
posted @ 2017-12-03 20:17  榕破  阅读(542)  评论(2编辑  收藏  举报