上篇博客使用两个简单的小例子完成了关于基本函数构建的原则和技巧
**
这次我们使用之前总结出来的提高程序的复用性的技巧和动态内存分配来构造学生信息管理系统
要求:1 动态构造一个数组,存放学生的信息
2 然后按分数输出
**
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
struct student
{
int age;
char sex;
int score;
};
int main(void)
{
struct student* parr;
int len;
int i,j;
struct student t;
printf("请输入学生的个数\n");
printf("len = ");
cin >> len;
//动态的构造一维数组
parr=(struct student *)malloc(len*sizeof(struct student));
//输入
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
printf("age=");
cin >> parr[i].age;
//scanf("%d", &parr[i].age);
printf("\n");
printf("sex=");
//cin >> parr->sex;
cin >> parr[i].sex;
//scanf("%c", &parr[i].sex);
printf("\n");
printf("score=");
//cin >> parr->score;
cin >> parr[i].score;
//scanf("%d", parr[i].name);// name是数组名,本身就已经是数组首元素的地址
// 所以 parr[i].name 不能够改成 &parr[i].name
}
//排序
for (i = 0; i < len - 1; ++i)
{
for (j = 0; j < len - 1 - i; ++j)
{
if (parr[j].score < parr[j + 1].score)
{
t= parr[j];
parr[j] = parr[j + 1];
parr[j + 1] = t;
}
}
}
//输出
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
//printf("age= %d",parr->age);
printf("age= %d ,", parr[i].age);
//printf("sex= %c ,", parr->sex);
printf("sex= %c", parr[i].sex);
//printf("score= %d\n", parr->score);
printf("score= %d\n", parr[i].score);
printf("\n");
}
//printf("%d",len);
return 0;
}
结论:这是第一版,全程使用一个主函数完成了整个功能,冗杂的步骤放两周的话,估计我自己都无法正常理解,易读性很差,更不要提函数复用性了
第二版,我们试着开始调整程序的结构
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
struct student
{
int age;
char sex;
int score;
};
void shuru(int len, struct student* parr)
{
int i;
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
printf("age=");
cin >> parr[i].age;
//scanf("%d", &parr[i].age);
printf("\n");
printf("sex=");
//cin >> parr->sex;
cin >> parr[i].sex;
//scanf("%c", &parr[i].sex);
printf("\n");
printf("score=");
//cin >> parr->score;
cin >> parr[i].score;
//scanf("%d", parr[i].name);// name是数组名,本身就已经是数组首元素的地址
// 所以 parr[i].name 不能够改成 &parr[i].name
}
}
//输出
void shuchu(int len, struct student* parr)
{
int i;
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
//printf("age= %d",parr->age);
printf("age= %d ,", parr[i].age);
//printf("sex= %c ,", parr->sex);
printf("sex= %c\t", parr[i].sex);
//printf("score= %d\n", parr->score);
printf("score= %d\n", parr[i].score);
printf("\n");
}
}
//排序
void paixu(int len, struct student* parr)
{
int i, j;
struct student t;
for (i = 0; i < len - 1; ++i)
{
for (j = 0; j < len - 1 - i; ++j)
{
if (parr[j].score < parr[j + 1].score)
{
t = parr[j];
parr[j] = parr[j + 1];
parr[j + 1] = t;
}
}
}
}
int main(void)
{
struct student * parr;
int len;
int i;
printf("请输入学生的个数\n");
printf("len = ");
cin >> len;
//动态的构造一维数组
parr = (struct student*)malloc(sizeof(struct student) * len);
//输入
shuru(len, parr);
//排序
paixu(len, parr);
//输出
shuchu(len,parr);
//printf("%d",len);
return 0;
}
总结:我们可以看到,我们将整个程序的复用性提高,通过输入,排序,输出,三个被调函数使主函数的长度大大减小,更加易读,其实很多步骤我们并不需要理解的那么详细不是吗?我们明白他的答题功能就可以继续往下读了,
但是,我觉得这依然不太够!
如果你仔细看就会发现我们的动态构造一维数组的功能还是在主函数里,也就意味着以后如果我们要对学生信息更改的话,我们还需要在主函数里找动态建造学生信息的代码,然后进行更改;或者说我希望我的主函数能够更简便一点,我想把动态内存分配的代码也拿出去,我只想看在主函数里看到一个外调函数名叫“动态构造内存”而不是在主函数里找,因为队以这个小小的学生信息管理程序来说我们的确比较容易看到,但如果面对笔者庞大更多倍的程序来说我们可能就会无从下手了
所以,第三次尝试来了:
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
struct student
{
int age;
char sex;
int score;
};
void goujian(char name)
{
}
void shuru(int len, struct student* parr)
{
int i;
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
printf("age=");
cin >> parr[i].age;
//scanf("%d", &parr[i].age);
printf("\n");
printf("sex=");
//cin >> parr->sex;
cin >> parr[i].sex;
//scanf("%c", &parr[i].sex);
printf("\n");
printf("score=");
//cin >> parr->score;
cin >> parr[i].score;
//scanf("%d", parr[i].name);// name是数组名,本身就已经是数组首元素的地址
// 所以 parr[i].name 不能够改成 &parr[i].name
}
}
void shuchu(int len, struct student* parr)
{
int i;
for (i = 0; i < len; ++i)
{
printf("请输入第 %d 个学生的信息\n", i + 1);
//printf("age= %d",parr->age);
printf("age= %d ,", parr[i].age);
printf("sex= %c ,", parr->sex);
//printf("sex= %c", parr[i].sex);
printf("score= %d\n", parr->score);
//printf("score= %d\n", parr[i].score);
printf("\n");
}
}
void vary(int ll, struct student* parr)
{
parr = (struct student*)malloc(sizeof(struct student)* ll);
}
int main(void)
{
struct student* parr;
int len;
int i;
printf("请输入学生的个数\n");
printf("len = ");
cin >> len;
//动态的构造一维数组
vary(len, parr);
//输入
shuru(len, parr);
//输出
shuchu(len, parr);
//printf("%d",len);
return 0;
}