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,再从那位开始把它和它前面的数输出,我的做法真的比同学的复杂很多,理解上同学的代码也更好理解,向同学学习。