C语言博客做业04——数组

0.展现PTA总分

1.本章学习总结

1.1 学习内容总结

  • 数组中查找数据:
    利用下标 循环查找:好比a[5]={1,2,3,4,5}中找到3这个数字
for(i=0;i<5;i++)
if(a[i]==3)
index=i;//因而记下3所在数组的下标,则a[index]就是所要找的数了
  • 数组中插入数据:
    伪代码(好比一个a[10]={1,2,3,4,5,7,8,9,10}中插入一个数x=6,按从小到大顺序):
int i;
从左到右查找第一个比6大的数,记下它的下标index;
for(i=9;i>index;i--)
{
    a[i]=a[i-1];
}
a[index]=x;

作法:利用for循环从后面往前面赋值,最后在a[index]的位置赋予x的值,实现数组数据的插入。数组

  • 数组中删除数据:
  • 好比有一个a[5]={1,2,3,4,5},要在数组中删除3这个数据
    一、伪代码(利用循环):
for(i=0;i<5;i++)
if(a[i]==3)//找出3所在数组的下标
index=i;//记下下标
for(i=index;i<4;i++)
{
    a[i]=a[i+1];
}//使a[index]赋值为下一位,而后执行循环使下一位赋值为下下一位;从而删除3这个数据,保留其余数据的数字的顺序
for(i=0;i<4;i++)
printf("%d"a[i]);
//在使用数组的时候,因为删除了一位数字,因此从新输出或者使用的时候,记得减小数组的一个长度,因此有i<4而不是i<5

二、伪代码(利用另外一个数组):函数

int i=0;j=0;
for(i=0;i<5;i++)
if(a[i]==3)//找出3所在数组的下标
index=i;//记下下标
while(j!=5)//这里若是数组长度为n,则将5改成n便可
{
    if(i!=index)b[i++]=a[j++];
    else {j++}
}

这样子就获得了删除3这个数字后剩余数字不变的数字b了,这种方法能够保留a这个数组,获得新的数组,不过比第一种方法麻烦一点,有时候会显得不必。学习

  • 数组中目前学到排序方法
    这里举例子并注释说明(有一个数组a[n],其中的数据从小到大排列)
    一、冒泡法(把最大的沉下去):
    使用两层循环
for(i=1;i<n;i++)//外循环n-1次
{
    for(j=0;j<n-1-i;j++)
        {
            判断a[j]>a[j+1],是的话交换a[j]与a[j+1];
        }//内循环结束后,将有一个最大值“沉”到未排序的最下面
}

两层循环后便可获得有序的重构数组a[];
二、选择法(先选择最大的,而后按照顺序排下来):
这里也是要用到两层循环测试

for(i=1;i<n;i++)
{
    for(j=0;j<n-i;j++)
    {
        若是a[MaxIndex]<a[j];则交换Max与j; //历遍数组,找出最大的值所在下标
    }
    交换a[MaxIndex]与a[n-i]; //将最大的元素与(未排序)下标最大的数组元素交换
}

两层循环后便可获得有序的重构数组a[];调试

  • 数组作枚举用法:code

  • 哈希数组用法:blog

1.2 本章学习体会

  • 学习感觉:又过了2个周,忽然以为时间过得好快啊,从顺序结构到循环结构,再到函数,如今已经到了数组,学到的知识愈来愈多,但相对应的题目难道也愈来愈大了,本身也要更加的努力了。
    这两周以来学习了数组,数组有3大类,一个是一维数组,第二个是二维数组,还有一个三维数组,啊,不是,是字符数组,字符数组包括由简单的字符组成的数组,还有字符串数组,作数组的话感受运用更灵活,思路也更复杂。
  • 这两周的代码量:884行排序

    2.PTA实验做业

    2.1 题目:7-7 螺旋方阵

    2.1.1 伪代码:

for(k=0;k<5;k++)//控制螺旋赋值的次数
{
    i = 0, j = 0;//从新赋值行、列
    for(j = 0+k; j < n-k; j++)//控制赋值的数量
        {
              从左到右赋值方阵第一行;
         }
    for(i = 1+k; i <n-k; i++)//控制赋值的数量
        {
              从上到下赋值最后一列;
        }
    for(j = n - 2-k; j >= 0+k; j--)//控制赋值的数量
        {
              从右到左赋值最后一行;
         }
    for(i = n - 2-k; i >= 1+k; i--)//控制赋值的数量
        {
              从下到上赋值第一列;
        }

}
利用循环,输出二维数组a[i][j]

2.1.2 代码截图:

2.1.3 造测试数据:

输入数据 输出数据 说明
2 恰好围成一圈
4 普通的一个数据
9 临界最大的数据

2.1.4 PTA提交列表及说明:(在VS上已调试成功)

提交列表说明:

这道题遇到了2个问题,均在VS上调试完成
本题采用了一个for里面4个for螺旋式地给2个行2个列赋值的方法字符串

  • 问题一、螺旋方阵赋值时出现后一个for赋值把前面for最后一个拐角覆盖掉了,进行右移或左移后正常赋值
    好比:
    1 2 3 4
    13 14 15 5
    12 18 17 6
    11 10 9 8
    这里a[3][3]原来应该被第2个for赋值为7的,结果却被第3个for从新赋值为8,还有外循环进行一次后的a[2][2]也是出现了覆盖赋值的状况.
    原来错误的循环:for (j = n - 1-k; j >= 0+k; j--),改成for (j = n - 2-k; j >= 0+k; j--),将j的初始值-1,使它赋值向左移了一位。
  • 问题二、内循坏条件控制很差,也致使了覆盖赋值的状况
    好比:
    1 2 3 4
    12 13 14 15
    11 18 17 16
    10 9 8 7
    这里a[1][3]原来应该为5,a[2][3]原来应该为6,可是却被第二次外循环从新赋值为1五、16;
    因而将第1个内循坏由for (j = 0+k; j < n; j++)改成for (j = 0+k; j < n-k; j++),改变循坏条件,使最后一个赋值变为有k控制的赋值。

2.2 题目名2

2.2.1 伪代码

2.2.2 代码截图

2.2.3 造测试数据

2.2.4 PTA提交列表及说明

提交列表说明:

2.3 题目名3

2.3.1 伪代码

2.3.2 代码截图

2.3.3 造测试数据

2.3.4 PTA提交列表及说明

提交列表说明

3.阅读代码

相关文章
相关标签/搜索