第八周编程总结

本周作业头

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3074
我在这个课程的目标是 用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配
这个作业在那个具体方面帮助我实现目标 字符串的运用、 动态内存分配的应用、结构类型的了解
参考文献 C语言程序设计II

基础作业

一、函数实现字符串逆序 (15 分)

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

函数接口定义:

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)实验代码

void f( char *p )
{
char t;
int i,j=0;     //输入字符串
for(i=0;*(p+i)!='\0';i++)
{
j++;
}
for(i=0;i<j/2;i++)   //逆序后的字符串为
{
t=*(p+i);
*(p+i)=*(p+j-i-1);
*(p+j-i-1)=t;
}
}

2)设计思路

3)运行遇到的问题及解决办法

这一题在于用字符串进行编程及字符串的处理,所以有时候用字符串指针的时候会懵,老是编译错误,解决办法就是看书,基础知识要牢记。

4)运行结果截图

二、字符串的连接 (15 分)

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

函数接口定义:

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)实验代码

char *str_cat(char *s, char *t)
{
	int i,len = strlen(s);        //测出字符串长度
	for (i = 0; *(t + i) != '\0'; i++)  
	{
		*(s + i + len) = *(t + i);   //确定位置
	}
  return s;   //返回字符串s的首地址。
	
}

2)设计思路

3)运行过程中遇到的问题及解决办法

应该求出输入的字符长度,而我直接赋初值给字符串长度,答案就不对了

4)运行结果截图

三、 输出学生成绩 (20 分)

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

输入格式:

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

输出格式:

按照以下格式输出:

average = 平均成绩
max = 最高成绩
min = 最低成绩

结果均保留两位小数。

输入样例:

3
85 90 95

输出样例:

average = 90.00
max = 95.00
min = 85.00

1)实验代码

#include<stdlib.h>
int main ()
{
    int i,n;
    float *p,sum,max,min,average;
    scanf("%d",&n);
    //为数组p动态分配n个整数类型大小的空间
    if((p = (float*) calloc (n,sizeof(float))) ==NULL){
        printf ("Not able to allocate memory.\n");
        exit(1);
        }
        sum=0;
        max=0;
        min=100;
        for(i=0;i<n;i++){     //计算n个整数和
            scanf("%f",p+i);
            sum = sum+*(p+i);    // 计算三数的大小
            if(min>*(p+i))
            min = *(p+i);
            if(max<*(p+i))
            max = *(p+i);
        }
        average = sum/n;
        printf("average = %.2f\n",average);  //输出结果
        printf("max = %.2f\n",max);
        printf("min = %.2f\n",min);
        free(p);   //释放动态分配的空间
        return 0;
}

2)设计思路

3)运行遇到的问题

输出格式不对,我是写总,题目要求分行并保留两位小数。

4)正确截图

四、字符串排序 (20 分)

本题要求编写程序,读入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(void)
{
    char a[80][80],s[80];   //定义数组字符 
    int i,j;         //定义函数 

    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(s,a[j]);      //逐个转换字符串复制到另一个地址空间
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],s);
            }
        }
    }
    printf("After sorted:\n");    //输出每行一个字符串
    for(i=0;i<5;i++)
	{
        printf("%s\n",a[i]);
    }

    return 0;
 } 

2)设计思路

3)运行过程中的问题

这题和第五周题目相似思路差不多,但是写法不同,所以输出格式就按照第五周的写的,后面看题目要求改正的。

4)正确截图

五、计算平均成绩 (15 分)

给定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>
struct student          //学生信息结构定义
{
	char num[6];  //学号
	char name[11];   //名字
	float count;   //一个成绩
};
 
int main()
{
	struct student stu[10];   定义结构变量
	int i, n;
	float sum = 0, average;
	scanf("%d\n", &n);
	for (i = 0; i < n; i++) 
	{
		scanf("%s%s%f", &stu[i].num, &stu[i].name, &stu[i].count);
		sum = sum + stu[i].count;     //计算总成绩
	}
	average = sum / n;    //计算平均成绩
 
	printf("%.2f\n", average);
	for (i = 0; i<n; i++)  
	{
		if (stu[i].count < average)      //个人成绩和平均数作比较
		{
			printf("%s %s\n", stu[i].name, stu[i].num);    
		}
	}
 
	return 0;
}

2)设计思路

3)运行中的问题

刚开始只输出平均数,题目还要求输出成绩最小的同学信息,所以答案错误

4)正确截图

学习进度条

周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
3/4-3/11 七小时 37行 1、文件建立 2、对文件加密 1、if读取的文件是否必须存在,以“W”的方式写还是“a的方式”,两者性质是否相同 (这是做题中迷惑的,目前已解决)
3/12-3/16 九小时 53行 二维数组的基本定义 矩阵术语与二维数组下标的关系表需要老师详解
3/18-3/22 十小时 28行 41行 27行 冒泡法排序 选择法排序 二维数组的应用 冒泡排序法老师在课上提的不多,所以当时做还是思考很久
3/23-3/29 十小时 23行 43行 41行 排序法巩固 文件储存的巩固 判断回文 一些排序题的算法思路不清晰,还有流程图
3/30-4/5 十五个小时 6行 30行 36行 指针 数组 加 * 号和不加 * 的差别
4/6-4/12 二十一小时 12行 75行 29行 数组名作为函数参数的用法 %s的格式输出细节,输出参数问题
4/13-4/18 十六小时 119行 用字符串函数以及使用指针操作字符串的方法,掌握动态内存分配 结构类型运用及动态内存分布的一些概念

学习感悟

基本常识的掌握,总是编译错误,其次就是看题不认真,输出要求总是不挨边,所以经常答案错误。最后就是预习题,根据例题改写,问题不大。

结对编程感悟

这周题目比较还可以,几个都是以前做过的题,思路有了,就容易,所以这周讨论很愉悦。

折线图

时间 代码行数 博客字数
第一周 39 292
第二周 37 465
第三周 75 1099
第四周 96 1230
第五周 107 1039
第六周 66 1881
第七周 116 2415
第八周 119 2477
posted @ 2019-04-17 12:52  XHIJL  阅读(248)  评论(1编辑  收藏  举报