0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
•指针做循环变量做法
1.使指针移动,指向下一个地址单元,改变了指针原本指向的位置。
2.下标法,寻找离指针指向位置i个单位的位置,不会改变了指针原本指向的位置。
•字符指针如何表示字符串
用字符指针指向一个字符串的首地址。
•动态内存分配
void *malloc(size_t size);
函数 malloc()分配连续的内存区域,其大小不小于 size,需要强制类型转换。malloc()获得内存区域时,内存中的内容没有初值。void*calloc(size_t n,size_t size);
calloc()函数功能是动态分配n个大小为size的内存空间,需要强制类型转换。calloc()函数会将所申请的内存空间中的每个字节都初始化为0。void * realloc(void * ptr,size_t size);
realloc() 函数可以做到对动态开辟内存大小的调整(既可以往大调整, 也可以往小调整)。ptr为需要调整的内存地址,size为调整后需要的大小(字节数)。void free(void* ptr);
申请的动态内存不再使用时,要及时释放。free()不能重复释放一块内存。在free()函数之后需要将ptr再置空 ,即ptr = NULL;
如果不将ptr置空的话,后面程序如果再通过ptr会访问到已经释放过无效的或者已经被回收再利用的内存, 为保证程序的健壮性, 一般我们都要写ptr = NULL; 。
•指针数组及其应用
指针数组就是存放指针的数组,其本质为数组且每个数组元素是指针。
应用:6-7 输出月份英文名
char* getmonth(int n) { char* p[12] = { "January","February","March","April","May","June","July","August","September","October","November","December" }; if (n > 12 || n < 1) return NULL; return p[n - 1]; }
•二级指针、行指针
二级指针 :intptr:数据类型是int,即指向指针的指针,是个二级地址。
行指针:指向某一行,不指向具体的元素。
•函数返回值为指针
1.2 本章学习体会
对于一维数组和二维数组的学习有些明白,但是对于字符数组实在是懵。还有对于一些题目,虽然做出来了,但是代码非常多,应该能找到更简洁的方法去写。
代码量:483行
2.PTA实验作业
2.1 7-4 删除重复字符
2.1.1 伪代码
#include<stdio.h> #define N 201 int main() { char s[N]; static char h[N]; int i=0; int k; //输入字符串 for (i = 0; s[i] != '\0'; i++) { k = (int)s[i];//强制类型转换 h[k] = s[i];//将字符储存在对应ASCII码值得数组内 } 输出字符串 return 0; }
2.1.2 代码截图
#include<stdio.h> #define N 201 int main() { char s[N]; static char h[N]; int i=0; int k; while ((s[i] = getchar()) != '\n') { i++; } s[i] = '\0'; for (i = 0; s[i] != '\0'; i++) { k = (int)s[i]; h[k] = s[i]; } for (i = 0; i < 200; i++) { if (h[i] != 0) { printf("%c", h[i]); } } return 0; }
2.1.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
全空格 | 一个空格 | 全空格 |
==--ccbbaa;;'' | '-;=abc | 有其他字符 |
2.1.4 PTA提交列表及说明
部分正确:只考虑了字母和数字的情况,没有考虑其他字符的输入与重复。也没有考虑全空格的情况。
2.2 7-7 jmu-c-大数加法
2.2.1 数据处理
char a[N];//大数a char b[N];//大数b int n=1,m=1,i,j,k;//循环变量 int x, y; int z; a[0] = '0';//考虑进位 b[0] = '0';;//考虑进位
2.2.2 代码截图
#include<stdio.h> #include<string.h> #define M 1002 #define N 1003 int main() { char a[N]; int n=1,m=1,i,j,k; int x, y; int z; char b[N]; a[0] = '0'; b[0] = '0'; while ((a[n] = getchar()) != '\n') { n++; } a[n] = '\0'; while ((b[m] = getchar()) != '\n') { m++; } b[m] = '\0'; j = n-1; i = m - 1; if (n>=m) { for (i; i >= 0; i--) { x = a[j] - '0'; y = b[i] - '0'; if (x + y > 9) { a[j] = (x + y - 10) + '0'; for (k = j;; k--) { a[k - 1] = a[k - 1] + 1; if (a[k - 1] - '9' > 0) { a[k - 1] = '0'; continue; } else break; } } else a[j] = (x + y) + '0'; j--; } if (a[0] != '0') { printf("%s", a); } else { for (i = 1; i < n; i++) { printf("%c", a[i]); } } } else { for (j; j >= 0; j--) { x = a[j] - '0'; y = b[i] - '0'; if (x + y > 9) { b[i] = (x + y - 10) + '0'; for (k = i;; k--) { b[k - 1] = b[k - 1] + 1; if (b[k - 1] - '9' > 0) { b[k - 1] = '0'; continue; } else break; } } else b[i] = (x + y) + '0'; i--; } if (b[0] != '0') { printf("%s", b); } else { for (i = 1; i < m; i++) { printf("%c", b[i]); } } } return 0; }
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
99、1 | 100 | 检验是否进位 |
1、99 | 100 | a的位数小于b |
2.2.4 PTA提交列表及说明
答案错误:没有考虑a的位数比b来得少。
2.3 7-5 有重复的数据I
2.3.1 数据处理
int static hash[100001];//定义一个哈希数组来表示数据是否出现过
2.3.2 代码截图
#include<stdio.h> #define N 100001 int check(int n); int main() { int a[N]; int n; int m; int i; int flag = 0; scanf("%d", &n); if (check(n) == 0) { printf("YES"); } else { printf("NO"); } return 0; } int check(int n) { int static hash[100001]; int i; int x; for (i = 1; i <= n; i++) { scanf("%d", &x); if (hash[x] == 1) { return 1; } else { hash[x]=1; } } return 0; }
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
1 2 3 4 5 1 | YES | 最后一个有重复 |
2.3.4 PTA提交列表及说明
部分正确:使用逐一查找的方法来判断是否有重复数据,浪费了时间,还导致了段错误。改用以空间换时间的方法来重写代码。
3.阅读代码
7-7 螺旋方阵
#include<stdio.h> int main(void) { int n; int a[10][10]; scanf("%d", &n); int x = 0, y = 0;//坐标,爱的螺旋转圈圈 int k = 1;//循环数1~n*n int bound0 = n - 1, bound1 = n - 1, bound2 = 0, bound3 = 1;//右下左上个方向的墙壁会向中间缩拢 int direction = 0;//0向右,1向下,2向左,3向上 while (k <= n * n) { if (direction == 0) { a[x][y++] = k++; if (y == bound0) { //向右走,遇到墙壁就向下 direction = 1; bound0--; } } else if (direction == 1) { a[x++][y] = k++; if (x == bound1) { //向下走,遇到墙壁就向左 direction = 2; bound1--; } } else if (direction == 2) { a[x][y--] = k++; if (y == bound2) { //向左走,遇到墙壁就向上 direction = 3; bound2++; } } else if (direction == 3) { a[x--][y] = k++; if (x == bound3) { //向上走,遇到墙壁就向右 direction = 0; bound3++; } } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { printf(" %2d", a[i][j]); } printf("\n"); } }
功能:打印n阶螺旋方阵
这个螺旋方针题目的解法令我眼前一亮,它用生动形象的注释,将一个复杂的问题形象化、简单化,我想,自己写代码是否也能像这样子灵动。同时它也让我知道了代码并不一定是枯燥的
,它只要加上一点注释,就可以变得很优美。