• 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的代码省略,也没有影响;我的输出代码的输出第一行的代码可以使用单层循环也可以实现;二者可以相应简化代码;
  • 相关阅读:
    java实验报告(实验五)
    java实验报告(实验三)
    java读书笔记二
    总结报告
    Android实践项目汇报(总结)-修改
    Android实践项目汇报(总结)
    Android实践项目汇报(四)
    Android实践项目汇报(三)
    Android实践项目汇报(二)
    Android实践项目汇报-改(一)
  • 原文地址:https://www.cnblogs.com/vanishzeng/p/10048487.html
Copyright © 2020-2023  润新知