2019春第八周作业

这个作业属于那个课程 C语言程序设计II
这个作业要求在哪里 要求我们掌握几个函数和怎样实现内存动态分配,可以更好的运用它
我在这个课程的目标是  学懂C语言,会编程一些简单的小应用
这个作业在那个具体方面帮助我实现目标  这个作业让我学懂怎样用指针实现内存动态分配
参考文献  https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/

 

 

基础题:

6-1 函数实现字符串逆序 (15 分)

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

函数接口定义:

void f( char *p );

函数fp指向的字符串进行逆序操作。要求函数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=0,j=0,temp;//定义变量
    while(p[i]!='\0')//计算数组的长度
    {
        i++;
    }
    while(j<i-1)//利用temp把p[i-1]赋值给p[j],p[i]赋值给p[i-1]
    {
        temp=p[j];
        p[j]=p[i-1];
        p[i-1]=temp;
        j++;
        i--;
    }
    
    return ;
 } 

 

 

 

2)流程图

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

   问题:没思路

 

       解决办法:参考了别人的代码

 

3)运行结果截图

 

 

 

 

 

6-3 字符串的连接 (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 )
{
    strcat(s,t);//字符串t复制到字符串s的末端
    return s;//返回字符串s的首地址
    
 } 

 

 

 

2)流程图

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

      没问题

3)运行结果截图

 

 

 

7-1 输出学生成绩 (20 分)

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

输入格式:

输入第一行首先给出一个正整数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 n,i,*p;
    double sum=0,max,min;
    scanf("%d",&n);  //输入同学个数
    if((p=(double *) calloc (n,sizeof (double)))==NULL){    //通过动态分配内存单元
        printf("Not able to allocate memory.\n");
        exit(1);
    }

    for(i=0;i<n;i++)
    {
        scanf("%d",p+i);  //输入n个同学的成绩
        sum+=*(p+i);  //计算n个同学的成绩的和
    }
    max=min=*p;
    for(i=0;i<n;i++)
    {
        if(max < *(p+i))  //把最大值赋值给max
            max = *(p+i);
        if(min > *(p+i))  //把最小值赋值给min
            min = *(p+i);
    }
    
    printf("average = %.2f\nmax = %.2f\nmin = %.2f\n",sum/n,max,min);  //输出平均成绩、最大值和最小值
    free(p);  //释放
    
    return 0;
}

 

 

 

2)流程图

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

   开始时看到题目要求输出有两个小数的结果

3)运行结果截图

 

 

7-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()
{
    int i,k;
    char a[5][80];
    char s[80];
    for(i=0;i<5;i++)
    {
        scanf("%s", &a[i]);  //输入5个字符串
    }
    for(i=1;i<5;i++)  //冒泡排序法
    {
        for(k=0;k<5-i;k++)
        {
            if(strcmp(a[k],a[k+1])>0)  //若a[k]大于a[k+1],返回一个正数
            {
                strcpy(s,a[k]);
                strcpy(a[k],a[k+1]);  //把较小值存入a[k],较大值存入a[k+1]
                strcpy(a[k+1],s);
            }
        }
    }
    printf("After sorted:");
    for(i=0;i<5;i++)
    {
        printf("\n%s",a[i]);  //由小到大的顺序输出字符串
    }
    
    return 0;
}

 

 

 

2)流程图

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

   用二维数组存储5个字符;可以用冒泡排序法或选择排序法

3)运行结果截图

 

 

7-3 计算平均成绩 (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{  //学生信息结构定义
    int num[100];  //学号
    char name[10][100];  //姓名
    int grade[100];  //成绩
};
int main ()
{
    int i,n;
    struct student s1;   //定义结构变量
    double sum=0;
    scanf("%d",&n);  //输入学生个数
    for(i=0;i<n;i++)
    {   
        scanf("%d %s %d",&s1.num[i],&s1.name[i],&s1.grade[i]);  //输入学生信息
        sum+=s1.grade[i];
    }
    printf("%.2f\n",sum/n);  //输出平均成绩
    for(i=0;i<n;i++)
    {
        if(s1.grade[i]<sum/n)
        printf("%s %05d\n",s1.name[i],s1.num[i]);  //输出平均线以下的学生名单
    }
    return 0;
}

 

2)流程图

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

   问题:用%d输出结果num[i]时,屏幕只显示一个数字

   解决办法:用%05输出num

3)运行结果截图

 

 

  第二周 第三周 第四周 第五周 第六周  第七周 第八周

字数

548 661 1145 1242 177 1541 1609
代码行数 37 55 100 54 50 88 110

 

 

 

 

学习进度条 

日期 花的时间 行数页码 学到的知识 日期的疑惑
3/1-3/7 4个小时 148-155

数组的定义与运用

3/9-3/15 4个小时 298-303

文件定义和文件数据的处理

3/18-3/22 4个小时 155-165

一维数组的排序方法

二维数组的运用

3/23-3/28 4个小时  166-172  字符串的储存方法,和字符串的运用  将字符串改成十进制输出
3/29-4/5 4个小时  180-186  掌握了指针的定义,基本运算等  指针的初始化还不太懂
4/6-4/12 4个小时 186-190 加强对指针的掌握,利用指针进行编程 指针指向数组的运用还是不太懂
4/13-4/19 4个小时 200-211 学习了几个函数strcat,strcpy,strcmp,和实现内存动态分配 分不清strcat和strcpy的用处

 

 

 

学习总结

    由于本周家里有事无法来学校上课,错过了这周的C语言课,只能自己利用课余时间把这周的老师教的内容自学一遍,自学过程中遇到了一些不懂的地方,我请教了室友和同学;但对用指针实现内存动态分配还不是很能理解,幸好这周作业运用到这方面的知识不是很多。

posted @ 2019-04-19 16:09  ¥...Star  阅读(247)  评论(0编辑  收藏  举报