题目6-1 计算两数的和与差
1 设计思路
(1)主要描述题目算法
第一步:psum为sum的地址,pdiff为diff的地址,形参op1、op2接受到实参a,b传来的值。
第二步:根据题意进行赋值。
2.实验代码
void sum_diff( float op1, float op2, float *psum, float *pdiff ) { *psum=op1+op2; *pdiff=op1-op2; }
(2) 本题调试过程碰到问题及解决办法
无。
题目6-2 拆分实数的整数与小数部分
1 设计思路
(1)主要描述题目算法
第一步:因为输入的数据为浮点型,强制转换x为整型,赋值给*intpart,*intpart的值为整数部分。
第二步:x减去*intpart为小数部分。
2.实验代码
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
(2) 本题调试过程碰到问题及解决办法
无。ps:原先定义了一个变量y用来存放强制转换x后的值,发现是多此一举。
题目6-3 在数组中查找指定元素
1 设计思路
(1)主要描述题目算法
第一步:定义变量flag=0用来标记,count用来存放指定元素的最小下标,用for循环和if语句一个一个的查找,找到了指定元素就令flag=1。
第二步:判断flag是否为0(没找到),真的就令count=-1。
第三步:返回count的值。
2.实验代码
int search( int list[], int n, int x ) { int count,j,flag=0; for(j=0;j<n;j++) { if(list[j]==x) { count=j; flag=1; } }
if(flag==0) count=-1;
return count; }
(2) 本题调试过程碰到问题及解决办法
无。
3.流程图
题目6-4 找最大值及其下标
1 设计思路
(1)主要描述题目算法
第一步:定义变量MAX,MAX存放数组第一个的值。
第二步:运用for循环比较,如果后一个的值大于MAX,就交换,下标存到指针b所指的变量里,进行下一次比较。
第三步:返回MAX的值。
2.实验代码
int fun(int *a,int *b,int n) { int j,MAX; MAX=a[0];
for(j=1;j<n;j++) { if(MAX<*(a+j)) { MAX=*(a+j); *b=j; } } return MAX; }
(2) 本题调试过程碰到问题及解决办法
错误原因:写这个程序时还不怎么会用指针,导致答案错误。
改正方法:去看了书上数组与指针那一章的几个例题。
3.流程图
题目6-5 最小数放前最大数放后
1 设计思路
(1)主要描述题目算法
第一步:运用for循环输入数组的值。
第二步:运用for循环找出最小的数的下标,再用if语句判断它是不是第一个数,不是就与第一个数进行交换。同理找出最大的数,然后交换。
第三步:输出数组元素。
2.实验代码
void input(int *arr,int n) { int i; for(i=0;i<n;i++) { scanf("%d",arr++); } } void max_min(int *arr,int n) { int j,index=0,t,flag=0; for(j=1;j<n;j++) { if(*(arr+j)<*(arr+index)) index=j; } if(index!=0) { t=*arr;*arr=*(arr+index);*(arr+index)=t; } for(j=1;j<n;j++) { if(*(arr+j)>*(arr+flag)) flag=j; } if(flag!=0) { t=*(arr+n-1);*(arr+n-1)=*(arr+flag);*(arr+flag)=t; } } void output(int *arr,int n) { int k; for(k=0;k<n;k++,arr++) { printf("%3d",*arr); } }
(2) 本题调试过程碰到问题及解决办法
无。
3.流程图
题目6-6 指针选择法排序
1 设计思路
(1)主要描述题目算法
第一步:用外循环控制趟数,n个数选n-1趟,假设当前趟的第一个数为最值,记在k中 。
第二步:再用for循环从下一个数到最后一个数之间找最值,若其后有比最值更大的,则将其下标记在k中。
第三步:若k不为最初的i值,就交换。
2.实验代码
void sort(int *x,int n) { int i,t,k,j; for(i=0;i<(n-1);i++) { k=i; for(j=i+1;j<n;j++) { if(*(x+j)>*(x+k)) { k=j; } } if(i!=k) { t=*(x+i); *(x+i)=*(x+k); *(x+k)=t; } } }
(2) 本题调试过程碰到问题及解决办法
因为以前做过此题,所以没有问题。
3.流程
题目6-7 判断回文字符串
1 设计思路
(1)主要描述题目算法
第一步:用while循环语句判断字符串数组有多少个字符。
第二步:定义变量j,从后往前与从前往后比较字符,不相等就跳出循环。
第三步:比较j和i的大小,j大于i返回真,j小于i返回假。
2.实验代码
bool palindrome( char *s ) { int i=0,j=0; while(*(s+i)!='\0') { i++; } i--; for(;j<=i;i--,j++) { if(*(s+i)!=*(s+j)) { break; } } if(j>i) return 1; else return 0; }
(2) 本题调试过程碰到问题及解决办法
老师上课讲过此题,所以并无问题。
3.流程图
题目6-8 使用函数实现字符串部分复制
1 设计思路
(1)主要描述题目算法
第一步:用while循环语句判断字符串数组有多少个字符。
第二步:判断m是否超过输入字符串的长度,是结果字符串应为空串,不是,定义一个变量i和j,i从m-1个字符开始赋值给j=0时的新字符数组。
第三步:令最后一个字符数组的值为'\0'。
2.实验代码
void strmcpy( char *t, int m, char *s ) { int i,j=0; while(*(t+i)!='\0') { i++; } i--; if((i+1)<m) *s='\0'; else { for(i=(m-1),j=0;*(t+i)!='\0';i++,j++) { *(s+j)=*(t+i); }
*(s+j)='\0';
}
}
(2) 本题调试过程碰到问题及解决办法
1、如果不写 void ReadString( char s[] ) 这个函数,在编译器中运行不了,但是加上后PTA提交答案为错误。
解决办法:在PTA的提交中不写 void ReadString( char s[] ) 这个函数,,题目中已说明可以不用表示,其实它写的略去不表我想了半天。。。原来意思是不表示。。。
2、按照我的写法写,最后没有写
*(s+j)='\0' 程序会输出乱码。
原因:因为C通过判断'\0'来辨识字符串的结束。系统读取字符串,它只是从字符数组的开始,一直往后找,一直找到'\0'为止。如果不加,系统只好再往后找,一直找到'\0'为止。
3.流程图
二. 总结
1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?
这两周主要学习了指针以及它的应用,知道了指针的作用(通过地址能找到所需的变量单元)和如何定义、使用它。我问题大的地方其实不是指针而是函数,可能时因为上学期对这一块少加练习的缘故,不知道形参和实参它们之间是如何传递的,不知道在函数调用结束后,形参所占的内存单元会被释放,形参发生改变不会改变主调函数实参的值。所以这几次PTA的作业,让我不光学习了指针还让我重新复习了函数。
通过这几次的PTA作业,我发现刚开始写时,对指针的运用并不熟练,果然自己以为听懂了和实际写起来还是有很大的差别,这也说明了代码光看是没有用的。上个周末去参加了ACM的招新,有一道题已经完成了99%了,调试时总是输出答案不对,在我冥思苦想时,时间已经到了。等到学长他们讲思路时我终于发现了我的问题所在,就是一个小小的地方(重新计数时没让它的值等于0),非常后悔和可惜。虽然最后进了ACM,但是我觉得自己在写代码这块思路还是不清晰,想到啥写啥,代码也不够简洁,最好的办法还是多加练习,看书上的例题时最好开着编译器自己动手打打。
2、Git地址:https://coding.net/u/FENGZX/p/PTA/git?public=true
3、点评3个同学的本周作业
4、学习进度表格