江蘇科技大學
(張家港)
實驗報告
專業班級: 2014級機制專業 1班
課程名稱: 計算機程序設計基礎實踐VC++
學 號: 1445721111
學生姓名: 李加其
指導教師: 孫 娜
2015年6月
一、函數編程:
1.求素數問題:定義函數判斷一個整數是否爲素數,求300以內的素數,每行3個數形式輸出。
代碼:
#include<iostream>
using namespace std;
int judge(int a)
{
if(a==2) return 1;
if(a==3) return 1;
if(a>=3)
{
for(int i=2;i<a;i++)
{
if(a%i==0)
return 0;
else
continue;
}
}
return 1;
}
int main()
{
int num=0;
for(int j=2;j<=300;j++)
{
if(judge(j))
{
cout<<j<<' ';
num++;
if(num%3==0)
{
cout<<endl;
}
}
}
return 0;
}
2.最大公約數和最小公倍數問題:求兩分數之和並輸出結果,要求:將求最小公倍數和最大公約數設計成獨立的函數。(提醒:分子、分母可分別用兩個整型變量表示。之和的分母就是兩分數分母的最小公倍數;輸出示例: cout<<3<<”/”<<7; 就完成了分數3/7的輸出顯示。)
代碼:
#include<iostream>
using namespace std;
int fenzi,fenmu;
int judgebei(int a,int c)
{
int min=a>c?c:a;
for(int i=min;i<=a*c;i++)
{
if(i%a==0&&i%c==0)
{
return i;
break;
}
}
}
int judgeyue(int fenmu,int fenzi)
{
int cou=1;
int min=fenmu<fenzi?fenmu:fenzi;
for(int i=1;i<=min;i++)
{
if(fenmu%i==0&&fenzi%i==0)
{
if(i>=cou)
{
cou=i;
}
}
}
return cou;
}
int main()
{
int a,b,c,d;
cout<<"輸入第一個分數:分子、分母"<<endl;
cin>>b>>a;
cout<<"輸入第二個分數:分子、分母"<<endl;
cin>>d>>c;
int bei=judgebei(a,c);
fenmu=bei;
fenzi=b*fenmu/a+d*fenmu/c;
int yue=judgeyue(fenmu,fenzi);
cout<<b<<"/"<<a<<"+"<<d<<"/"<<c<<"="<<fenzi/yue<<"/"<<fenmu/yue;
return 0;
}
3.排序與元素移動綜合題:(1)定義整型數組a[10],從鍵盤輸入10個數爲數組賦值,並分別定義兩個獨立函數,void print(int b[])實現將一維數組元素輸出,void sort(int b[],int n)實現將一維數組的元素按從小到大排序(用兩種方法實現)。最後在主函數中分別調用兩個函數。
代碼:
#include<iostream>
using namespace std;
int b[10];
int tem[100000000]={0,0};
void sort1(int a[],int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>a[j])
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
void sort2(int a[],int n)
{
int d=0;
int countnum=a[0];
for(int i=0;i<n;i++)
{
if(a[i]>=countnum)
countnum=a[i];
tem[a[i]]++;
}
for(int j=0;j<=countnum;j++)
{
while(tem[j]!=0)
{
b[d]=j;
d++;
tem[j]--;
}
}
}
void print(int a[])
{
for(int i=0;i<10;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
}
int main()
{
int a[10];
for(int i=0;i<10;i++)
{
cin>>a[i];
}
print(a);
sort1(a,10);
print(a);
sort2(a,10);
print(b);
return 0;
}
4.二維數組與元素移動:
(1)定義一個二維數組int b[2][3],從鍵盤輸入爲二維數組賦值,將二維數組中每行元素循環後移一位,並以矩陣形式輸出二維數組元素。
(2)定義一個二維數組,int a[3][4],求其外圍元素之和,並以矩陣形式輸出二維數組元素。(求和用兩種方法實現)
代碼:
#include<iostream>
using namespace std;
int main()
{
int b[2][3];
int a[3][4];
cout<<"輸入移動2*3數組:"<<endl;
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cin>>b[i][j];
}
}
for(int i=0;i<2;i++)
{
int temp=b[i][2];
b[i][2]=b[i][1];
b[i][1]=b[i][0];
b[i][0]=temp;
}
for(int i=0;i<2;i++)
{
for(int j=0;j<3;j++)
{
cout<<b[i][j]<<' ';
}
cout<<endl;
}
cout<<"輸入3*4數組:"<<endl;
int sum=0,sum2;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
cin>>a[i][j];
if(i==0||i==2||j==0||j==3)
sum=sum+a[i][j];
}
}
sum2=a[0][0]+a[0][1]+a[0][2]+a[0][3]+a[1][0]+a[1][3]+a[2][0]+a[2][1]+a[2][2]+a[2][3];
cout<<sum<<' '<<sum2<<endl;
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
cout<<a[i][j]<' ';
}
cout<<endl;
}
return 0;
}
5.字符串處理:設計一個通用函數實現在字符串s1中從第m個字符開始插入字符串s2,在主程序中對該函數進行測試。
初始狀態:s1:abcdefg
s2:1234
輸入插入字符串的位置:3
目標狀態:s1: ab1234cdefg
s2:1234
代碼:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void connect(char str1[80],char str2[80],int i)
{
char str3[80];
int j,k,m,h;
h=strlen(str1);
for(j=0;j<=i-2;j++)
{
str3[j]=str1[j];
}
for(m=0;str2[m]!='\0';j++,m++)
{
str3[j]=str2[m];
}
for(k=h-i-2;str1[k]!='\0';j++,k++)
{
str3[j]=str1[k];
}
str3[j]='\0';
//printf("%s",str3);
for(int i=0;i<strlen(str3);i++)
{
cout<<str3[i];
}
cout<<endl;
}
int main()
{
char str1[80],str2[80];
int i;
cin.getline(str1,80);//gets(str1);
cin.getline(str2,80);
cin>>i;
connect(str1,str2,i);
return 0;
}
6.拼數與合數問題:
(1)在主函數中定義一個一維數組a[4]用來存放4個整型數3,12,0,1,並依次輸出一維數組中的元素。
(2)依次取出數組中的元素,利用合數算法將這些元素合成一個數,要求合數的過程寫成獨立函數的形式,編寫int fun(int b[],int n)函數,其中b爲一維數組,n爲b數組中包含的元素個數。該函數用來實現合數過程,並在主函數中調用該函數,並在主函數中輸出合成之後的數。
代碼:
#include<iostream>
using namespace std;
int sum=0;
int judge(int b)
{
int c=0;
while(b)
{
b=b/10;
c++;
}
return c;
}
int fun(int a[],int n)
{
for(int i=0;i<n;i++)
{
int b=a[i];
if(b!=0)
{
int num=judge(b);
while(num)
{
sum=sum*10;
num--;
}
sum=sum+b;
}
else{
sum=sum*10;
}
}
return sum;
}
int main()
{
int a[4]={3,12,0,1};
for(int i=0;i<4;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
cout<<fun(a,4)<<endl;
return 0;
}
7.數字字符與整數轉換算法:將字符串#ab78c15fk23d*中整型數據提取出來,合成一個整型數781523並輸出來。再將781523整數的各個數位數字拆開存放到一維數組int b[10]中,並將一維數組中的元素轉換爲數字字符存放到字符數組s[100]中,並輸出該數字字符串"325187".
代碼:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string str;
cin>>str;
int a=str.length(),sum=0;
for(int i=0;i<a;i++)
{
if(str[i]>='0'&&str[i]<='9')
{
sum=sum*10+str[i]-'0';
}
}
cout<<sum<<endl;
int b[10],j=0;
while(sum)
{
b[j]=sum%10;
sum=sum/10;
j++;
}
for(int i=0;i<j;i++)
{
if(b[i])
{
cout<<b[i]<<' ';
}
}
cout<<endl;
char s[100];
int num=0;
for(int i=0;i<j;i++)
{
if((b[i]))
{
s[num]=b[i]+'0';
num++;
}
}
s[num]='\0';
for(int i=0;i<num;i++)
{
cout<<s[i]<<' ';
}
cout<<endl;
return 0;
}
8.循環結構:請從鍵盤輸入一個正整數,求這個數是幾位數,並求出該正整數的各個位上的數字之和。如輸入1234,該正整數是4位數,各個數位上的數字之和爲10.
代碼:
#include<iostream>
using namespace std;
int a[100],b=0;
void fun(int n)
{
while(n)
{
a[b]=n%10;
n=n/10;
b++;
}
}
int main()
{
int n;
cin>>n;
fun(n);
cout<<"這是"<<b<<"位數"<<endl;
int sum=0;
for(int i=0;i<b;i++)
{
sum=sum+a[i];
}
cout<<"和爲"<<sum<<endl;
return 0;
}
9.求1-1/2+1/3-1/4+……+1/99-1/100的和。
代碼:
#include<iostream>
using namespace std;
int main()
{
int i;
float s,t,sum;
t=1;
sum=0;
s=1;
for(i=2;i<=100;i++)
{
sum=sum+t;
s=-s;
t=s/i;
}
cout<<sum<<endl;
return 0;
}
10.從鍵盤輸入一個整數n,將該整數的每一位上的數字拆開,存放到一維數組int a[10]中,該過程用獨立函數形式實現。並將一維數組中的元素取出合成一個數,並輸出合成的數和一維數組元素。如n:1234,存放到一維數組中的順序爲4 3 2 1,合成一個數爲4321。
代碼:
#include<iostream>
using namespace std;
int a[100],b=0;
void fun(int n)
{
while(n)
{
a[b]=n%10;
n=n/10;
b++;
}
}
int main()
{
int n;
cin>>n;
fun(n);
for(int i=0;i<b;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
int sum=0;
for(int i=0;i<b;i++)
{
sum=sum*10+a[i];
}
cout<<sum<<endl;
return 0;
}
二、類的問題:
1.問題描述如下:
(1)定義一個類Array, 它的數據成員和成員函數如下:
私有數據: int b[10];
公有成員函數: Array(int t[]); //功能爲一維數組b初始化
void sort(); //功能爲實現對一維數組從大到小排序
void move(); // 功能爲將一維數組元素循環後移一位
void print(); //功能爲輸出一維數組元素
(2)用類定義對象arr,並用對象arr調用成員函數,實現對一維數組元素排序和數組元素循環後移一位,並輸出每次操作的結果。
代碼:
#include<iostream>
using namespace std;
class Array{
private:
int b[10];
public:
Array(int t[]);
void sort();
void move();
void print();
};
Array::Array(int t[])
{
for(int i=0;i<10;i++)
{
b[i]=t[i];
}
}
void Array::sort()
{
for(int i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
if(b[i]<b[j])
{
int temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
}
void Array::move()
{
int temp=b[9];
for(int i=8;i>=0;i--)
{
b[i+1]=b[i];
}
b[0]=temp;
}
void Array::print()
{
for(int i=0;i<10;i++)
{
cout<<b[i]<<' ';
}
cout<<endl;
}
int main()
{
int t[10]={1,4,2,5,3,7,8,6,9,22};
Array arr(t);
arr.print();
arr.sort();
arr.print();
arr.move();
arr.print();
return 0;
}
2.問題描述如下:
(1)定義一個類Array, 它的數據成員和成員函數如下:
私有數據: int b[4][5];int s;
公有成員函數:Array(int t[][5]);//功能爲二維數組b初始化
void sum();// 功能爲求二維數組外圍元素之和
void print();//功能爲以矩陣形式輸出二維數組元素
(2)用類定義對象array,並用對象array調用成員函數求出二維數組外圍元素之和,輸出二維數組元素。
代碼:
#include<iostream>
using namespace std;
class Array{
private:
int b[4][5];
int s;
public:
Array(int t[][5]);
void sum();
void print();
};
Array::Array(int t[][5])
{
for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
b[i][j]=t[i][j];
}
}
s=0;
}
void Array::sum()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
if(i==0||i==3||j==0||j==4)
{
s=s+b[i][j];
}
}
}
cout<<s<<endl;
}
void Array::print()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<5;j++)
{
cout<<b[i][j]<<' ';
}
cout<<endl;
}
}
int main()
{
int t[4][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
Array array(t);
array.print();
array.sum();
array.print();
return 0;
}
3.問題描述如下:定義一個字符串類String,將字符串b拼接到字符串a中,(不能用拼接函數)。具體要求如下:
(1)私有數據成員
char a[100],b[100];
(2)公有成員函數
String(char c[],char d[]):構造函數,用參數初始化數據成員
void fun():功能函數,實現將b拼接到a的後面
void insert(int m);實現將字符數組b中的字符串插入到字符數組a中的第m個字符的位置。
void show():功能函數,輸出數據成員
(3)用數據"123456789","abc"在主函數中對類測試。
代碼:
#include<iostream>
#include<string.h>
using namespace std;
char str1[100],str2[100];
int i;
class String
{
private:
char a[100],b[100];
public:
String(char c[],char d[]);
void fun();
void insert(int m);
void show();
};
String::String(char c[],char d[])
{
for(int i=0;i<strlen(c)+1;i++)
{
a[i]=c[i];
}
for(int i=0;i<strlen(d)+1;i++)
{
b[i]=d[i];
}
}
void String::fun()
{
char str3[10000]={0};
int j=0,i,k;
for(i=0;i<strlen(a);i++,j++)
{
str3[j]=a[i];
}
for(k=0;k<strlen(b)+1;k++,j++)
{
str3[j]=b[k];
}
a[j]='\0';
for(int f=0;f<j;f++)
{
a[f]=str3[f];
}
cout<<"fun done"<<endl;
}
void String::insert(int m)
{
char str3[100]={0};
int j,k,md,h;
h=strlen(a);
for(j=0;j<=m-2;j++)
{
str3[j]=a[j];
}
for(md=0;b[md]!='\0';j++,md++)
{
str3[j]=b[md];
}
for(k=h-m-2;a[k]!='\0';j++,k++)
{
str3[j]=a[k];
}
str3[j]='\0';
for(int i=0;i<strlen(str3);i++)
{
a[i]=str3[i];
}
cout<<"insert done and result:"<<endl;
}
void String::show()
{
for(int i=0;i<strlen(a)+1;i++)
{
cout<<a[i];
}
cout<<endl;
}
int main()
{
cin.getline(str1,80);
cin.getline(str2,80);
String str(str1,str2);
str.show();
str.fun();
str.show();
cin>>i;
str.insert(i);
str.show();
return 0;
}
4.問題描述如下:定義一個字符串類String,爲指針變量p動態申請空間,並初始化。對p所指向的字符串進行逆序操作。具體要求如下:
(1)私有數據成員
char *p;
(2)公有成員函數
String(char *t):構造函數,用參數初始化數據成員
void fun():功能函數,實現對字符串進行逆序。
void show():功能函數, 輸出數據成員
~String();析構函數,撤銷對象。
(3)用數據"123456789"在主函數中對類測試。
代碼:
#include<iostream>
using namespace std;
string s1;
int num;
class String{
private:
char *p;
public:
String(char *t);
void fun();
void show();
~String();
};
String::String(char *t)
{
p=t;
}
void String::fun()
{
num=s1.length();
int temp=*(p+0);
*p=*(p+num);
*(p+0)=temp;
}
void String::show()
{
for(int i=num-1;i>=0;i--)
{
cout<<*(p+i)<<' ';
}
cout<<endl;
}
String::~String()
{
delete []p;
}
int main()
{
cin>>s1;輸入
char *t=&s1[0];可以直接賦值char s1[10000]=”???????”那麼上面一句就不要了
String s(t);
s.fun();
s.show();
return 0;
}
5.問題描述如下:定義一個類名爲Array,爲指針變量p動態申請空間,並初始化。對p所指向的一維數組逆序排序。具體要求如下:
(1)私有數據成員
int *p;
(2)公有成員函數
Array(int *t):構造函數,用參數初始化數據成員
void fun():功能函數,實現對一維數組進行逆序。
void show():功能函數, 輸出數據成員
~Array();析構函數,撤銷對象。
(3)在主函數中對類測試。例如int a[10]={1,2,3,4,5,6,7,8,9,0};
代碼:
#include<iostream>
using namespace std;
class Array{
private:
int *p;
public:
Array(int *t);
void fun();
void show();
~Array();
};
Array::Array(int *t)
{
p=t;
}
void Array::fun()
{
int temp=*(p+0);
*p=*(p+9);
*(p+0)=temp;
}
void Array::show()
{
for(int i=9;i>=0;i--)
{
cout<<*(p+i)<<' ';
}
cout<<endl;
}
Array::~Array()
{
delete []p;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,0};
Array arr(a);
arr.fun();
arr.show();
return 0;
}
6.問題描述如下:定義一個類名爲Array,爲指針變量p動態申請空間,並初始化。具體要求如下:
(1)私有數據成員
char *p;int s;//s用來存放合成的數
(2)公有成員函數
Array(char *t):構造函數,用參數初始化數據成員
void fun():功能函數,實現對一個字符串中的數字字符,組合成一個整數。
void show():功能函數, 輸出數據成員
~Array();析構函數,撤銷對象。
(3)在主函數中對類測試。(如輸入”a2bc3de4,輸出234)。
代碼:
#include<iostream>
#include<string>
using namespace std;
string str1;
class Array
{
private:
char *p;
int s;
public:
Array(char *t);
void fun();
void show();
~Array();
};
Array::Array(char *t)
{
p=t;
s=0;
}
void Array::fun()
{
int temp;
int num=str1.length();
for(int i=0;i<num;i++)
{
if(*(p+i)>='0'&&*(p+i)<='9')
{
temp=*(p+i)-'0';
s=s*10+temp;
}
}
}
void Array::show()
{
cout<<s<<endl;
}
Array::~Array()
{
delete []p;
}
int main()
{
cin>>str1;
char *t=&str1[0];
Array arr(t);
arr.fun();
arr.show();
return 0;
}
7.試定義一個類Array,將二維數組的各行按其所有元素的和從小到大進行行排序,各行內元素之間的順序保持不變。具體要求如下:
(1)私有數據成員
int a[4][4]; 原始數組。
(2)公有成員函數
Array(int k[][4],int n); 構造函數,用數組k的前n行元素初始化數組a。
int sum(int b[4][4],int k); 求數組b中第k行元素的和。
void exch(int b[4][4],int x,int y); 交換數組b的第x行與第y行。
void fun( ); 按題意對數組進行排序。
void print( ); 輸出數組。
(3)在主函數中對該類進行測試。
輸入示例:
原數組:
5 5 5 5
4 4 4 4
3 3 3 3
2 2 2 2
排序後的數組:
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
代碼:
#include<iostream>
using namespace std;
class Array{
private:
int a[4][4];
public:
Array(int k[][4],int n);
int sum(int b[4][4],int k);
void exch(int b[4][4],int x,int y);
void fun();
void print();
};
Array::Array(int k[][4],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<4;j++)
{
a[i][j]=k[i][j];
}
}
}
int Array::sum(int b[4][4],int k)
{
int num=0;
for(int i=0;i<4;i++)
{
if(i==k-1)
{
for(int j=0;j<4;j++)
{
num=num+b[i][j];
}
}
else
continue;
}
return num;
}
void Array::exch(int b[4][4],int x,int y)
{
//約定x<y;
int temp[4];
int c=x-1,d=y-1;
for(int i=0;i<4;i++)
{
if(i==c)
{
for(int j=0;j<4;j++)
{
temp[j]=b[c][j];
}
}
if(i==d)
{
for(int j=0;j<4;j++)
{
b[c][j]=b[d][j];
b[d][j]=temp[j];
cout<<"第"<<i<<"and"<<y<<"changed"<<endl;
}
}
}
}
void Array::fun()
{
for(int i=1;i<=3;i++)
{
for(int j=i+1;j<=4;j++)
{
if(sum(a,i)>sum(a,j))
{
exch(a,i,j);
}
}
}
}
void Array::print()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
int main()
{
int k[4][4]={5,5,5,5,4,4,4,4,3,3,3,3,2,2,2,2};
int m[5][4]={20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};
Array arr1(k,4);
Array arr2(m,4);
arr1.print();
cout<<endl;
arr2.print();
cout<<endl;
arr1.fun();
cout<<endl;
arr2.fun();
cout<<endl;
arr1.print();
cout<<endl;
arr2.print();
cout<<endl;
return 0;
}
8.繼承與派生:定義一個圓類circle作爲基類,公有派生出圓柱體的類colum,求出圓柱體的體積。具體要求如下:
(1)類circle
保護數據成員: float r; //圓的半徑
公有構造函數: circle(float); //初始化r
公有成員函數: float getr(); //取圓的半徑r
double area(); //求圓的面積
(2)類colum
保護數據成員: float h; //圓柱體的高
公有構造函數: colum(float,float); //初始化r和h
公有成員函數: float geth(); //取圓柱體的高h
double vol (); //求圓柱體的體積
(3)編寫一個程序測試該類,測試數據及要求如下:
圓柱體對象:v(1.0,3.0);
本程序的執行結果如下:
圓柱體屬性數據:
半徑:1米
高度:3米
面積:3.14平方米
體積:9.42立方米
代碼:
#include<iostream>
#define pi 3.1415926
using namespace std;
class circle{
protected:
float r;
public:
float getr();
double area();
circle(float a);
};
circle::circle(float a)
{
r=a;
}
float circle::getr()
{
return r;
}
double circle::area()
{
return pi*r*r;
}
class colum:public circle
{
protected:
float h;
public:
colum(float ri,float high);
float geth();
double vol();
};
colum::colum(float ri,float high):circle(ri)
{
h=high;
}
float colum::geth()
{
return h;
}
double colum::vol()
{
return pi*r*r*h;
}
int main()
{
colum v(1.0,3.0);
cout<<"半徑:"<<v.getr()<<"米"<<endl;
cout<<"高度:"<<v.geth()<<"米"<<endl;
cout<<"面積:"<<v.area()<<"平方米"<<endl;
cout<<"體積:"<<v.vol()<<"立方米"<<endl;
return 0;
}