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\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,再从那位开始把它和它前面的数输出,个人作法真的比同窗的复杂不少,理解上同窗的代码也更好理解,向同窗学习。
相关文章
相关标签/搜索