C博客作业05--2019-指针

0.展示PTA总分

1.本章学习总结

1.1 学习内容总结

  • 指针做循环变量做法

指针做循环变量可以做判断条件
如:
当遍历整型数组num时遇到-1时,循环结束

for(p=num;*p!=-1;p++)
    {
        ...
    }

当字符串结束时(字符串末尾为'\0'),停止循环

for(p=ch;*p;p++)
    {
        ...
    }
  • 字符指针如何表示字符串

字符指针表示字符串,需要将字符指针指向字符串的第一个字符,并在字符结尾放一个结束符\0
如:

char*p;
char ch[6]={'h','e','l','l','o','\0'};

p=ch
  • 动态内存分配
    动态内存分配主要运用malloc函数,其用法为:
int *p;
int n;

scanf("%d",&n);

p=(int*)malloc(sizeof(int)*n);

...

feel(p);
  • 指针数组及其应用

指针数组,即指针的数组,是一个能存储多个指针的数组,主要应用于多个字符串的存储,如:

char*p[2];
char ch1[6]={"hello"};
char ch2[6]={"world"};

p[1]=ch1;
p[2]=ch2;
  • 二级指针、行指针

二级指针,即指向指针的指针,主要用于指向二维数组的行,用于跨行遍历。

  • 函数返回值为指针

有时候函数返回值为指针,只需要在定义函数类型时定义为指针,如:

int*函数名(形参);

1.2 本章学习体会

学习了指针,我们能够更加方便地在不同的函数里传参数,修改,也能跟加方便地对数组进行遍历。在学完了本章内容,我们应该要更好地掌握函数的灵活运用,尽量将代码分装,并且能灵活的运用指针传参,尽量减少主函数的内容,让代码更加简洁。
*代码量:450

2.PTA实验作业

2.1 题目名 6-5 字符串反正序连接 (10 分)

2.1.1 伪代码

void fun (char *s, char *t)
{
    定义整型变量count初始化为0
    定义一个指向s的指针p

    while(*p)
    {
        count加1
        p加1
    }

    for(p--;count;count--,p--,t++)
    {
        将p所指的字符放到t上
    }

    for(p=s;*p;p++,t++)
    {
        将p所指的字符放到t上
    }

    *t=0
}

2.1.2 代码截图

2.1.3 总结本题的知识点

  • 对指针遍历数组的考察
  • 对数组输出顺序变换的考察

2.1.4 PTA提交列表及说明

2.2 题目名 6-4 求出数组中最大数和次最大数

2.2.1 伪代码

int fun(int* a, int n)
{
        定义指针p、pmax、pmax2分别指向a、a、a+1.
	定义一个整型变量temp

        用指针p遍历数组,将最大数的地址交给pmax
	用temp将a[0]中的数与pmax所指的数交换

	用指针p从a[1]开始遍历数组,将最大数的地址交给pmax2
	用temp将a[1]中的数与pmax2所指的数交换

	return 0;
}

2.2.2 代码截图

2.2.3 总结本题的知识点

  • 指针对数组的遍历
  • 利用指针将数组中的两个数交换

2.2.4 PTA提交列表及说明


1.编译错误:分号忘记打
2.答案错误:让两个指针先指向最大数与次大数,再同时交换,但是如果次大数再数组的第一个,再最大数交换时,它的地址就变了,所以错误了
3.答案正确:将两个指针一个指好交换好再换下一个。

2.3 题目名 6-7 输出月份英文名

2.3.1 伪代码

char* getmonth(int n)
{
	定义一个十三行的二维字符数组,第一行放0,从第二行开始依次将十二月份的英文单词放入
	if n不是月份
	{
		返回NULL;
	}
	else
	{
		返回month[n];
	}
}

2.3.2 代码截图

2.3.3 总结本题的知识点

  • 对二维数组的定义与调用
  • 对函数返回类型为指针的运用进行考察

2.3.4 PTA提交列表及说明

3.阅读代码


本题的主要思路
1.将输入的字符存储到一个字符数组中
2.对开头的字符进行处理
通过定义k=0,然后在遍历数组时

if(k=0)
{
    if(ch(i)==' ');
    {
        k=1;
    }
}
if(k)
{
...
}

即可忽略开头空格
然后是正负判断,在循环外定义j=0,flag=0,在开始遍历数组时

if(j=0)
{
    if (ch[i]=='-')
    {
        flag=1;
    }
    else
    {
        num=ch[i]-'0';
    }
}

即可通过flag判断数是否为零

3.转换
遍历数组,将字符转化为整型

num=num*10+ch-'0';

判断是否超出范围
利用double存储,如果大于int所能存储的大小,则停止循环输出INT_MAX (231 − 1) 或 INT_MIN (−231)

4.判断结束
当字符串出现非数字字符是时,停止遍历

5.结尾
判断正负

if(flag)
{
    num*=-1;
}

6.输出

posted @ 2019-12-01 12:57  ZGGYY  阅读(301)  评论(0编辑  收藏  举报