1.本章学习总结#
1.1 思维导图##
1.2 本章学习体会及代码量学习体会##
1.2.1 学习体会###
数组的定义简单,可简化代码,增加代码可读性,也便于使用循环结构,但它的不足之处就是数组大小必须定义时给出,数组空间的大小一旦确定后就不能更改,空间太大可能会造成空间浪费,太小数组又会越界,使得代码出错。相比前面的内容,数组还是比较优秀的,数组可用来储存数据,对于不同的情况我们可以选择一维数组,二维数组,字符数组。数字也可存放在字符数组中,但若要计算的话,就要先-‘0’,转成数字。利用数组可以将多个数进行排序,而普通代码则做不到这点。冒泡法、排序法都是数组排序的经典做法。
1.2.2 代码累计###
2.PTA总分#
2.1截图PTA中函数题目集的排名得分##
2.2 我的总分##
一维数组:175
二维数组:105
字符数组:130
总分:405
3.PTA实验作业#
3.1PTA题目1##
找出不是两个数组共有的元素
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
3.1.1 算法分析###
void Found(int a[],int b[],int n,int m); //函数声明
定义 n,m,i,j;
定义数组a a[20];
定义数组b b[20];
输入a数组元素个数n
输入数组a
输入数组b元素个数m
输入数组b
Found(a,b,n,m); //调用函数
return 0;
void Found(int a[],int b[],int n,int m) //函数定义
定义 i,j,k=0,cn;
定义数组c c[41]; //把数组a和数组b中的元素放到c数组中
static int flag[40]; //使用数组flag避免同一数字重复输出
cn=n+m;
for i=0 to n-1 do //把a数组中的数放到c数组中
c[i]=a[i];
end for
for i=0 to m-1 do //把b数组中的数放到c数组中
c[n+i]=b[i];
end for
for i=0 to cn-1 do
if flag[i] then
continue;
end if
for j=i+1 to cn-1 do
if c[i]==c[j]&&i<n&&j>=n then //两个数分别在a数组和b数组中
flag[j]=1;
flag[i]=1;
end if
if c[i]==c[j]&&i<n&&j<n then //两个数同在a数组中
flag[j]=1;
end if
if c[i]==c[j]&&i>=n&&j>=n then //两个数同在b数组中
flag[j]=1;
end if
end for
if flag[i]==0 then
c[k++]=c[i];
end if
end for
输出数组c
}
3.1.2 代码截图###
3.1.3 PTA提交列表及说明###
- Q1:输出不是两数组共有的元素,且同一数字不重复输出
- A1:做的时候没有想到用flag数组来处理重复的数字,使得输出结果中有数字重复。若同一个数组中有相同的数或是与另一个数组中有相同的数字,就把后面那个数的flag数组值置为1,将重复的数的flag数组值置为1,再把flag数组值为0的数放到重构数组c中
3.2 PTA题目2##
阅览室
天梯图书阅览室请你编写一个简单的图书借阅统计程序。当读者借书时,管理员输入书号并按下S键,程序开始计时;当读者还书时,管理员输入书号并按下E键,程序结束计时。书号为不超过1000的正整数。当管理员将0作为书号输入时,表示一天工作结束,你的程序应输出当天的读者借书次数和平均阅读时间。
注意:由于线路偶尔会有故障,可能出现不完整的纪录,即只有S没有E,或者只有E没有S的纪录,系统应能自动忽略这种无效纪录。另外,题目保证书号是书的唯一标识,同一本书在任何时间区间内只可能被一位读者借阅。
3.2.1 算法分析###
void LibrarySystem(int a[][3],int k); //函数声明
定义天数n
定义二维数组a a[2000][3];
定义 i,k,num,hour,minu;
char c; //S,E
输入天数n
for i=1 to n-1 do
k=0;
while(1)
scanf("%d %c %d:%d",&num,&c,&hour,&minu);
if num!=0 then //把借书信息存入a数组中
a[k][0]=num; //数组每行第一个元素存放书号
a[k][1]=c; //第二个元素存放是借书还是还书
a[k][2]=hour*60+minu; //第三个元素存放时间
k++; //记录一天的借书还书次数
end if
else
break;
end while
LibrarySystem(a,k); //函数调用
end for
return 0;
void LibrarySystem(int a[][3],int k) //函数定义
定义 i,j,count=0; //可根据count的值判断该借书数据是否有效
double sum=0;
for(i=0;i<k;i++) //一天的借书还书次数
if a[i][1]=='S' then //借书
for j=i+1 to k-1 do
if a[i][0]==a[j][0]&&a[j][1]=='S' then //无效记录
break;
end if
else if a[i][0]==a[j][0]&&a[j][1]=='E' then //还书
sum=sum+a[j][2]-a[i][2]; //计算借书时间
count++; //计算一天的借书次数
break;
end if
end for
end if
end for
if count!=0 then //输出有效数据
printf("%d %.0f\n",count,sum/count);
else //无效数据
printf("0 0\n");
}
3.2.2 代码截图###
3.2.3 PTA提交列表及说明###
- Q1:对一串既有数字又有字母还有时间的数据手足无措
- A1:把一串既有数字又有字母还有时间的数据存放到二维数组a中
- Q2:如何忽略无效数据
- A2:利用count的值来判断数据是否有效,只有同一书号输入中有E时,count的值才会改变,该数据也才会被记录下来
3.3 PTA题目3##
大数加法
输入2个大数,每个数的最高位数可达1000位,求2数的和。
保证输入数都是数字,不能有空格,输出2数相加的结果
3.3.1 算法分析###
定义 i,j,length1,length2; // length1是字符数组s1的长度, length2是字符数组s2的长度,
char s1[1000],s2[1000];
int num1[1000]={0}; // 数字数组num1
int num2[1000]={0}; // 数字数组num2
输入字符串s1,s2
length1=strlen(s1); //求第一个加数的位数
length2=strlen(s2); // 求第二个加数的位数
j=0;
for i=length1-1 to 0 do //将字符数组转化为数字数组,并倒数存放,作为第一个加数
num1[j]=s1[i]-'0';
j++;
end for
j=0;
for i=length2-1 to 0 do //将字符数组转化为数字数组,并倒数存放,作为第二个加数
num2[j]=s2[i]-'0';
j++;
end for
for i=0 to 1000 do //实现大数的加法
num1[i]=num1[i]+num2[i];
if num1[i]>9 then
num1[i]=num1[i]-10;
num1[i+1]++;
end if
end for
for (i=999;i>=0&&num1[i]==0;i--) //求得最终结果的位数
if(i>0)
for(;i>=0;i--) //输出最终答案
printf("%d", num1[i]);
end for
end if
else
printf("0");
end for
return 0;
3.3.2 代码截图###
3.3.3 PTA提交列表及说明###
- Q1:代码写完在devc测试时,输不出结果
- A1:我把两个大数放在字符数组中,没有把它们转成数字就开始进行加法运算
- Q2:进位问题
- A2:两个大数最大不超过1000位数,两个数加起来也不会超过1000位,就先分别把两个大数转成数字逆序存放到其他两个定义数组中,把对应位数相加,若和大于9,则下一位加1,再重999位中去找第一个不是0的数,从这个地方逆序输出它和它前面的数,就是答案
4. 代码互评#
4.1 代码截图
同学的代码
我的代码
4.2 二者不同##
- 从直观角度看,同学的代码比我的代码要简洁一点。
- 同学代码直接从最后一位开始相加计算,而我是先把它们转成数字再逆序存到新的数组中,我的做法比较麻烦。
- 同学是先找出哪个大数的位数较多,再把两个大数相对应位数的元素的和赋给该数组,我是开了一个初始化为0的1000大小的数组把相加的数存到里面,再去找从哪位数组元素开始它的值不为0,再从那位开始把它和它前面的数输出,我的做法真的比同学的复杂很多,理解上同学的代码也更好理解,向同学学习。