C++结构体编程示例

一、计算课程积分

【问题描述】输入某个学生的信息(含学号,姓名,年龄,六门课程分数-高数/英语/c语言/工程制图/大学物理/信息论,它们的课程积分分别为4/3/4/3/3/3),当分数不低于60时可获得积分,计算课程总积分,。
【输入形式】

学号 姓名 年龄

课程分数  
【输出形式】

学号 姓名 年

#include <stdio.h>

// 定义结构体Student显示学生信息 
struct Student {
    int id;
    char name[20];
    int age;
    int score[6];
};

int main() {
    // 定义结构体变量student
    struct Student student;

    // 输入学生信息:学号、姓名、年龄 
    scanf("%d %s %d", &student.id, student.name, &student.age);
    
    int i;
    // 输入各科分数 
    for(i = 0; i < 6; i++) {
        scanf("%d", &student.score[i]);
    }

    // 计算积分数 
    int total_points = 0;
    for (i = 0; i < 6; i++) {
        if (student.score[i] >= 60) {
            //语文和英语加4分,其余加3分 
            if (i == 0 || i == 2) {
                total_points += 4;
            } else {
                total_points += 3;
            }
        }
    }

    // 输出学生信息:学号、姓名、年龄 
    printf("%d %s %d\n", student.id, student.name, student.age);
    // 输出总积分 
    printf("%d\n", total_points);

    return 0;
}

二、计算复数的和与积

【问题描述】

若2个复数分别为:c1=x1+(y1)i, c2=x2+(y2)i,

则:

c1+c2 = (x1+x2) + (y1+y2)i

c1*c2 = (x1*x2-y1*y2) + (x1*y2+x2*y1)i

分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之积。

【输入形式】

输入在一行中给出4个实数,分别代表c1和c2的实部和虚部。

【输出形式】

在两行中分别输出c1+c2和c1*c2的计算结果。

#include <stdio.h>

// 定义结构体,表示复数
typedef struct fushu {
    double a; // 实部
    double b; // 虚部
} FUSHU;

// 定义函数,用于计算两个复数的加法
FUSHU addition(FUSHU c1, FUSHU c2) {
    FUSHU result;
    result.a = c1.a + c2.a; // 实部相加
    result.b = c1.b + c2.b; // 虚部相加
    return result; // 返回结果
}

// 定义函数,用于计算两个复数的乘法
FUSHU product(FUSHU c1, FUSHU c2) {
    FUSHU result;
    result.a = c1.a * c2.a - c1.b * c2.b; // 计算实部
    result.b = c1.a * c2.b + c1.b * c2.a; // 计算虚部
    return result; // 返回结果
}

// 主函数
int main() {
    // 声明变量
    FUSHU c1, c2, sum, c;

    // 输入第一个复数的实部和虚部
    scanf("%lf", &c1.a);
    scanf("%lf", &c1.b);

    // 输入第二个复数的实部和虚部
    scanf("%lf", &c2.a);
    scanf("%lf", &c2.b);

    // 调用加法函数,计算两个复数的和
    sum = addition(c1, c2);

    // 调用乘法函数,计算两个复数的乘积
    c = product(c1, c2);

    // 输出结果
    printf("addition of complex is %.6lf+%.6lfi\n", sum.a, sum.b);
    printf("product of complex is %.6lf+%.6lfi\n", c.a, c.b);

    return 0;
}

三、三角形结构体

【问题描述】

设计一个三角形的结构体,结构体的成员是三角形的三条边长。编写以下函数来操作该三角形:

一个函数判断这三条边能否构成一个三角形。

一个函数用于计算该三角形的面积。

一个函数用于计算该三角形的周长。

一个函数判断该三角形是否为直角三角形。

一个函数判断该三角形是否为等腰三角形。

一个函数判断该三角形是否为等边三角形。

一个函数用于输入三角形的三条边。

【样例输入】

3 4 5

【样例输出】

Valid triangle!

Area: 6.00

Perimeter: 12.00

Right triangle!

#include <stdio.h>
#include <math.h>

// 定义结构体,表示三角形
typedef struct Triangle
{
    double side1; // 第一条边长
    double side2; // 第二条边长
    double side3; // 第三条边长
} Triangle;

// 函数:输入三角形的边长
Triangle inputTriangle()
{
    Triangle t; // 声明一个Triangle类型的变量t

    // 依次输入三角形的三条边长
    scanf("%lf", &t.side1);
    scanf("%lf", &t.side2);
    scanf("%lf", &t.side3);

    return t; // 返回输入的三角形
}

// 函数:判断三角形是否合法(三条边长能否构成三角形)
int isValidTriangle(Triangle t)
{
    // 判断三角形的三条边长是否满足三角形的两边之和大于第三边的性质
    if(t.side1 + t.side2 > t.side3 && t.side1 + t.side3 > t.side2 && t.side2 + t.side3 > t.side1)
    {
        return 1; // 合法
    }
    else
    {
        return 0; // 不合法
    }
}

// 函数:计算三角形的面积
double calArea(Triangle t)
{
    // 使用海伦公式计算三角形的面积
    double s = (t.side1 + t.side2 + t.side3) / 2;
    return sqrt(s * (s - t.side1) * (s - t.side2) * (s - t.side3)); // 返回计算结果
}

// 函数:计算三角形的周长
double calPerimeter(Triangle t)
{
    // 直接返回三角形的三条边长之和
    return t.side1 + t.side2 + t.side3;
}

// 函数:判断三角形是否为直角三角形
int isRightTriangle(Triangle t)
{
    double a = t.side1, b = t.side2, c = t.side3;

    // 使用毕达哥拉斯定理判断是否为直角三角形
    if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a)
    {
        return 1; // 是直角三角形
    }
    else
    {
        return 0; // 不是直角三角形
    }
}

// 函数:判断三角形是否为等腰三角形
int isIsoscelesTriangle(Triangle t)
{
    // 判断三角形的三条边是否有两条边长度相等
    if (t.side1 == t.side2 || t.side1 == t.side3 || t.side2 == t.side3)
    {
        return 1; // 是等腰三角形
    }
    else
    {
        return 0; // 不是等腰三角形
    }
}

// 函数:判断三角形是否为等边三角形
int isEquilateralTriangle(Triangle t)
{
    // 判断三角形的三条边是否长度相等
    if (t.side1 == t.side2 && t.side1 == t.side3)
    {
        return 1; // 是等边三角形
    }
    else
    {
        return 0; // 不是等边三角形
    }
}

// 主函数
int main()
{
    // 输入三角形的边长
    Triangle t = inputTriangle();

    // 判断三角形是否合法
    if (isValidTriangle(t))
    {
        printf("Valid triangle!\n"); // 合法三角形
        // 输出三角形的面积和周长
        printf("Area: %.2lf\n", calArea(t));
        printf("Perimeter: %.2lf\n", calPerimeter(t));

        // 判断三角形是否为直角三角形
        if (isRightTriangle(t))
            printf("Right triangle!\n"); // 是直角三角形

        // 判断三角形是否为等腰三角形
        if (isIsoscelesTriangle(t))
            printf("Isosceles triangle!\n"); // 是等腰三角形
        // 判断三角形是否为等边三角形
        else if (isEquilateralTriangle(t))
            printf("Equilateral triangle!\n"); // 是等边三角形
    }
    else
        printf("Invalid triangle!\n"); // 不合法三角形

    return 0;
}

四、成绩表里找同学

【问题描述】

编写一个程序,读入 N 个同学的姓名和语数外三门功课的单科成绩,对其按照一定的排序规则排序形成一张成绩表(先按总分从高到低排序,总分相同则按语文成绩由高到低排序,仍然相同则按数学成绩由高到低排序,若总分和单科成绩均相同则最后按姓名的字典序排序)。最后给定一个数字 K(K<=N) ,输出在这张排好序的成绩表中位置在第 K 位的同学的姓名和总分。

【输入形式】

  • 第一行输入一个正整数 N(1<=N<=1024),代表接下来将录入 N 个学生的成绩。

  • 接下来 N 行录入 N 条学生的成绩记录,每条记录依次为姓名,语文成绩,数学成绩,英语成绩,这四个字段以空格分隔。姓名为字符串(仅包含小写字母,不含空格,长度<=19),学生之间不会重名。三科成绩均为整数(0~100)。

  • 最后输入一个正整数 K(1<=K<=N),代表需要在成绩表中从前往后找到的位置。

【输出形式】

  • 在成绩表中从前往后处在第 K 位的同学的姓名和总分,中间以空格分隔。

【样例输入】

2
tom 90 91 92
lucy 91 90 92
1

【样例输出】

lucy 273
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 定义结构体储存学生信息 
struct Student {
    string name;
    int chinese, math, english, total;

    // 定义构造函数初始化学生信息并计算总分数 
    Student(string n, int c, int m, int e) : name(n), chinese(c), math(m), english(e), total(c + m + e) {}

    //重载小于运算符以定义排序标准
    bool operator<(const Student& other) const {
        if (total == other.total) {
            if (chinese == other.chinese) {
                if (math == other.math) {
                    return name < other.name;
                }
                return math > other.math;
            }
            return chinese > other.chinese;
        }
        return total > other.total;
    }
};

int main() {
    int N;
    cin >> N;

    vector<Student> students;

    //输入学生信息 
    for (int i = 0; i < N; i++) {
        string name;
        int chinese, math, english;
        cin >> name >> chinese >> math >> english;
        students.push_back(Student(name, chinese, math, english));
    }

    sort(students.begin(), students.end()); // 根据规则给学生排序 

    int K;
    cin >> K;

    cout << students[K - 1].name << " " << students[K - 1].total << endl;

    return 0;
}

五、求复数的模

编程示例:

#include<iostream>  // 包含输入输出流的头文件
#include<cmath>     // 包含数学函数的头文件
using namespace std; // 使用标准命名空间

// 定义复数结构体
struct Complex
{
    double real; // 实部
    double imag; // 虚部
};

// 打印复数函数
void print(Complex c)
{
    cout<< c.real <<" + " << c.imag <<"i\n"; // 输出实部和虚部,并带上 i 表示虚数单位
}

// 计算复数绝对值函数
double abscomplex(Complex c)
{
    return sqrt(c.real*c.real+c.imag*c.imag); // 根据勾股定理计算复数的绝对值
}

// 初始化复数函数
void init(Complex &c,double r,double i)
{
    c.real=r; // 将传入的实部赋值给复数的实部
    c.imag=i; // 将传入的虚部赋值给复数的虚部
}

int main()
{
    Complex cm1; // 声明一个复数结构体变量 cm1
    init(cm1,-1.5,2); // 初始化 cm1 的实部为 -1.5,虚部为 2
    print(cm1); // 打印 cm1 的实部和虚部
    cout<<"abs of cm1 is "<<abscomplex(cm1)<<endl; // 输出 cm1 的绝对值
    return 0; // 返回 0,表示程序正常结束
}

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值