C++程序设计实验-5

Posted on 2018-05-17 14:16  旧城旧梦旧少年  阅读(244)  评论(0编辑  收藏  举报

南京信息工程大学实验报告

实验名称 C++简单程序设计-1 实验日期 2018-5-15 得分  指导教师  耿学华     

   计软院   专业计科    年级  2016     班次  (2)  姓名    余佳奇    学号  20161326022    

 

一、     实验结论

1.  string类和vector模版的基本用法。

Code:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void output1(vector<string> &);  
void output2(vector<string> &);  
int main()
{
    vector<string>likes, dislikes; 
    likes.push_back("favorite book");
    likes.push_back("music");
    likes.push_back("film");
    likes.push_back("anime");
    likes.push_back("sport");
    likes.push_back("sportsman");
    cout << "-----I like these-----" << endl;
    output1(likes);
    dislikes.push_back("paintings");
    dislikes.push_back("instrument");
    dislikes.push_back("motorcycle");
    cout << "-----I dislike these-----" << endl;
    output2(dislikes);
    likes.swap(dislikes);
    cout << "-----I likes these-----" << endl;
    output1(likes);
    cout << "-----I dislikes these-----" << endl;
    output2(dislikes);                        
    return 0;
}
void output1(vector<string> &v) {
    for(int i=0;i<v.size();++i)
    cout<<v[i]<<endl; 
}
void output2(vector<string> &v) {
    for(vector<string>::const_iterator i=v.begin();i!=v.end();++i)
    cout<<*i<<endl;
}

运行结果:

2.  指针基础知识。

1)6-17

  Code:

#include<iostream>
using namespace std;
int main(){
    int *p;
    p=new int(9);//此处由*p=9更改而来.指针没有初始化,不知道指向哪块内存,导致系统崩溃。// 
    cout<<"The value at p:"<<*p;
    delete p;//释放内存空间// 
    return 0;
}

运行结果:

2)6-18

  Code:

#include<iostream>
using namespace std;
int fn1(){
    int *p=new int(5);
    return *p;
}
int main(){
    int a=fn1();
    cout<<"the value of a is:"<<a;
    //*p存在的域只在fn1中,fn1函数结束后,p被销毁,所以返回的值没有意义,并不能实现预期的效果。因此去掉返回值//
}

运行结果:

3.实现一个动态矩阵类 Matrix(类的声明见 matrix.h)。实现 Matrix 类,并编写代码完 成测试。

Code:

matrix.h

#ifndef MATRIX_H
#define MATRIX_H
class Matrix {
    public:
        Matrix(int n); // 构造函数,构造一个n*n的矩阵 
        Matrix(int n, int m); // 构造函数,构造一个n*m的矩阵 
        Matrix(const Matrix &X); // 复制构造函数,使用已有的矩阵X构造 
        ~Matrix(); //析构函数 
        void setMatrix(const float *pvalue); // 矩阵赋初值,用pvalue指向的内存块数据为矩阵赋值 
        void printMatrix() const; // 显示矩阵
        inline float &element(int i, int j){return *(p+((i-1)*cols)+j-1);}//返回矩阵第i行第j列元素的引用
        inline float element(int i, int j) const;
// 返回矩阵第i行第j列元素的值 
        void setElement(int i, int j, int value); //设置矩阵第i行第j列元素值为value
        inline int getLines() const{return lines;}  //返回矩阵行数 
        inline int  getCols() const{return cols;}  //返回矩阵列数 
    private:
        int lines;    // 矩阵行数
        int cols;      // 矩阵列数 
        float *p;   // 指向存放矩阵数据的内存块的首地址 
};
#endif

matrix.cpp

#include"matrix.h"
#include<iostream>
#include<cassert>
#include<iomanip>
using namespace std;
Matrix::Matrix(int n){
    lines=cols=n; 
    if(lines<1)
        cout<<"矩阵的行数和列数必须大于0!"<<endl;
        else
        {
            float **q=new float *[lines];
            for(int i=0;i<lines;i++){
                q[i]=new float[cols];
                *q[i]=0;}
            p=new float[n*n];
            for(int i=0;i<lines;i++)
            memcpy(p+(i*cols),q[i],cols*sizeof(float));
        }
}
Matrix::Matrix(int n,int m):lines(n),cols(m){
    if(lines<1||cols<1)
        cout<<"矩阵的行数和列数都必须大于0!"<<endl;
        else
        {
            float **q=new float *[lines];
            for(int i=0;i<lines;i++)
              q[i]=new float[cols];
            p=new float[n*m];
                for(int i=0;i<lines;i++)
            memcpy(p+(i*cols),q[i],cols*sizeof(float));
        }
}
Matrix::Matrix(const Matrix &X){
    lines=X.lines;
    cols=X.cols;
    p=new float[lines*cols];
    memcpy(p,X.p,lines*cols*sizeof(float));
}
Matrix::~Matrix(){
    if(p!=NULL)
    {
        delete[] p;
    }
}
void Matrix::setMatrix(const float *pvalue){ 
for(int i=0;i<lines;i++)
    {
        for(int j=0;j<cols;j++)
        *(p+(i*cols)+j)=*(pvalue+(i*cols)+j);
    }
}
void Matrix::printMatrix ()const{
        for(int i=0;i<lines;i++)
    {
        for(int j=0;j<cols;j++)
        {
            cout<<*(p+(i*cols)+j)<<" ";
        }
        cout<<endl;
    }
}
inline float Matrix::element(int i, int j) const{
    assert(i>=0&&i<lines&&j>=0&&j<cols);
    return *(p+((i-1)*cols)+j-1);
}
void Matrix::setElement(int i, int j, int value){
    *(p+((i-1)*cols)+j-1)=value;
}

main.cpp

#include<bits/stdc++.h>
#include"matrix.h"
#define rap(a,b) for(int a=0;a<b;++a) 
using namespace std;
int main(){
float **q= new float *[100];
for(int i=0;i<100;i++)
q[i]=new float [100];
for(int i=0;i<100;i++){
    for(int j=0;j<100;j++)
    q[i][j]=6;}//构造一个100*100的二维数组,所有元素值设为6// 
float *tmp=new float[100*100];
for(int i=0;i<100;i++) 
memcpy(tmp+(i*100),q[i],100*sizeof(float));//为tmp数组赋值//M 
Matrix c(2);
cout<<"构造函数构造一个3*3矩阵,初值为0:"<<endl;
c.printMatrix();
Matrix a(5,6);
a.setMatrix(tmp);
cout<<"构造函数构造一个5*6矩阵,初值全为6:"<<endl;
a.printMatrix();
Matrix b(a);
cout<<"通过复制构造函数使用已有矩阵a构造一个新的矩阵:"<<endl;
b.printMatrix();
cout<<"设置矩阵第2行第4列元素值为7:"<<endl;
a.setElement(2,4,7);
a.printMatrix();
cout<<"输出b矩阵,测试数据,观察深复制对两个对象数据的作用:"<<endl;
b.printMatrix();
cout<<"矩阵第1行第1列元素的引用:"<<endl;
float *tmp2=&a.element(1,1);
cout<<tmp2<<endl;
cout<<"矩阵第1行第1列元素的值:"<<endl;
cout<<a.element(1,1)<<endl;
cout<<"矩阵行:"<<endl;
cout<<a.getLines()<<endl;
cout<<"矩阵列:"<<endl;
cout<<a.getCols()<<endl;
delete tmp;
rap(i,100)delete q[i];
delete []q; 
return 0;
}

运行结果:

4.期中考试题目

第一题:

Code:

Dice.h

class Dice {
    private:
        int sides;
    public:
        Dice(int n):sides(n) {
        }
        int cast();
};

Dice.cpp

#include<iostream>
#include<ctime>
#include<cstdlib>
#include"Dice.h"
int Dice::cast() {
    return rand()%sides+1;
}

main.cpp

#include<iostream>

#include<cstdlib>

#include<ctime>

#include"Dice.h"

using namespace std;

int main() {

    srand(time(NULL));

    Dice A(40);

    int num=0;

    for(int j=0;j<500;++j) {

           if (A.cast()==22)num++;

       }

       double p=0;

       p=(double)num/500.0;

       cout<<"学号 20161326022 被抽中的概率是:"<<p<<endl;

    return 0;

}

运行结果:

第二题:

Code:

User.h

class User{
    public:
        user();
        void print();
        void changepassword();
        void show();
    private:
        int id;
        string name,password;
};

User.cpp

#include"User.h"
#include<iostream>
#include<string>
using namespace std;
int currentID=1000;
User::user(){
    cout<<"请输入您的姓名!"<<endl;
    cin>>name;
    password="111111";
    cout<<"注册成功!编号为:"<<currentID<<"初始密码为‘111111’"<<endl; 
    currentID++;
}
void User::print(){
    cout<<"id:"<<id<<endl;
    cout<<"name:"<<name<<endl;
    cout<<"password:"<<password<<endl;
}
void User::changepassword(){
    int n=3;
    while(n--){
        string expassword;
        cout<<"请输入密码:"<<endl;
        cin>>expassword;
        if(password==expassword){
            cout<<"请输入新密码:"<<endl;
            cin>>password;
            break;
        }
        else{
            cout<<"密码错误,您还有"<<n<<"次输入机会。"<<endl;
        }
        if(n==0)
        cout<<"密码错误次数过多,请稍后再试!"<<endl;
    }
}
void User::show(){
    cout<<"id:"<<currentID-1<<endl;
}

main.cpp

#include"User.h"
#include<iostream>
using namespace std;
int main(){
    int num;
    cout<<"请输入新用户个数:"<<endl;
    cin>>num;
    while(num--)
    {
        User a;
        a.user();
        a.show();
        if(num==0)
        {
            a.print();
            a.changepassword();
            a.print();
        }
    }
}

运行结果:

第三题:

Code:

book.h

#ifndef BOOK_H
#define BOOK_H

#include <string>
using std::string;

class Book {
    public:
        Book(string isbnX, string titleX, float priceX);  //构造函数  
        void print(); // 打印图书信息 
    private:
        string isbn;
        string title;
        float price;
};
#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: "<<isbn<<" Title: "<<title<<" Price: "<<price<<endl;
}

main.cpp

#include "book.h"
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<Book>A;
    string isbn, title;
    float price;
    cout<<"Please enter the book's isbn,title,price in turn!(set the isbn 'quit' then quit)"<<endl;
    while(1){
        cin>>isbn>>title>>price;
        Book tmp(isbn,title,price);
        A.push_back(tmp);
        if(isbn=="quit") break;
    }
    cout<<"Book information:"<<endl; 
    for(int i=0;i<A.size();i++)
    A[i].print();
    
    return 0;
}

运行结果:

二、实验总结与体会

  在本次实验中熟悉掌握了String类和Vector模版的用法。对指针和数组的运用也更加熟悉。String类中有很多常用的成员函数能很方便的实现一些功能。在写第三个部分的时候,发现自己对二维数组指针掌握的不太好。即**p和*p

float *p1=a[0]; // 表示第一行第一列的地址
float **p2=a; //表示第一行的地址
在这种情况下 *p1相当于a[0][0]
*p2相当于a[0]
*(*p2)相当于a[0][0]