C语言博客作业05——指针

…衆ロ難τιáo~ 提交于 2019-12-06 06:35:25

0.展示PTA总分

1.本章学习总结

1.1 学习内容总结

•指针做循环变量做法

1.使指针移动,指向下一个地址单元,改变了指针原本指向的位置。
2.下标法,寻找离指针指向位置i个单位的位置,不会改变了指针原本指向的位置。

•字符指针如何表示字符串

用字符指针指向一个字符串的首地址。

•动态内存分配

  1. void *malloc(size_t size);
    函数 malloc()分配连续的内存区域,其大小不小于 size,需要强制类型转换。malloc()获得内存区域时,内存中的内容没有初值。
  2. void*calloc(size_t n,size_t size);
    calloc()函数功能是动态分配n个大小为size的内存空间,需要强制类型转换。calloc()函数会将所申请的内存空间中的每个字节都初始化为0。
  3. void * realloc(void * ptr,size_t size);
    realloc() 函数可以做到对动态开辟内存大小的调整(既可以往大调整, 也可以往小调整)。ptr为需要调整的内存地址,size为调整后需要的大小(字节数)。
  4. void free(void* ptr);
    申请的动态内存不再使用时,要及时释放。free()不能重复释放一块内存。在free()函数之后需要将ptr再置空 ,即ptr = NULL;
    如果不将ptr置空的话,后面程序如果再通过ptr会访问到已经释放过无效的或者已经被回收再利用的内存, 为保证程序的健壮性, 一般我们都要写ptr = NULL; 。

•指针数组及其应用

指针数组就是存放指针的数组,其本质为数组且每个数组元素是指针。
应用:6-7 输出月份英文名

char* getmonth(int n)
{
    char* p[12] = { "January","February","March","April","May","June","July","August","September","October","November","December" };
    if (n > 12 || n < 1) return NULL;
    return p[n - 1];
}

•二级指针、行指针

二级指针 :intptr:数据类型是int,即指向指针的指针,是个二级地址。
行指针:指向某一行,不指向具体的元素。

•函数返回值为指针

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!