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阶螺旋方阵

这个螺旋方针题目的解法令我眼前一亮,它用生动形象的注释,将一个复杂的问题形象化、简单化,我想,自己写代码是否也能像这样子灵动。同时它也让我知道了代码并不一定是枯燥的
,它只要加上一点注释,就可以变得很优美。

猜你喜欢

转载自www.cnblogs.com/chenlr/p/11876927.html