【c++】c++案例记录

文章展示了几个C++编程练习,包括使用循环解决找零钱组合、打印九九乘法表和奇数、找数组中的最大值、元素逆置、冒泡排序等基础算法问题。此外,还涉及到了结构体的使用,如创建老师和学生的结构体,并实现数据输入与输出。最后,文章给出了一个通讯录管理系统的实现,包括添加、显示、删除、查找、修改和清空联系人等功能。
摘要由CSDN通过智能技术生成


复习c++过程中的一些练习记录

循环练习

  1. 题目要求:有1分,2分,5分,10分四种硬币,每种硬币数量无限,给定n分钱(n<100000),有多少中组合可以组成n分钱?
#include <iostream>

using namespace std;

int main()
{
      int i=0,s=0,j=0,z=0,x=0,r=0,n;
    cin>>n;

       for(i=0;i<=n;i++)
       {
           for(j=0;j<=int(n/2);j++)
           {
               for(z=0;z<=int(n/5);z++)
               {
                   for(x=0;x<=int(n/10);x++)
                   {
                       s=i+2*j+5*z+10*x;
                       if(s==n)
                       {
                           r=r+1;
                       }
                   }
               }
           }
       }
    cout << r << endl;
    return 0;
}

  1. 题目要求:打印九九乘法表
#include <iostream>

using namespace std;

int main()
{
      int i,j;
      for(i=1;i<=9;i++)
      {
           for(j=1;j<=i;j++)
           cout<<j<<"*"<<i<<"="<<i*j<<"\t";
           cout<<endl;
      }
    return 0;
}
  1. 题目要求:打印奇数
#include <iostream>

using namespace std;

int main()
{
    for (int i = 0; i < 100; i++)
    {
        if (i % 2 == 0)
        {
            continue;
        }
        cout << i << endl;
    }
    return 0;
}

找最大/最小数

题目要求: 在一个数组中记录了五只小猪的体重,如:int arr[5] = {300,350,200,400,250};找出并打印最重的小猪体重。

#include <iostream>

using namespace std;

int main()
{
    int arr[5] = {300,350,200,400,250};
    int max=0,i;
    for(i=0;i<5;i++)
    {
        if(arr[i]>max)
         max=arr[i];
    }
    cout<<max;
    return 0;
}

元素逆置

题目要求:请声明一个5个元素的数组,并且将元素逆置。(如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);

#include <iostream>

using namespace std;

int main()
{
    int arr[5] = {1,2,3,4,5};
    int j,num;
    int end;
    end=sizeof (arr)/sizeof (arr[0])-1;
    for(j=0;j<5/2;j++)
        {
            num=arr[j];
            arr[j]=arr[end];
            arr[end]=num;
            end--;
        }
    for(j=0;j<5;j++)
            cout<<arr[j];
    return 0;
}

冒泡排序

题目要求:将数组 { 4,2,8,0,5,7,1,3,9 } 进行升序排序

#include <iostream>

using namespace std;
void maopao(int *arr,int len)
{
    int j,i,num;
     for(i=0;i<9;i++)   //排序轮数
     {
        for(j=0;j<9-i;j++)   //每轮交换次数
        {
        if(arr[j]>arr[j+1])
        {
            num=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=num;
            }
        }
    }
}
int main()
{
    int len,c;
    int arr[10] = { 4,2,8,0,5,7,1,3,9,6 };
    len=sizeof (arr)/sizeof (arr[0]);
    maopao(arr,len);

    for(c=0;c<10;c++)
            cout<<arr[c];
    return 0;
}

结构体

  • 语法:struct 结构体名 { 结构体成员列表 };

  • 通过结构体创建变量的方式有三种:

    • 方式一:struct 结构体名 变量名
    • 方式二:truct 结构体名 变量名 = { 成员1值 , 成员2值…}
    • 方式三:定义结构体时顺便创建变量
  • 注意值传递和地址传递的区别,const使用在地址传递的时候,防止数据被修改

 //结构体变量创建方式1 
struct student
{
	string name;  
	int age;     
	int score;    
};
struct student stu1; //struct 关键字可以省略
	stu1.name = "张三";
	stu1.age = 18;
	stu1.score = 100;
 //结构体变量创建方式2 
struct student
{
	string name;  
	int age;     
	int score;    
};
struct student stu2 = 
{ 
    {"刘备",23,"男"},
};
 //结构体变量创建方式3 
struct student
{
	string name;  
	int age;     
	int score;    
}stu3;
	stu3.name = "王五";
	stu3.age = 18;
	stu3.score = 80;

题目要求1:学校正在做毕设项目,每名老师带领5个学生,总共有3名老师,需求如下:

  1. 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
  2. 学生的成员有姓名、考试分数,创建数组存放3名老师,通过函数给每个老师及所带的学生赋值
  3. 最终打印出老师数据以及老师所带的学生数据。
#include <iostream>
#include <string>
using namespace std;
struct student
{
   string name;
   int score;
}stu[5];

struct teacher
{
    string name;
    struct student stu[5];
}ter[3];
//struct teacher ter[3];
void inputinformation()
{
    for(int i=0;i<3;i++)
    {
        cout<<"请输入第"<<i+1<<"位老师的名字:";
        cin>>ter[i].name;
        for(int j=0;j<5;j++)
        {
            cout<<"请输入第"<<j+1<<"位学生的名字:";
            cin>>ter[i].stu[j].name;
            cout<<"请输入第"<<j+1<<"位学生的分数:";
            cin>>ter[i].stu[j].score;
        }
    }
}
void outputinformation()
{
    for(int i=0;i<3;i++)
    {
        printf("老师名字:%s\n",ter[i].name.c_str());   //在C中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式
        for(int j=0;j<5;j++)
        {
            printf("\t学生名字:%s 学生分数:%d\n",ter[i].stu[j].name.c_str(),ter[i].stu[j].score);
        }
    }
}
int main()
{
    inputinformation();
    outputinformation();
    return 0;
}

题目要求2:设计一个英雄的结构体,包括成员姓名,年龄,性别;创建结构体数组,数组中存放5名英雄。通过冒泡排序的算法,将数组中的英雄按照年龄进行升序排序,最终打印排序后的结果。五名英雄信息如下:
{“刘备”,23,“男”}, {“关羽”,22,“男”}, {“张飞”,20,“男”}, {“赵云”,21,“男”}, {“貂蝉”,19,“女”},

#include <iostream>
#include <string>
using namespace std;
struct student
{
   string name;
   int score;
}stu[5];

struct teacher
{
    string name;
    struct student stu[5];
}ter[3];
//struct teacher ter[3];
void inputinformation()
{
    for(int i=0;i<3;i++)
    {
        cout<<"请输入第"<<i+1<<"位老师的名字:";
        cin>>ter[i].name;
        for(int j=0;j<5;j++)
        {
            cout<<"请输入第"<<j+1<<"位学生的名字:";
            cin>>ter[i].stu[j].name;
            cout<<"请输入第"<<j+1<<"位学生的分数:";
            cin>>ter[i].stu[j].score;
        }
    }
}
void outputinformation()
{
    for(int i=0;i<3;i++)
    {
        printf("老师名字:%s\n",ter[i].name.c_str());   //在C中没有string类型,故必须通过string类对象的成员函数c_str()把string对象转换成C中的字符串样式
        for(int j=0;j<5;j++)
        {
            printf("\t学生名字:%s 学生分数:%d\n",ter[i].stu[j].name.c_str(),ter[i].stu[j].score);
        }
    }
}
int main()
{
    inputinformation();
    outputinformation();
    return 0;
}

总结练习1:通讯录管理系统

  • switch语句:switch(表达式){ case 结果1:执行语句;break; case 结果2:执行语句;break; ... default:执行语句;break; }

题目要求:通讯录是一个可以记录亲人、好友信息的工具。要求利用C++来实现一个通讯录管理系统 ,系统中需要实现的功能如下:

  1. 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  2. 显示联系人:显示通讯录中所有联系人信息
  3. 删除联系人:按照姓名进行删除指定联系人
  4. 查找联系人:按照姓名查看指定联系人信息
  5. 修改联系人:按照姓名重新修改指定联系人
  6. 清空联系人:清空通讯录中所有信息
  7. 退出通讯录:退出当前使用的通讯录
#include <iostream>
#include <string>
using namespace std;
int choose;

struct linkman
{
    string name;
    string gender;
    int age;
    string phone;
    string address;
};
struct addressbook
{
    struct linkman human[1000];
    int size;
}ads;
void showMenu()
{
    cout << "***************************" << endl;
    cout << "*****  1、添加联系人  *****" << endl;
    cout << "*****  2、显示联系人  *****" << endl;
    cout << "*****  3、删除联系人  *****" << endl;
    cout << "*****  4、查找联系人  *****" << endl;
    cout << "*****  5、修改联系人  *****" << endl;
    cout << "*****  6、清空联系人  *****" << endl;
    cout << "*****  0、退出通讯录  *****" << endl;
    cout << "***************************" << endl;
}
void addlinkman()
{
    if(ads.size>=1000)
    {
        printf("通讯录已满,无法添加");
    }
    else
    {
            printf("请输入姓名:");
            cin>>ads.human[ads.size].name;
            printf("请输入性别:");
            cin>>ads.human[ads.size].gender;
            printf("请输入年龄:");
            cin>>ads.human[ads.size].age;
            printf("请输入联系电话:");
            cin>>ads.human[ads.size].phone;
            printf("请输入家庭住址:");
            cin>>ads.human[ads.size].address;
            printf("添加成功");
            ads.size++;
            system("pause");
            system("cls");
    }
}
void printfbook()
{
    if(ads.size==0)
       printf("通讯录为空,请重新输入");
    else
    {
        for(int i=0;i<ads.size;i++)
        {
            printf("姓名:%-8s",ads.human[i].name.c_str());
            printf("性别:%-8s",ads.human[i].gender.c_str());
            printf("年龄:%-8d",ads.human[i].age);
            printf("联系电话:%s\t",ads.human[i].phone.c_str());
            printf("家庭住址:%-8s\n",ads.human[i].address.c_str());
        }
    }
    system("pause");
    system("cls");
}
int isExist(addressbook * ads,string name)
{
//    printf("ads.size的值为:%d\n",ads->size);
    for(int i=0;i<ads->size;i++)
    {
        if(ads->human[i].name==name)
        {
            return i;
        }
    }
    return -1;
}
void deletelinkman()
{
    printf("请输入您想要删除的联系人的姓名:");
    string deletename;
    cin>>deletename;
    int ret=isExist(&ads,deletename);
    if(ret!=-1)
    {
        for(int i=ret;i<ads.size;i++)
        {
            ads.human[i]=ads.human[i+1];
        }
       ads.size--;
    }
    printf("删除成功");
    system("pause");
    system("cls");
}
void findlinkman()
{
    printf("请输入您想要查找的联系人的姓名:");
    string findname;
    cin>>findname;
    int ret=isExist(&ads,findname);
//    printf("ret=%d",ret);
    if(ret==-1)
        printf("未找到该联系人");
    if(ret!=-1)
    {
        printf("姓名:%-8s",ads.human[ret].name.c_str());
        printf("性别:%-8s",ads.human[ret].gender.c_str());
        printf("年龄:%-8d",ads.human[ret].age);
        printf("联系电话:%-8s",ads.human[ret].phone.c_str());
        printf("家庭住址:%-8s\n",ads.human[ret].address.c_str());
    }
    system("pause");
    system("cls");
}
void editlinkman()
{
    printf("请输入您想要修改的联系人的姓名:");
    string editname;
    cin>>editname;
    int ret=isExist(&ads,editname);
    if(ret==-1)
        printf("未找到该联系人");
    if(ret!=-1)
    {
        printf("请输入修改后的联系人的性别:");
        cin>>ads.human[ret].gender;
        printf("请输入修改后的联系人的年龄:");
        cin>>ads.human[ret].age;
        printf("请输入修改后的联系人的联系电话:");
        cin>>ads.human[ret].phone;
        printf("请输入修改后的联系人的家庭住址:");
        cin>>ads.human[ret].address;
        printf("修改成功");
    }
    system("pause");
    system("cls");
}
void empty(addressbook * ads)
{
    ads->size = 0;
    cout << "通讯录已清空" << endl;
    system("pause");
    system("cls");
}
int main()
{
//    struct addressbook ads;
    ads.size=0;     //初始化
    while(1)
    {
        showMenu();
        printf("请输入您想要选择的功能:");
        cin>>choose;
        switch (choose) {
            case 1:  addlinkman();
                break;
            case 2:  printfbook();
                break;
            case 3:  deletelinkman();
                break;
            case 4:  findlinkman();
                break;
            case 5:  editlinkman();
                break;
            case 6:  empty(&ads);
                    break;
            case 0:
                printf("欢迎下次使用\n");
                exit(0);
                break;
            default:
                printf("您输入的功能有误,请重新输入:\n");
                break;
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值