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

0.展示PTA总分

1.本章学习总结

1.1 学习内容总结

1.1.1数组的定义和赋初值

1.1.1.1一维数组

1.1.1.1.1一维数组形式为:类型 数组名[数据个数]
如:

int a[5](定义一个变量名为a的可以存储五个整型数据的数组)
char op[5](定义一个变量名为op的可以存储五个字符数据的数组)

1.1.1.1.2赋初值:以一维整型数组为例
情况一:

逐个全部赋值 a[5]={1,2,3,4,5};(注意:将1赋值给a[0],将2赋值给a[1]...以此类推)

情况二:

动态数组部分赋值 int a[5]={1,2};(此时将1赋值给a[0],将2赋值给a[1],而a[2],a[3],a[4]都由系统自动赋随机值)
静态数组部分赋值 static int a[5]={1,2};(此时将1赋值给a[0],将2赋值给a[1],而a[2],a[3],a[4]都由系统自动赋值为0)

1.1.1.2二维数组

1.1.1.2.1二维数组形式为:类型 数组名[行长度][列长度]
如:

int a[3][3](定义一个变量名为a的3行3列的可以存储九个整型数据的二维数组)
char op[3][3](定义一个变量名为op的3行3列的可以存储九个字符数据的二维数组)

1.1.1.2.2赋初值:以二维整型数组为例
情况一:分行赋值法

 a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
(将{1,2,3}赋值给第1行即a[0][0],a[0][1],a[0][2]...以此类推)
static int a[3][3]={{1,2,3},{},{4,5}};
(将{1,2,3}赋值给第1行即a[0][0],a[0][1],a[0][2],将{4,5}赋值给第3行a[2][0],a[2][1],而其余元素都由系统自动赋值为0)

情况二:顺序赋初值

int a[3][3]={1,2,3,4,5,6,7,8,9};(按从行到列的顺序给所有元素赋值)
int a[3][3]={1,2,3,4,5,6,7};(按从行到列的顺序依次给元素赋值,a[2][1],a[2][2]由系统赋随机值)

1.1.2数组中查找数据

1.1.2.1顺序查找法(以一维数组为例)

如需要查找数组中存储x的为哪一个
for(i=0;i<n;i++)
{
if(a[i]==x)
 {
    printf("index is %d",i);//输出相应所需下标
  }

1.1.2.2二分查找法(适用于数组中数按大小关系排列的情况)

如需要查找数组中存储x的为哪一个
如在数组a[10]中查找,则a[5]为数组的中间数,用x和a[5]比较,则可以确定所查找的数在前半部分还是后半部分,缩小查找范围,以此类推,直到最后找出答案。

1.1.3插入数据(原数据有n个,按从小到大顺序排列)

定义 插入数x;
定义 循环变量i ,j;
输入 x;
from i=0 to i<n;
{
如果 a[i]大于x
{
   from j=i+1 to j<=n;
  {
      a[j]=a[j-1];
  }
   a[i]=x;
  退出循环;
}
如果 a[i]小于x且i=n-1;
{
  a[n]=x;
}
}

1.1.4数组排序

1.1.4.1选择排序法

思路:假设需要排序的数据有n个

第一步:在未排序的n个数(a[0]~a[n-1])中找到最小数,将其和a[0]交换;
第二步:在未排序的n-1个数(a[1]~a[n-1])中找到最小数,将其和a[1]交换;
.....
第n-1步:在未排序的2个数(a[n-2]~a[n-1])中找到最小数,将其和a[n-2]交换;

1.1.4.2冒泡排序法

思路:构建两个循环

for i=1 to i<n //外部循环
 for j=0 to j<n-i //内部循环
    {
     如果a[j]大于a[j+1]
     两者交换
    }

1.2 本章学习体会

1.2.1我认为本章的数组学习与前几章的知识特点有很大不同。已学习知识点最大的共性就是逻辑性强,这毋庸

置疑,但本章不管是一维数组还是二维数组,学习难度增大了,关键与前几章相比,它对抽象思维能力的
要求更高,更需要多练习去熟悉其中的规律。对于本章中的字符串数组的相关知识点,我还有许多不懂或
是不熟悉之处,如字符串的多种输入和输出方法和需注意点,还有对字符串的处理,多个字符串的联系等等。

1.2.2代码量统计

820行左右(自认为没有达标,偷懒了T.T)

2.PTA实验作业

2.1二维数组每列排序

2.1.1 伪代码

定义二维数组a[4][5]
定义循环变量i,j,k
from i=0 to i<4 
  from j=0 to j<5
     存入数据
from j=0 to j<5           \\列不变,逐列操作
  from i=0 to i<4-1       \\行上进行操作
     from k=i+1 to k<4     \\选择排序法进行交换
如果a[i][j]大于a[k][j]
两者交换
输出交换后的数组a[4][5]

2.1.2 代码截图


2.1.3 造测试数据

输入一:

输出一:无结果
输入二:

输出二:

说明二:正确答案
输入三:

输出三:

说明三:正确答案

2.1.4 PTA提交列表及说明


Q1:输入测试数据后按回车键却没有输出任何东西。
A1:寻找是不是输出最后结果位置的代码发生错误,发现最后用于输出结果的printf写成了scanf。
Q2:输入题给数据后输出混乱排序的数组。
A2:发现是交换函数中的行标和列标表示写反了。

2.2 交换最小值和最大值

2.2.1 数据处理

伪代码

定义循环变量i
定义数组个数n
定义min和max用来储存最小值和最大值
定义flag1和flag2存储需调到第一位和最后一位的数据的下标
输入n
from i=0 to i<n
输入a[i]
使min等于a[0]
from i=0 to i<n
如果a[i]小于等于min
min=a[i]  flag1=i  flag=1
如果i等于n-1且flag等于1
a[0]和a[flag1]交换
使max等于a[n-1]
from i=n-1 to i>=0
如果a[i]大于等于max
max=a[i]  flag2=i  flag=2
如果i等于0且flag等于2
a[n-1]和a[flag2]交换
输出最后结果

2.2.2 代码截图



2.2.3 造测试数据

输入数据 输出数据 说明
1 3 4 5 6 4 5 1 3 5 1 3 4 5 5 4 5 1 3 6 输入题给数组数据最大个数(10个)
8 2 5 1 4 1 2 5 4 8 题给输入输出样例
2 1 1 2 最特殊的两个数交换

2.2.4 PTA提交列表及说明


Q1:发现最大数确实在第一个,最小数确实在最后一个,但是原来第一个和最后一个数据消失。
A1:应该把第一个数和最小数交换,而不是单纯把第一个变成最小数。最大数的移动同理。
Q2:答案还是和所给样例有偏差。
A2:发现是顺序有误,第一步应该先对最小数的移动操作,然后才是最大数。

2.3 题目名3

2.3.1 数据处理

伪代码


2.3.2 代码截图

2.3.3 造测试数据

输入数据 输出数据 说明

2.3.4 PTA提交列表及说明

Q1:
A1:
Q2:
A2:
3.阅读代码

posted @ 2019-11-17 22:56  囫囵吞了个枣  阅读(279)  评论(1编辑  收藏  举报