一.程序阅读题
1.switch和for循环套用,要注意case后有无break。
#include<iostream>
using namespace std;
int main()
{
int a=4,c=0,b=1;
for(int i=0;i<5;++i)
{
switch((--a)>0)
{
case 0: switch(c++)
{
case 0: cout<<"%";
case 1: cout<<"#";
}break;
case 1: switch(b)
{
case 0:cout<<"*";--b;break;
case 1:cout<<"@";--b;break;
}
default:cout<<"&";
}
cout<<"!"<<endl;
}
return 0;
}
2.主要考察作用域与可见性,注意int i=0在局部。
#include<iostream>
using namespace std;
void funcc(int a)
{
cout<<a<<endl;
}
int main()
{
int i=0,k=2;
for(int i=1;i<=3;++i)
{
funcc(i*k);
}
cout<<i<<" "<<k<<endl;
return 0;
}
补2(C++教程例题):
#include<iostream>
using namespace std;
int i;
namespace Ns
{
int j;
}
int main()
{
i=5;
Ns::j=6;
{
using namespace Ns;
int i;
i=7;
cout<<"i = "<<i<<endl;
cout<<"j = "<<j<<endl;
}
cout<<"i = "<<i<<endl;
return 0;
}
3.主要考察两个指针作为形参时,对两个形参的所存的地址进行交换,但是 传入的是指针类型的变量,而非地址值,所以其实func函数,并不起任何作用,此题还有一问,请写上func函数的作用。
#include<iostream>
using namespace std;
void fun(int *p,int *q)
{
int *c;
c=p;
p=q;
q=c;
}
int main()
{
int a=7,b=19;
int *pa=&a,*pb=&b;
cout<<*pa<<" "<<*pb<<endl;
fun(pa,pa);
cout<<"经过交换后的结果:"<<endl;
cout<<*pa<<" "<<*pb<<endl;
return 0;
}
4.全局对象、静态局部对象、栈对象的构造与析构的调用顺序问题。
#include<iostream>
using namespace std;
class A
{
public:
A(int x):xx(x)
{
cout<<"A()"<<xx<<endl;
}
~A()
{
cout<<"~A()"<<xx<<endl;
}
private:
int xx;
};
A a(1);
int main()
{
A b(2);
static A c(3);
return 0;
}
5.派生类与基类构造和析构执行顺序
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A()"<<endl;
}
~A()
{
cout<<"~A()"<<endl;
}
};
class B :public A
{
public:
B()
{
cout<<"B()"<<endl;
}
~B()
{
cout<<"~B()"<<endl;
}
};
int main()
{
B b;
return 0;
}
6.考察虚函数的运行时多态与未设成虚析构函数不会去调用派生类的析构函数问题,当然这是建立在用基类指针指向派生类对象的时候。
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A()"<<endl;
}
~A()
{
cout<<"~A()"<<endl;
}
virtual void print() const
{
cout<<"I am A"<<endl;
}
};
class B:public A
{
public:
B()
{
cout<<"B()"<<endl;
}
~B()
{
cout<<"~B()"<<endl;
}
void print() const
{
cout<<"I am B"<<endl;
}
};
int main()
{
A *pa = new B();
pa->print(); //基类指针调用派生类成员函数
delete pa;
pa= NULL;
return 0;
}
7.考察前置++运算符设置为友元函数。
#include<iostream>
using namespace std;
class A
{
public:
A(int xx,int yy):x(xx),y(yy){}
friend A operator ++ (A &a);
void print()
{
cout<<x<<","<<y<<endl;
}
public:
int x;
int y;
};
A operator ++(A &a)
{
++a.x;
++a.y;
return a;
}
int main()
{
A a(10,20);
a.print();
for(int i=0;i<5;++i)
{
++a;
}
a.print();
return 0;
}
二.程序填空题
1.请完善如下代码,实现求出由0-9这些数字组成的三位数有多少种(要求三位数的每一位均不同)
#include<iostream>
using namespace std;
int main()
{
/*总共5个空,坑 在第一个空三位数的第一位不能是0.*/
int i,j,k,num=0;
for(i=1;i<=9;i++)
{
for(j=0;j<=9;j++)
{
if(i!=j)
{
for(k=0;k<=9;k++)
{
if(k!=i&&k!=j)
num++;
}
}
}
}
cout<<"num="<<num<<endl;
return 0;
}
三.程序改错题
四.程序编程题
1、先用随机函数(rand)按列优先初始化一个3行4列的数组(数组中元素的范围是【0,9】),然后判断该数组中是否有鞍点(即是否存在既是行上最大又是列上最小的元素)
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define M 3
#define N 4
/*该数组中是否有鞍点(即是否存在既是行上最大又是列上最小的元素)*/
int check_max(int a[M][N],int i,int j) //判断行最大,行不变列变
{
int s=1;
for(int k=0;k<N;k++)
{
if(a[i][k]>a[i][j])
{
s=0;
break;
}
}
return s;
}
int check_min(int a[M][N],int i,int j) //判断列最小,行变列不变
{
int s=1;
for(int k=0;k<M;k++)
{
if(a[k][j]<a[i][j])
{
s=0;
break;
}
}
return s; //是最小值
}
int main()
{
int b[M][N]={0};
bool flag=false;
srand( (unsigned)time( NULL ) );
for(int i=0;i<M;i++)//用rand()赋值
{
for(int j=0;j<N;j++)
{
b[i][j]=rand()%10;
cout<<b[i][j]<<" ";
}
cout<<endl;
}
for(int i=0;i<M ;i++)
{
for(int j=0;j<N;j++)
{
if(check_min(b,i,j)&&check_max(b,i,j))
{
cout<<b[i][j]<<"是该数组中的鞍点"<<endl;
flag=true;
}
}
}
if(flag==false)
{
cout<<"该数组没有鞍点"<<endl;
}
return 0;
}
2.写一个函数模板完成二分查找的功能,是在数组中查找且该数组中的元素是有序的,必须使用递归实现。
非递归
#include<iostream>
using namespace std;
//写一个函数模板完成二分查找的功能,数组已经有序,用递归
template <class T>
int BinarySearch( T arr[], const T target,const int array_size)
{
int low,mid,height;
low=0;
height=array_size-1;
while(low<=height)
{
mid=(low+height)/2;
if(arr[mid]<target)
{
low=mid+1;
}
else if(arr[mid]>target)
{
height=mid-1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int array_size=sizeof(a)/sizeof(*a);
int b =BinarySearch(a,2,array_size);
cout<<b<<endl;
return 0;
}
递归
#include<iostream>
using namespace std;
template<class T>
int Binarysearch(T a[],T key,int left,int right)
{
int mid=left+(right-left)/2;
if (left>right)
return -1;
else if(a[mid]==key)
return mid;
else if(a[mid]>key)
Binarysearch(a,key,0,mid-1);
else
Binarysearch(a,key,mid+1,8);
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9};
int ans=Binarysearch(a,2,0,8);
if(ans==-1)
{
cout<<"cannot found"<<endl;
}
else
cout<<ans<<" is the position"<<endl;
return 0;
}
3、实现一个selfString类,要求至少包含构造函数和析构函数,构造函数功能从文件里读取一行英文字符串,也得有一个功能函数,该功能函数实现在两个字符串中找到他们的公共单词,要求必须是长度最长的公共单词,selfString有两个私有数据成员一个是字符数组,一个是Length,每个英文单词之间用空格分隔开,最后一点要求:不允许使用标准模板库。
嗯 下面的都没用,我想太多了,直接二维数组就解决了
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
class selfString
{
private:
char str[80];
int length;
public:
selfString(char *filename)
{
ifstream infile(filename);
if(!infile.is_open())
{
cerr<<"file failed"<<endl;
}
else
{
infile.getline(str,80);
length=strlen(str);
infile.close();
}
}
~selfString()
{
delete str;
}
int getlength()
{
return length;
}
char *getline()
{
return str;
}
};
char * findcommon(char *line1,char **word2,int k); // k是word2的个数
int main()
{
char file1[20]="D:\\mytest12.txt";
char file2[20]="D:\\mytest13.txt";
selfString s1(file1);
selfString s2(file2);
char *line1=s1.getline(); // 一个句子
char *line2=s2.getline();
cout<<"file1: "<<line1<<endl;
cout<<"file2: "<<line2<<endl;
// 第一个line作为被搜索的字符串
// line2分别放各个单词,作为寻找的子串
char *word2[10];
char *token2=strtok(line2," ");
int index2=0;
while(token2)
{
word2[index2++]=token2;
token2=strtok(NULL," ");
}
cout<<"在两个句子中相同的最大单词是: ";
char *max=findcommon(line1,word2,index2);
cout<<max<<endl;
return 0;
}
// 在word1中寻找子串,即每个word2的值
char * findcommon(char *line1,char **word2,int k)
{
int max=0;
char *tempmax;
char *sptr;
int j=0; // 用来控制words的个数
while(j<k)
{
sptr=strstr(line1,word2[j]);
while(sptr) //如果在line1中找到有相同的子串
{
if(strlen(word2[j])>max) //如果找到一个比max还大的
{
max=strlen(word2[j]); // 赋值给max
tempmax=word2[j];// 将此时的临时最大量给temp
break;//也不用继续搜后面的,我们只需要找到匹配就行了
}
else //这时候比max还小
{
break; // 根本不用做任何操作
}
}
j++;// 此时只需要挪动word2的位置,让下一个单词与line进行匹配
}
return tempmax;
}
找最大子串
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
string s1="bcgghadcced";
string s2="aggcadcbhe";
int mark[s1.length()][s2.length()];
for(int i=0;i<s1.length();i++) //生成辅助矩阵
{
for(int j=0;j<s2.length();j++)
{
if(s1[i]==s2[j]) //字符匹配
mark[i][j]=1;
else
mark[i][j]=0;
}
}
for(int i=0;i<s1.length();i++) // 输出辅助二维矩阵
{
for(int j=0;j<s2.length();j++)
{
printf("%d",mark[i][j]);
}
printf("\n");
}
int tempx,tempy;
for(int i=0;i<s1.length();i++)
{
for(int j=0; j<s2.length();j++)
{
if(mark[i][j]==1)
{
tempx=i;
tempy=j;
while(tempx<(s1.length()-1)&&tempy<(s2.length()-1)&&mark[tempx+1][tempy+1]==1)
{
mark[tempx+1][tempy+1]=mark[tempx][tempy]+1;
tempx++;
tempy++;
}
}
}
}
int max=0;
int index_x=0,index_y=0;
for(int i=0;i<s1.length();i++)
{
for(int j=0;j<s2.length();j++)
{
if(mark[i][j]>max)
{
max=mark[i][j];
index_x=i;
index_y=j;
}
}
}
for(int i= index_x-max+1;i<=index_x;i++)
{
cout<<s1[i];
}
cout<<endl;
return 0;
}
简单生成一个string类
#include<iostream>
#include<fstream>
using namespace std;
class mystring
{
public:
mystring(const char *s = NULL);
~mystring();
char* getstring();
private:
char *str;
int length;
};
mystring::mystring(const char *s)
{
if(s==NULL)
{
str= new char[1];
*str='\0';
length=0;
}
else
{
length=strlen(s);
str= new char[length+1];
strcpy(str,s);
}
}
mystring:: ~mystring()
{
delete str;
str=NULL;
}
char* mystring::getstring()
{
return str; //返回str所指的地址
}
int main()
{
mystring s1("abc");
cout<<s1.getstring()<<endl;
return 0;
}
(这个方法只是寻找最长子串,用动态规划,答案还在上面)
#include<iostream>
#include<cstdio>
#include<fstream>
using namespace std;
class mystring
{
public:
mystring(const char *s = NULL);
~mystring();
char* getstring();
private:
char *str;
int length;
};
mystring::mystring(const char *s)
{
if(s==NULL)
{
str= new char[1];
*str='\0';
length=0;
}
else
{
length=strlen(s);
str= new char[length+1];
strcpy(str,s);
}
}
mystring:: ~mystring()
{
delete str;
str=NULL;
}
char* mystring::getstring()
{
return str; //返回str所指的地址
}
void find_substring(const char *s1,const char *s2)
{
int a=strlen(s1),b=strlen(s2);
int mark[a][b]; //生成辅助矩阵
for(int i=0;i<a;i++)
{
for(int j=0; j<b;j++)
{
if(*(s1+i)==*(s2+j))
{
mark[i][j]=1;
}
else
{
mark[i][j]=0;
}
}
}
//输出辅助数组看是否成功赋值给辅助矩阵
for(int i=0;i<a;i++)
{
for(int j=0; j<b;j++)
{
cout<<mark[i][j]<<" ";
}
cout<<endl;
}
//找斜线找子串
int tempx,tempy;
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(mark[i][j]==1) //一旦找到数组中有1的位置
{
while(tempx<a-1&&tempx<b-1&&mark[tempx+1][tempy+1]==1)
{
mark[tempx+1][tempy+1]=mark[tempx][tempy]+1;
tempx++;
tempy++;
}
}
}
}
int max=0;//标记矩阵中最大值
int index_x,index_y; //index最后遍历到的是矩阵最大值的位置 ,用index-max-1 来顺序输出子串
for(int i=0;i<a;i++)
{
for(int j=0;j<b;j++)
{
if(mark[i][j]>max)
{
max=mark[i][j];
index_x=i;
index_y=j;
}
}
}
for(int i=index_x-max-1; i<=index_x ; i++)
{
printf("%c ",s1[i]);
}
cout<<endl;
}
int main()
{
char s1[20],s2[20];
ifstream infile1("D:\\mytest3.txt");
ifstream infile2("D:\\mytest4.txt");
//是否从文件中读取字符串
if(!infile1.is_open())
{
cout<<"error file1"<<endl;
}
else
{
infile1.getline(s1,15);
cout<<s1<<endl;
}
if(!infile2.is_open())
{
cout<<"error file2"<<endl;
}
else
{
infile2.getline(s2,15);
cout<<s2<<endl;
}
infile1.close();
infile2.close();
mystring ms1(s1);
mystring ms2(s2);
cout<<"比较ms1和ms2中的最大子串,生成辅助矩阵"<<endl;
find_substring(ms1.getstring(),ms2.getstring());
return 0;
}
蒙纳士练习题:
1.同构数(1-10000)
#include<iostream>
using namespace std;
bool judge(int n)
{
int num=n*n;
if(n<10)
{
if(num%10==n)
return true;
else
return false;
}
if(n>=10&&n<=100)
{
if(num%100==n)
return true;
else
return false;
}
if(n>100&&n<=1000)
{
if(num%1000==n)
return true;
else
return false;
}
if(n>1000&&n<=10000)
{
if(num%10000==n)
return true;
else
return false;
}
}
int main()
{
for(int i=1;i<10000;i++)
{
if(judge(i))
cout<<i<<" ";
}
cout<<endl;
return 0;
}
2.模板函数写一个找数组中的最小值,要用递归
#include<iostream>
using namespace std;
template<class T>
T findmin(T a[],int left,int right)
{
static int min=0;
if(left>right)
return a[min];
else
{
if(a[min]>a[left])
min=left;
findmin(a,++left,right);
}
}
int main()
{
int a[]={0,9,12,56,3,1,-20,-11,10,4};
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
int ans = findmin(a,0,10);
cout<<ans<<endl;
char s[]="osjkmnabxc";
for(int i=0;i<10;i++)
{
cout<<s[i]<<" ";
}
cout<<endl;
char answer=findmin(s,0,10);
cout<<answer<<endl;
return 0;
}
3.selfstring 上面已经写过了