复习c++过程中的一些练习记录
循环练习
- 题目要求:有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;
}
- 题目要求:打印九九乘法表
#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;
}
- 题目要求:打印奇数
#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名老师,需求如下:
- 设计学生和老师的结构体,其中在老师的结构体中,有老师姓名和一个存放5名学生的数组作为成员
- 学生的成员有姓名、考试分数,创建数组存放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++来实现一个通讯录管理系统 ,系统中需要实现的功能如下:
- 添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
- 显示联系人:显示通讯录中所有联系人信息
- 删除联系人:按照姓名进行删除指定联系人
- 查找联系人:按照姓名查看指定联系人信息
- 修改联系人:按照姓名重新修改指定联系人
- 清空联系人:清空通讯录中所有信息
- 退出通讯录:退出当前使用的通讯录
#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;
}