/*
题目:
//声明一个结构体类型
struct _AdvTeacher
{
char *name;
char *tile;
int age;
char *addr;
char *p1; //系统预留成员域
char **p2;//系统预留成员域
};
要求定义一个结构体数组(6个元素),要求从键盘输入数据,并按照名称大小进行排序;打印输出。
1、 打印结构体数组,需要单独封装成函数;10
2、 排序结构体数组,需要单独封装成函数(按照名称进行排序);50
3、 main函数中编写业务测试模型;40 2014-04-22 19:59:31
wirting by zhangshichuan.
*/
#include <iostream> using namespace std; #define StructArrarySize 3 // 老师数量
#define StudentNum 1 // 每位老师的学生的数量 typedef struct _AdvTeacher
{
char *name;
char *tile;
int age;
char *addr;
char **student;
}AdvTeacher; int CreateStructArray(AdvTeacher **, int, int); //客户端初始化结构体数组
int FreeStructArray(AdvTeacher **, int, int); //客户端释放结构体数组内存
int PrintStructArray(AdvTeacher*, int, int); //客户端打印结构体数组元素
int SortStructArray(AdvTeacher*, int); //客户端对结构体数组元素排序 int main(void)
{
int rv = ;
AdvTeacher * t = NULL; rv = CreateStructArray(&t, StructArrarySize, StudentNum); //被调函数分配内存,甩出来
if (rv != )
{
printf("func: CreateStructArray() _%d_error_\n ", rv);
goto End;
} for (int i = ; i < StructArrarySize; ++i) // 客户端初始化赋值
{
printf("请输入第%d位老师的姓名: ", i+);
scanf("%s", t[i].name);
printf("请输入第%d位老师的年龄: ", i+);
scanf("%d", &(t[i].age));
printf("请输入第%d位老师的职务: ", i+);
scanf("%s", t[i].tile);
printf("请输入第%d位老师的地址: ", i+);
scanf("%s", t[i].addr);
for (int j = ; j < StudentNum; ++j)
{
printf("请输入第%d位老师的第%d位学生的姓名: ", i+, j+);
scanf("%s", t[i].student[j]);
}
} printf("排序前:\n");
rv = PrintStructArray(t, StructArrarySize, StudentNum); // 打印
if (rv != )
{
printf("func: PrintStructArray() _%d_error_\n ", rv);
goto End;
} rv = SortStructArray(t, StructArrarySize); // 排序
if (rv != )
{
printf("func: SortStructArray() _%d_error_\n ", rv);
goto End;
} printf("排序后:\n");
rv = PrintStructArray(t, StructArrarySize, StudentNum); // 打印
if (rv != )
{
printf("func: PrintStructArray() _%d_error_\n ", rv);
goto End;
} End:
rv = FreeStructArray(&t, StructArrarySize, StudentNum);
if (rv != )
{
printf("致命错误: FreeStructArray()执行失败!\n _%d_error_\n", rv);
} system("pause");
return rv;
} // 创建结构体数组
int CreateStructArray(AdvTeacher **t, int structArrarySize, int studentNum)
{
int rv = ;
if (NULL == t)
{
rv = -;
return rv;
} AdvTeacher * temp = NULL; temp = (AdvTeacher *)malloc(structArrarySize * sizeof(AdvTeacher));
if (NULL == temp)
{
rv = -;
return rv;
} for (int i = ; i < structArrarySize; ++i)
{
temp[i].name = (char *)malloc( * sizeof(char));
temp[i].addr = (char *)malloc( * sizeof(char));
temp[i].tile = (char *)malloc( * sizeof(char)); if (NULL == temp[i].name || NULL ==temp[i].addr || NULL == temp[i].tile)
{
rv = -;
return rv;
} temp[i].student = (char **)malloc(studentNum * sizeof(char *));
if (NULL == temp[i].student)
{
rv = -;
return rv;
}
for (int j = ; j < studentNum; ++j) //创建学生内存块
{
(temp[i].student)[j] = (char *)malloc( * sizeof(char));
if (NULL == (temp->student)[j])
{
rv = -;
return rv;
}
}
} *t = temp; return rv;
} // 销毁结构体数组
int FreeStructArray(AdvTeacher **t, int structArrarySize, int studentNum)
{
int rv = ;
AdvTeacher *temp = *t; for (int i = ; i < structArrarySize; ++i)
{
for (int j = ; j < studentNum; ++j) // 销毁学生内存块
{
if (NULL != temp[i].student[j])
{
free(temp[i].student[j]);
}
} if (NULL != temp[i].addr && NULL != temp[i].name && NULL != temp[i].tile && NULL != temp[i].student)
{
free(temp[i].addr);
free(temp[i].name);
free(temp[i].tile);
free(temp[i].student);
}
} if (NULL != temp)
{
free(temp);
*t = NULL; //间接赋值 通过*(实参的地址), 去间接修改实参的值 为null
} return rv;
} // 打印结构体数组
int PrintStructArray(AdvTeacher*t, int structArrarySize, int studentNum)
{
int rv = ;
if (NULL == t)
{
rv = -;
return rv;
} AdvTeacher *temp = t; for (int i = ; i < structArrarySize; ++i)
{
printf("第%d位老师的姓名为:%s \n", i + , temp[i].name);
printf("第%d位老师的年龄为:%d \n", i + , (temp[i].age));
printf("第%d位老师的职务为:%s \n", i + , temp[i].tile);
printf("第%d位老师的地址为:%s \n", i + , temp[i].addr);
for (int j = ; j < studentNum; ++j)
{
printf("第%d位老师的第%d位学生的姓名为:%s\n", i + , j + , temp[i].student[j]);
}
} return rv;
}
// 排序结构体数组
int SortStructArray(AdvTeacher*t, int structArrarySize)
{
int rv = ;
if (NULL == t)
{
rv = -;
return rv;
}
AdvTeacher *temp = t; for (int i = ; i < structArrarySize; ++i)
{
for (int j = i + ; j < structArrarySize; ++j)
{
if ( > strcmp(temp[i].name, temp[j].name))
{
AdvTeacher tmp = temp[i];
temp[i] = temp[j];
temp[j] = tmp;
}
}
} return rv;
}

Demo_张仕传_结构体考试-modify的更多相关文章

  1. Demo02_对结构体进行文件读写_张仕传_作业_

    #include <iostream> using namespace std; #define StructArrarySize 5 // 老师数量 #define StudentNum ...

  2. 全国计算机等级考试二级教程-C语言程序设计_第14章_结构体、共用体和用户定义类型

    函数的返回值是结构体类型 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> struct ...

  3. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  4. 『Python CoolBook』C扩展库_其四_结构体操作与Capsule

    点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, type ...

  5. C++_系列自学课程_第_12_课_结构体

    #include <iostream> #include <string> using namespace std; struct CDAccount { double bal ...

  6. C++_知识点_结构体/枚举/联合

    //C++中结构体的不同之处 #include <iostream> #include <string> using namespace std; int main(void) ...

  7. C语言_结构体变量指针做函数参数的使用案例

    # include <stdio.h> # include <stdlib.h> # include <string.h> # include <malloc ...

  8. C语言_结构体的4种定义初始化方式及案例

    结构体是一种构造数据类型 (构造数据类型:数组类型.结构体类型(struct).共用体类型(union)).用途:把不同类型的数据组合成一个整体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一 ...

  9. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_结构体

    在DUTs文件夹上右击添加结构体,结构体中可以放基本变量类型,也可以嵌套其他结构体   使用的时候,需要声明结构体的实例,然后按照类.属性的格式来读写变量,会有代码的自动提示   你也可以声明数组,类 ...

随机推荐

  1. JavaScript- The Good Parts Chapter 6

    Thee(你) I’ll chase(追逐:追捕) hence(因此:今后), thou(你:尔,汝) wolf in sheep’s array.—William Shakespeare, The ...

  2. light oj 1294 - Positive Negative Sign

    1294 - Positive Negative Sign   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  3. zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  4. grub名词理解

    http://baike.baidu.com/link?url=HDv2WL37x1EBS51pCHqbGQIFx7aAJ91h-0afrjOy1UH6MjhKUFPnvjNkOU32OHdVoTS7 ...

  5. 使用jdom操作xml文件 去除子节点带有命名空间

    package com.soft.common; import java.util.HashMap; import java.util.Map; import org.jdom2.Namespace; ...

  6. spring + springmvc + jdbc + quartz + maven整合

    个人搭建框架: pom.xml: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

  7. PetShop 4.0学习笔记:消息队列MSMQ

    直到今天才知道,在我们每天都在用的Window系统里还有这么好用的一个编程组件:消息队列.它能够解决在大数据量交换的情况下的性能问题,特别是BS系统的数据库性能.而且它的异步处理方式能给程序员最大的便 ...

  8. 设置tomcat内存

    设置Tomcat启动的初始内存其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4. 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置 三.实例,以下给 ...

  9. Winform之跨线程访问控件(在进度条上显示字体)

    此文章对于遇到必须使用线程但是没有办法在线程内操作控件的问题的处理  有很好的解决方案(个人认为的.有更好的方案欢迎交流.) 在做跨线程访问之前我们先了解下我们所做的需要达到的效果: 这个是批量的将x ...

  10. Android(java)学习笔记165:Android的Junit调试

    编写android应用的时候,往往我们需要编写一些业务逻辑实现类,但是我们可能不能明确这个业务逻辑是否可以成功实现,特别是逻辑代码体十分巨大的时候,我们不可能一行一行检查自己的代码,为了解决这样的问题 ...