计蒜课难题题库之泥塑课

      最近看《征服c指针》感觉被虐了,到后面几章完全看不懂了,我也觉得最近光在看书,基本没写代码,这样下去是不行的。于是我决定把《征服c指针》丢一段时间,先多写写代码练练手。于是我就到计蒜课的难题题库找虐去了。

好吧,题目要求是这样的:

小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。

小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。每组输入数据的第一行为一个整数n,表示了这个班的小朋友数,之后n行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学生手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有9个小朋友,最少也要有2个小朋友,每个小朋友在学籍系统中的名称不超过8个字符长。当出现一个班级的小朋友数为-1时,表示没有更多的班级了。

输出行数与小米老师带的班级数相同,形式为“X took clay from Y.”,具体请参考样例输出。

样例1

输入:

3
10 10 2 Jill
5 3 10 Will
5 5 10 Bill
4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam
-1
输出:

Bill took clay from Will.
Graham took clay from Cam.
这道题逻辑很简单,有两个难点,一个是输入,一个是对结构体的掌握(好吧,我承认看了这么久的《c指针》我还是不会用指向二维数组的指针,或者说不敢用。。。。。)

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct student
{
    int num[3];
    int v;
    char name[9];
}STU;
typedef struct class
{
    int num_stu;
    struct student stu[9];
}CLASS;

void   judgesteel(CLASS *class_n,int count)
{
    int i,j,v,max=-1,min=10000,key1=-1,key2=-1;
    for(i=0;i<count;i++)//对班级进行迭代
    {
        max=-1,min=10000,key1=-1,key2=-1;
        for(j=0;j<class_n->num_stu;j++)//对每个学生迭代
        {
            class_n->stu[j].v=class_n->stu[j].num[0]*class_n->stu[j].num[1]*class_n->stu[j].num[2];
            if(class_n->stu[j].v>max)
            {
                key1=j;
                max=class_n->stu[j].v;
            }
            else if((class_n->stu[j].v)<min)
            {
                key2=j;
                min=class_n->stu[j].v;
            }
        }
        printf("%s took clay from %s\n",class_n->stu[key1].name,class_n->stu[key2].name);
        class_n=class_n+1;//下一个班级
    }
}

int main()
{

    CLASS *class_n;
    int i,j,count=1;
    class_n=malloc(sizeof(CLASS));//首先为class_n动态分配一个地址
    if(class_n==NULL)
    {
        printf("No enough membery");
        exit (0);
    }
    scanf("%d",&class_n->num_stu);//输入班级人数
    CLASS *p=class_n;//p保存首地址
    CLASS *q;
    while(1)
    {
        for(i=0;i<(class_n->num_stu);i++)
        {
            for(j=0;j<3;j++)//为每一位学生输入长宽高
            {
                scanf("%d",&class_n->stu[i].num[j]);
            }
            scanf("%s",class_n->stu[i].name);
        }
        q=class_n;//保存class_n当前指向的位置
        class_n=realloc(class_n,(count+1)*sizeof(CLASS));//用count计数班级,扩大classs_n的容量
        class_n=q+1;//将class_n指向最新的内存
        scanf("%d",&class_n->num_stu);//输入班级人数
        if(class_n->num_stu==-1)
        {
            break;
        }
        count=count+1;//班级数加一
    }
    class_n=p;//将首地址还原
    judgesteel(class_n,count);
    free(p);
    return 0;
}

说起写的过程我就气,不知道编译器出了什么问题,尼玛运行个printf都要程序出错。是时候重装一遍codeblocks了。弄得我调试的时候还以为遇到鬼了。


反思:1.第一次实战realloc函数

2.要移动指针时,最好再声明一个指针来保存首地址,到时候输出的时候好返回。

3.结构体中的结构体指针要引用其中的成员应该用->,而结构体中的结构体,要引用其中的成员应该用"."。

4.在找最值时,最值得下标找出来后还应该更新最值。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值