复试上机指南之小技巧篇(1)

一、输入一组整数

这个就是输入一组整数,数组的话没法用,因为数组是定长的,所以我们采用vector结合cin.get()进行判断。

int input;
vector vec;//vector的好处就在是一个动态数组,我们可以在不指定长度的情况下,输入任意长度的数字
while(cin>>input){
	vec.push_back(input);
	if(cin.get()=='\n')
		break;
}

二、单链表的递归逆序输出

我们在机试中经常遇到单链表的逆序输出的问题,2018北理的机试题中规定必须采用递归、链表输出,所以必须得掌握。

void reverse_input_list(node *q){
	if(q->next!=NULL)
		reverse_input_list(q->next);
	cout<data<<" ";
}

在使用的时候,采用头插或者尾插,建立好链表之后把头结点传入函数中,就OK了。

三、等腰梯形或者三角形

这也是机试中经常出现的点,虽然不难,但是有时候临时想还是考验逻辑能力的。

cin>>n;
for(i=0;i

四、关于结构体

这一类题经常是以学生信息、成绩等为背景进行考察,这个是一个关于学生成绩输入,统计挂科两门以上的学生、输出信息,并按照每个人的挂科数目进行排序输出,这个难点在成绩的不确定。我是在结构体中定义了一个vector< float> score.

typedef struct Student{
	string name;
	int no;//学号
	vector score;
}student;

下面是具体的输入信息:

while(cin>>scor){
	if(scor == -1)
		break;
	s[cnt].score.push_back(scor);//cnt是结构体数组,表示第几个学生。
}

五、字符串中的小数,输出出来

我们经常遇到需要把一个字符串中的数字输出出来,可以是整数、小数、正负数(前面有正负号需要带着正负号)。首先是输入之后,我们需要进行判断。

cin>>s;
	int i;
	for(i=0;i='0'&&s[i]<='9' || s[i]=='+'||s[i]=='-'){
			i=judge(i);//此处是第一次输入i,经过完整的判断在
			           //输出完这个数字之后,下一个不符合判断条件的字符的开始
			           //此处的i的精髓,judge()函数返回的是第一个不符合输出条件的字符的下标,我们用i接受这个
			           //下标,对现在的i++再次开始判断是否符合进入判断的条件,精髓认真理解。
		}
	}

接下来就是进行小数、负数、正数、纯数字的输出了,其中还包括类似于+004.500这种数字输出为+4.5。

int judge(int i){//这个i是元素的下标。
	int flag=1;//负数输出时,将flag赋值-1,乘上输出的数。
	bool a=false;
	double point=1,num=0;//表示点,在查找的过程中,可以将.后面的数字呈上point。
	do{//在循环中会一直判断下一个字符是不是符合要求,.或者数字来操作。
		if(s[i]>='0'&&s[i]<='9'){//纯数字或者小数的精髓,通过设置point的值来使其不断*0.1,使得2.3333这种也可以输出。
			if(point>=1){
				num=num*10+s[i]-'0';
			}
			else{
				num=num+point*(s[i]-'0');
				point*=0.1;//考虑存在2.333这种情况。
			}
		}
		else if(s[i]=='-')
			flag *= -1;
		else if(s[i]=='+')
			a=true;
		else if(s[i]=='.')
			point*=0.1;
	}while(!endof(s[++i])&&i

六、关于字符串的拼接问题

这个题是关于全排列的,意思是给a,b,c三个字符,输入n,加入n=2,那就输出aa,ab,ac,bb,ba,bc,cc,cb,ca,9最后再输出一共有几个,这个题我的思路是,一个string,一个vector< char> v;

	if(n==1){
		show(v);
		return 0;
	}
	else{
		while(--n){
			v=fun(v,a);//此处必须带参数做,例:n=3,其运行情况是先n=2,此时循环结束之后,v中的字符为aa,ab,ac.....,之后再n--,n=1。
			           //结果保存了之后返回给v,然后v再作为参数传回给fun,
			           //此时的v是aa,ab,ac.....,然后继续拼接单个字符,以此类推n=4,n=5...
		}
		show(v);	
	}

下面是fun函数,是用了一个返回vector的函数,因为每次这个返回的vector都要作为下一次循环的参数进行继续判断。

vector fun(vector v,string a){
	int i,j;
	vector ve;
	for(i=0;i

七、提取一个整数的每位数

就是在判断回文数、水仙花数的时候,我们需要知道输入数字的每一位,然后进行判断。

num=n;
len=0;
while(num){
    arr[len++]=num%10;//取余之后的结果存放在arr中,是从低位到高位的存放
    num/=10;//每次取余结束之后,/10,因为int是向下取整,所以123除10就是12.
}

八、辗转相除求最大公约数

int gcd(int a,int b){
    int t;
    if(a

九、读写文件

#include   
#include   
#include   
int main(){
    char fname[20]="abc.txt";
    ofstream out(abc.txt);
    if(out.is_open()){
        out<<"Hello,file!"<

你可能感兴趣的:(考研复试,C++,C++STL)