作业要求一
请将pta作业编程题目的解题思路和调试过程记录在博客中,每道题目的具体格式如下:
题目6-1 计算两数的和与差
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:函数里的psum、pdiff为指针变量,把a赋值给op1,b赋值到op2,&sum赋值到psum,&diff赋值到pdiff
第二步:对*psum及*pdiff进行赋值
第三步:输出结果
2.实验代码
void sum_diff(float op1,float op2,float *psum,float *pdiff) { *psum=op1+op2; *pdiff=op1-op2;
题目6-2 拆分实数的整数与小数部分
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:函数里的intpart、fracpart为指针变量,x赋值给x,&intpart赋值给intpart, &fracpart赋值给fracpart
第二步:用int定义整型函数
第三步:用减法定义小数部分计算式
2.实验代码
void splitfloat(float x,int *intpart,float *fracpart) { *intpart=(int)x; *fracpart=x-*intpart; }
6-3 在数组中查找指定元素
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:通过主函数可得定义整型变量 j, list[], n, x, q, index
第二步:设q=-1,利用for循环,遍历数组,当有一个对应元素时,跳出循环
第三步:若x等于list[q],则返回q的值,若没有,则使index为-1
(2)流程图
2.实验代码
int search ( int list[], int n, int x ) { int j; int q = -1; for(j=0;j<n;j++){ if(x==list[j]) { q=j; break ; } } return(q); }
6-4 找最大值及其下标
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:定义一个长度为10的数组,用j记录最大值对应的下标
第二步:令max=a[0],遍历数组
第三步:利用for循环输入a[i]的值,根据被调用函数比较出a、&p、N的最大值;
第四步:输出所得的最大值和p的值
(2)流程图
2.实验代码
int fun(int *a,int *b,int n){ int q=a[0],j; for(j=0;j<n;j++){ if(q<a[j]){ q=a[j]; *b=j;} } return(q); }
6-5 最小数放前最大数放后
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:调用题目中定义的input(int *arr,int n)函数,定义i,使用for循环结构,当i小于元素个数n时,输入arr数据,函数调用结束
第二步:调用函数max_min(int arr,int n),遍历数组,使得最大值位于函数元素的首位,最小值位于函数元素中的最后一位
第三步:调用函数 output(int *arr,int n) ,遍历数组,按照格式输出arr数组中的元素
(2)流程图
2.实验代码
void input(int *arr,int n){ int i; for(i=0;i<n;i++){ scanf("%d",arr+i); } } void max_min(int *arr,int n){ int min=arr[0],max=arr[0]; int i,temp; int q=0,w=0; for(i=0;i<n;i++){ if(min>*(arr+i)){ min=*(arr+i); q=i; } if(max<*(arr+i)){ max=*(arr+i); w=i; } } temp=*(arr+0);*(arr+0)=*(arr+q);*(arr+q)=temp; temp=*(arr+n-1);*(arr+n-1)=*(arr+w);*(arr+w)=temp; } void output(int *arr,int n){ int i; for(i=0;i<n;i++){ printf("%3d",*(arr+i)); } }
3.本题调试过程碰到问题及解决办法
错误信息:
错误原因:取地址时*arr+i缺括号,取地址对象错误。
改正方法:对于整体取地址,括号位置应为*(arr+i)。
6-6指针选择法排序
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:定义指针变量p、循环变量i、和一个数组,将数组首元素的地址赋值给指针变量p
第二步:使用选择排序法对数组进行从大到小的排序,输出数组元素
(2)流程图
2.实验代码
void sort(int *x,int n){ int i,j,s,temp; for(i=0;i<n-1;i++){ s=i; for(j=i+1;j<n;j++){ if(*(x+s)<*(x+j)){ s=j; } } if(s!=i){ temp=*(x+i);*(x+i)=*(x+s);*(x+s)=temp; } } }
3.本题调试过程碰到问题及解决办法
错误信息:
错误原因:for循环初始值表达错误,对指针理解不清晰
改正方法:通过查找资料对for循环知识进行巩固
6-7 判断回文字符串
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:定义字符数组s[20],输入字符串赋值给s
第二步:用循环结构,判断在数组元素内是s[i]与s[j]是否相等。若是,则返回true;若不是则返回false
(2)流程图
2.实验代码
bool palindrome( char *s ){ int i,count=0,q; count=strlen(s); q=count/2; for(i=0;i<q;i++){ if((*(s+i))!=(*(s+count-i-1))){ return(false); } } if(i==q){ return(true); } }
3.本题调试过程碰到问题及解决办法
错误信息:
错误原因:指针定义错误,缺少函数指标
改正方法:添加strlen(s)函数定义,取地址时*后加括号
6-8 使用函数实现字符串部分复制
1.设计思路
(1)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:定义两个字符数组t[20],s[20],m,输入一个数赋给m
第二步:调用函数strmcpy,并通过for循环条件,输出字符数组s
(2)流程图
2.实验代码
void strmcpy( char *t, int m, char *s ){ int i; for(i=m;*(t+i-1)!='