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

0.展示PTA总分(0----2)#

1.本章学习总结(2分)#

1.1 学习内容总结##

  • 指针的定义:类型名指针变量名;内存地址一般都是用16进制数表示;&表示地址运算符,例如p =&x;是将变量x 的地址存储在p 中;指针变量的类型是指它所指向的变量的数据类型,必须将指针变量和一个特定的变量进行关联后才可以使用它,指针变量必须先赋值;p++不再是指向原来的那个向量,而是一个新向量,* p ++等价与*( p ++);只能把一个指针的值赋给另一个相同类型的指针;对于指针的函数调用,实参是地址,传递的是地址,用指针类型形参接受该变量的地址;学到了冒泡法排序的代码;数组名本身是一个地址即指针值,数组名的地址也是数组第一个元素的地址,数组名可以使用指针形式,而指针变量也可以转换为数组形式;指针的算术运算只包括两个相同类型的指针相减以及指针加上或减去一个整数,其他的操作如指针相加、相乘和相除,或指针加上和减去一个浮点数都是非法的;还学到了二分法查找的方法,sum函数的使用;字符的输入,可以有scanf(“%s”,str);gets(str);fgets(str,10,stdin);以及其他输入方式,字符的输出,可以有printf(“%s”,str);puts(str);printf(“%s”,“hello”);以及其它输出方式。字符数组与字符指针之间的转换关系。常用的字符串处理函数,头文件是<string.h>,字符串复制函数strcpy(str1,str2);字符串连接函数strcat(str1,str2);字符串比较函数strcmp(str1,str2);字符串长度函数strlen(str);知道了怎么动态分配内存,一般调用动态分配函数malloc()或calloc,分配的内存空间不用时要释放,调用free()函数,更改以前的存储分配时,调用分配调整函数realloc()。堆区和栈区都是动态存储区的一部分。堆区:在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的 ;栈区:在执行函数调用时,系统在栈上为函数的局部变量及形参分配内存,函数执行结束时,自动释放这些内存。栈区生存期由函数决定,堆区由程序员决定;栈区由编译系统自动分配释放,无需程序员管理,生长方向向下,分配效率高,无碎片问题,而堆区程序员不释放,会造成内存泄漏,生长方向是向上的,分配效率低,频繁申请/释放易造成内存碎片。指针数组一般格式:类型名(char) *数组名 [数组长度];二维数组一般格式为:类型名(char) 数组名 [行长度] [列长度]。括号里面指类型名为char时,定义的是多个字符串。指针数组不仅可以对多个字符串整体操作,还可以对字符串中的字符进行操作。定义二维字符数组时由于各个字符串的长度一般并不相同,会造成内存单元的浪费,而指针数组并不存放字符串,仅仅用数组元素指向各个字符串,就没有类似的问题。

1.2 本章学习体会##

  • 不清晰的主要是指针的变换,指针与数组之间的变换和转化,有的比较不明白,还有就是反复的取地址和取内容,有点混乱。通过对指针的学习,发现指针的理解不是很容易,感觉指针是个神奇的东西,而且代码里面写指针的时候,不是很会调试。
  • 代码量774

2.PTA实验作业(7分)#

2.1 7-2藏尾诗##

2.1.1 伪代码###

定义一个二维字符数组ch用来存放诗句,一个一维字符数组str存放每句诗句的最后一个字,整型变量i,j,k来控制字符循环。

	定义二维字符数组ch
	定义一维字符数组str
        定义整型变量i,j,k,并且k=0


	for (i = 0; i < 4; i++)
		for (j = 0; j < 20; j++)
			输入一个字符,如果输入的是回车则介绍循环
                end for
		如果字符是回车,则跳到下一轮循环
	end for
	for (i = 0; i < 4; i++)
		for (j = 0; j < 20; j++)
			if (ch[i][j] == '\n')
				str[k++] = ch[i][j - 2];
				str[k++] = ch[i][j - 1];
                        end if
		end for
	end for
	str[k] = '\0';
	输出字符串str

2.1.2代码截图###


2.1.3总结本题的知识点###

  • 本题的知识点是字符数组一维和二维的熟练应用。

2.1.4PTA提交列表及说明###

1.这道题虽然在提交PTA的时候一次就过了,但我在vs上调试不少世界。
2.刚开始正常运行,也可以输入,但是不输出,只能一直输入,不知道错在哪了,再读了一下代码,发现是行数和列数写反了。
3.改了行数和列数,还是同样的问题,不能结束,然后我又加了换行时的条件。
4.加过条件后还是一样的问题,就再读了一下代码,发现是输入的代码写错了把%c写成了%s。
5.答案正确:改过之后,提交就对了。

2.2 7-3 字符串的冒泡排序##

2.2.1伪代码###

定义一个一维字符数组strE用来做两个字符串交换的中间变量,一个二维字符数组str用来存放若干个字符串,整型变量N,K分别表示有N行字符串,和扫描到第K遍,整型变量i,j来控制循环
        定义整型变量i,j,N,K
        定义一维字符数组strE
        输入整数N和K
	定义二维字符数组str

	输入若干个字符串

	for (j = 1; j <= K; j++)
		for (i = 0; i < N-j; i++)
			比较两个字符串大小,并交换位置,小的在前面,大的在后面
		end for
        end for	
	输出若干个字符串

2.2.2代码截图###


2.2.3总结本题的知识点###

  • 本题的知识点主要是冒泡排序法的应用,二维字符数组的输入输出,两个字符串的互换。

2.2.4PTA提交列表及说明###

1.部分正确:最小N,1次排序,顺序,最大字符串这个测试点错误,因为字符数组最后会吸收一个回车,数组长度写错了。
2.答案正确:把数组长度多加了1后就正确了。

2.3 7-1(指针做函数返回值) 查找指定字符##

2.3.1伪代码###

定义一个一维字符数组str,一个查找字符ch,下标位置index,判断变量flag,参与循环控制的变量i
        定义ch和str
        定义i和index,flag=0
        
	输入一个字符
	getchar();//吸收回车
	输入一个字符串

	for (i = 0; str[i] && str[i] != '\n'; i++)
		if (ch == str[i])
			index = i;
			flag = 1;
		end if
        end for
	if (flag 等于 1)
		输出下标
	else
		输出Not Found
        end if

2.3.2代码截图###

2.3.3 总结本题的知识点###

  • 本题的知识点是如何遍历字符数组,在字符数组中找元素,并记录下标,还有就是字符及其字符数组的输入和输出,连着输入时,要学会用getchar()吸收回车。

2.3.4 PTA提交列表及说明###

1.编译错误:gets写成了gets_s,提交pta的时候忘改了。
2.部分正确:下标等于最大值时错误,由于最后会多一个回车,数组长度不够。
3.答案正确:把数组长度扩大了一点,然后就对了。

3.阅读代码(-2--1分)#


  • 这个代码的功能是给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。
  • 首先,把两个算式对齐。分别把字符串转为字符数组,把长度短的进行调整,长度与两个字符串中最长的相等。其次,进行每一位上的运算。然后,循环处理每一位,同时记录是否产生进位。最后,要注意是否产生了最后一个进位,使得整个流程保持严谨。
  • 这段代码巧妙的使用了一个自定义指针函数,返回值为指针类型,这是值得学习的地方,熟练的运用了memset函数和~运算符,是代码得到了大量的简化,值得学习

posted on 2019-12-01 14:57  王威。  阅读(243)  评论(1编辑  收藏  举报

导航