zoukankan      html  css  js  c++  java
  • c语言博客作业04--数组

    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
    ",count,sum/count);
    	else                             //无效数据
    	printf("0 0
    ");
    }
    
    

    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,再从那位开始把它和它前面的数输出,我的做法真的比同学的复杂很多,理解上同学的代码也更好理解,向同学学习。
  • 相关阅读:
    Linux平台不同解压缩命令的使用方法
    poj 1274 The Perfact Stall
    Experience Design for Sexable Forum
    JavaScript中的Array对象方法调用
    iOS9适配小结
    [Servlet&amp;JSP] HttpSession会话管理
    Android中的跨进程通信方法实例及特点分析(一):AIDL Service
    OpenCV——PS滤镜算法之Spherize 球面化(凸出效果)
    《Effective Modern C++》翻译--条款4:了解怎样查看推导出的类型
    Android开发系列之ListView
  • 原文地址:https://www.cnblogs.com/x-m-66/p/10087509.html
Copyright © 2011-2022 走看看