0.展示PTA总分(0----2)
1.本章学习总结(2分)
1.1 学习内容总结
指针做循环变量做法:让指针向下移动,改变本来表示的内容,*(数组名+序号)
字符指针如何表示字符串:将指针首地址指向字符串
char str[] = "hello world";
char *p = str;
直接使用一个指针指向字符串的方式来表示字符串:
char *str = "hello world";
动态内存分配:
有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.
malloc函数的原型为:void *malloc (unsigned int size) 其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。还有一点必须注意的是,当函数未能成功分配存储空间(如内存不足)就会返回一个NULL指针。所以在调用该函数时应该检测返回值是否为NULL并执行相应的操作。
指针数组及其应用:
指针数组其实就一个用来存放指针的数组.
二级指针、行指针:二级指针就是指向指针的指针,行指针出现在二维数组中,例如有一个二维数组a[2][3];a[0]指的就是这个二维数组第0行的首地址,相当于&a[0][0];
函数返回值为指针:当函数返回值的类型是指针时,要返回某个指针,不过要注意的是,不能在实现函数时返回在函数内部定义的局部数据对象的地址,这是因为所有的局部数据对象在函数返回时就会消亡,其值不再有效。
1.2 本章学习体会
指针这块还是感觉有些抽象,学习起来比较困难,目前对这块知识的掌握较为薄弱,希望今后每天坚持学习下去,攻克这一难关。
计算这两周代码量:358
2.PTA实验作业(7分)
2.1 题目名1:6-6 查找子串
2.1.1 伪代码
定义空指针p
定义整型变量i, j, k = 0, lengths, lengtht;
定义lengths等于s的长度,
定义length等于t的长度
for (i的初值为0; i小于lengths则做累加)
令j等于i;
while (s[j]与t[k]相等)
{
k和j做累加;
}
如果(k大于等于lengtht)
p等于&s[i]并返回p
k等于0,即重置k
end for
返回p
2.1.2 代码截图
2.1.3 总结本题的知识点
1.函数strlen的使用
2.现将*p定义为空指针
2.1.4 PTA提交列表及说明
1.部分正确:未解决 长度超过题面MAXS, t在结尾处 这个测试点不知道出了什么问题,令k>lengtht解决
2.编译错误:少打了分号
2.2 题目名2:7-3 字符串的冒泡排序
我们已经知道了将N个整数按从小到大排序的冒泡排序法。本题要求将此方法用于字符串序列,并对任意给定的K(<N),输出扫描完第K遍后的中间结果序列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),此后N行,每行包含一个长度不超过10的、仅由小写英文字母组成的非空字符串。
输出格式:
输出冒泡排序法扫描完第K遍后的中间结果序列,每行包含一个字符串。
2.2.1 伪代码
for i from0 to n
输入数组p
end for
for i from1 to n
如果count等于k则退出
for j from 0 to n-i
交换p[j]和p[j-1]的值
end for
count++
end for
输出数组
2.2.2 代码截图
2.2.3 总结本题的知识点
1.函数strcpy的使用
2.函数strcmp的使用
3.交换字符串
strcpy(temp, p[j]);
strcpy(p[j], p[j + 1]);
strcpy(p[j + 1], temp);
4.字符串如何进行冒泡排序
2.2.4 PTA提交列表及说明
1.答案错误:for循环的条件出错,改为如截图所示即解决
2.答案错误:冒泡排序的比大小的语句出错,改用strcmp才正确
2.3 题目名3:7-4 说反话-加强版
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。
2.3.1 伪代码
fgets(str, N - 1, stdin);输入字符串str
endstr = str;定义指针endstr指向str
while (*endstr && *endstr != '
')
endstr++;
p = --endstr;遍历指针
while(p不等于str)
{
如果p不等于空格
统计单词长度
{ 如果p-1为空格
输出单词
否则加上空格再输出
}
p--
}
输出首个单词
2.3.2 代码截图
2.3.3 总结本题的知识点
1.字符串指针表示某个子串printf("%.*s",len,p);
2.逆向扫描字符串while(p!=str) p--;
3.如何查找前一字符是空格的字符串
2.3.4 PTA提交列表及说明
1.部分正确:前几次不知道如何判断单词并输出,只过了一个测试点,看了讲解才明白
2.部分正确:(2)调试时只能输出首字母,然后发现循环体语句出问题
3.部分正确:(17)未能输出第一个单词,输出语句补充了一下
3.阅读代码(-2--1分)
Freddie the frosh has chosen to take k courses. To meet the degree requirements, he must take courses from each of several categories. Can you assure Freddie that he will graduate, based on his course selection?
输入描述
Input consists of several test cases. For each case, the first line of input cont
输出描述
For each test case, output a line containing "yes" if Freddie's course selection meets the degree requirements; otherwise output "no".
输入例子
3 2
0123 9876 2222
2 1 8888 2222
3 2 9876 2222 7654
3 2
0123 9876 2222
2 2 8888 2222
3 2 7654 9876 2222
0
输出例子
yes
no
参考答案
#include<stdio.h>
#include<string.h>
int main()
{
int i,j,r,c;
int k,m,a,b,flag;
int map[10000];
while(scanf("%d",&k)!=EOF,k)
{
memset(map,0,sizeof map);
scanf("%d",&m);
for(i=0;i<k;i++)
{
scanf("%d",&a);
map[a]++;
}
flag=1;
int count;
for(i=0;i<m;i++)
{
scanf("%d %d",&r,&c);
count=0;
for(j=0;j<r;j++)
{
scanf("%d",&b);
if(map[b]>0)
count++;
}
if(count<c)
flag=0;
}
if(flag==0)
puts("no");
else
puts("yes");
}
return 0;
}
这段代码的问题是有个人选择了k门课程。为了达到学位要求,他必须修几门课中的每一门,问根据他的选课情况,他会不会毕业。这段代码所运用到的知识多多少少与我们目前已经掌握的知识有关,像循环语句,flag的使用,数组。不过经过查找资料,我懂得了EOF这句代码的用法。EOF,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。(while(scanf("%d",&n) != EOF))
如果不加" != EOF",那么这个while语句就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束。