zoukankan      html  css  js  c++  java
  • C++程序设计实验-5

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

    实验名称 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]

  • 相关阅读:
    Redis源码解析:07压缩列表
    Redis源码解析:06整数集合
    Redis源码解析:05跳跃表
    Laravel中的路由管理
    jquery登录的异步验证
    ThinkPHP3.2.3中,配置文件里配置项的读取
    ThinkPHP3.2.3中,查询语句中in的使用方法。
    Fatal error: Maximum function nesting level of '100' reached, aborting!
    无限级分类的收缩与展开功能
    mysql添加DATETIME类型字段导致Invalid default value错误的问题
  • 原文地址:https://www.cnblogs.com/yjqi/p/9050827.html
Copyright © 2011-2022 走看看