Loading

C语言博客作业04--数组

1.本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

  • 通过这几周数组的学习,掌握了数组相关的基础使用方法及相应题型的掌握;
  • 可以用static对数组进行赋0初值,而不必使用for语句进行操作,省略了很多麻烦;
  • 然后在写字符数组代码过程中,不能确定字符数组的长度,如果用for语句去计数也显得相对繁琐,于是网上查找相应代码解决,发现strlen函
    数就可以解决了
  • 数组题型难度较之前也明显提升,写代码耗时也相对增加,而写代码思路也显得很重要,有时候思路不清晰就会导致代码写到一半然后中途短路,
    这也加大了之后调试等的难度,首先给自己代码做简单注释可以使回头想问题时更快整理思路,另一点很重要的是必要时候可以在外面草稿纸
    或者文档上写下自己的思路,都是比较好的思路整理方法;

1.2.2 代码累计

2.PTA总分

2.1截图PTA三次题目集:一维数组、二维数组和字符数组共3次题目集的排名得分

一维数组

二维数组

字符数组

2.2 我的总分:

一维数组:200分
二维数组:105分    
字符数组:150分
总分:455分

3.PTA实验作业

3.1 PTA题目1

在一大堆数据中找出重复的是一件经常要做的事情。现在,我们要处理许多整数,在这些整数中,可能存在重复的数据。
你要写一个程序来做这件事情,读入数据,检查是否有重复的数据。如果有,输出“YES”这三个字母;如果没有,则输出“NO”。

3.1.1 算法分析

定义整型变量n用于表示数组长度
定义num数组用于输入一串数据 
定义并初始化same数组使其数组中的每个单元都为零
定义flag用于判断数据是否有重复 
输入n
for i=0 to n do
	输入nu[i]
end for
for i=0 to n do
 	same[num[i]]++    //same数组用于计数num数组中一些数的个数 
 	if same[num[i]]==2 then   //如果same数组中这个单元等于2,则说明num中存在两个重复的数 
 		flag=1
 		退出循环
 	end if
end for
if flag==0 then
	输出NO	end if
if flag==1 then 
	输出YES end if

3.1.2 代码截图

3.1.3 PTA提交列表及说明

  • Q1:在Dev中运行例子的那个结果正确,然后调到pta中发现答案错误;
  • A1:试了一组不含重复数组的例子,发现输出了两个NO,阅读代码发现是循环中已经有含NO的输出,跳出循环后仍然有NO的输出,对此进行更改;
  • Q2:更改后发现依旧是部分正确,且显示运行超时;
  • A2:想到可能是运用嵌套循环使循环次数大大增加,而数据一大则导致了运行超时,所以改成了像现在的一层循环的代码;

3.2 PTA题目2

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。

3.2.1 算法分析

定义n表示要输出n行n列的矩阵
定义二维数组num
定义i,j,k用于循环;flag用于判断矩阵中的数是否为鞍点;count用于计数鞍点个数 
输入 n
输入n行n列的num矩阵
for i=0 to n do
	for j=0 to n do
		for k=0 to n do
			if k!=i then 
			 	if num[i][j]>num[k][j] then
					flag=0 退出循环
				end if/*如果在j列上有其他的数大于判断的数,则该判断的数不是鞍点,将flag赋值为0,跳出循环*/ 
			end if
			if k!=j then
				if  num[i][j]<num[i][k] then
					flag=0 退出循环
				end if/*如果在i行上有其他的数大于判断的数,则该判断的数不是鞍点,将flag赋值为0,跳出循环*/ 
			end if
		end for
		if flag==1 then
			输出i,j 
			count++//每发现一个鞍点,count加1 
		end if 
		flag=1//每次k循环结束后,重新将flag赋值为0,一遍下一个数的判断 
	end for
end for
if count==0 then
	输出NONE /*如果计数为0,则说明矩阵中不存在鞍点,输出NONE*/ 

3.2.2 代码截图


3.2.3 PTA提交列表及说明

  • Q1:刚开始编译可以就转入pta中提交,但有部分答案错误,答案显示第一个例子不正确;
  • A1:检查代码和审题发现,是比较行列最大数和最小数弄反了,做此更改;
  • Q2:再次提交发现依旧有“最大规模,有并列极值元素,最后一个是鞍点”答案错误的提示;
  • A2:分析发现并列极值不能看作是鞍点,所以更改判断条件,将等号省略即可;

3.3 PTA题目3

输入2个大数,每个数的最高位数可达1000位,求2数的和。

3.3.1 算法分析

定义op1和op2两个字符数组用于存放两个大数; 
定义num1和num2两个整型数组用于存放两个大数倒过来的数,便于相加; 
定义i,j用于循环;
在两个数组op1,op2中输入两个大数;
定义n用于存放字符串长度较大的那个长度数值; 
for i=strlen(op1),j=0 to i>=0 do
	num1[j]=op1[i]-'0' 
	i--;j++
end for /*将字符数字转化为整型数字,并且逆序 */
for i=strlen(op2),j=0 to i>=0 do
	num2[j]=op2[i]-'0' 
	i--;j++
end for /*将字符数字转化为整型数字,并且逆序 */
n=(strlen(op1)>=strlen(op2))?strlen(op1):strlen(op2);//判断两个字符数组的长度,并将长的数组长度赋值给n 
for i=0 to n-1 do
	num1[i]=num1[i]+num2[i];//将两个数组中同个单元的数相加并赋值给num1数组 
	if num1[i]>=10 then
		num1[i]-=10;
		num1[i+1]+=1;
	end if		/*如果数组中同个下标的数相加大10,则该下标的数减去10,并该下标加1单元的数加1*/ 
end for
if num1[n]==1 then	//判断num[n] 是否为1,如果为1则说明两个大数的最后两个数相加大于10,输出的数组长度应加1 
	for i=n to 0 do 
		输出num1[i]
		i--
	end for 
else do
	for i=n-1 to 0 do
		输出num1[i]
		i--
	end for
end if 

3.3.2 代码截图


3.3.3 PTA提交列表及说明

  • Q1:这题在Dev C编译了好久,发现有一直答案错误;
  • A1:经过printf法调试(调试结果如图1),觉得num函数中的值已经将字符数组中的值逆序了;
  • Q2:继续编译下面内容发现依旧得不到正确答案,且发现最后输出值按正序输出依旧是正序结果;
  • Q2:这点引起我的注意,如果前面的值已经逆序的话,按理说后面输出值的时候再逆序才会回到正序输出结果;
    检查发现果然一开始的时候只是让数值从数组最后单元输出,并未让数组中的数真正逆序过来,对此进行改正;

图1

4.代码互评

4.1 代码截图

同学的代码(陈梓灿)


我的代码


4.2 二者的不同

  • 我们两个人的思路基本相同,都是先分别对首行和首列的数组单元进行赋值,在计算相应行列中间的数组单元的值,最后实现加法表的输出;
  • 在输出加法表的代码可见,同学的代码更少且更直观,而我的则更长,但清晰;
  • 输出代码中,同学的代码通过条件让a[0][0]值不进入循环,且控制了第一行的条件,实现一个嵌套循环即可输出加法表;
    而我的代码则先用一个嵌套循环输出第一行比较特殊的情况,再用一个嵌套实现后面几行的输出;
  • 同学的代码将输出代码后的赋给数组单元0的代码省略,也没有影响;我的输出代码的输出第一行的代码可以使用单层循环也可以实现;二者可以相应简化代码;
posted @ 2018-12-06 21:54  August_丶  阅读(967)  评论(0编辑  收藏  举报