C语言博客-指针

一、PTA实验作业(5分)

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

1. 本题PTA提交列表

1232194-20171217174956999-1484973919.png

2. 设计思路

1232194-20171217175457827-1247874471.png

3.代码截图

1232194-20171217175532171-1679995001.png

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

  • 题目2:6-3 统计大于等于平均分人数

1. 本题PTA提交列表

1232194-20171217181326952-1673308871.png

2. 设计思路

定义 *b 用于储存s首位置,sum用于求和
若*s不等于0
     sum+=*s;
        s++;
end
平均分*aver=sum/人数
n=0用于统计及格人数 
若*b不等于0
   如果 *b大于或等于*aver
   n++
   b++    
end
返回 n 

3.代码截图

1232194-20171217181408827-539449079.png

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

  • 1.答案正确但输出错误(不相信所以交了两次)
    1232194-20171217181819452-520196581.png

  • 不要处理指针首地址本身,新建一个指针来处理

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

1. 本题PTA提交列表

1232194-20171217183300780-1954350727.png

2. 设计思路

定义 整型变量max储存最大值,循环变量g,最大字符下标i;
         字符型  temp用于暂时储存字符,*q用于储存p的首位置
    q=p
    max=*p的ASCII数
    若 *p不等于\0
        if  *p的ASCII数 大于 max
        max 等于 *p的ASCII数
        i++;
    p++ 
    end
    for g=i to g=0
    交换 *(p+g)和*(p+g-1)
    end for 
  • 今天写博客的时候发现一个问题:如果输入的字符串不是按照ASCII数按照大小输入,则我的代码不成立

3.代码截图

1232194-20171217183320999-19080646.png

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

  • 错误一:p=*q
    1232194-20171217183428983-914647933.png
  • 错误二:交换时使用了双循环
  • 错误三:循环次数错误
    1232194-20171217183450983-416613655.png

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

1232194-20171218115456162-817957726.png

三、阅读代码(2分)

  • 因为我自己做不出来,所以和军霖同学要了这道题目的代码了解
  • 吴军霖同学关于6-11报数的代码1:
void CountOff( int n, int m, int out[] ){
    int off=1,cnt=0,i;
    static int flag[MAXN];
    
    for(i=1;off<=n;i++){
        cnt+=!flag[i];
        if(cnt%m==0&&!flag[i]) {
            flag[i]=1;
            out[i-1]=off++;
        }
        if(i==n) i=0;
    }   
  • 它的功能:给出每个人的退出顺序编号。
  • 优势:
  • 1.首先可以看出军霖同学的代码十分简洁,像
if(flag[i]) 
        cnt++;

他直接简化为

cnt+=!flag[i];
  • 2.他判断是否出圈的方式很巧妙,用数组flag[MAXN]表示,当flag等于1时,表示没有出圈,当flag=0时表示出圈;
  • 3.关于让我比较头疼的就是如何使一个数列以一个圈的方式循环,
    军霖同学以
if(i==n) i=0;

的方式判断语句是否到达最后一个人,并赋予0,从头开始循环,即以一个圈的形式进行;

  • 吴军霖同学关于7-7 删除字符串中的子串
char s[81],sub[81];
    gets(s);
    gets(sub);
    int i,u,v;
    
    do{
        for(i=0,u=0; s[i] ;){//以s到最后一个字符为结束 
            
            if(s[i]==sub[0]){//主串中遇到与子串第一个字符相等的开始判断接下来的是否会相等 
                for(v=i+1; sub[v-i] ;v++) //循环条件为sub[v-i],即子串到最后一个字符,减少了许多变量 
                if( s[v]!=sub[v-i] ) 
                break;
                if(!sub[v-i]) i=v;//如果子串出现,就给主串加上子串的长度 
            }
            s[u++]=s[i++];//即满足了s[u]=s[i],又进行了i++,u++; 
            
        }
        s[u]='\0';//for循环结束 后给s[u]加上结束标识符 
    }while(u!=i);//新的字符串中也会有子串的出现
    
    puts(s);
    return 0;
}

(备注是我自己对该代码的理解)

  • 功能:输入2个字符串S1和S2,要求删除字符串S1中出现的所有子串S2,即结果字符串中不能包含S2。
  • 优势:思路很清晰,代码精简,虽然精简比较难读懂,但这也是我们今后的目标
  • (1)循环条件
for(v=i+1; sub[v-i] ;v++)

循环条件为sub[v-i],即子串到最后一个字符,减少了许多变量

  • (2)录入除子串外字符的方式
s[u++]=s[i++];

即满足了s[u]=s[i],又进行了i++,u++;

  • (3)用do-while循环语句对新字符也出现子串的情况进行了判断

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

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

(1)什么是结构?结构和数组有什么区别

  • 结构:结构类型是一种允许程序员把一些一些数据分量聚合成一个整体的数据类型。一个结构中包含的每个数据分量都有名字,这些数据分量称为结构成员或者结构分量,结构成员可以是C语言中的任意变量类型
  • 和数组的区别:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同

    (2)有几种结构的定义形式

  • 1.混合定义:在定义结构类型的同时定义结构变量

struct 类型名{
类型名 结构成员1;
类型名 结构成员2;
...
类型名 结构成员n;

}结构变量名表;

注意:这里的分号不能漏掉.

  • 2.嵌套定义:在定义结构成员时所使用的数据类型也可以是结构类型
    例如:
struct address{
  char city[10]; 
};
struct nest_student{
   int num;
   struct address addr;};

注意: struct address addr;};.
注意:必须先定义成员的结构类型,再定义主结构类型.

  • 3.无类型名定义
    例如:
struct {
类型名 结构成员1;
类型名 结构成员2;
...
类型名 结构成员n;

}结构变量名表;

注意:这种做法导致后来无法再定义这个类型的其他结构变量,所以一般建议前面两种.

(3)如何引用结构成员变量

结构变量名.结构成员名

注意:中间的那个点.
由于结构成员运算符的优先级属于最高级别,所以一般情况下都优先执行。
只有相同类型的变量之间才可以直接赋值

4)什么是结构数组?

    1. 结构数组是结构与数组的结合体
      格式如下:
struct student students[50]
  • 2.其初始化与二位数组的初始化类似
  • 3.对结构数组成员的引用
结构数组名[下标].结构成员名

(5)什么是结构指针?

  • 1.结构指针就是指向结构类型变量的指针
  • 2.结构指针的值实际上是结构变量的首地址,即,第一个成员的地址.
  • 3.用*p访问结构成员
    如:
01.(*p).num=101;

注意:(p)中的括号是不可以少的,因为成员运算符‘.’的优先级高于‘’的优先级.

02.p.num=101;
03.p->num=101;

2.罗列本周一些错题。

课堂派
  • 1.预习作业
    1. 1232194-20171218115708068-960670618.png
  • 答案是语法错误,

要么

(*p).str++

要么

p->str++
    1. 1232194-20171218115851537-1675890.png
  • 答案是D. A中的“p++”也是地址,与p的用法相同是成立的,stu最大为stu[2],stu[3]越界了。

转载于:https://www.cnblogs.com/Zeng99/p/8052727.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值