第1次作业

作业要求一

请将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)!='\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)的代码行数和所用时间、博客字数和所用时间。

posted @ 2018-03-24 21:48  揆空  阅读(258)  评论(6编辑  收藏  举报