C语言博客作业04——数组
0.展示PTA总分
一维数组
二维数组
字符数组
1.本章学习总结
•数组中如何查找数据,有哪些做法
顺序查找
重头到尾遍历数组,直到找到需要的数据。
优点:操作简单。
缺点:效率低,当数组很大时十分耗时。
二分法查找
每次查找都可以缩短一半的查找范围,效率高。
缺点:只适用于有序排列的数组。
•数组中如何插入数据,怎么做,可以写个伪代码或动态图展示方法
首先找到该数要插入的位置,再将这个位置后的所有数的位置向后移一位,最后将这个数插入。
•数组中如何删除数据,这个有多种做法,请一一展示。
1.覆盖
找到要删除的数据的位置,从它开始,将后面的数据向前覆盖,实现数组数据的删除。
2.新数组存放
定义一个新数组,将不删除的数据放入新数组。
•数组中目前学到排序方法,主要思路?
1.选择排序法
思路:将数组中每个元素与第一个元素比较,如果这个元素小于第一个元素, 则交换这两个元素。循环查找,每次找出最小元素,放于第 1 个位置,经过 n-1 轮比较完成排序
2.冒泡排序
思路:比较相邻的元素,将小(大)的放到前面。
•数组做枚举用法,有哪些案例?
不懂。
•哈希数组用法,目前学过哪些案例,举例展示。
7-5 有重复的数据I (10 分)
#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
int a[N];
int n;
int m;
int i;
int flag = 0;
scanf("%d", &n);
if (check(n) == 1)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int check(int n)
{
int static hash[100001];
int i;
int x;
for (i = 1; i <= n; i++)
{
scanf("%d", &x);
if (hash[x] == 1)
{
return 1;
}
else
{
hash[x]=1;
}
}
return 0;
}
7-11 求整数序列中出现次数最多的数 (15 分)
#include <stdio.h>
int main()
{
int n, a[1000], b[1000] = { 0 };
int i, j, max = 0, k;
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
if (a[i] == a[j])
b[i] = b[i] + 1;
}
for (i = 0; i < n; i++) {
if (max < b[i]) {
max = b[i];
k = i;
}
}
printf("%d %d\n", a[k], max);
return 0;
}
1.2 本章学习体会
对于一维数组和二维数组的学习有些明白,但是对于字符数组实在是懵。还有对于一些题目,虽然做出来了,但是代码非常多,应该能找到更简洁的方法去写。
代码量:483行
2.PTA实验作业
2.1 7-4 删除重复字符
2.1.1 伪代码
#include<stdio.h>
#define N 201
int main()
{
char s[N];
static char h[N];
int i=0;
int k;
//输入字符串
for (i = 0; s[i] != '\0'; i++)
{
k = (int)s[i];//强制类型转换
h[k] = s[i];//将字符储存在对应ASCII码值得数组内
}
输出字符串
return 0;
}
2.1.2 代码截图
#include<stdio.h>
#define N 201
int main()
{
char s[N];
static char h[N];
int i=0;
int k;
while ((s[i] = getchar()) != '\n')
{
i++;
}
s[i] = '\0';
for (i = 0; s[i] != '\0'; i++)
{
k = (int)s[i];
h[k] = s[i];
}
for (i = 0; i < 200; i++)
{
if (h[i] != 0)
{
printf("%c", h[i]);
}
}
return 0;
}
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
全空格 | 一个空格 | 全空格 |
==--ccbbaa;;'' | '-;=abc | 有其他字符 |
2.1.4 PTA提交列表及说明
部分正确:只考虑了字母和数字的情况,没有考虑其他字符的输入与重复。也没有考虑全空格的情况。
2.2 7-7 jmu-c-大数加法
2.2.1 数据处理
char a[N];//大数a
char b[N];//大数b
int n=1,m=1,i,j,k;//循环变量
int x, y;
int z;
a[0] = '0';//考虑进位
b[0] = '0';;//考虑进位
2.2.2 代码截图
#include<stdio.h>
#include<string.h>
#define M 1002
#define N 1003
int main()
{
char a[N];
int n=1,m=1,i,j,k;
int x, y;
int z;
char b[N];
a[0] = '0';
b[0] = '0';
while ((a[n] = getchar()) != '\n')
{
n++;
}
a[n] = '\0';
while ((b[m] = getchar()) != '\n')
{
m++;
}
b[m] = '\0';
j = n-1;
i = m - 1;
if (n>=m)
{
for (i; i >= 0; i--)
{
x = a[j] - '0';
y = b[i] - '0';
if (x + y > 9)
{
a[j] = (x + y - 10) + '0';
for (k = j;; k--)
{
a[k - 1] = a[k - 1] + 1;
if (a[k - 1] - '9' > 0)
{
a[k - 1] = '0';
continue;
}
else break;
}
}
else a[j] = (x + y) + '0';
j--;
}
if (a[0] != '0')
{
printf("%s", a);
}
else
{
for (i = 1; i < n; i++)
{
printf("%c", a[i]);
}
}
}
else
{
for (j; j >= 0; j--)
{
x = a[j] - '0';
y = b[i] - '0';
if (x + y > 9)
{
b[i] = (x + y - 10) + '0';
for (k = i;; k--)
{
b[k - 1] = b[k - 1] + 1;
if (b[k - 1] - '9' > 0)
{
b[k - 1] = '0';
continue;
}
else break;
}
}
else b[i] = (x + y) + '0';
i--;
}
if (b[0] != '0')
{
printf("%s", b);
}
else
{
for (i = 1; i < m; i++)
{
printf("%c", b[i]);
}
}
}
return 0;
}
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
99、1 | 100 | 检验是否进位 |
1、99 | 100 | a的位数小于b |
2.2.4 PTA提交列表及说明
答案错误:没有考虑a的位数比b来得少。
2.3 7-5 有重复的数据I
2.3.1 数据处理
int static hash[100001];//定义一个哈希数组来表示数据是否出现过
2.3.2 代码截图
#include<stdio.h>
#define N 100001
int check(int n);
int main()
{
int a[N];
int n;
int m;
int i;
int flag = 0;
scanf("%d", &n);
if (check(n) == 0)
{
printf("YES");
}
else
{
printf("NO");
}
return 0;
}
int check(int n)
{
int static hash[100001];
int i;
int x;
for (i = 1; i <= n; i++)
{
scanf("%d", &x);
if (hash[x] == 1)
{
return 1;
}
else
{
hash[x]=1;
}
}
return 0;
}
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 2 3 4 5 1 | YES | 最后一个有重复 |
2.3.4 PTA提交列表及说明
部分正确:使用逐一查找的方法来判断是否有重复数据,浪费了时间,还导致了段错误。改用以空间换时间的方法来重写代码。
3.阅读代码
7-7 螺旋方阵
#include<stdio.h>
int main(void)
{
int n;
int a[10][10];
scanf("%d", &n);
int x = 0, y = 0;//坐标,爱的螺旋转圈圈
int k = 1;//循环数1~n*n
int bound0 = n - 1, bound1 = n - 1, bound2 = 0, bound3 = 1;//右下左上个方向的墙壁会向中间缩拢
int direction = 0;//0向右,1向下,2向左,3向上
while (k <= n * n)
{
if (direction == 0)
{
a[x][y++] = k++;
if (y == bound0)
{
//向右走,遇到墙壁就向下
direction = 1;
bound0--;
}
}
else if (direction == 1)
{
a[x++][y] = k++;
if (x == bound1)
{
//向下走,遇到墙壁就向左
direction = 2;
bound1--;
}
}
else if (direction == 2)
{
a[x][y--] = k++;
if (y == bound2)
{
//向左走,遇到墙壁就向上
direction = 3;
bound2++;
}
}
else if (direction == 3)
{
a[x--][y] = k++;
if (x == bound3)
{
//向上走,遇到墙壁就向右
direction = 0;
bound3++;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf(" %2d", a[i][j]);
}
printf("\n");
}
}
功能:打印n阶螺旋方阵
这个螺旋方针题目的解法令我眼前一亮,它用生动形象的注释,将一个复杂的问题形象化、简单化,我想,自己写代码是否也能像这样子灵动。同时它也让我知道了代码并不一定是枯燥的
,它只要加上一点注释,就可以变得很优美。