C++编程学习笔记 week 6

week 6 C++ 结构体与类

练习

2.1 日期结构体用法

定义一个日期结构体,该结构体成员有年、月、日3个数据。要求从键盘输入年月日,判断该年是否闰年(函数调用)并以年-月-日格式输出日期以及是否闰年(函数调用)。

#include<iostream>   
using namespace std;   
class Date   //使用类,声明为public
{   
public:   
    int year;   
    int month;   
    int day;   
    int whichleaps(int n); //定义识别闰年的函数,n=year  
    void Print(struct Date x);   //打印结果
};   
  
int Date::whichleaps(int n)//调用类中的函数识别闰年
//n=year
{   
    return((n%4==0&&n%100!=0)||(n%400==0)); //判断语句,返回0或1  
}   
  
void Date::Print(struct Date x)   
{   
    cout<<"日期是"<<x.year<<"-"<<x.month<<"-"<<x.day<<endl;   
    int flag=x.whichleaps(x.year); //1为真,0为假  
    if(flag==1)   
        cout<<"该年是闰年"<<endl;   
    else  
        cout<<"该年不是闰年"<<endl;   
} 
int main()   
 {   
   struct Date x;//定义一个日期结构体变量   
  cin>>x.year>>x.month>>x.day;//从键盘输入年月日   
  x.Print(x);//输出日期以及是否闰年   
  return 0;   
 }   

3.1 日期类用法

定义一个日期类,该类数据成员有年、月、日3个私有数据。私有成员函数有判断闰年,公有成员函数有设置年月日数据成员的值、按指定格式输出日期。要求从键盘输入年月日,判断该年是否闰年并以年-月-日格式输出日期以及是否闰年。

#include<iostream>   
using namespace std;   
class Date   
{   
private:   
    int year;   
    int month;   
    int day;   //私有数据
    int whichleaps(int n);   //私有成员函数();
    //判断闰年的成员函数,类中只有声明,其定义在类外,权限是私有,只能被类中其他成员函数调用

public:    //公有成员函数
    void Print();  //按指定格式输出日期
    //输出成员函数,类中只有声明,其定义在类外,权限是公有

    void reset(int a,int b,int c)  
    {   
        year=a;   
        month=b;   
        day=c;   
    }   //修改私有数据成员年月日的值,需要参数,类内定义,即类中给出函数体,是内联函数。权限是公有

};   
  
int Date::whichleaps(int n)   //n=year=a
{   
    return((n%4==0&&n%100!=0)||(n%400==0));   
}   
  
void Date::Print()   //成员函数类外定义,需要类名::函数名形式,数据成员year可以直接用,所以该函数无参,返回值为空
{   
    cout<<"日期是"<<year<<"-"<<month<<"-"<<day<<endl;   
    int flag=whichleaps(year);//可以在函数内部直接调用成员函数
   
    if(flag==1)   
        cout<<"该年是闰年"<<endl;   
    else  
        cout<<"该年不是闰年"<<endl;   
}   
  
int main()   
{   
    Date x;   ;//定义一个日期类对象,其数据成员没有被赋初值

    int a,b,c;   
    cin>>a>>b>>c;   
    x.reset(a,b,c); );//通过公有成员函数调用,修改私有数据成员的值
  
    x.Print();   
    return 0;   
       
}  

2.2 长方形结构体用法

要求定义一个长方形结构体,有长和宽2个数据。要求从键盘输入长和宽,计算周长(用函数调用)和面积(用函数调用)并输出(用函数调用)。

#include<iostream>   
using namespace std;   
class acre   
{   
public:   
    int length;   
    int width;   
    int around(int a,int b);   
    int area(int a,int b);   
    void print(acre x); //括号内变量为类(acre)x  
};   
  
int acre::around(int a,int b)   //a=length, b=width
{   
    return 2*(a+b);   
}   
  
int acre::area(int a,int b)   
{   
    return a*b;   
}   
  
void acre::print(acre x)   
{   
    cout<<"面积是"<<area(x.length,x.width)<<endl;   
    cout<<"周长是"<<around(x.length,x.width)<<endl;   
}   
  
int main()   
{   
    class acre x;   ;//定义一个长方体类变量

    cin>>x.length>>x.width;   //a,b
    x.print(x);   //括号中变量为类x
    return 0;   
} 

2.3 时间结构体的用法

定义一个时间结构体,包括时、分、秒3个数据。要求时间从键盘输入,然后将时间以时:分:秒的格式输出(用函数调用)并将时间转换为以秒为单位的数输出(用函数调用)。
此题可以参考2.1题日期结构体用法来实现。

#include<iostream>   
using namespace std;   
struct time//结构体,默认公有(public:)   
{   
    int hr;   
    int min;   
    int sed;   
    int whichleaps(int hr,int min,int sed);   //括号内输入三个变量
    void Print(time x);   //结构体(time)x
      
};   
  
int time::whichleaps(int hr,int min,int sed)   
{   
    return(hr*3600+min*60+sed);   
}   
  
void time::Print(time x)   
{   
    cout<<"时间为"<<x.hr<<":"<<x.min<<":"<<x.sed<<endl;   
    cout<<"转为"<<x.whichleaps(x.hr,x.min,x.sed)<<"秒"<<endl;   
}   //使用结构体x中的成员函数x.whichleaps,x.whichleaps调用结构体x中的数据x.hr, x.min, x.sed
int main()   
{   
    struct time x;   
       
    cin>>x.hr>>x.min>>x.sed;   
      
    x.Print(x);  //括号中变量为结构体x 
    return 0;   
}  

2.4 圆结构体用法

要求定义一个圆结构体,包括半径和圆心坐标数据。要求从键盘输入半径和圆心坐标,圆周率用3.14计算圆面积和周长。输出圆心坐标位置以及圆的面积和周长。
此题可以参考2.2题。

#include<iostream>  
#define pi = 3.14; //定义常量  
using namespace std;   
struct circle   
{   
  
    float r;   
    float b,c;  //圆心坐标 
       
    float around(float a);   
    float area(float a);   
    void print(circle x);   //结构体(circle)x
};   
  
float circle::around(float a)   
{   
    return 2*3.14*a;   //无法使用pi?
}   
  
float circle::area(float a)   
{   
    return 3.14*a*a;   
}   
  
void circle::print(circle x)   
{   
    cout<<"圆心坐标是"<<x.b<<","<<x.c<<endl;   
    cout<<"面积是"<<area(x.r)<<endl;   
    cout<<"周长是"<<around(x.r)<<endl;   
}   
int main()   
{   
    struct circle x;   
    float a;   
    cin>>x.r>>x.b>>x.c>>a;   
    x.print(x);   
    return 0;   
}  


2.5 学生结构体用法

定义一个学生结构体,包括3个数据:英语成绩、计算机成绩以及这2门课的总成绩。要求从键盘输入5个学生的英语与计算机成绩信息,然后按这两门课的总成绩进行升序排序(用函数调用),并输出这5个学生排序后的成绩信息(用函数调用)。

#include <iostream>   
using namespace std;   
struct stu   
{   
    int en;   
    int pc;   
    int all;   
};   
void print(struct stu x[],int n)//输出学生信息   
//括号内变量为空
{   
    int i;   
    for(i=0;i<n;i++)   
    {   
        cout<<"英语"<<x[i].en<<",计算机"<<x[i].pc<<",总成绩"<<x[i].all<<endl;   
    }   
}   
  
void LineAll(struct stu x[],int n)   //结构体不包括加总函数LineAll()
//不返回
{   
    int i,j;   
    struct stu tmp;   
    for(i=0;i<n;i++)   
        for(j=n-1;j>i;j--)   
            if(x[j-1].all >x[j].all)   //用冒泡法对数组元素进行升序排序
            {   
                tmp=x[j-1];   
                x[j-1]=x[j];   
                x[j]=tmp;   
            }   
}   
int main()   
{   
    struct stu x[5];  //定义一个学生结构体数组,大小为5

    for(int i=0;i<5;i++)   //给5个结构体数组的元素进行赋值

    {   
        cin>>x[i].en>>x[i].pc;   
         x[i].all = x[i].en + x[i].pc;   
    }   
    LineAll(x,5);   //x结构体总称,n=5
    print(x,5);   
    return 0;   
}  

3.5 学生类用法

定义一个学生类,包括3个数据:英语成绩、计算机成绩以及这2门课的总成绩,自行分析成员函数。要求从键盘输入5个学生的英语与计算机成绩信息,然后按这两门课的总成绩进行升序排序,并输出这5个学生排序后的成绩信息。
提示:本题涉及对象数组用法

#include <iostream>   
using namespace std;   
class stu   
{   
private:   //
    int en;   
    int pc;   
    int all;   
public:   
    void print()   //输出学生信息,无参,类中定义

    {   
        cout<<"英语"<<en<<",计算机"<<pc<<",总成绩"<<all<<endl;   
    }   
    void reset(int e,int p)   

    {   
        en=e;   
        pc=p;   
        all=e+p;   
    }   
    int lineall()   //获取私有成员总成绩,无参,有返回值,类中定义
    {   
        return all;   
    }   
};   
  
  
void Line(stu x[],int n)   
{   
    int i,j,a,b;   
    struct stu tmp;   
    for(i=0;i<n;i++)   
        for(j=n-1;j>i;j--)   
        {   
            a=x[j-1].lineall();   
            b=x[j].lineall();   //私有成员不能类外访问,所以通过公有函数获取私有数据值

            if(a > b)   
            {   
                tmp=x[j-1];   
                x[j-1]=x[j];   
                x[j]=tmp;   //对象之间赋值,隐含调用拷贝构造函数

            }   
        }   
}   
  
void Print(stu x[ ],int a)   //输出所有学生信息,对象数组作参数,普通函数

{   
    for(int i=0;i<5;i++)   
        x[i].print();   //每个对象数组的元素,相当于对象

}   
  
int main()   
{   
    stu x[5];   //定义一个学生对象数组,大小为5

    int a,b;   
    for(int i=0;i<5;i++)   //给对象数组的5个元素进行赋值

    {   
        cin>>a>>b;   
        x[i].reset(a,b);   //通过调用成员函数对私有数据成员赋值

           
    }   
    Line(x,5);  // 按总成绩对学生对象数组进行升序排序 ,普通函数调用

    Print(x,5);  //输出全部学生信息,普通函数调用

    return 0;   
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于少儿C编程学习的路线推荐,可以首先参考《少儿C 快乐编程》这本适合小学高级以及中学生自学的编程教程。这本教程包含了C语言的所有基础知识,并通过实例教学的方式,让学生可以在家里进行学习,无需去昂贵的培训机构。每学习一节课,可以提高学生的编程能力。 此外,还可以结合Scratch软件进行学习。Scratch是一款图形化编程语言,可以帮助学生更好地理解编程概念。通过使用Scratch,学生可以进行可视化的编程实践,从而培养对编程的兴趣和动手能力。然后逐渐过渡到C语言编程。 对于更进一步的学习,可以参考蓝桥杯青少组的C语言编程竞赛。蓝桥杯是国内著名的计算机竞赛,对于学生的编程能力提升有很大的帮助。可以根据蓝桥杯的学习路线图进行学习,并争取在五六级时参加比赛并争取拿到CSP-J二三等奖。 综上所述,少儿C编程学习的推荐路线是从《少儿C 快乐编程》教材开始,结合Scratch软件进行图形化编程实践,然后参加蓝桥杯青少组的C语言编程竞赛。这样可以循序渐进地提高学生的编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [少儿C++快乐编程](https://download.csdn.net/download/weixin_26897585/19660391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [少儿C++编程学习路线推荐(2022.10.31)](https://blog.csdn.net/dllglvzhenfeng/article/details/127613427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值