【C++ mid-term exerises】

 

1. 用掷骰子方式,模拟班级每个学号被随机抽点的概率。 (12分) 具体要求如下: (1)设计并实现一个骰子类Dice。 ① 数据成员sides表示骰子面数。构造时,指定骰子是6面,8面,还是其它数值。 ② 成员函数int cast()是掷骰子操作的抽象,返回一个位于1~sides之间的随机数。 例如,如果骰子是6面,返回1~6之间的随机数;如果骰子是40面,返回1~40之间的随机数。

图1 UML类图 Dice类


(2)在main中,定义一个骰子对象,以班级人数作为骰子的面数构造。 比如,软嵌(计嵌)班级 40人,输入40后,以40作为骰子面数构造一个骰子对象。 使用骰子对象,掷骰子500次,统计并输出自己学号(取学号最后两位)被抽点中的概率。


附:相关函数原型: ① int rand(void) 返回一个0~RAND_MAX之间的伪随机数; 头文件<cstdlib>(也有的在<cmath>) http://www.cplusplus.com/reference/cstdlib/rand/ ② void srand (unsigned int seed); 为rand()设置随机种子。通常以时间作为随机种子,即srand(time(NULL)) 头文件<cstdlib>(也有的在<cmath>), <ctime> http://www.cplusplus.com/reference/cstdlib/srand/

 

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<ctime>
 4 using namespace std;
 5 class Dice{
 6     public:
 7     Dice(int n);
 8     ~Dice();
 9     int cast();
10     private:
11     int sides;
12 }; 
13 Dice::Dice(int n){
14     sides=n;
15 }
16 Dice::~Dice(){
17     
18 }
19  int   Dice::cast(){
20  
21      int a;
22     a=rand()%sides;
23     return a;
24 }
25 int main(){
26     int num,i;
27     cin>>num;
28     Dice d(num);
29     int b[num];
30     for(i=0;i<num;i++)
31     b[i]=0;
32     
33     int times,t;
34     cin>>times;
35     t=times;
36     while(times--){
37         srand(times) ;
38        i=d.cast();
39        b[i]++;
40     }
41     
42     for(i=0;i<num;i++){
43         cout<<i+1<<"  被点中的概率    "<<(double)b[i]/t<<endl; 
44     }
45     return 0;
46 }
Dice随机数

截图:

 

 

 

 

2. 用户管理(新用户添加、密码修改) (18 分) 具体要求如下: (1)基于以下场景表述设计并实现用户类User ① 每一个用户有用户编号(id), 用户名(name), 密码(password)三个属性。其中,用户编号(id)由系统自动 顺序编号,用户名和密码都是字母、数字、符号的组合,新用户密码,默认”111111”。Use 类所有对象还 有一个共有属性CurrentID,用来记录当前已经被使用的最大id号(初始值999)。 每当新增一个新用户时,CurrentID的值加1,同时将这个值作为新用户的id号。 例如: 新增第1个用户user1时,CurrentID为1000,同时,user1的id自动编号为1000 新增第2个用户user2时,CurrentID为1001,同时,user2的id自动编号为1001

② 除了构造函数外,还要求User类能实现以下要求: a) 打印用户信息,包括用户编号(id), 用户名(name), 密码(password) b) 修改密码。在修改密码前,要求先输入旧密码,验证无误后,才允许修改。如果输入旧密码时,连续三 次输入错误,则提示用户稍后再试,暂时退出修改密码程序。 c) 打印 User类所有对象共有属性CurrentID,在打印该属性同时,打印最后一个新增用户的信息。

(2)在 main中创建 User类实例,测试User类的各项操作(新用户添加、密码修改、共有属性及最后一 个新增用户信息打印)

 User.h

 1 #ifndef User_H
 2 #define User_H
 3 #include <string>
 4 using std::string;
 5 class User{
 6     public:
 7         User(string y,string z="111111");
 8         void printmessage();
 9         void newpassword();
10         ~User();
11         void static show();
12           int static UserID;
13         private:
14             int id;
15             string name;
16             string password;
17           
18 };
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 #endif

User.cpp

 1 #include "User.h"
 2 #include <iostream> 
 3 #include <string>
 4 using std::string;
 5 using namespace std;
 6 int User::UserID=999;
 7 User::User(string y,string z){
 8     UserID++;
 9     id=UserID;
10     name=y;
11     password=z;
12 }
13 void User::show(){
14     cout<<UserID<<endl;
15 }
16 User::~User(){
17             UserID--;
18         }
19 void User::printmessage(){
20 
21     cout<<"编号:   "<<id<<"   姓名: "<<name<<"  密码:  "<<password<<endl; 
22 }
23 
24 void User::newpassword(){
25         string s,s2;
26     int n=3,j=0;
27      
28     while(n--){
29         cout<<"请输入现有密码:";
30         cin>>s;
31         cout<<endl;
32     if(s==password){
33         cout<<"请输入新密码:";
34         cin>> s2;
35         password=s2;
36         cout<<endl;
37         cout<<"修改成功!"<<endl;
38         cout<<endl;
39          break;
40     }
41     else
42     {
43         cout<<"您的密码有误,请重新输入密码!";
44         cout<<endl;
45         j++;
46         }    
47     }
48     
49         if(j==3){
50             cout<<"请稍后再进行修改!"<<endl; 
51         }
52     
53 }

main.cpp

 1 #include "User.h"
 2 #include <string>
 3 #include <iostream>
 4 using std::string;
 5 using namespace std;
 6 int main(){
 7     int *p1;
 8     User *u,*v;
 9     p1=&User::UserID;
10     cout<<*p1+1<<endl;
11     cout<<*p1+2<<endl;
12     cout<<*p1+3<<endl;
13     string h="xiao",l="123211";
14     User a(h,l),b("guaiguai"),c("lily");
15     u=&c; 
16     
17 
18     
19     cout<<u<<endl;
20     a.printmessage();
21     b.printmessage();
22     c.printmessage();
23      
24     b.newpassword();
25     c.newpassword(); 
26     
27     u->printmessage(); 
28     
29     return 0;
30 }

运行截图:

 

3. 图书入库 

main.cpp

 1 #include "book.h"
 2 #include <vector>
 3 #include<string>
 4 #include <iostream>
 5 using namespace std;
 6 using std::string;
 7 int main()
 8 {
 9      
10     
11      vector<Book>books;// 定义一个vector<Book>类对象
12     
13     string isbn, title;
14     float price;
15     int j=0;
16     
17     while(cin>>isbn>>title>>price){
18         Book book(isbn,title,price);
19         j++;
20         books.push_back(book);
21     }
22     // 录入图书信息,构造图书对象,并添加到前面定义的vector<Book>类对象中
23     // 循环录入,直到按下Ctrl+Z时为止 (也可以自行定义录入结束方式) 
24     
25     for(int i=0;i<j;i++)
26     {
27         books[i].print();
28     }
29     
30     // 输出入库所有图书信息
31     // 补足程序
32     // ... 
33     
34     
35     return 0;
36 }

book.h

 1 #ifndef BOOK_H
 2 #define BOOK_H
 3 
 4 #include <string>
 5 using std::string;
 6 
 7 class Book {
 8     public:
 9         Book(string isbnX, string titleX, float priceX);  //构造函数  
10         void print(); // 打印图书信息 
11     private:
12         string isbn;
13         string title;
14         float price;
15 };
16 #endif

book.cpp

#include "book.h"
#include <iostream> 
#include <string>
using namespace std;
Book::Book(string isbnX, string titleX, float priceX){
    isbn=isbnX;
    title=titleX;
    price=priceX;
}
void Book::print(){
    cout<<"编号   "<<isbn<<"  标题    "<<title<<"  价格   "<<price<<endl; 
}

 

 

 问题:在使用编译器devc++5.10,修改类和函数任何一处,然后程序就别想编译了。但是函数是对的呀,不明白为啥。

比如程序2中,我添加了一个测试函数之后,编译报错。可是语法我并没有检查出什么错误。

 

posted @ 2018-05-16 19:22  一头  阅读(517)  评论(1编辑  收藏  举报