0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- 指针与指针变量
- 指针:内存中的一个存储单元的地址,即内存单元的编号。
- 指针变量:声明一个变量并使用地址作为该变量的值,即一个能存放地址值的变量,通过它存放的地址值能间接访问它所指向的内容。
- 动态内存分配
- malloc动态申请内存
- calloc动态申请内存
- realloc动态申请内存
- 动态内存释放free()
- 指针做循环变量做法
int a[20];
int n;
int *p;
p=a; //一维数组的数组名就是代表数组的首地址,一般不轻易改变原来的地址,引入一个新的指针变量去遍历
fgets(a,20,stdin)
for(p=a;*p&&*p!='
';p++)
printf("%d",*p);
- 字符指针如何表示字符串
char str[]="Hello,World";
char *ptr;
for(ptr=str;*ptr&&*ptr!='
';ptr++)
printf("%c",*ptr);
- 指针数组及其应用
int *p;
int i;
char *pch[6]={"1","2","3","4","5","6"};
for(i=0;i<6;i++)
printf("%s",pch[i]);
- 二级指针、行指针
二级指针:
类型名** 变量名;
例:
int a = 10;
int* p = &a;
int** p = &p;
a、* p、** p代表同一个单元,它们的值相同
理论上,可以定义任意多级指针,但实际中很少超过二级,避免指针级数过多造成理解错误,使程序可读性降低。
行指针:int(*p)[n]; p = a;
p + i表示第i行的首地址a[i],二级指针
a[i][j] = *(*(p + i) + j) = (*(p + i))[j] = p[i][j];
- 函数返回值为指针
返回指针的函数一般都返回全局数据对象或主调函数中数据对象的地址
因为所有的局部数据对象在函数返回时就会消亡,其值不再有效
1.2 本章学习体会
- 指针是一块相当重要的内容,我感觉他集合了前面所有的内容,但学习中又有些抽象,不易理解,所以还是要多刷题,多看书
- 代码量:512行
2.PTA实验作业
2.1 输出月份英文名
2.1.1 伪代码
接收月份数n
定义字符指针m接收要传递的地址(静态变量)
定义二维数组看k[13][20]接收英文
定义整型变量j
for j=1 to 12
if j==n//找到月份
m=k+j;
return m;
end for
return 0
2.1.2 代码截图
2.1.3 总结本题的知识点
- 函数返回值为指针:不能返回函数内部定义的变量,因为这种变量会随函数结束而被清除,所以我们一般返回全局变量或主函数中的指针,又或是静态局部变量
2.1.4 PTA提交列表及说明
Q1:主要是没理解指针作为参数的限制,翻书后明白了,把指针定义为静态局部变量就可以了
Q2:另外一开始是用switch语句做的,现在想挺蠢的,然后是忘了加break。
2.2 藏尾诗
2.2.1 伪代码
char*p[5][20]//存放诗句
定义i,j做为循环变量,k存放长度
for i=0 to 3
*p[i]=(char*)malloc(20);//分配内存存储诗句
fgets(*p[i],20,stdin);
end for
for j=0 to 3
k=strlen(*p[j]);
printf("%s", *p[j] + k - 3);
end for
2.2.2 代码截图
2.2.3 总结本题的知识点
- 汉字在字符中占两个字节
- 指针做循环变量
- 动态内存的分配
2.2.4 PTA提交列表及说明
Q1:使用mall哦草函数是没有强制转换返回类型
Q2:输出时包含了换行符,导致答案不对,将倒数第二个字节改成0就好了
2.3 jmu-c-二分查找
2.3.1 伪代码
int min,max记录下限与上限
int temp 记录中间值
while (min <= max)//二分法开始
temp = (min + max) / 2;
if (*(a + temp) == key)
{
(*count)++;
return temp;
}
else if (*(a + temp) < key)
{
min = temp + 1;
(*count)++;
}
else
{
max = temp - 1;
(*count)++;
}
}
2.3.2 代码截图
2.3.3 总结本题的知识点
- 二分法的熟练运用
- 指针的下标用法
2.3.4 PTA提交列表及说明
Q:pta虽然一次过了,但在vs上错了很多次,主要是对二分法的运用不太熟练
3.阅读代码
首先建立一个HashMap来映射符号和值,然后对字符串从左到右来,如果当前字符代表的值不小于其右边,就加上该值;否则就减去该值。以此类推到最左边的数,最终得到的结果即是答案