2019 第八周作业

2019春季第八周作业

这个作业属于哪个课程 C语言程序设计ll
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3074)
我在这个课程的目标是 掌握字符串和字符指针、利用常用的字符串处理函数 及用指针实现内存动态分配
这个作业在哪个具体方面帮助我实现目标 利用字符串函数编写代码以及用指针实现动态分配内存
参考文献 https://wenwen.sogou.com/z/q1710626805.htm)

一、基础题

1、 函数实现字符串逆序

本题要求实现一个字符串逆序的简单函数。

函数接口定义:

void f( char *p );

函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。

裁判测试程序样例:

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    f(s);
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

Hello World!

输出样例:

!dlroW olleH

(1)实验代码

#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s );     /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    f(s);
    printf("%s\n", s);

    return 0;
}

void f( char *p )
{
    int i=0,j=0,z,m;
    while(p[i]!='\0')
    {
        i++;
        z=i-1;
    }
    while(j<=z)     //字符数组处理字符串,将字符串的首字符和最后一个字符交换,注意交换的次数
    {
        m=p[j];
        p[j]=p[z];
        p[z]=m;
        j++;
        z--;
    }
}

(2)设计思路

(3)本题调试过程中碰到问题及解决方法

问题:·一开始没有判断p[i]!='\0'的情况,导致答案错误
解决方法:·多次调试后找到错误并改正

(4)运行结果截图

2、字符串的连接

本题要求实现一个函数,将两个字符串连接起来。

函数接口定义:

char *str_cat( char *s, char *t );

函数str_cat应将字符串t复制到字符串s的末端,并且返回字符串s的首地址。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXS 10

char *str_cat( char *s, char *t );

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};

    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

abc
def

输出样例:

abcdef
abcdef

(1)实验代码

#include <stdio.h>
#include <string.h>

#define MAXS 10

char *str_cat( char *s, char *t );

int main()
{
    char *p;
    char str1[MAXS+MAXS] = {'\0'}, str2[MAXS] = {'\0'};

    scanf("%s%s", str1, str2);
    p = str_cat(str1, str2);
    printf("%s\n%s\n", p, str1);

    return 0;
}

char *str_cat(char *s,char *t)
{
    return strcat(s,t);     //连接两个字符串,连接后的字符串存放在s中
    
    return 0;
}

(2)设计思路

(3)本题调试过程中碰到问题及解决方法

问题:·一开始想到的做法比较麻烦,还只能输出一行abcdef,进行调试我也看不出哪里出错
解决方法:·查了百度,看到了一种比较简单的方法,直接用函数连接两个字符

(4)运行结果截图

3、输出学生成绩

本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。

输入格式:

输入第一行首先给出一个正整数N,表示学生的个数。接下来一行给出N个学生的成绩,数字间以空格分隔。

输出格式:

按照以下格式输出:
average = 平均成绩
max = 最高成绩
min = 最低成绩
结果均保留两位小数。

输入样例:

3
85 90 95

输出样例:

average = 90.00
max = 95.00
min = 85.00

(1)实验代码

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int i,N,*p;
    double sum,max,min;
    scanf ("%d",&N);
    
    if((p=(int*) calloc (N,sizeof(int)))==NULL)     //为数组p动态分配N个整数类型大小的空间
	{                
        printf ("Not able to allocate memory.\n");
        exit (1);
    }
    for(i=0;i<N;i++)               //输入学生的成绩
	{                                 
        scanf("%d",&p[i]);
    }
    max=min=p[0];
    for(i=0;i<N;i++)              //计算学生的平均成绩、最高成绩和最低成绩
    {
        sum=sum+p[i];
        if(max<p[i])
        {
            max=p[i];
        }
        if(min>p[i])
        {
            min=p[i];
        }
    }
    printf ("average = %.2lf\n",sum/N);
    printf ("max = %.2lf\n",max);
    printf ("min = %.2lf\n",min);
    free (p);
    
    return 0;
}

(2)设计思路

(3)本题调试过程中碰到问题及解决方法

本题是参看书上的例题写的,没有出现错误

(4)运行结果截图

4、字符串排序

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:
After sorted:
每行一个字符串

输入样例:

red yellow blue green white

输出样例:

After sorted:
blue
green
red
white
yellow

(1)实验代码

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j;
	char a[5][80],m[80];
	
	for(i=0;i<5;i++)
	{
		scanf("%s",&a[i]);	
	}
	 for(i=1;i<5;i++)             //比较字符串的大小 
    { 
        for(j=0;j<5-i;j++)
        {
            if(strcmp(a[j],a[j+1])>0)                   
            {
                strcpy(m,a[j]);                //把字符串a[j]复制到m 
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],m);
            }
        }
    }

	printf("After sorted:\n");
	for(i=0;i<5;i++)
    {
        printf("%s\n",a[i]);
    }

	return 0;
}

(2)设计思路

(3)本题调试过程中碰到问题及解决方法

问题:·本题是仿照书上的例题写的,一开始没有定义二维数组,并且在比较字符串大小的时候出了点问题,我把for语句中的i=0,导致答案错误。
解决方法:·多次调试之后发现错误并改正。

(4)运行结果截图

二、预习题

1、计算平均成绩

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和成绩([0,100]区间内的整数),要求计算他们的平均成绩,并顺序输出平均线以下的学生名单。

输入格式:

输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩”,中间以空格分隔。

输出格式:

首先在一行中输出平均成绩,保留2位小数。然后按照输入顺序,每行输出一位平均线以下的学生的姓名和学号,间隔一个空格。

输入样例:

5
00001 zhang 70
00002 wang 80
00003 qian 90
10001 li 100
21987 chen 60

输出样例:

80.00
zhang 00001
chen 21987

(1)实验代码

#include<stdio.h>
#include<string.h>
struct student                            //学生信息结构定义
{
    int num[6];                    //学号              
    char name[11];                 //姓名 
    int grade;                     //成绩 
};
 
int main(void)
{
    struct student a[10];                      //定义结构变量
    int i, N;
    double sum = 0,average;
    scanf("%d\n", &N);
    for (i = 0; i < N; i++)                      //计算
    {
        scanf("%s%s%d", &a[i].num, &a[i].name, &a[i].grade);
        sum += a[i].grade;
    }
    average = sum / N;
 
    printf("%.2f\n", average);
    for (i = 0; i<N; i++)  
    {
        if (a[i].grade < average)
        {
            printf("%s %s\n", a[i].name, a[i].num);
        }
    }
 
    return 0;
}

(2)设计思路

(3)本题调试过程中遇到的问题及解决方法

问题:·本题也是仿照书上写的,没有把学号和名字定义成数组
解决方法:·提交答案错误之后返回代码仔细检查

(4)运行结果截图

三、预习的主要内容

预习了第九章结构:
1、在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。。
  在C语言中,定义一个结构的一般形式为:
  struct结构名
  {
  //成员表列
  };
  成员表由若干个成员组成, 每个成员都是该结构的一个组成部分。对每个成员也必须作类型说明,其形式为:“类型说明符 成员名;”。成员名的命名应符合标识符的书写规定。。
  在这个结构定义中,结构名为stu,该结构由4个成员组成。 第一个成员为num,整型变量;第二个成员为name,字符型数组;第三个成员为sex,字符型变量;第四个成员为score,浮点型变量。 应注意在括号后的分号是必不可少的。。

2、当结构定义完成后,即创建了一种数据类型,可以像int、float等内置类型一样使用,以上面定义的stu结构体来和int类型对比着看。
  int a;//定义一个int类型的变量a
  stu a; //定义一个stu类型的变量a
  int *p; //定义一个int类型的指针p
  stu *p; //定义一个stu类型的指针p
  int a[10];//定义一个int类型的数组a,它有10个元素,每个元素是int类型
  stu a[10];//定义一个stu类型的数组a,它有10个元素,每个元素是stu类型。。

四、学习感悟

本周学习了字符串和字符指针,字符指针是指向字符的指针,所占内存单元存放的是所指字符的内存单元。定义方法为:char *p;还学习了常用的字符串处理函数 及用指针实现内存动态分配。。
对于本周的作业,我大部分是仿照书上的写的,但是还是有很多地方不清楚,比如预习题用到的结构,还不太懂结构的具体用法。。

感悟:虽然比较难,但是还是会继续努力的!加油!

五、结对编程感想

本周三晚自习依旧是我们结对编程的时间,但是由于我和搭档报了学校的活动,我们都没有去教室编程,但我们在寝室一起写了,感觉这次收获挺多的,在写题目的时候我们一起讨论了很多问题,我们实行不懂就问对方,两个都不懂就查资料或者问大佬。感觉还不错。

六、学习进度条

周/日期 这周所花的时间 代码行数 学到的知识点简介 目前比较迷惑的问题
2/25-3/3 三天 45 数组的认识及用法 数组长度的理解
3/4-3/10 两天 37 编写程序时处理文件 fscanf与fprintf的具体用法
3/11-3/17 三天 53 二维数组的使用及文件插入 二维数组的用法、上三角的判断及文件的处理
3/18-3/24 两天 113 选择排序法、二分查找法、二维数组的引用与矩阵 不清楚选择排序法和冒泡排序法的区别
3/25-3/31 两天 78 判断回文、一维字符数组的用法、使用字符串编程 使用字符串编程
4/1-4/7 两天 88 指针变量的基本运算,内存单元和地址之间的关系 不太了解指针数组
4/8-4/14 两天 96 指针、数组和地址之间的关系 对于指针数组和数组指针的区别不是特别清楚
4/15-4/21 两天 128 字符串和字符指针、常用的字符串处理函数 及用指针实现内存动态分配 对于指针都不是特别懂

七、表格和折线图

时间 代码行数 博客字数
第一周 45 870
第二周 37 1055
第三周 112 1158
第四周 113 1696
第五周 78 1854
第六周 114 2977
第七周 96 3019
第八周 128 3264

posted @ 2019-04-19 00:17  z★m  阅读(1119)  评论(1编辑  收藏  举报