C语言博客作业--字符数组

一、PTA实验作业

题目1:统计一行文本的单词个数

1. 本题PTA提交列表

2. 设计思路

Begin

定义字符型变量ch,pre=‘ ’;
定义整型变量count;//用来记录单词个数
count←0;
while((ch←getchar())!='\n')
do{
    if(ch!=' ' and pre →' ')
        count 自增;
    pre←ch;
}
output count;

End

3.代码截图

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

本道题类似于11月循环结构上机考试的一道题

当时提交时的错误提示显示我没有考虑到输入很多空格和只输入空格的情况,这次做题时突然想到,每次开始输入一个“单词”,除了第一个单词,其余单词的前面一定是有空格的,于是我定义了一个pre表示输入字符的前一个变量,先给pre赋上初值为空格,然后接下来每次输入字符时都令pre赋上ch的值,以此达到计数单词的目的(不过在写这个时才发现没有用数组来做,但是用数组也是差不多的,在开始的时候输入字符串遍历数组,后面的操作就差不多了)

题目2:找最长的字符串

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

2. 设计思路

3.代码截图

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

错误提示:

当时的代码是这样的(经过检查上面的代码没有错,那就只有最后输出错了)

后来仔细看了题目,才发现输出漏了一些东西,于是改成以下代码,果然全部正确了

题目3:删除字符串中的子串

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

2. 设计思路

Begin

定义整型变量i,j,count=0;
定义字符数组s1[100],s2[100];
input s1,s2;
while s1[i]!='\0'
do{
    if s2[count]←'\0' and count>0
    then{
            j→i-count;
          while(s1[i]!←'\0')
              s1[j++]→s1[i++];
          s1[j]→'\0';
          i→0;
          count→0;
        }
    if  s1[i]←s2[count]
        count 自增;
    else if (s1[i]←s2[0])
        count→1;
    else
        count→0;
    i自增;
    if s2[count]←'\0' and count>0 /*当要删除的字串在s1末尾时*/
        s1[i-count]→'\0';
    output s1;

End

3.代码截图

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

这是一开始的代码

但是发现这样会把所有只要是子串中的字符都删掉,很明显题目的要求不是这样,于是上网参考别人的代码重新写了一个。

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

三、同学代码结对互评

1.互评同学名称

曾文惠

2.我的代码、互评同学代码截图

我的代码:

曾文惠的代码:

3.我和同学代码不同在哪里?有哪些各自优势?你更喜欢哪种代码风格?如果同学代码有错的也请帮忙指出来哪里出问题。

曾文惠同学的代码与我的不同之处在于,她使用了strlen函数来计算字符串的长度,但是在本题中这一步是可以省略的,另外对于第一个单词的判断,她是在循环外先进行一次判断,而我的代码把这两步都合在一个循环里进行判断,虽然我们的思路差不多,但是我的代码要更加简洁,我更喜欢我的代码。

四、本周学习总结

1.你学会了什么?

1.1指针变量如何定义?

类型名 *指针变量名

如:

int *p;
char *cp;
float *fp;
double *dp1,*dp2;

需要特别注意的是:定义多个变量时,每一个指针变量前面都必须加上*

1.2 指针加法运算运用在哪种情况,2个指针变量能否相加?

指针的加法运算用在改变存储单元的位置,如“++p”、“(p)++”;

两个指针变量不能相加,指针变量表示地址,地址相加没有意义,但可以进行减法运算,表示两个地址之间的距离。

1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示?

程序运行失败。

1.4 课堂派上关于分离浮点数的整数部分和小数部分那题,请用DEVC验证实现,并在此贴图展示,同时说明哪句是指针变量做函数形参,函数实参应该怎么表示。指针变量做函数形参有什么用处?

第8行,指针变量作函数形参,指针变量需要在主函数有定义,函数实参需要加上&。

指针变量作为函数形参,可以将函数外部的地址传到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。

1.5 请把课本的冒泡排序的函数改成指针变量做形参格式,并把代码写在底下,注意用markdown语法渲染。


void bubble (int *p ,int n)
{
    int i,j,t;
    for(i=0;i<n;i++)
        for(j=0;j<n-i;j++)
            if(*p>*(p+1))
            {
                t=*p;
                *p=*(p+1);
                *(p+1)=t;   
            }
    for(i=0;i<n;i++)
        printf("%d",*(p+i)); 
}

1.6 如何定义一个指针变量指向数组,如何用指针变量表示数组元素?

(1)让指针变量指向数组

int a[100],*p;
p=a;

(2)用指针变量表示数组元素

p1=a;      等价于 p1=&a[0];
p2=a+1;  等价于 p2=&a[1];
那么 *p1=a[0]; *p2=a[1];
*(p++)即可表示数组a中的元素

1.7 如何定义字符指针指向字符串?指针指向字符串后,初始位置在哪里?

定义字符指针指向字符串

char *sp="string";

指针指向字符串后,初始位置即字符串首字符的地址

1.8 利用字符指针操作字符串,如设计函数实现字符串连接,请在此贴图展示代码。说明指针表示字符的方法好处是什么?

好处:占用的存储空间小,只占用一个可以存放地址的内存单元,使用方便。

2.本周你不会内容有什么?

2.1 课堂派错题罗列及如何订正。

第七题:

订正:

应该选A,str是数组名,不能进行赋值。

第六题:

订正:

(其实是不小心选错了= =)p表示的是a[0]的地址,加上8表示的还是地址,所以D错,p表示的是a[0]的值,(p+9)表示的是a[0]+9,即10,所以A和C错误,B正确

第四题:

订正:

同第七题,a是数组名,是常量,不能改变其值,所以选D。

第二题:

订正:

1.num 2.p+n 3.max<*p
数组作为形参,只需要数组名;
q表示地址,所以条件应该也是地址。

第三题:

订正:

忘记返回指针导致的错误。

2.2 其他不会的?打算怎么解决

课堂派的第一题不知道错在哪里,打算问同学。

3.数组上机考试小结

3.1 那题错了,请罗列?

6-2,7-3

7-2,7-4还没来得及做

3.2 错题如何订正,为什么错了?

6-2:错误提示:

但是不清楚测试点simple2是什么

7-3:当时时间快结束了所以把代码提交一下作为保存,没想到对了几个测试点,还没来得及去订正。

PS:修改

1.3 指针不赋初值,直接使用,会出现什么情况,请用DEVC验证,并截图展示

结果是一个随机地址

指针未赋初值,指针访问一个随机地址里面存放的数据,是不合法的。

1.8指针表示字符的方法好处

posted @ 2017-12-10 22:54  看尽长安花  阅读(317)  评论(2编辑  收藏  举报