• c语言博客作业04--数组


    0.展示PTA总分

    1.本章学习总结

    1.1 学习内容总结

    • 数组中查找数据:

      1. 数组的数据存放在下标不同的数组中,所以可将下标设为变量,输入确定的下标来寻找数;
      2. 学习过指针后,我们还可以用地址的加减来确定特定的数;
    • 数组中如何插入数据

    for j=k;j>n;j-- do//从尾部开始
       a[j]=a[j-1];//将数组右移
    end for
    a[k-1]=temp;//插入数
    
    • 数组中如何删除数据:确定删去的数,从该数开始,被赋予下一个数的值,这样要删的的数就被覆盖了;

    • 数组中目前学到排序方法:

      1. 选择排序法:首先找出最大值或最小值,与开头或结尾的数调换,再找出次最值数,再次调换,直到剩下一个数;
      2. 冒泡排序法:从数组开头开始,每一个数与下一个数比较,若大于下一个数,调换位置,这样循环,叨叨一组有序数列;
    • 数组做枚举用法:找重复数的题目中,以数组作为存放不同数的容器,当输入的数与数组的某个下标相同,开数组加一,计算数的出现次数;

    1.2 本章学习体会

    • 数组目前给我的感觉是一个工具,有一定的难度,尤其是字符数组,很多东西都没太搞懂,感觉不只在预习的时候要多翻书,平常有空时也要把书多翻几下,查漏补缺。
    • 代码总量:793行

    2.PTA实验作业

    2.1 7-5 找鞍点

    2.1.1 伪代码

    定义数组a
    输入行列数n
    for i=0;i<n;i++ do
      for  j=0;j<n;j++ do
            输入每个值
       end for
    end for
    for i=0;i<n;i++ do
       point1=a[i][0];
       for(j=0;j<n;j++ do
        比较每个值,找出最大值,记录下标
       end for
       for k0;k<n;k++ do
           在确定的列中找到最小值,记录下标
       end for
    比较下标,确定是否为同一个数
    

    2.1.2 代码截图

    2.1.3 造测试数据

    输入数据 输出数据 说明
    1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 2 1 正常数据
    1 0 0 极小值

    2.1.4 PTA提交列表及说明


    Q1 编译错误:运用了多个循环后,{}被搞乱了,不知道哪个对应哪个,最后一一找对应,发现了错误;
    Q2 部分正确:代码中没有考虑到相同值的出现,最后出现错误,其实加一个=就好了。

    2.2 二维数组每列排序

    2.1.1 伪代码

    定义数组a[4][5]
    for j=0;j<k;j++ do
       for k=1;k<=3;k++ do
          for i=0;i<3;i++ do
              运用选择排序法,将每一列排列好
          end for
       end for
    end for
    

    2.1.2 代码截图

    2.1.3 造测试数据

    输入数据 输出数据 说明
    1 7 4 1 4 8 3 6 1 6 1 2 0 7 8 9 1 1 7 4 3 4 6 8 1 1 2 6 0 7 8 9 正常数据

    2.1.4 PTA提交列表及说明


    Q1:运行超时:两次运行超时都是因为==打成了=,这是我打代码是的老毛病了,经常因此百思不得其解,其实只是自己犯二;
    Q2:格式错误:没有审清楚题目,所以第一个数前按照习惯没有空格。

    2.3 调查电视节目受欢迎程度

    2.3.1 伪代码

    静态定义数组a
    输入个数n
    for i=0;i<n:i++ do
     输入每次投票
    end for
    for i=1;i<=8;i++ do
      输出要求
    end for 
    

    2.3.2 代码截图

    2.3.3 造测试数据

    输入数据 输出数据 说明
    11042865468 112456899910 正常数据
    111111........... 崩溃 越界

    2.3.4 PTA提交列表及说明

    Q1:部分错误:段错误,没看清题目,全局变量小于最大数,数组越界

    3.阅读代码

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    #define N 20
    #define MAX 3628810
     
    char s[3][N],op;
    int n[3][N],len[3];
    int num;
    struct cha
    {
       char c;
       int n;
    }a[N];
    bool OK;
     
    void init(char *tmp)
    {
       bool used[2*N];
       memset(n,0,sizeof(n));
       memset(s,0,sizeof(s));
       memset(a,0,sizeof(a));
       memset(used,0,sizeof(used));
       num=0;
       int i,j,k;
       for(i=0,j=0; i<3; i++)
       {
          len[i]=j;
          for(k=0;;j++,k++)
          {
             if(tmp[j]=='+' || tmp[j]=='-' || tmp[j]=='=' || tmp[j]=='')
                break;
             s[i][k]=tmp[j];
             if(tmp[j]>='0' && tmp[j]<='9') n[i][k]=tmp[j]-'0';
             else
             {
                n[i][k]=tmp[j]-'A'+26;
                if(!used[tmp[j]-'A'])
                {
                   used[tmp[j]-'A']=true;
                   a[num++].c=tmp[j];
                }
             }
          }
          s[i][k]='';
          if(i==0) op=tmp[j];
          len[i]=j-len[i];
          j++;
       }
    }
     
    int tran(int i)
    {
       int ans=0;
       for(int k=0; k<len[i]; k++)
          ans=ans*10+n[i][k];
       return ans;
    }
     
    void solve(int *per)
    {
       sort(per,per+num); //全排列前记得排序
       do //对per枚举全排列
       {
          for(int i=0; i<num; i++) a[i].n=per[i];
     
          for(int i=0; i<3; i++)
             for(int j=0; j<len[i]; j++)
                if(s[i][j]>='A' && s[i][j]<='Z')
                   for(int k=0; k<num; k++)
                      if(s[i][j] == a[k].c)
                         n[i][j]=a[k].n;
     
          int ss[3];
          for(int i=0; i<3; i++)
             ss[i]=tran(i);
          if(op=='+' && ss[0]+ss[1]==ss[2]) {OK=true; break;}
          if(op=='-' && ss[0]-ss[1]==ss[2]) {OK=true; break;}
     
       }
       while(next_permutation(per,per+num));
    }
     
    int cmp(struct cha p ,struct cha q)
    {
       return p.c < q.c;
    }
     
    void BF()
    {
       int per[20];
       OK=false;
       sort(a,a+num,cmp);
       for(int state=0; state<1024; state++)
       {
          int cc=0;
          for(int k=0; k<10; k++) if(state&(1<<k)) per[cc++]=k;
          if(cc==num)
             solve(per);
          if(OK) break;
       }
       for(int i=0; i<num; i++) printf("%c %d
    ",a[i].c,a[i].n);
    }
     
    int main()
    {
       char tmp[3*N];
       while(scanf("%s",tmp)!=EOF)
       {
          init(tmp);
          BF();
       }
       return 0;
    }
    

    本题希望得到一个另类的计算器,用数字与字母进行加减法

  • 相关阅读:
    进程的实践与练习2
    士兵队列训练问题
    大数相加
    Ignatius and the Princess II
    Parentheses Balance (括号平衡)---栈
    简单计算器
    C++全排列函数next_permutation()和prev_permutation()
    黑白图像
    9*9乘法表
    输入5 个数按从小到大的顺序输出
  • 原文地址:https://www.cnblogs.com/my-sky-2019/p/11877215.html
Copyright © 2020-2023  润新知