作业要求一
请将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 拆分实数的整数与小数部分
第一步:函数里的intpart、fracpart为指针变量,x赋值给x,&intpart赋值给intpart, &fracpart赋值给fracpart
第二步:用int定义整型函数
第三步:用减法定义小数部分计算式
void splitfloat(float x,int *intpart,float *fracpart)
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
6-3 在数组中查找指定元素
第一步:通过主函数可得定义整型变量 j, list[], n, x, q, index
第二步:设q=-1,利用for循环,遍历数组,当有一个对应元素时,跳出循环
第三步:若x等于list[q],则返回q的值,若没有,则使index为-1
(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)主要描述题目算法。可以用文字描述(不允许使用伪代码),
第一步:定义一个长度为10的数组,用j记录最大值对应的下标
第二步:令max=a[0],遍历数组
第三步:利用for循环输入a[i]的值,根据被调用函数比较出a、&p、N的最大值;
第四步:输出所得的最大值和p的值
(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 最小数放前最大数放后
第一步:调用题目中定义的input(int *arr,int n)函数,定义i,使用for循环结构,当i小于元素个数n时,输入arr数据,函数调用结束
第二步:调用函数max_min(int arr,int n),遍历数组,使得最大值位于函数元素的首位,最小值位于函数元素中的最后一位
第三步:调用函数 output(int *arr,int n) ,遍历数组,按照格式输出arr数组中的元素
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指针选择法排序
第一步:定义指针变量p、循环变量i、和一个数组,将数组首元素的地址赋值给指针变量p
第二步:使用选择排序法对数组进行从大到小的排序,输出数组元素
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;
}
}
}
错误原因:for循环初始值表达错误,对指针理解不清晰
改正方法:通过查找资料对for循环知识进行巩固
6-7 判断回文字符串
第一步:定义字符数组s[20],输入字符串赋值给s
第二步:用循环结构,判断在数组元素内是s[i]与s[j]是否相等。若是,则返回true;若不是则返回false
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);
}
}
错误信息:
错误原因:指针定义错误,缺少函数指标
改正方法:添加strlen(s)函数定义,取地址时*后加括号
6-8 使用函数实现字符串部分复制
第一步:定义两个字符数组t[20],s[20],m,输入一个数赋给m
第二步:调用函数strmcpy,并通过for循环条件,输出字符数组s
void strmcpy( char *t, int m, char *s ){
int i;
for(i=m;*(t+i-1)!='\0';i++){
*(s+i-m)=*(t+i-1);
}
*(s+i-m)='\0';
}
要求三、学习总结和进度
1、总结两周里所学的知识点有哪些学会了?哪些还没有学会?
学习了指针及其应用,用指针变量做函数参数,还有数组指针和字符指针。了解了在引用数组元素的时候,指针变量和数组之间的相互转化。但是对函数的掌握还是不熟练,对字符串与指针的组合题目掌握不熟练,对*()的应用还要多加练习。
2、将PTA作业的源代码使用ggit地址it提交到托管平台上,要求给出上传成功截图和你的git地址。
git地址:https://git.coding.net/Downager/180325.git
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业。
http://www.cnblogs.com/sun031915/ http://www.cnblogs.com/phsudie/ http://www.cnblogs.com/gu-an-cheng-wxm/
4、请用表格和折线图呈现你本周(3/12 8:00~3/26 8:00)的代码行数和所用时间、博客字数和所用时间。