第八周

问题 回答
这个作业属于那个课程 C语言程序设计II
这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/homework/3078
我在这个课程的目标是 学习字符串的几种函数以及内存动态分配以及结构体的预习
这个作业在那个具体方面帮助我实现目标 在写题时自己不断探究,找到自己要学的知识点
参考文献 《C语言程序设计》《C primer plus》
基础题
<函数实现字符串逆序>
本题要求实现一个字符串逆序的简单函数。

函数接口定义:
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 )
{
    int i;
    char temp;
    int n=strlen(p);
    for(i=0;i<n/2;i++)     
    {
        temp=p[i];
        p[i]=p[n-i-1];
        p[n-i-1]=temp;
    }
    return p;
}

2.设计思路

3.遇到问题及解决方法
问题一:在定义空盒子temp时我并未将其定义成字符型而是定义成int型,导致错误。
解决方法:询问室友,仔细读题。
问题二:在前后字符调换时p[n-i-1]我一开始是定义的p[n-i],答案错误。
解决方法:上网查询,请教室友,发现如若不定义成p[n-i-1],最后的交换会出现错误。

4.运行截图

<字符串的连接>

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

函数接口定义:
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 )
{
    strcat(s,t);
    return s;
}

实验代码

char *str_cat( char *s, char *t )
{
	int i,j; 
	for(i=0;s[i]!='\0';i++)
	for(j=0;t[j]!='\0';j++){
		s[i+j]=t[j];
	}
	return s;
} 

2.设计思路


3.遇到的问题及解决方法

4.运行截图

<输出学生成绩>

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

输入格式:

输入第一行首先给出一个正整数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,temp;
    double *score,sum;
    scanf("%d",&n);
    if((score=(double* )malloc(n*sizeof(double)))==NULL) 
    {
        printf("Not able to allocate memory.\n");
        exit(1);
    }
    for(i=0;i<n;i++)
    {
        scanf("%lf",&score[i]);
    }
    sum=0;
    double max=score[0],average;
    double min=score[0];
    for(i=0;i<n;i++)
    {
        sum+=score[i];
        if(score[i]>max)
            max=score[i];
        if(score[i]<min)
            min=score[i];
    }
    printf("average = %.2f\n",sum/n);
    printf("max = %.2f\n",max);
    printf("min = %.2f\n",min);
    free(score);
    return 0;
}

2.设计思路

3.遇到问题及解决方法
问题一:在调用malloc函数时,在强制转换时还是定义的int型,导致错误。
解决方法:自己调试,询问室友。
问题二:在定义最大值最小值时我是将其定义为最大0,最小101,但是忽略了其中没有成绩的情况,如若如此定义会输出最大值0,最小值101.
解决方法:其实我一开始并未找到此处的错误,把代码交由我室友修改时,我们把最大值最小值定义成数组的首位,答案正确。


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],t[80];
    for(i=0;i<5;i++)
    {
        scanf("%s",&a[i]);
    }
    for(i=0;i<5;i++)
    {
        for(j=0;j<5-i;j++)
        {
            if(strcmp(a[j],a[j+1])>0)
            {
                strcpy(t,a[j]);
                strcpy(a[j],a[j+1]);
                strcpy(a[j+1],t);
            }
        }
    }
    printf("After sorted:\n");
    for(i=0;i<5;i++)
        printf("%s\n",a[i]);
    return 0;
}

2.设计思路

3.遇到问题及解决方案
问题一:其实一开始我并未意识到定义一个二维数组,但在后续程序编写过程中发现用一维数组时程序无法很顺利编写下去。
问题二:在编写时未按照提议把要输入的第一行写进代码,导致答案错误。
解决方法:仔细比对题目,发现少了输出时的第一句。
问题三:在一开始编写时本想调用strcmp和strcpy函数,但在写进时我发现答案错误。
解决方法:其实我改了很多地方,最后对比书我才发现是strcmp函数用法写错了。

4.运行截图

预习题
<计算平均成绩>

给定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 number[1000];
    double score;
    char name[10];
    };
int main()
{
    double average,sum=0;
    int n,i;
    struct student a[10];
    scanf("%d\n",&n);
    for(i=0;i<n;i++)
    {
        scanf("%s %s %lf",&a[i].number,&a[i].name,&a[i].score);
        sum+=a[i].score;
    }
    average=sum/n;
    printf("%.2f\n",average);
    for(i=0;i<n;i++)
    {
        if(a[i].score<average)
            printf("%s %s\n",a[i].name,a[i].number);
    }
    return 0;
}

2.设计思路

3.遇到问题及解决方法
问题一:在定义学生学号时我将其定义成int型,发现答案错误。
解决方法:联系到以前容易粗心的我,我认真看了下题目,果然,题目要求定义成字符型,而且在定义其数组时其应最少定义为6位,而不是5位,因为后面还有个结束符。
问题二:一开始刚学结构体,像在定义结构变量名、在应用结构体中成员时,有些许问题有点疑惑。
解决方法:认真研读教材,解决细节问题。
问题三:在输出时我犯了一个特别智障的错,在最后没有换行符,导致答案老是错误。
解决方法:无数次研究我终于发现了这个错误。

4.运行截图

周/日期 这周所花时间 代码行数 学到知识点简介 目前比较疑惑问题
4/13-4/17 5天 200 学习字符串的几种函数以及内存动态分配以及结构体的预习 挑战题不太会,结构体有些定义其实我比较混淆

累计代码和博客行数

时间 博客字数 代码行数
第一周 200 40
第二周 250 70
第三周 300 70
第四周 350 90
第五周 400 100
第六周 450 150
第七周 400 150
第八周 450 200
心得:还是觉得自己逻辑思维比较局限,有时候都不能想到作业要求的那个点,继续加油。
学习感悟:这周并未在作业外学习什么,主要是把上周的一些疑惑慢慢解开了,还看了我室友以前的代码,看了她的另一种思路,让自己思维逻辑得到提高。
难点:主要是以前基础不够牢固,老是弄混以前知识点,导致构思时有点思维不清,并未把以前的和现在的结合起来。挑战题真的对我来说非常困难。
结对编程:
在给队友讲题的过程中我也更加的理清了自己的思路,能够得到与自己不同的思维逻辑,让自己得到提升。有时候也会涉及以前知识点,让我能更好的复习,理清思路。
挑战题:其实这次挑战题我没有特别清晰的思路。我想了一下把每个数字对应的字母把它列出来,然后再进行编译,但是电话号码我不知编译6位、7位还是11位。没有特别明了的思路,持续加载中。。。
posted on 2019-04-18 06:45  营业执照  阅读(250)  评论(3编辑  收藏  举报