南京信息工程大学实验报告
实验名称 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]