STL之List存储结构体

题目描述:
  编写程序,实现如下学生信息处理功能(要求用List链表实现)
  1) 输入每个学生的信息(学号、姓名、性别及三门课程成绩);
  2) 插入学生信息;
  3) 删除学生信息;
  4) 输入某学生姓名,显示该生的信息;
  5) 计算全班每名学生的平均成绩,并显示;

测试代码:

#include <iostream>
#include <string>
#include <list>
#include <algorithm>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::list;
using std::find_if;

typedef struct
{
    double m_chinese;    // 语文成绩
    double m_math;        // 数学成绩
    double m_english;    // 英语成绩
    double m_average;    // 平均成绩
}Score;

typedef struct
{
    string m_id;    // 学号
    string m_name;    // 姓名
    string m_sex;    // 性别
    Score m_grade;    // 成绩
}Student;

typedef list<Student> StuList;
typedef StuList::iterator StuListIt;

/* 输入学生信息 */
Student InputStudentInfo()
{
    Student stu;
    cout << "请输入学生的学号、姓名、性别、三门成绩:" << endl;
    cin >> stu.m_id >> stu.m_name >> stu.m_sex;
    cin >> stu.m_grade.m_chinese >> stu.m_grade.m_math >> stu.m_grade.m_english;
    return stu;
}

/* 遍历学生信息 */
void PrintAllStudent(StuList stulist)
{
    for (Student s : stulist)
    {
        cout << s.m_id << " " << s.m_name << " " << s.m_sex << " " << s.m_grade.m_chinese << " "
            << s.m_grade.m_math << " " << s.m_grade.m_english << endl;
    }
}

int main(void)
{
    StuList stulist;
    Student stu;

    /* 输入学生信息 */
    stu = InputStudentInfo();
    stulist.push_back(stu);
    PrintAllStudent(stulist);

    /* 插入学生信息 */
    stu = InputStudentInfo();
    stulist.push_front(stu);
    PrintAllStudent(stulist);

    /* 删除学生信息 */
    string _strName;
    cout << "请输入要删除学生的姓名:" << endl;
    cin >> _strName;
    // lambdas表达式
    stulist.remove_if([_strName](Student s) {return (s.m_name == _strName); });
    PrintAllStudent(stulist);

    /* 查询学生信息 */
    cout << "请输入要查询学生的姓名:" << endl;
    cin >> _strName;
    for (Student& s : stulist)
    {
        if (s.m_name == _strName)
        {
            cout << s.m_id << " " << s.m_name << " " << s.m_sex << " " << s.m_grade.m_chinese << " "
                << s.m_grade.m_math << " " << s.m_grade.m_english << endl;
            break;
        }
    }

    /* 计算每个学生的平均成绩 */
    for (Student& s : stulist)
    {
        s.m_grade.m_average = (s.m_grade.m_chinese + s.m_grade.m_math + s.m_grade.m_english) / 3.0;
        cout << s.m_id << " " << s.m_name << " " << s.m_sex << " " << s.m_grade.m_chinese << " "
            << s.m_grade.m_math << " " << s.m_grade.m_english << s.m_grade.m_average << endl;
    }

    return 0;
}
时间: 2024-10-12 03:35:41

STL之List存储结构体的相关文章

hdu 4941 Magical Forest(STL map &amp; 结构体运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 105 Problem Description There is a forest c

C++重载流运算符,将存储结构体的vector直接写入文件

我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢? 采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次性写入,存储struct的vector也是可以的,这里举一个简单的例子,声明结构体: struct point { double lat; //纬度 double lon; //经度 unsigned long long time; //时间 } 写一个类封装流运算符: class onepoint

stl容器之--自定义结构体作为stl容器元素成员的使用

自定义结构体作为stl容器元素成员的设计要求之一是:在对待自定义类型时和内置类型必须是一致的,甚至自定义类型的支持更好. <C++标准程序库>: set和multiset set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multiset允许重复而set不允许. 只要是assignable.copyable.comparable(根据某个排序准则)的型别T,都可以成为set或multiset的元素型别.没有传入特别排序准则,就采用缺省准则less(这是一个仿函数,以op

结构体的大小

系统在存储结构体变量时存在地址对齐问题,编译器在编译程序时会遵循两条原则: 一.结构体变量中成员的偏移量必须是成员大小的整数倍: 二.结构体大小必须是所有成员大小的整数倍. 1 #include<stdio.h> 2 3 struct a{ 4 int i; 5 float f; 6 char c; 7 double d; 8 long l; 9 }b; 10 11 int main(){ 12 printf("%d\n",sizeof(b.i));// 4 13 prin

结构体指针

结构体与指针 1.结构体指针的数值为某个结构体的内存空间的地址,从而指针指向某个结构体. 2.结构体指针的初始值为空(0),不指向任何结构体. 3.malloc操作:创建一个新的内存空间(从内存中选择一个内存空间存储结构体),p指向这个结构体,p的值为这个结构体的内存空间的地址. 4.结构体指针的赋值:一个结构体指针的数值等于另外一个结构体指针的数值,从而两个结构体指针指向相同的结构体.当对某个结构体进行访问时,选择的结构体指针只要满足该结构体指针指向这个结构体即可,即可以有很多种选择. 5.当

结构体的定义及使用

结构体的定义 定义一个结构的一般形式为: struct 结构名 { 成员表列 } 成员表由若干个成员组成,每个成员都是该结构的一个组成部分. 对每个成员也必须作类型说明. 例如: struct stu { int num; char name[20]; int age; } 结构类型变量的说明 结构体定义并不是定义一个变量,而是定义了一种数据类型,这种类型是你定义的,它可以和语言本身所自有的简单数据类型一样使用(如 int ). 结构体本身并不会被作为数据而开辟内存,真正作为数据而在内存中存储的

struct结构体详解

为什么要有结构体 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成你想要的数据类型.以方便日后的使用. 在实际项目中,结构体是大量存在的.研发人员常使用结构体来封装一些属性来组成新的类型.由于C语言内部程序比较简单,研发人员通常使用结构体创造新的"属性",其目的是简化运算. 结构体在函数中的作用不是简便,其最主要的作用就是封装.封装的好处就是可以再次利用.让使用者不必关心这个是什么,只要根据定义使用就可以了. 在C语言中,可以定义结构体类型,将多个相

计算结构体大小

char类型的长度被定义为一个8位字节,这很简单. short类型的长度至少为两字节.在有些计算机上,对于有些编译程序,short类型的长度可能为4字节,或者更长. int类型是一个整数的“自然”大小,其长度至少为两字节,并且至少要和short类型一样长.在16位计算机上,int类型的长度可能为两字节:在32位计算机上,可能为4字节:当64位计算机流行起来后,int类型的长度可能会达到8字节.这里说的都是“可能”,例如,早期的Motorala 68000是一种16/32位的混合型计算机,依赖于不

黑马程序员--C语言中结构体-我之理解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 什么是结构体? “结构”是一种构造类型,它是由若干“成员”组成的.每一个成员可以是一个基本数据类型或者又是一个构造类型. 为什么要有结构类型? 结构体可以把功能相同的数据组织起来,存在一起,用的时候方便,而且在调用函数时,若 传递参数较多