C博客作业--指针

一、PTA实验作业

题目1:6-2 求出数组中最大数和次最大数

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

定义max存放较小值,temp存放最大值的下标,i为循环变量
       for(i=1;i<n;i++){
            如果*a<*(a+i)
            temp=i;
             交换*a与*(a+i)的值}
             最大值max=*(a+temp)
       for(i=1;i<n;i++){
           如果 *(a+1)<*(a+i)
           temp=i;
           交换*(a+1)与*(a+i)的值}
           次大值max=*(a+temp)

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 1.一开始的时候没有理清楚思路就开始写代码,所以就误把这道题目当成排序来写,然后碰巧测试数据有些数已经排好序了,导致输出来的数很奇怪。

  • 解决办法:本来觉得排序没有错,又仔细看了一下题目发现题目要求并不是排序,只是交换位置,而且用排序的方法好像做不了,所以改成了找最大值的思想来写。

  • 2.也不知道是哪里错了,输出的数有交换过位置,但是最终交换的结果不正确。

  • 解决办法:调试时发现我的程序运行到第二个循环时根本就不进入第二个循环,因为我的循环条件是控制在从第二个数开始循环,第二个数正好是最大数,没有数满足比他大,所以循环进不去,后来我就把循环条件改成了for(i=1;i<n;i++) if((a+1)<(a+i))程序就正常运行了。

题目2:6-5 判断回文字符串

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

定义循环变量i,j
    计算字符串长度并用i来存放。
      j=i-1;
      i=0;
      while(i<j){
      如果*(s+i)!=*(s+j) 返回false
      i++;
      j--;}
      else 返回true

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 这一题的思路也很清晰,就是先计算出字符串的长度,然后从两头开始判断,只要有a[i]!=a[k]就直接返回false如果循环可以执行到最后则说明这个字符串是回文字符串,但是不知道为什么我编写的程序不管怎么改都没有办法通过运行。
  • 解决办法:这个问题调试好久都是编译错误,就好像不管我函数体内的内容是什么都没办法通过运行,后来我就去请教同学,同学的做法和我的做法几乎一摸一样,唯一不同的地方就是计算字符串长度是她直接用循环变量i存放,我用另一个变量k,所以后面一部他的程序要让k=i-1,之后让i=0,而我的直接让k=k-1就不用让i归0了。不管是我的程序还是他的程序都没办法在devc上运行,但是我的程序在pta上提交是编译错误,他的提交就是答案正确,我到现在也没明白为什么,好像我的做法也没什么错误呀。

题目3:6-7 过滤字符串只保留串中的字母字符

1. 本题PTA提交列表(要提交列表,不是结果)

2. 设计思路(伪代码或流程图)

3.代码截图(注意,截图,截图,截图。不要粘贴博客上。不用用···语法去渲染)

4.本题调试过程碰到问题及PTA提交列表情况说明。

  • 这一题我一开始就想着控制循环条件在定义一个新数组去存放过滤完的数组就好了,可是不管怎么调试,就是调试不正确,而且就像定义一个新数组a[u],让u自增我一直觉得不会出错但是调试时发现u根本就不是自增状态。而且别的数据也是乱七八糟的。

  • 解决办法:我一直找不到错误在哪里,后来就去请教了同学,同学指出我的指针运用混乱,一下子是用指针,一下子又是用数组的,会把整个程序弄混乱,用指针就一直使用指针就好,这样不容易乱,所以我就听从同学建议将数组全部改为指针。

  • 2.全部改为指针后还是输出不对,输出是原样输出的,没有经过筛选。

  • 这个问题也不是我自己解决的,还是同学帮找出来的错误,说我在最后的时候没有将a[u]的值复制到ptr中,所以才原样输出,后来我想了一下确实是这样,我只是用一个新数组存放过滤后的值,并没有改变ptr中的值,所以函数返回时当然返回了未经改变的ptr,后来使用了strcpy来复制就正确了。

二、截图本周题目集的PTA最后排名。

三、阅读代码

将字符串转换成十进制整数

  • 这个代码是为了将 字符串转换成十进制整数,这样的做法好处就是将筛选好的字符串一次性转变为整数,而且利用了flag来辅助判断输入的字符中是否有负号,很方便, 再讨论负号时就不需要赘述。我之前有看到同学的做法是当输入字符为a时直接让number=10,而不是通过公式进行转换,虽然PTA可以通过,但是总感觉有漏洞,而这种通过公式的做法显然更缜密。

输出斐波纳契数

#include<stdio.h>
int fun(int n)      //n代表第几项。特别指出:0是第0项,不是第1项。
{
    if (n <= 1)
        return n;
    else
        return fun(n-1) + fun(n-2);
}
int main()
{
    int n;
    printf("请输入要输出多少项(自然数)斐波那契数列:");
    scanf("%d",&n);
    //int *a = (int *)malloc((n+1)*sizeof(int));//如需存储,使用动态内存分配n+1个空间进行存储
    int i;
    for (i = 0; i < n+1; i++)         //输出所有项
    {
        printf("%d ", fun(i));
        if (i != 0 && i%5 == 0)     //每五项进行一次换行(第一行多一个第0项)
            printf("\n");
    }
    printf("第 %d 项是:%d\n", n, fun(n)); //输出要求的项
    return 0;
}
  • 这个程序使用了递归来计算斐波纳契数,比起用循环来写这题,递归的方法更加接近人的思维方式,很容易想到,将整个程序简化了不少,但是递归有一个缺点就是有点费内存。

四、本周学习总结

1.自己总结本周学习内容。

  • 之前对指针一点都不熟悉,就是感觉好好的干嘛要用指针呀,多麻烦不是。后来随着学习的深入发现有些题目确实用指针写会比较方便简单,而且程序也更加高效。这一周因为写了指针的pta所以对指针的运用掌握了许多的基本用法,但是这也仅仅是简单题目的简单运用,复杂一些就有些混乱了,就比如说如果当一个指针指向的是数组的话,那我可能这一步用的是指针,下一步用的是数组,结果导致整个程序都混乱了,最后自己还找不出来哪里错了。还有一点就是一个指针如果我两次循环都要用到的话,就比如说p,在第一个循环中我让p自增即p++,就让p加到了临界点,而下一个循环我要让p从原来第一个值又开始自增,但是直到现在我也不懂怎么让他回到第一个值,所以我每次都是用(p+i)来代替p的自增。

2.罗列本周一些错题。

补充程序,通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。

函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。

#include  <stdio.h>
#include  <string.h>
struct student {
  long  sno;         /*学号*/
  char  name[10];    /*姓名*/
  float  score[3];   /*三门课成绩*/
};
void Fun( ______1_______, int  n)  /* 按照姓名的字典序(从小到大)排序?*/
{
   ______2_______ t;
   int  i, j;
   for (i=0; i<_____3____; i++)
     for (j=i+1; j<=n-1; j++)
        if (__________4__________)
         {
             t = a[i];
             a[i] = a[j];
             a[j] = t;
         }
}
int main()
{
    struct student  s[4]={{10001,"ZhangSan", 95, 80, 88},
                          {10002,"LiSi", 85, 70, 78},
                          {10003,"CaoKai", 75, 60, 88},
                          {10004,"FangFang", 90, 82, 87}};
    int  i, j;
    printf("\n\nThe original data :\n\n");
    for (j=0; j<4; j++)
    {
        printf("\nNo: %ld  Name: %-8s      Scores:  ",s[j].sno, s[j].name);
        for (i=0; i<3; i++)
           printf("%6.2f ", s[j].score[i]);
        printf("\n");
    }

   Fun(s, 4);
   printf("\n\nThe data after sorting :\n\n");
   for (j=0; j<4; j++)
   {
      printf("\nNo: %ld  Name: %-8s      Scores:  ",s[j].sno, s[j].name);
      for (i=0; i<3; i++)  printf("%6.2f ", s[j].score[i]);
      printf("\n");
    }
    return 0;
}
  • 当时因为是自己预习,就有好多地方不懂,再加上在第一个程序题那里磨蹭了太久就着急了,也没有看完下面的主程序就开始写,结果,,,
  • 第一个空应该把结构体传入,所以填struct student a[ ],第二个空要定义t的类型,从下面t存放a[i]的内容来看应该要定义为struct student,第三个空填循环条件,按照选择排序的条件应该填n,第四个空排序,不能直接比较a[i]与a[j]的大小而是应该写strcmp(a[i].name,a[j].name) > 0。
posted @ 2017-12-17 23:49  晗光凡影  阅读(373)  评论(0编辑  收藏  举报