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


    0.展示PTA总分




    1.本章学习总结

    1.1 学习内容总结

    • 查找数据有遍历法和二分查找法
      • 遍历法:以数组的下标为循环条件,从0开始查找,直到找到数据。
      • 二分查找法:将数据与数组中间的数据进行比较,通过比较的结果确定数据在数组的哪个区间,从而改变查找区间,以此类推,直到找到数据。该方法仅适用于有序数组。
    • 通过遍历数组找到数据要插入位置的下标,然后将数组左移或右移,再将数据插入。
    • 通过查找数据,找到要删除数据的下标,然后直接将数组左移,覆盖掉要删除的数据,即可完成数据删除。
    • 我们学到的排序方法主要有:选择排序和冒泡排序
      • 选择排序法:在所有数中找到最小数,将其与数组中的第一个数交换,以此类推,直到排序完成。
      • 冒泡排序法:相邻的两个数进行比较,如果下标小的数更大,则交换两个数,以此类推可将最大数移到第n位。再对前n-1个数进行上述操作,将第二大的数移到n-1位。反复进行上述操作,即可完成排序。
    • 数组做枚举用法:用i枚举数组下标,遍历数组。
    • 哈希数组用法:定义一个哈希数组用于计数,以需要统计的数值做为下标,在哈希数组中计数。

    1.2 本章学习体会

    • 本章学习了数组,感觉在做数组的过程中,最容易出错的地方就是下标了,数组的第一个数下标是为0,虽然都知道,但在做题的时候还是容易出错。
    • 大概1000行。

    2.PTA实验作业

    2.1 数组循环左移

    2.1.1 伪代码

    定义一个长度为最大n两倍的数组
    输入数组元数个数n和左移长度m
    m=m%n
    for i=0 to i<n do
    对a[i]赋值
    end for
    for i=0 to i<m do
    a[N - 1-i] = a[i]
    end for
    for i=0 to i<n-m do
    a[i] = a[i+m]
    end for
    for i=n-m to i<n do
    a[i] = a[N - 1 - j];j++;
    end for
    for i=0 to i<n do
    输出a[i]
    end for
    

    2.1.2 代码截图

    2.1.3 造测试数据

    输入数据 输出数据 说明
    8 3 1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 正常数据
    8 11 1 2 3 4 5 6 7 8 4 5 6 7 8 1 2 3 m>n的数据
    8 0 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 m为0的数据

    2.1.4 PTA提交列表及说明

    1.部分正确:在最开始做这题时,我没有考虑到m大于n的情况,导致部分测试点无法通过。
    2.答案正确:通过m=m%n计算出移动的最小长度,提高了程序运行效率,也使m始终小于n。
    

    2.2 IP地址转换

    2.2.1 伪代码

    定义一个数组two[N]用于存储输入的二进制字符
    定义一个flag用于判断是否需要输出".",并将flag初始化为0
    定义一个num用于存对应的十进制数
    for i=0 to i<N do
    给two[i]赋值
    end for
    for i=1 to i<=4 do
    num=0
    if i==4 then
    flag=1
    end if
    for j=j to j<i*8 do
    num=num*2+two[j]-'0'
    end for
    输出num
    if flag==0 then
    输出"."
    end if
    end for
    

    2.2.2 代码截图

    2.2.3 造测试数据

    输入数据 输出数据 说明
    11001100100101000001010101110010 204.148.21.114 0和1都有的数据
    00000000000000000000000000000000 0.0.0.0 全0的数据
    11111111111111111111111111111111 255.255.255.255 全1的数据

    2.2.4 PTA提交列表及说明

    1.部分正确:最初写这段代码的时候我将num=0放在循环外定义,导致只能通过全0的测试点。
    2.答案正确:在我将num=0放在循环内,每轮循环都对num从新赋值后,答案正确。
    

    2.3 判断上三角矩阵

    2.3.1 伪代码

    定义一个二位数组a[N][N]用于存放矩阵
    输入一个数据T,代表需要判断的矩阵个数
    for i=1 to i<=T do
    flag=0
    输入一个数n作为矩阵的阶
    for j=0 to j<n do
    for k=0 to k<n do
    对a[j][k]赋值
    end for
    end for
    for j=1 to j<n do
    for k=0 to k<=j-1 do
    if a[j][k]不等于0 then
    flag=1并且跳出内层循环
    end if
    end for
    if flag==1 then
    跳出外层循环
    end if
    end for
    if flag==1 then
    输出NO
    else
    输出YES
    end if
    end for
    

    2.3.2 代码截图

    2.3.3 造测试数据

    输入数据 输出数据 说明
    2 3 1 2 3 0 4 5 0 0 6 2 1 0 -8 2 YES NO 正常数据
    1 1 1 YES 矩阵为一阶矩阵的数据
    1 10 1 2 3 4 5 6 7 8 9 10 2 4 5 4 8 4 5 1 5 5 3 1 5 4 4 5 6 5 4 4 4 5 1 4 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 NO 最大n

    2.3.4 PTA提交列表及说明

    1.答案错误:在第一次提交时我的flag=0是放在for循环外初始化的,以至于后期的循环中flag没有被初始化,导致答案错误。
    2.答案正确:我将flag=0写到for循环中,每轮循环开始都重新将flag初始化为0,最后答案正确。
    

    3.阅读代码

    #include <stdio.h>
    #define N 1000
    #define M 9
    
    int main()
    {
    	int n;
    	int i;
    	int response;
    	static int count[M];
    
    	scanf("%d", &n);
    	for (i = 0; i < n; i++)
    	{
    		scanf("%d", &response);
    		if (response >= 1 && response <= 8)
    		{
    			count[response]++;
    		}
    	}
    	for (i = 1; i <= 8; i++)
    	{
    		printf("%4d%4d
    ", i, count[i]);
    	}
    	
    	return 0;
    }
    

    这个代码的优点就是用response作为count的下标,灵活的运用了数组

  • 相关阅读:
    windows下的IO模型之选择(select)模型
    tcp通讯中socket套接字accept和listen的关系
    转一篇shell中关于各种括号的讲解
    记两个std接口equal_range,set_difference
    nginx学习
    c++ 读取文本问题
    vim使用常看
    CNN设计一些问题
    什么是反射?反射机制的应用场景有哪些?
    java为什么只有值传递?
  • 原文地址:https://www.cnblogs.com/w60-06/p/11875809.html
Copyright © 2020-2023  润新知