C语言博客05--指针
1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
在本周指针的学习中,遇到了很多难点,运用起来很不熟练。比如说:
- 当指针指向一个数组的时候,该如何控制指针指向的地方。int a【10】,*p=a。此时指针指向数组的第一个元素。
- 如何用指针来调换两个数组的数据:先初始化m,n的值
char *p1=a[n], *p2=b[m],p3;
if(*p1!=‘\0’&&*p1!=‘\0’)
{
p3=*p1;
*p1=*p2;
*p2=p3;
p1++;p2++;}
在之后的内容学习中一定要先有较为扎实的基础知识才能更好地习得高等知识,要多多加油!
1.2.2 代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
指针 --- 110分(满分)
3.PTA实验作业
3.1 PTA题目1
题目一:编写一个解密藏尾诗的程序。
算法分析:
char *p,str[20],record[10]; 定义字符型指针,两个字符型数组
int i,n; 定义整形变量
record[0]=0; 初始化一个字符型数组来存放最后结果
for(i=0;i<=3;i++) gets(str) 题目中明说有四句话,循环输入四次
n=strlen(str); 求出输入的长度
p = str; p=p+n-2; 读取最后一个字符(文字),因为一个汉字占两个字节,因此减二
strcat(record,p); 复制到结果数组中 end for
puts(record); 按要求输出藏尾诗
3.1.2 代码截图
3.1.3 PTA提交列表及说明
了解如何使控制指针指向指定位置,然后注意好字节的控制,最后进行输出。
4.大作业
4.1.改造函数介绍
改进内容:
1.构造字符数组存放算术表达式
伪代码分析:
int num1; 定义整形变量
srand(time(NULL)); 随机数
if(level == 1) num1 = 4; 一二三级算式的长度
else if(level == 2) num1 = 9;
else num1 = 12;
for(int i = 0;i < num1-1;i ++)
{
for(int x = 0;x < level;x ++)
exp[i++] = rand() % 10 + '0'; 产生随机一位数(字符型)
if(level == 1)
{
int t = rand() % 4; +-*/的随缘取法
if (t == 0) exp[i] = '+';
else if (t == 1) exp[i] = '-';
else if (t == 2) exp[i] = '*';
else if (t == 3) exp[i] = '/';
}
else
{
int t = rand() % 2; +-的随缘取法
if (t == 0) exp[i] = '+';
else if (t == 1) exp[i] = '-';
}
}
exp[num1-1] = '='; 算式的等号
exp[num1] = '\0'; 数组结束的地方
end
代码截图:
2.判断表达式是否合法
伪代码分析:
if(a == '/') a为全局变量
{
if(exp[2] == '0') 只有在除法运算中才会出现非法运算
return 0; 被除数为零,return 0;
if((exp[0]-'0') / (exp[2]-'0') == 1)
return 0; 除不尽时,返回0
}
return 1; 其他情况,视为成立。return 1
end
代码截图:
3.根据字符表达式,能计算其结果。
伪代码分析:
static int num_temp,numtemp[10],a=0,b=0; 初始化数据
char op_temp,optemp[2];
for(int i = 0;exp[i];i ++)
if(exp[i] >= '0' && exp[i] <= '9')
{
numtemp[a] = numtemp[a] * 10 + (exp[i] - '0');
a ++; 计算数据(二位三位数的计算)
}
else
{
optemp[b] = exp[i]; 存储运算符
b ++;
} end for
for(int i = 0;i < b;i ++)
switch (optemp[b]) 分情况讨论
{
case('+'):numtemp[0] = numtemp[0] + numtemp[1];
if(level > 1) numtemp[0] += numtemp[2]; break; 二级三级的运算有两步
case('-'):numtemp[0] = numtemp[0] - numtemp[1]; break;
if(level > 1) numtemp[0] -= numtemp[2];
case('*'):numtemp[0] = numtemp[0] * numtemp[1]; break;
case('/'):numtemp[0] = numtemp[0] / numtemp[1]; break;
} end for
return numtemp[0]; 返回答案 end
代码截图:
4.3 与原有函数代码比较
以前的代码是一个函数覆盖了创造算式、判断算式是否合理、判断答案正误、输出正答率等功能,比较繁琐(功能比较强大。。。),也就导致了灵活性趋近于zero;因此在这次大作业中,不得不对它进行大手术。现在的代码,作用明显且单一,具有客观的灵活性,易变通。
4.4 改进大作业总结
- 上一次的大作业难点在于怎么去制造随机数和时间处理上,还有第一次写,没有较好的控面能力,不能很好地把介绍语言、提示语言、画面整洁度提供给使用者。经过了一次的尝试,听了老师和同学的讲解后对于这些内容已经初具模型,萌发出了自己的想法,期冀这次可以做得更好!
- 这一次的大作业要使用指针来记录字符数组的地址,进行存放算式。不能熟练地使用指针,因此在各个部分都有知识盲点存在(猛.虎.落.泪.),通过不断地查询资料,观看视频,询问同学来慢慢改进代码!
- 注意事项:在以后的代码编写时,函数过多时一定要分开编写,否则很难调试;