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


    0.展示PTA总分

    一维数组

    二维数组

    字符数组


    1.本章学习总结

    1.1 学习内容总结

    数据查找(顺序查找)

    定义数组a
    int i,j;
    输入所需查找的数x
    for i=0 to n-1 do
    if(a[i]==x) return 1;//找到
    end for
    if(i==n)
    return -1;//未找到
    

    数据查找(二分法查找)

    函数引用查找数据
    定义数组a
    int min,max,mid;
    输入所需查找的数x
    wile(min<=max)
    取中间数a[mid]
    if(x>a[mid])
    min=mid+1;//左区间改变
    if(x<a[mid])
    max=mid-1;//右区间改变
    if(x==a[min]
    找到数return mid;
    end while
    return -1//找不到
    
    

    数据插入

    int index,loc,i,number,a[N];
    for index=1 to n-1 do
    number=a[index]//插入的数
    for i=0 to index-1 do
         查找插入位置loc
    end for
    for i=index to loc+1 do
    右移a[i]=a[i-1]//移动数组
    end for
    a[loc]=number//插入数组
    end for
    

    数据删除

    int a[N],i,j,deleteNumber,n,index;
    for i=0 to n-1 do
    if(deleteNumber==a[i])
    index=i;
    for j=index to n-1 do
    a[j]=a[j+1];
    end for
    end for
    

    数组排序(选择排序法(从小到大))

    int i,j,minIndex,a[N],temp;
    for i=0 to n-2 do
     minIndex=i;
      for j=i to n-2 do
       if(a[j]<a[minIndex])
        temp=a[minIndex];
        a[minIndex]=a[j];
        a[j]=temp;//交换
      end for
    end for
    

    数组排序(冒泡法排序(从小到大))

    引用函数void BubbleSort(int a[],int n)
    int temp,i,j;
    for i=0 to n-2 do
      for j=0 to n-i-2 do
       if(a[j]>a[j+1])
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;//交换
      end for
    end for
    

    查找是否有重复数据(哈希数组)

    int FindDuplicate(int n)
    int i;
    int data;
    int static hash[N];
    fori = 1 to n do
    输入数据data
    if(hash[data]==1)
    return 1;//第二次出现数据,有重复
    else
    hash[data]=1;//第一次出现数据赋值1
    end for
    return 0;//没有重复数据
    
    

    1.2 本章学习体会

    这两周通过对数组的学习,对数组的用法有了大致了解,但对静态数组的应用(例如哈希数组)还是有一定的模糊感,感觉遇到同类问题可能会应用,但若转变题型可能只有一定的思路但不知道如何表达。
    对数组移动,删除等了解了多种方法,希望能有具体例题,加深印象。

    代码量
    11、12 1211

    2.PTA实验作业

    2.1 题目名1:7-6 阅览室

    2.1.1 伪代码

    定义二维数组储存三列数据
    输入所要查询的天数
    for i = 1 to day do
    按行输出所要处理的数据
    scanf("%d %c %d:%d", &bookNumber, &op, &hour, &minute);
    调用函数处理数据
    end for
    
    分装函数处理
    定义借阅次数count
    定义平均借阅时间average
    for i = 0 to k do
    if (a[i][1] == 'S')//表示借书
       forj = i + 1 to k do
       if (a[j][0] == a[i][0] && a[j][1] == 'S')//判断是否有重复借同一本书
       if ( a[j][0] == a[i][0] && a[j][1] == 'E' )//判断是否有还书记录
       若有count自增,平均时间增加
       end for
    end for
    if (count == 0)//无借书记录
    else//有借书记录
    

    2.1.2 代码截图


    2.1.3 造测试数据

    输入数据 输出数据 说明
    1 130 正常数据(同一本书被借多次,有不匹配)
    正常数据

    2.1.4 PTA提交列表及说明


    1.运行超时: 未考虑输入时bookNumber==0时结束输入导致死循环
    2.部分正确:忽略舍弃小数点输出(%.0f)
    3.部分正确:未考虑同一本书借多次的情况(当检测到字符S时使用循环查找是否有同一书号再次被借的输入情况)

    2.2 题目名2:7-7 jmu-c-大数加法

    2.2.1 数据处理

    定义一维字符数组存放待相加两数firstNumber,secondNumber
    定义一维数组存放两数相加之和sum
    while getchar!=’
    ’输入firstNumber和secondNumber
    len1、 len2=’’//表示字符串输入结束
    if (len1 > len2)//若第一个字符串更长
      j=len2;
      differ = len1 - len2;//计算firstNumber和secondNumber相差位数differ
      for i = len1 - 1 to 0 do
       j=j-1;
       if (i >= differ)
         secondNumber[i] = secondNumber[j];//将最后一位对其
       secondNumber[i] = '0';//补齐较短数列前面空值置为0
      len = len1;//sum数组长度赋值
      end for
    if (len1 <= len2)
      j=len1;
      differ = len1 - len2;//计算firstNumber和secondNumber相差位数differ
      if (i >= differ)//判断两数是否相等
      for i = len1 - 1 to 0 do
        firstNumber[i] = firstNumber[j];//将最后一位对其
        firstNumber[i] = '0';//补齐较短数列前面空值置为0
      len = len2;//sum数组长度赋值
      end for
    for i = 0 to len do//将a,b转为数值运算后存入c
      sum[i] = (firstNumber[i] - '0') + (secondNumber[i] - '0');
    end for
    for i = len - 1 to >= 0 do//判断是否进位c[0]不进位
      if(c[i]>9)
        c[i]=c[i]-10;
        c[i-1]=c[i-1]+1;
    end for
    输出c[i]
    

    2.2.2 代码截图



    2.2.3 造测试数据

    输入数据 输出数据 说明
    两数据长度不同
    长度相同进位
    长度相同不进位

    2.2.4 PTA提交列表及说明


    1.多种错误:
    (1)循环判断范围错误,范围小于数组长度(更改范围)
    (2)两数组对应位置错误
    (3)两数据长度相等时未考虑
    2.部分正确:数组长度不同时未把空位赋值‘0’而赋值0导致错误(为字符数组)
    3.部分正确:变量表达错误

    2.3 题目名3:7-3 字符串转换成十进制整数

    2.3.1 数据处理

    定义字符数组str、str2
    定义flag = 0;//判断十六进制前是否有负号
    while 输入数组str[i]
    str[i] = '';
    for i = 0 str[i] != '' do//找出第一个第一个十六进制数的下标
    Index2 = i;//记录下标
    end for
    for i = 0 str[i] != '' do//若有负号找出第一个负号的下标
    Index1 = i;//记录下标
    end for
    if (Index1 < Index2)//判断负号是否在第一个十六进制数前
    flag = 1;//在第一个十六进制数前
    for i = 0 str[i] != '' do//筛选出符合十六进制的数存入str2中
    str2[k++] = str[i];
    end for
    
    分装函数将十六进制转为十进制
    for i = 0 to k do
    if (str2[i] >= '0' && str2[i] <= '9')
    	sum = sum * 16 + str2[i] - '0';
    if (str2[i] >= 'a' && str2[i] <= 'f')
    	sum = sum * 16 + str2[i] - 'a' + 10;
    if (str2[i] >= 'A' && str2[i] <= 'F')
    	sum = sum * 16 + str2[i] - 'A' + 10;
    end for
    if (flag == 1)//为负数
    sum = -sum;
    return sum;
    

    2.3.2 代码截图


    2.3.3 造测试数据

    输入数据 输出数据 说明
    +-P-xf4+-1!# -3905 正常数据(两个负号)
    -zyzx-t# 不输出 数据被过滤(不符合十六进制数)
    abFcD# 704461 无符号有大小写数据

    2.3.4 PTA提交列表及说明


    1.部分正确:(中间过程错误挺多都在在vs中调试)
    (1)没理解题意是在在第一个十六进制数前的负号才有效
    (2)没考虑字符被全部过滤不输出的情况
    (3)一开始对负数如何表达处理没思路(添加flag变量判断是否要负值)


    3.阅读代码

    值得学习之处:
    (1)有预先验算想好思路找好规律后进行编程
    (2)函数循环调用(递归方法)

  • 相关阅读:
    _MainTex_TexelSize
    资源处理参考
    unity 判断一个trans在不在sceen内
    DX11 绘制三角形 判断顺时针
    int型转LPCWSTR在MessageBox上显示
    sizeof struct
    buffer和cache
    DX11 三维空间: depth信息与stencil信息
    DX11 纹理的添加
    hlsl SV_POSITION
  • 原文地址:https://www.cnblogs.com/sixiDL000/p/11854634.html
Copyright © 2020-2023  润新知