struct的使用
编写一个学生struct,成员有学号(id)、姓名(name)、成绩(5门课程),随机生成多个学生的学号、姓名和成绩存储到结构体数组。再根据总分进行排名并输出学生的信息和总分。
stu.h
#ifndef STU_H
#define STU_H #include<stdio.h>
#include<stdlib.h>
#include<time.h> #define LEN 3
#define NUM 5 typedef struct Student
{
int id;
char name[LEN];
int score[NUM];
}STU; //初始化
void id_init(int *val);
void name_init(char *name, int len);
void score_init(int *array, int num);
void stuArray_init(STU *stuArray, int num); //打印学生数组信息
void printArray(STU *stuArray, int num);
//求一个学生的成绩总分
int sum(STU stu, int num);
//比较操作
int cmp(const void* left, const void* right); #endif
stu.c
#include "stu.h" //初始化
void id_init(int *val)
{
*val = + rand() % ;
} void name_init(char *name, int len)
{
int i;
for(i = ; i < len; i++)
{
if(i == )
name[i] = 'A' + rand() % ;
else
name[i] = 'a' + rand() % ;
}
name[i] = '\0';
} void score_init(int *array, int num)
{
int i;
for(i = ; i < num; i++)
array[i] = rand() % + ;
} void stuArray_init(STU *stuArray, int num)
{
int i;
for(i = ; i < num; i++)
{
id_init(&stuArray[i].id);
name_init(stuArray[i].name,LEN);
score_init(stuArray[i].score,NUM);
}
} //求一个学生的成绩总分
int sum(STU stu, int num)
{
int total = ;
int i;
for(i = ; i < num; i++)
total += stu.score[i];
return total;
} //打印学生数组信息
void printArray(STU *stuArray, int num)
{
int i;
for(i = ; i < num; i++)
printf("%5d\t %s\t %3d %3d %3d %3d %3d %4d\n",stuArray[i].id,stuArray[i].name,stuArray[i].score[],stuArray[i].score[],stuArray[i].score[],stuArray[i].score[],stuArray[i].score[],sum(stuArray[i],NUM));
} //比较操作
int cmp(const void* left, const void* right)
{
int sum_left, sum_right;
STU *stu_left = (STU*)left;
STU *stu_right = (STU*)right; sum_left = sum(*stu_left,NUM);
sum_right = sum(*stu_right,NUM); if(sum_left < sum_right)
return ;
else if(sum_left == sum_right)
return ;
else
return -;
}
main.c
#include "stu.h" int main()
{
STU array[];
srand(time(NULL));
stuArray_init(array,);
printArray(array,);
printf("\n--------------------排序后------------------\n\n");
qsort(array,,sizeof(STU),&cmp);
printArray(array,);
system("pause");
return ;
}
struct的使用的更多相关文章
- 使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件.socket操作时.这时候,可以使用python的struct模块来完成. struct模块中最重要的三个函数是pack(), unpack( ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- go-使用 unsafe 修改 struct 中的 field 的值
以下是方法,不要纠结原理,等东西积累多了,你才有能力纠结原理: 首先,你需要有一个这样的函数,这是在 nsq 的源码里直接抄过来的: func unsafeValueOf(val reflect.Va ...
- C语言中struct位域的定义和使用
位域的定义和使用 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又 ...
- C# Struct结构体里数组长度的指定
typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...
- C 语言Struct 实现运行类型识别 RTTI
通过RTTI,能够通过基类的指针或引用来检索其所指对象的实际类型.c++通过下面两个操作符提供RTTI. (1)typeid:返回指针或引用所指对象的实际类型. (2)dynamic_cast: ...
- VC++ : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>
最近学习Google Breakpad,将其用在了自己的项目中,编译的版本为VS2010,没有什么问题.但是为了和之前的程序兼容,需要使用VS2008版本的程序,于是又编译了VS2008版本的代码,但 ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- 窥探Swift之别具一格的Struct和Class
说到结构体和类,还是那句话,只要是接触过编程的小伙伴们对这两者并不陌生.但在Swift中的Struct和Class也有着令人眼前一亮的特性.Struct的功能变得更为强大,Class变的更为灵活.St ...
- struct 大小计算
结构体是一种复合数据类型,通常编译器会自动的进行其成员变量的对齐,已提高数据存取的效率.在默认情况下,编译器为结构体的成员按照自然对齐(natural alignment)条方式分配存储空间,各个成员 ...
随机推荐
- jboss 异常处理
异常: jboss.aop:service=AspectManager 15:19:46,361 ERROR [ScannerThread] [MainDeployer] org.jboss.depl ...
- How to Pronounce ‘to the’ in a Sentence
How to Pronounce ‘to the’ in a Sentence Share Tweet Share Tagged With: The Word THE, TO Reduction St ...
- The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic growth
The 2018 Nobel prizesThe Nobel prize for economics is awarded for work on the climate and economic g ...
- 数据类型-DataFrame
数据类型-DataFrame DataFrame是由多个Series数据列组成的表格数据类型,每行Series值都增加了一个共用的索引 既有行索引,又有列索引 行索引,表明不同行,横向索引,叫inde ...
- spring boot 配置 freemarker
1.springboot 中自带的页面渲染工具为thymeleaf 还有freemarker 这两种模板引擎 简单比较下两者不同, 1.1freemaker 优点 freemarker 不足:thym ...
- IntelliJ IDEA project module
在IDEA 创建一个project,目录结构是这样的:在project下创建一个module之后目录结构是这样的: 简单的概括如下: IntelliJ系中的 Project 相当于Eclipse系中 ...
- mysql开通tcp远程连接
1.登陆mysql: mysql -u root mysql 2.运行下面命令 UPDATE `mysql`.`user` SET `Host` = '%' WHERE `user`.`Host` = ...
- LIS问题(DP解法)---poj1631
题目链接:http://poj.org/problem?id=1631 这个题题目有些难看懂hhh,但实质就是求LIS--longest increasing sequence. 以下介绍LIS的解法 ...
- mongo通信协议
先是一个包头: struct MsgHeader { int32 messageLength; // total message size, including this int32 requestI ...
- 【校招面试 之 C/C++】第10题 C++不在构造函数和析构函数中调用虚函数
1.不要在构造函数中调用虚函数的原因 在概念上,构造函数的工作是为对象进行初始化.在构造函数完成之前,被构造的对象被认为“未完全生成”.当创建某个派生类的对象时,如果在它的基类的构造函数中调用虚函数, ...