计蒜课难题题库之泥塑课

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

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

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

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

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

样例1

输入:

1
2
3
4
5
6
7
8
9
10
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
1
2
Bill took clay from Will.
Graham took clay from Cam.

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

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#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.在找最值时,最值得下标找出来后还应该更新最值。