c语言博客作业04--数组
0.pta展示总分
1.本章学习总结
1.1学习内容总结
1.1.1基础知识点总结
- 数组的定义:数组是一组具有相同类型的数据的集合,这些数据被称为数组元素。格式为:类型名 数组名[常量表达式]。数组所占字节数为元素个数与基本类型所占字节数的乘积。
- 数组的初始化:数组初始化元素值默认为0,没有初始化元素值为随机。例如在int a[5]={1,2,4};中,a[4]的值为0,而在int a[5];中,a[4]的值为不确定的随机数。
- fegts()函数在输入结束处自动输入'\0'
1.1.2数组各种做法总结
1.数组中如何查找数据
- 按顺序查找:对于数组中的元素逐个排查,看是否有与所要查找的数据相等的元素。但对于元素非常多的数组来说,效率很低。
- 二分查找法:若一组数据为按大小顺序排列,则可用此方法。其做法为:找出左边界和右边界,并找出中间元素与所找数据进行比较,如果相等则找出,若不相等,则根据大小判断其中一个边界换为中间元素的上一个元素或下一个元素,继续查找,直到找出或最终也没找到。
二分查找例子:
2.在数组中插入数据
寻找所要插入所给数据的位置,将其与其后数据向右移动一个单元,并将所给数据插入此位置。例如在从小到大的一组数据中插入一个数据且插入后仍是从小到大排列的做法。要注意数组长度。
void insertArray(int a[], int n, int data)
{
int i;
int j;
int index;
for (i = 0;i < n;i++)
{
if (a[i] > data)查找数组中的元素,发现第一个比所给数据大的元素,找出其下标
{
index = i;
break;
}
}
for (j = n;j > index;j--)对于其后该数据与其后数据进行右移
{
a[j] = a[j - 1];
}
a[index] = data;将该数据插入原来第一个比它大的元素的位置
return;
}
3.数组中删除数据
1.用后面的来覆盖前面的
2.重新定义一个数组,重新存放除要删除的数据之外的所有数据
4.数组中目前学习到的排序方法
- 冒泡法:其原理为从a[0]开始,依次将其和后面的元素比较,若a[0]>a[i],则交换它们,一直比较到a[n]。同理对a[1],a[2],...a[n-1]处理,即完成排序。冒泡法原理简单,但其缺点是交换次数多,效率低。
- 选择法:选择法循环过程与冒泡法一致,它还定义了记号k=i,然后依次把a[k]同后面元素比较,若a[k]>a[j],则使k=j.最后看看k==i是否还成立,不成立则交换a[k],a[i],这样就比冒泡法省下许多无用的交换,提高了效率。
5.数组做枚举用法
电视节目的那一题,节目名运用了枚举法。
6.哈希数组用法
判断有重复数据 将一个数组中的内容作为另一个数组的下标
1.2本章学习体会
- 数组的学习使得我c语言编程更精进了一些,数组是c语言中很重要的一章,数组这一章的pta题目集相较于之前变得比较多了。出现的比较多的是,在vs上调试没有任何问题,而在pta上提交却答案错误,甚至连部分正确都不是。
- 这两周的代码量是900行左右,与目标相比少了一些
pta实验作业
2.1求整数序列中出现次数最多的数
2.1.1伪代码
int count;定义出现次数
int max = 0;定义存放出现次数最多的数
int index = 0;定义数组下标
if (n == 1)
{如果只有一个元素,直接输出
printf("%d %d", a[0], n);
return;
}
for (i = 0;i < n;i++)
{从第一个元素开始比较
count = 0;初始化次数
for (j = 0;j < n;j++)
{
if (a[i] == a[j])
{如果相等,则次数+1
count++;
}
}
b[i] = count;将该数据出现次数存入b数组
}
for (i = 0;i < n - 1;i++)
{判断找出b数组中最大的数据,即为出现的最多次数
if (b[i] < b[i + 1])
{
max = b[i + 1];
index = i + 1;
}
else
{
max = b[i];
index = i;
}
}
printf("%d %d", a[index], max);输出结果
2.1.2代码截图
2.1.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
10 3 2 -1 5 3 4 3 0 3 2 | 3 4 | pta给出例子 |
1 2 | 2 1 | 当数组元素只有一个 |
5 1 1 1 1 1 | 1 5 | 全是重复数据 |
2.1.4PTA提交列表及说明
1.部分正确:第一次并没有注意到n最小时有错误,在vs上运行了好几遍,感觉没什么错,就改了几个运算符
2.部分正确:第二次发现当n最小时错误,运行发现n最小时,出现次数为0,于是附加了一个if语句
3.全部正确
2.2螺旋方阵
2.2.1伪代码
int count = 1;给方阵赋值的变量
int n;方阵的边长
int a[10][10] = { 0 };定义一个二维数组病赋值全为0
scanf("%d", &n);输入边长
a[i][j] = 1;将第一个元素赋值为1
while (n*n != count)判断当数组中元素为n*n个时,停止循环
{
while (j + 1 < n && !a[i][j + 1])判断循环条件,第一个条件是限制条件,第二个条件是判断下一个元素是否为0,如果不是则循环终止。下同。
{对于行的正向输入
j++;
count++;
a[i][j] = count;
}
while (i + 1 < n && !a[i + 1][j])
{对于列的正向输入
i++;
count++;
a[i][j] = count;
}
while (j - 1 >= 0 && !a[i][j - 1])
{对于行的逆向输入
j--;
count++;
a[i][j] = count;
}
while (i - 1 >= 0 && !a[i - 1][j])
{对于列的逆向输入
i--;
count++;
a[i][j] = count;
}
}
for (i = 0;i < n;i++)
{
for (j = 0;j < n;j++)
{输出二维数组中的各个元素
printf("%3d", a[i][j]);
}
printf("\n");当行元素为n个时,换行
}
2.2.2代码截图
2.2.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 | 1 | 边长为1 |
5 | pta数据 | |
3 | 普通数据 |
2.2.4pta提交列表及说明
1.部分正确:对于循环条件的控制不当,没有限制当下一个元素已经被赋值了的情况
2.部分正确:对于循环的第二个条件的判断不当,改为!()
3.全部正确
2.3A-B
2.3.1伪代码
char a[N];主
char b[N];副
char c[N];存结果
int t[N] = { 0 };累加数组
fgets(a, N, stdin);输入
fgets(b, N, stdin);
int count = 0;
for (int i = 0; i < (int)strlen(b); i++)
{将b数组中各个元素作为下标,对t数组赋值
t[b[i]]++;
}
for (int i = 0; i < (int)strlen(a); i++)
{
if (t[a[i]] == 0)判断当a数组中元素作为下标时,相应t数组数据是否为0,如果是0,则b数组中未出现此元素,将该元素赋给c数组
{
c[count++] = a[i];
}
}
c[count] = '\0';最后将c数组的最后加上'\0',以便输出
printf("%s\n", c);
2.3.2代码截图
2.3.3造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
I love GPLT! It's a fun game! aeiou | I lv GPLT! It's fn gm! | pta给出例子 |
you are smart! uet | yo ar smar! | 普通数据 |
you you | 两数组相同 |
2.3.4pta提交列表及说明
说明:本来常规做法没有做出来,后来查了一下,发现可以用字符作为数组的下标,于是就这样写
1.答案错误:复制时出现错误。本题在提交之前进行了多次vs调试,本来可以一次全部正确,但复制导致出错
2.答案正确:虽然本题并无错误,但主要是对于这个做法感觉十分巧妙,于是写入博客
3.阅读代码
1.本题代码的作用是计算使用相同数字和相同格式规则可以显示的下一个最高价格。 只包含小数点的输入行终止输入。 如果价格不能提高,则打印“价格不能提高”。只是略微看懂,其中有未学到的知识。
2.本题代码的优点是熟悉运用各种函数接口,设置了多个函数,使代码更加简洁,主函数显得极为简练。熟练运用函数的返回值,各个函数之间关联密切。
3.运用了许多函数,虽然现在并没有学到这些函数,但在指针的那一章有许多函数,这也可以让我们学到在写代码时,熟练运用各种函数,可以更快更好更精简地解决各种问题。