1. 程式人生 > >C++實驗5

C++實驗5

代碼 ren size user lines 析構函數 itl get oat

實驗結論

實驗內容1
源碼

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

// 函數聲明 
void output1(vector<string> &);  
void output2(vector<string> &);  

int main()
{
    vector<string>likes, dislikes; // 創建vector<string>對象likes和dislikes
    likes.push_back("book");
    likes.push_back("music");   
    likes.push_back("film");
    likes.push_back("paintings");
    // 為vector<string>數組對象likes添加元素值 ( favorite book, music, film, paintings,anime,sport,sportsman,etc) 
    // 補足代碼 
    // 。。。 
    
    
    cout << "-----I like these-----" << endl;
    output1(likes);
    // 調用子函數輸出vector<string>數組對象likes的元素值 
    // 補足代碼
    // 。。。 
    dislikes.push_back("anime");
    dislikes.push_back("sport");
    dislikes.push_back("sportsman");
    // 為vector<string>數組對象dislikes添加元素值 
    // 補足代碼 
    // 。。。 
    
    cout << "-----I dislike these-----" << endl;
    output2(dislikes);
    // 調用子函數輸出vector<string>數組對象dislikes的元素值 
    // 補足代碼
    // 。。。 
    
    likes.swap(dislikes);
    // 交換vector<string>對象likes和dislikes的元素值 
    // 補足代碼
    // 。。。 
    
    
    cout << "-----I likes these-----" << endl;
    output1(likes);
    // 調用子函數輸出vector<string>數組對象likes的元素值 
    // 補足代碼
    // 。。。 
    
    cout << "-----I dislikes these-----" << endl;
    output2(dislikes);
    // 調用子函數輸出vector<string>數組對象dislikes的元素值 
    // 補足代碼
    // 。。。 
        
                        
    return 0;
}


// 函數實現 
// 以下標方式輸出vector<string>數組對象v的元素值  
void output1(vector<string> &v) {
    for(int i=0;i<v.size();i++)
    cout<<v[i]<<" ";
    cout<<endl;
    // 補足程序
    // 。。。 
}

// 函數實現
// 以叠代器方式輸出vector<string>數組對象v的元素值 
void output2(vector<string> &v) {
    vector<string>::iterator  it;
    for(it=v.begin() ;it!=v.end() ;it++)
    cout<<*it<<" ";
    cout<<endl;
    // 補足程序
    // 。。。 
}

截圖
技術分享圖片
實驗內容2
源碼1

#include <iostream>
using namespace std;
int main()
{
    //int a; 
    //int *p=&a;  可以先定義一個變量a,並將其地址賦給指針p 
    int *p;//指針再被使用前沒有被賦初值 
    *p=9;
    cout<<"The value at p: "<<*p;
    return 0;
}

源碼2

#include <iostream>
using namespace std;
int fn1(){
    int *p=new int(5);
    return *p;//用new分配的內存沒有用delete釋放,會導致分配的內存無法回收 
    //delete p;
}
int main()
{
    int a=fn1();
    cout<<"the value of a is: "<<a;
    return 0;
}

實驗內容3
源碼
main.cpp

#include <iostream>
#include "matrix.h"
using namespace std; 
int main() {
    int l,c,i,j,n;
    cout<<"輸入矩陣行數和列數"<<endl;
    cin>>l>>c; 
    float a[l*c];
    cout<<"輸入矩陣的各行各列的數"<<endl; 
    for(i=0;i<l*c;i++)
    cin>>a[i];
    Matrix A(l,c);
    A.setMatrix(a);
    cout<<"顯示矩陣"<<endl;
    A.printMatrix();
    cout<<"輸入i,j 返回第i行第j列的數"<<endl;
    cin>>i>>j;
    A.element(i,j);
    cout<<"重新設置這個數"<<endl;
    cin>>n; 
    A.setElement (i,j,n);
    cout<<"重新返回這個數"<<endl;
    A.element(i,j);
    cout<<"返回矩陣行數與列數"<<endl;
    A.getLines() ;
    A.getCols() ;
    return 0;
}

matrix.cpp

#include <iostream>
#include "matrix.h"
using namespace std;
int i,j;
Matrix::Matrix(int n):lines(n),cols(n){
    p=new float[lines*cols];
} 
Matrix::Matrix(int n,int m):lines(n),cols(m){
    p=new float[lines*cols];
} 
Matrix::Matrix(const Matrix &x):lines(x.lines),cols(x.cols){
    p=new float[lines*cols];
    for(i=0;i<lines*cols;i++)
    p[i]=x.p[i];
} 
Matrix::~Matrix() {
    delete[] p;
}
void Matrix::setMatrix(const float *pvalue) {
    for(i=0;i<lines*cols;i++)
    p[i]=pvalue[i];
}
void Matrix::printMatrix() const{
    for(i=0;i<lines;i++){
    for(j=0;j<cols;j++)
    cout<<p[i*lines+j]<<" ";
    cout<<endl;
    }
}
inline float Matrix::element(int i,int j) const{
    cout<<p[(i-1)*lines+j-1]<<endl;
}
void Matrix::setElement(int i, int j, int value){
    p[(i-1)*lines+j-1]=value;
}
inline int Matrix::getLines() const{
    cout<<lines<<endl;
}
inline int Matrix::getCols() const{
    cout<<cols<<endl;
}

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) const;// 返回矩陣第i行第j列元素的值 
        void setElement(int i, int j, int value); //設置矩陣第i行第j列元素值為value
        inline int getLines() const; //返回矩陣行數 
        inline int  getCols() const; //返回矩陣列數 
    private:
        int lines;    // 矩陣行數
        int cols;    // 矩陣列數 
        float *p;   // 指向存放矩陣數據的內存塊的首地址 
};
#endif

截圖
技術分享圖片
實驗內容4
期中考試第二題
源碼
main.cpp

#include <iostream>
#include"user.h"
#include <string>
using namespace std;
int main() {
    string n,p;
    cout<<"請輸入用戶名和密碼"<<endl;
    cin>>n>>p;
    User user(n,p);
    user.print();
    user.change();
    cout<<"當前ID:";
    user.getCurrentID(); 
    return 0;
}

user.h

class User{
    public:
        User(string n,string p="111111");
        void print();
        void change();
        void static getCurrentID();
    private:
        int id;
        string name,password;
        int static CurrentID;
};

user.cpp

#include<iostream>
#include"user.h"
#include<string>
using namespace std;
int User::CurrentID=999;
User::User(string n,string p="111111"):name(n),password(p){
     id=++CurrentID;    
}
void User::print(){
    cout<<"用戶編號:"<<id<<endl; 
    cout<<"用戶名:"<<name<<endl;
    cout<<"密碼:"<<password<<endl;
}
void User::change(){
    string p;
    cout<<"請輸入舊密碼"<<endl;
    while(true){
    cin>>p;
    if(p!=password)
    cout<<"密碼錯誤!請重新輸入"<<endl;
    else break; 
    } 
    string newp;
    while(true){
    cout<<"請輸入新密碼"<<endl;
    cin>>p;
    if(p==password)
    cout<<"新密碼不能與舊密碼相同!"<<endl,continue;
    cout<<"請再次輸入新密碼"<<endl;
    cin>>newp;
    if(newp!=p) 
    cout<<"兩次密碼不同,請重新輸入"<<endl;
    else cout<<"修改成功"<<endl,break; 
    }
    password=newp;
}
void User::getCurrentID(){
    cout<<CurrentID<<endl;
}

截圖
技術分享圖片
期中考試第三題
源碼
main.cpp

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

int main()
{
    cout<<"請輸入出版編號,書名及定價"<<endl;
    vector<Book>mybooks; 
    string isbn, title;
    float price;
    int s=0;
    while(cin>>isbn>>title>>price){
        Book book(isbn,title,price);
        mybooks.push_back(book);
        s++; 
    }
    for(int i=0;i<s;i++){
        mybooks[i].print();
    }
    return 0;
}

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<<endl;
    cout<<"書名:"<<title<<endl;
    cout<<"定價:"<<price<<endl;
}

截圖
技術分享圖片

實驗總結

再一次看期中考試的題目,感覺沒有做的時候感覺那麽難,可能考試的時候時間比較緊,一時半數不能有清晰簡潔的思路,所以無從下手,另外對於函數返回引用這一方面在實驗時遇到了點問題,查了查函數返回值與返回引用的區別,發現函數返回值時會生成一個臨時變量來間接賦值,而函數返回引用則不會產生臨時變量,而是直接賦值,這樣省了一點內存也提高了一些效率。

C++實驗5