C语言博客05--指针

1.本章学习总结

1.1 思维导图

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

在本周的学习中,我学到了

1.数组各元素的地址与数组名的关系,以及指针在数组中的应用
2.字符串的储存方式,以及众多的字符串处理函数
3.动态内存的分配

1.2.2 代码累计

代码量(行)
15 412

2.PTA总分

2.1截图PTA中函数题目集的排名得分

2.2 我的总分:110

3.PTA实验作业

3.1 PTA题目1

  • 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

3.1.1 算法分析

定义字符指针怕,字符数组a[500001]
定义整型变量i,j,flag,其中flag=0
gets(a);//输入字符串 
j = strlen(a);
p = a + j - 1;//p指向字符串的最后一个字符 
while *p == ' ' do //跳过字符串末尾的空格 
	*p = 0;
	p--;
	j--;
end while
for j= j to 1 do
	if j == 1 then//若p指向字符串的首元素 
		if p != 0 then
			  if flag==1 then
		      	printf(" ");
		      end if
			printf("%s", p);
		end if	
	else if *(p-- - 1) == ' ' then//若p指向字符的前一个字符为空格 
		  if flag==1 then
		    printf(" ");
		   end if
		printf("%s", p+1);
		flag=1;
		while *p == ' ' do//跳过所有空格 
			*p = 0;
			p--;
			j--;
		end while
	end if
end for 

3.1.2 代码截图


3.1.3 PTA提交列表及说明

  • 这道题在一开始的时候我并没有考虑到多空格的问题,因此我也几个点上卡了一会了,直到之后注意的了可能有多个空格之后这个问题之后才过了全部的测试点

4.大作业

4.1.改造函数介绍

1.函数1

定义变量 flag;
srand(time(0));
定义整型数组_num[3],字符数组_op[3] 
num = _num, op = _op; /*全局指针num和op分别指向两个数组*/ 
定义变量 i, m, j;
m = pow(10, level);
exit:
for i = 0 to 3 do
	_num[i] = rand() % m;
	j = rand() % 4;
	switch j then
		case 0:_op[i] = '+'; break;
		case 1:_op[i] = '-'; break;
		case 2:_op[i] = '*'; break;
		case 3:_op[i] = '/'; break;
	end switch
end for
flag = IsExp(); /*判断生成的题目是否合法*/
if flag == 0 then /*若不合法则重新执行上述过程*/ 
	goto exit;
end if 
if level == 1 then /*将题目写入exp中*/ 
	sprintf(exp, "%d%c%d", num[0], op[0], num[1]);
else
	sprintf(exp, "%d%c%d%c%d", num[0], op[0], num[1], op[1], num[2]);
end if 

最终代码:

2.函数2

定义变量 p;
if op[0] == '/' then
	if num[1] == 0 then return 0;/*若除数为0*/ 
	end if
	if num[0] % num[1] == 0 thrn return 1;/*判断是否能整除*/ 
	else return 0;
	end if
end if
if op[1] == '/' then
	if num[2] == 0 then return 0;/*若除数为0*/ 
	end if
	if op[0] == '+' || op[0] == '-' then/*判断是否能整除*/ 
		if num[1] % num[2] == 0 then return 1;
		else return 0;
		end if
	else
		if op[0] == '*' then p = num[0] * num[1] % num[2];
		else p = num[0] / num[1] % num[2];
		end if
		if p == 0 then return 1;
		else return 0;
		end if
	end if
end if

最终代码:


3.函数3

定义整型变量 i, j, k, m, answer 
定义整型数组 num[10];
定义字符数组 op[10];
i = 0, m = 0, j = -1, k = -1;
do
	if exp[i]<='9'&&exp[i]>='0' then 
		m = m * 10 + exp[i] - '0';
	else
		op[++k] = exp[i];
		num[++j] = m;
		m = 0;
	end if
	if k >= 1 then /*先计算算式优先级较高的乘除法*/ 
		if  op[k-1] == '*' || op[k-1] == '/' then
			if op[k - 1] == '*' then
				num[k] = num[k - 1] * num[k];
			else if op[k - 1] == '/' then
					num[k] = num[k - 1] / num[k];
			end if
			num[k - 1] = 0;
			if k - 2 >= 0 then
				op[k - 1] = op[k - 2];
			else
				op[k - 1] = '+';
			end if
		end if
	end if
while exp[i++] != '='  do 
answer = 0;
char _op = '+';
j = 0, k = 0;
while 1 do /*计算算式中剩下的加减法*/ 
	if _op == '+' then answer += num[j++];
	else if _op == '-' then answer -= num[j++];
	else if _op == '=' break;
	end if
	_op = op[k++];
end while
return answer;


4.2 与原有函数代码比较

1.函数1

  • 函数1相较于我原本的代码来说,它是我原本几个函数合并之后的函数,整体思路并没有太多变化,只不过我借助合并删除了原本的一些多余的代码,使得代码看上去更加的简短一些

2.函数2

  • 函数2的功能是我原本没有的,是这次改动新增的,所以就不多说了

6.函数3

  • 函数3相较于我原来代码来说会更好,原来的代码只能计算一步或两部的运算,而新的代码已经不局限于一步或两步的运算了,可以计算更多步的算式

4.3 改进大作业总结

这次改进大作业我并没有进行太多的改动,只是合并了一些函数,并新增了以个原本没有的函数,其余的地方几乎还是原代码,不过这只是我初步的改进,并不是我最终的改进,但由于时间关系,本次博客我只能先用我初步的改进来写了。我现在已经开始着手于大作业的最后一次改进了,本次改进的最终改动将与大作业的最后一次改进一同完成。

posted @ 2018-12-16 15:37  xingkyh  阅读(303)  评论(3编辑  收藏  举报