• C语言第九次博客作业--指针


    一、PTA实验作业

    题目1:两个4位正整数的后两位互换

    1. 本题PTA提交列表

    2. 设计思路

    定义循环变量i,两个数组a[4],b[4]
    for i=0 to 3
       a[i]*p取各个位
       *p/=10
    end
    for i=0 to 3
       b[i]*q取各个位
       *q/=10
    end
    分别对*p和*q重新赋值
    

    3.代码截图

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

    本题没有多大问题,就是想再找一种更简单的做法。

    题目2: 输出月份英文名

    1. 本题PTA提交列表

    2. 设计思路

    if形参n不再月份范围内
       return NULL
    定义指针数组*a[]并赋值十二个月份
       return a[n-1]
    

    3.代码截图

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

    刚开始我用的switch语句来判断月份,后来在舍友提醒下改成了数组来存放英文并直接返回。

    • 部分正确 :月份不在范围内

    解决办法:加入if判断若不在范围内,就返回NULL

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

    1. 本题PTA提交列表

    2. 设计思路

    定义*a存放ptr,循环变量i,计数变量count
    while(*ptr)
       if *ptr 是字母
           将*ptr存放到*(a+i)中  i++
       else count++ 记录非字母
       ptr++继续循环
    end
    *(a+i)赋值结束符
    return count非字母个数
    

    3.代码截图

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

    这道题前面一直在对p直接判断,导致提交运行超时,后来利用另一个指针来存放符合题意的字符并返回,就不会运行超时。

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

    三、阅读代码

    strcpy字符串复制函数原型

    char * strcpy(char * dest, const char * src)   // 实现src到dest的复制
    {
      if ((src == NULL) || (dest == NULL))    //判断参数src和dest的有效性
      {
              return NULL;
      }
      char *strdest = dest;           //保存目标字符串的首地址
      while ((*strDest++ = *strSrc++)!='');    //把src字符串的内容复制到dest下
      return strdest;
    }
    

    memcpy内存拷贝函数原型

    void *memcpy(void *memTo, const void *memFrom, size_t size)
    {
      if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必须有效
             return NULL;
      char *tempFrom = (char *)memFrom;             //保存memFrom首地址
      char *tempTo = (char *)memTo;                  //保存memTo首地址      
      while(size -- > 0)                //循环size次,复制memFrom的值到memTo中
             *tempTo++ = *tempFrom++ ;  
      return memTo;
    }
    

    strcpy和memcpy主要有以下3方面的区别。

    1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
    2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

    strcpy字符串复制函数原型

    #include "assert.h"  
    char *strcpy(char *strDest, const char *strSrc)    //使用const来约束strSrc,提高程序的健壮性。如果函数体内的语句试图改动strSrc的内容,编译器将指出错误。
    {  
       assert((strDest != NULL) && (strSrc!= NULL));    //对传入参数strDest和strSrc进行检查,禁止空指针传入
        if (strDest == strSrc)  
            return strDest;  
        char *tempDest = strDest;  
        while((*strDest++ = *strSrc++) != '');  
        return tempDest;  
    }
    

    四、本周学习总结

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

    1.1"&"与"*"互为逆运算

    • "&"是取地址符
    &(变量名)=>获取变量的地址
    
    • "*"是指针声明符和间接访问运算符(取值运算符)
    *(变量名)=>将变量当作地址,到相应的地址取值
    

    1.2指针

    • 定义指针变量
    int *p,i;
    p=&i;
    p=0;
    p=NULL;
    p=(int *) 1732;(表示p指向地址为1732的int型变量)
    
    • 指针变量就是用来储存地址的变量

    • 指针的作用:用来传递地址,作为引用类型的变量,减少内存消耗。

    1.3指针与数组

    数组名就是一个地址,指向这个数据的开端

    *p==a[0]
    *(p+n)==a[n]
    *p+=1,(*p)++,++*p将指针p所指向的变量值加1
    *p++,*(p++)先取*p的值作为表达式的值,在将指针p的值加1
    

    1.4排序和查找

    • 冒泡排序
    void bubble (int a[],int n)
    {
    	int i,j,t;
    	for( i=0; i<n; i++)
    		for( j=0; j<n-1; 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=i+1; j<n; j++)
    			if(a[j]>a[i]){
    				t=a[j];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;        \前半段,high前移 
            else       low = mid + 1;       \后半段,low后移 
        }    
        if(low <= high)   
            return mid;               \ 找到返回下标 
        else 
            return -1;               \找不到返回-1 
    }
    

    1.5结构体的定义

    struct time{
    	int hour;
    	int minute;
    	int second;
    };
    struct time t;
    
    struct time{
    	int hour;
    	int minute;
    	int second;
    } t;
    

    1.6结构体嵌套

    struct date{
    	int year;
    	int month;
    	int day;
    };
    struct person{
    	char name[256];
    	struct date birthday;
    };
    

    1.7结构体的引用和初始化

    struct student{
    	int number;
    	char name[256];
    	char sex[6];
    	int age;
    	int grade;
    };
    int main()
    {
    	struct student alan={01,"alan","man",16};
    	printf(alan.name);
    }
    
    

    1.8结构体数组

    struct student{
    	int number;
    	char name[256];
    	char sex[6];
    	int age;
    	int grade;
    };
    int main()
    {
    	struct student class[5];
    	strcpy(alan.name,"alan");
    	printf(alan.name);
    }
    
    

    2.罗列本周一些错题。

    写函数fun , a数组中n个整数从小到大排列,函数功能是:从a中删除第一个遭到与x值相同的数组元素,删除后a的数组仍然由小到大有序排列。


    这道题尤其要注意最后一个空n=n-1,平时很容易忽略掉

  • 相关阅读:
    清除浮动的三种方式
    js控制滚动条默认在底部
    npm 基础命令
    package.json中^,~的区别
    mac 使用iTerm2快捷登录远程服务器
    iterm 分屏切换快捷键与配色设置
    git tag — 标签相关操作
    gulp iconfont
    webpack 3 升级 webpack4 个人笔记
    import * as x from 'xx' 和 import x from 'xx'
  • 原文地址:https://www.cnblogs.com/lmb171004/p/8044710.html
Copyright © 2020-2023  润新知