• C博客作业--指针


    一、PTA实验作业

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

    1. 本题PTA提交列表

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

    函数部分:
        定义i,m,k ,t 
        for 1=0  to  1
            m=i;
         end;
    	 
    	for  k=i+1v  to  n-1
    	    若  a[k]>a[m]
    	    则   t=a[k];
    		     a[k]=a[m];
    			 a[m]=t;
         end;
    

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

    4.本题调试过程以及提交列表的情况

    #######一开始的时候没有想到可以用循环的嵌套,只用了单层循环,当a[i]>a[i+1]则让a[i]=index,先找到最大数,存放于index中,但是这样的话就不好找的次大数了,然后想到可以用循环的嵌套,第一次循环从a[0]开始,先找到最大数,将它与a[0]交换位置,第二次循环则从a[1]开始,找到最大数,将它与a[1]交换位置

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

    1. 本题PTA提交列表

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

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

    4.本题调试过程以及提交列表的情况

    这题是借鉴书上判断回文数的方法,但书上是用数组做,这题要求用指针,但方法都一样,在写代码时忘记计算字符串的长度,当时就直接写了k=k-1,但是没有k的初值,导致后面一直是部分正确。

    题目3:6-10 字符串串动变化

    1. 本题PTA提交列表

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

    函数部分:
        定义 i=0,最大字符max,*q
    	max=p[0];
    	  遍历 p; 
    	   若 max小于*(p+i)
    	      max=*(p+i);
    		   q=P+i;
    	      i++;
    	end;
            当q>p成立时,
    		    *q=*(q-1);
    			q--;
    	end;
    	     将最大字符放于首位
    

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

    4.本题调试过程以及提交列表的情况


    一开始时是想的先找到最大字符以及它的位置,然后循环将它前面的数向后移一位,再将最大字符赋值给a[0],但是这样原始的a[0]就会丢失,然后想到用 指针做,重新定义一个指针,使它指向最大字符,让最大字符前的字符均向后移一位,再将最大字符放于首位

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

    三、阅读代码

    实现字符串的连接
    #include<stdio.h>
    #include<string.h>
    #define MAXS 10
    char *str_cat( char *s, char *t );
    int main()
    {
           char *p;
          char str1[MAXS+MAXS] = {''}, str2[MAXS] = {''};
         scanf("%s%s", str1, str2);
          p = str_cat(str1, str2);
             printf("%s
    %s
    ", p, str1);
         return 0;
    }
    char *str_cat( char *s, char *t )
    {
           char *p;
           p=strcat(s,t);
         return (p);
    }
    

    上面的代码调用了strcat函数来实现字符串间的连接,并且定义了指针来指向字符串,这样不会占用太多的内存空间,如果是我写的话,应该是重新定义一个字符数组,然后将这两个字符串存到新定义的字符数组中,然后再循环输出,相对于上述代码来说的话过程比较繁琐,并且会占用较多的内存

    查找星期
    #include<stdio.h>
    #include<string.h>
    #define MAXS 80
    int getindex( char *s );
    int main()
    {
            int n;
             char s[MAXS];
           scanf("%s", s);
           n = getindex(s);
          if ( n==-1 ) printf("wrong input!
    ");
          else printf("%d
    ", n);
         return 0;
    }
    int getindex( char *s )
    {
                 char a[7][MAXS]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
                  int i;
                   for(i=0;i<7;i++)
                 {
                       if(strcmp(a[i],s)==0)
                   return (i);
            }
                 if(i==7)
                      return (-1);
          }
    

    上述代码也是运用了数组与指针相结合的方式,并且调用了比较大小的函数strcmp,这样可以很容易的判断出输入的数字是否可以代表星期,若可以,则输出对应的星期英文名称。

    四、本周学习总结(1分)

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

    3【指针】

    (1)&是取地址运算符;
    (2)指针变量的类型不是指指针变量本身的类型,而是指它所指向的变量的数据类型,不同类型指针变量所占的内存空间大小都是相同的
    (3指针之间可以相减,比较大小但是不可以相加,指针相减得到的是地址间差多少个存储单元,为常量,不再是地址;地址的加法运算,即下移操作,若加一,则是增加一个存储单元;
    (4)当p=&a后,p与a相同;&p与&a相同,是地址;&a与a相同,是变量;(p)++等价于a++,将p所指向的变量值相加一,p++等价于(p++)
    (5)对指针进行初始化时需注意的几点:
    a.把一个变量的地址作为初始化赋值给指针变量时,该变量必须在此之前已经定义。因为变量只有在定义后才被分配存储单元,它的地址才能赋给指针变量
    b.可以用初始化了的指针变量给另一个指针变量做初始化
    c.不能用数值作为指针变量的初值,但可以将一个指针变量初始化为一个空指针,例:int *p=1000是错误的,而 int *p=0,是将指针变量初始化为空指针,这里0是ASCII字符NULL的值; p=(int )1732表示将一个常量强制转换为指针
    (6)
    (a+i) 与a[i]等价

    冒泡法:
            void  bubble( int a[ ] ,int n)
        {
             int i , j ,t ;
             for( i=1; i<n; i++)
                for( j=0 ;j<n -i ;j++)
                    if( a[j] > a [ j+1 ]){
                       t = a [ j ]; a[ j ]=a[ j+1]; a[ j+1 ]=t ;
    
        }
    
        }
    
    选择法:
            void  choose( int a[ ] ,int n )
          {
                  int  i , j ,t ;
                   for ( i=1;i<n;i++)
                       for( j=j+1;j<n;j++)
                           if( a[ j ] < a [ i ]{
                                   t=a[ i]; a [ j ]= a[ i ]; a [ i ] = t;
           }
          }
     
    
    二分法:
              int Bsearch ( int  *p , int  n,int x)
        {
                 int low ,high,mid;
                  low=0;high=n-1;
                 while   ( low < = high )  {
                       mid= (low+high)/2;
                        if ( x==p [ mid ] )
                               break;
                  else  if ( x < p[ mid ] )
                        high = mid -1;
                  else 
                        low= mid +1;
         }
              if ( low <= high )
                  return mid;
               else
                   return  -1;
        }
    

    【常用的字符串处理函数】

    (1)字符串复制函数 strcpy(s1,s2),例:
               int  i;
              char  s1 [80],s2 [80 ], from [80] = "happy";
                 strcpy ( str1, from );
                 strcpy ( str2; "key" );
          第三条语句调用了函数 strcpy()把from中的字符串复 制给str1;第四条语句把字符串常量“key”复制给str2后,数组str1中存放了“happy”,数组str2中存放了“key”
    
    (2)字符串连接函数 strcat (s1,s2)
     s1必须是字符串数组基地址,参数s2可以是字符组名或是字符串常量。例:
         char  str1 [80] =" hello",str2[ 80], t [80 ] = " world";
            strcat ( str1, t );
             strcpy ( str2 , str1 );
             strcat ( str2,"!" );
       先调用函数strcat ()连接str1和t,结果放在str1中,再调用函数strcpy()将str1中的字符串赋给str2,最后调用函数strcat()连接str2和字符串常量“!”后,str2中存放了“hello world !”
    
    (3)字符串比较函数strcmp(s1,s2)
       和函数strcpy()中对参数的要求不同,函数strcmp()中的参数s1和s2 可以是字符数组名或字符串常量。函数strcmp()返回一个整数,给出字符串s1和s2的比较结果:
       a. 若s1和 s2 相等,返回0;
       b.若s1大于s2,返回一个正数
       c.若s1小于s2,则返回一个负数
    
    (4)字符串长度函数strlen(s1)
      参数s1可以是字符数组名或字符串常量。函数strlen()返回字符串s1的‘’之前的字符个数。即字符串的有效字符的个数(不包括字符结束符‘’)
    
    【结构】
    (1)结构类型定义的一般形式:
       struct  结构名 {
                 类型名   结构成员1;
                 类型名    结构成员2;
                 ···
                 类型名     结构成员n;
      };
    

    例:
    struct address { //定义结构地址
    char city [ 10 ];
    char street [ 20 ];
    int code;
    int zip;
    };

    (2)定义结构变量的三种方式:
    a.单独定义: 即先定义一个结构类型,再定义这种类型的变量
    b.混合定义:即在结构类型的同时定义结构变量,且这种定义的一般形式为:
                struct  结构名{
                       类型名   结构成员名1;
                       类型名    结构成员名2;
                          ··· 
                       类型名     结构成员名n;
               }结构变量名;
    c.无类型名定义: 指在定义结构变量时省略结构名,例:
               struct   {
                     类型名  结构成员名1;
                     类型名   结构成员名2;
                      ...
                     类型名   结构成员名n;
               }结构变量名表;
    

    2.罗列本周一些错题

    指针课堂派复习作业

    (1)

    #######1.gets(chrstr) 2.char p(错误原因:没有真正理解指针的用法,以为toupper是数组名)
    3.
    p (遍历p,直到p!=‘’)
    4.toupper(
    (p-1)(错误原因同二)

    (2)

    #######1.sum=Fun(s)(错误原因:该处为调用函数,且s是指针,本身就是地址,不用取地址符&)
    2.s(isdigit是判断是否为数字字符,又将它看作是数组名)
    3.sum=sum+
    s-'0'(错误原因同二,若字符为数字字符,则将它转换为数字)

    (3)

    1.Fun(a,x,&n)

    2.break;
    3.j>i;
    4.n=n+1(由于插入了x后,需要再申请一个存储单元,所以指针n需指向下一个地址

    (4)

    1.fun( a,&n)

    2.n=n+1(错误原因:n++指的是指向的位置下移,而不是数值加一)

  • 相关阅读:
    【BZOJ】1671: [Usaco2005 Dec]Knights of Ni 骑士(bfs)
    【BZOJ】1689: [Usaco2005 Open] Muddy roads 泥泞的路(贪心)
    Maven使用
    上传图片
    Model、ModelMap和ModelAndView的使用详解
    Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则
    mybatis 分页插件PageHelper的简单使用
    Mybatis 自动生成mapper文件
    Tomcat部署时war和war exploded区别以及平时踩得坑
    springMVC @response 中文乱码解决
  • 原文地址:https://www.cnblogs.com/2223ch/p/8047824.html
Copyright © 2020-2023  润新知