第一次作业

题目

1.证明P++等价于(p)++还是等价于*(p++)?

#include <stdio.h>
int main()
{
    int a=5;
    int *p=&a;
    printf("p=%d\n",p);              //p=6487620
    printf("p++=%d\n",p++);          //p++=6487620
    p=&a;
    printf("(p)++=%d\n",(p)++);      //(p)++=6487620
    printf("*(p++)=%d\n",*(p++));    //*(p++)=6487628
 }

2 题目6-1 计算两数的和与差

(1) 实验代码

#include<stdio.h>
void sum_diff( float op1, float op2, float *psum, float *pdiff );

int main()
{
    float a, b, sum, diff;

    scanf("%f %f", &a, &b);
    sum_diff(a, b, &sum, &diff);
    printf("The sum is %.2f\nThe diff is %.2f\n", sum, diff);
	
    return 0; 
}

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
  *psum=op1+op2;
  *pdiff=op1-op2;
}

(2) 设计思路
主要描述题目算法
第一步:由题可得,形参和实参相关联,故若求两数之和就直接进行形参相加;
第二步:求两数之差的原理和求和原理相似;

(3)本题调试过程中碰到的问题及解决方法
本题没有问题。

题目6-2拆分实数的整数与小数部分

(1)实验代码

void splitfloat( float x, int *intpart, float *fracpart )
{
  *intpart=(int)x;
  *fracpart=x-(int)x;
}

(2)设计思路
主要描述题目算法
第一步:求整数,就直接用int强转即可;
第二步:求小数部分,就是用原数减去整数部分即可;

(3)本题调试过程中碰到的问题及解决方法
本题没有问题

题目6-3在数组中查找指定元素

(1)实验代码

int search( int list[], int n, int x )
{
  int i,index;
  for(i=0;i<n;i++)
  {
    if(list[i]==x)
    {
     index=i;;
     break;
    }else
    {
      index=-1;
    }
  }
  return index;
}

(2)设计思路
第一步:首先定义一个循环变量;
第二步:要查找指定元素,就遍历数组,再用if条件进行判断;
流程图

(3)本题调试过程中碰到的问题及解决方法
开始用的是continue而不是break,发现只需要直接结束循环就能实现找到元素,所以最后修改成了break。

6-4找最大值及其下标

(1)实验代码

int fun(int *a,int *b,int n)
{
  int i;
  for(i=0;i<n;i++)
  {
    if(a[i]>*a)
    {
      *a = a[i];
      *b = i;
    }
  }return *a;
}

(2)设计思路
第一步:先定义循环变量;
第二步:遍历数组并用if条件进行判断;
流程图:

(3)本题调试过程中碰到的问题及解决方法
本题没有问题;

6-5最小数放前最大数放后

(1)实验代码

#include<stdio.h>
void input(int *arr,int n)
{
  int i=0;
  for(i=0;i<n;i++)
  {
    scanf("%d",&arr[i]);
  }
}
void max_min(int *arr,int n)
{
  int j=0,x=0,y=n-1;
  for(j=0;j<n;j++)
  {
    if(arr[x]>arr[j])
    {
      int t;
      t=arr[x];
      arr[x]=arr[j];
      arr[j]=t;
    }
  }
  for(j=n-1;j>0;j--)
  {
    if(arr[y]<arr[j])
    {
      int k;
      k=arr[y];
      arr[y]=arr[j];
      arr[j]=k;
    }
  }
}
void output(int *arr,int n)
{
  int a=0;
  for(a=0;a<n;a++)
  {
    printf("%3d",arr[a]);
  }
}

(2)设计思路
第一步:本题有三个接口,第一个是数组存入;
第二步:第二个接口就是进行题目要求的进行操作,首先用遍历的方法进行找最小值,并把它放到第一位,之后再找最大值放到最后一位;
第三步:第三个接口,把数组输出;
流程图:
(3)本题调试过程碰到问题及解决办法
本题没有问题;

6-6指针选择法排序

(1)实验代码:

void sort(int *x,int n){
int i,j,t;
for(j=1;j<10;j++)
{
  for(i=0;i<10-j;i++)
  {
    if(*(x+i)<*(x+i+1))
    {
      t=*(x+i);
      *(x+i)=*(x+i+1);
      *(x+i+1)=t;
    }
  }
}
}

(2)设计思路
第一步:本题和上学期学过的冒泡排序和选择排序法相似,就是在加上指针。其实和上学期大同小异。
第二步:进行冒泡排序之后再返回结果;
流程图:

(3)本题调试过程碰到问题及解决办法
本题没有问题,和上学期的内容较为相似;

6-7判断回文字符串

(1)实验代码

bool palindrome( char *s )
{
  int i=0,j=0,result=1;
  char *b = s;
  for(;*b != '\0';b++) {
    i++;
  } 
  for(; *s != '\0';s++,j++) {
    if(*(s) != *(b-j-1)) {
        result = 0;
      }
  }
    return result;
}

(2)设计思路
第一步:回文判断原理就是关于中心字母左右对称;
第二步:根据上述原理,首先定义两个变量,之后遍历数组,再进行以中心为轴左右进行对比;
第三步:在对比过程中,若有不相同即跳出判断不是回文,反之为回文;
流程图

(3)本题调试过程碰到问题及解决办法

6-8使用函数实现字符串部分复制

(1)实验代码

void strmcpy( char *t, int m, char *s )
{
    int i = 0;
    char *b = t;
    for(;*b!='\0';b++) {
        i++;
    }
    if(m>i) {
    *s='\0';    
    } else {
        for(;*t!='\0';s++,t++)
        *s = *(t+m-1);
    }
    *s = '\0';
 return 0;
}

(2)设计思路
第一步:首先把已知字符数组给空数组;
第二步:之后再根据题目要求之后再进行赋值操作;
(3)本题调试过程碰到问题及解决办法
这个题是在网上查找答案因为自己不会做,看了很多遍也自己打了很多遍,所以没有问题。

作业要求三

(1)总结两周所学的知识点有哪些学会了?哪些还没有学会?

这两周主要学习了指针的用法和作用,最主要应该掌握的应该是指针在数组中的运用,而且函数调用在指针的用法中也尤为主要,上学期字符的应用自己掌握的不是很好,需要多多看书并且多加练习。

(2)PTA作业源代码上传Git

 Git超链接:

地址
上传截图:

(3)点评3位同学本周作业,并邀请3位同学点评作业
(4)表格和折现图记录学习情况
表格:

折线图:

posted @ 2018-03-23 22:27  胡景文  阅读(171)  评论(9编辑  收藏  举报