2008年北理复试上机

1、存储一组姓名,如Apple,Tom,Green,Jack要求能排序、按字母顺序插入、并显示。

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

void Print(vector<string> vi)
{
	vector<string>::iterator it;
	for(it=vi.begin();it!=vi.end();it++)
	{
		cout<<(*it)<<"  ";
	}
	cout<<endl;
}

int main()
{
	vector<string > vi;
	string str;
	while(1)
	{
		cout<<"请输入"<<endl;
		cin>>str;
		if(str=="#")
			break;
		vi.push_back(str);
		sort(vi.begin(),vi.end());
		Print(vi);
		
	}


}

 

2、输入文件名及路径创建该文件,并把从键盘输入的内容保存到该文件,最后将该文件的路径、该文件名及文件中的内容输出到屏幕。

 

#include <iostream>
#include <cstdio>
#include <string>

using namespace std;


int main()
{
	string filename,add,address;
	char text[100];
	cout<<"请输入文件名"<<endl;
	cin>>filename;
	cout<<"请输入文件路径"<<endl;
	cin>>add;
	getchar();
	address+=add;
	address+="/";
	address+=filename;
	FILE *fp;
	if(!(fp=fopen(address.c_str(),"w")))
		cout<<"打开失败"<<endl;
	cout<<"请输入内容"<<endl;
	while(1)
	{
		gets(text);
		if(strcmp(text,"#")==0)
			break;
		fprintf(fp,text);
		fprintf(fp,"\n");
	}
	fclose(fp);
	
	cout<<"文件地址:"<<add<<"  文件名"<<filename<<endl;
	cout<<"文件内容:"<<endl;


	if(!(fp=fopen(address.c_str(),"r")))
		cout<<"打开失败"<<endl;
	while(fgets(text,200,fp)!=NULL)
	{
		cout<<text;
	}
	fclose(fp);
	
	
	
	return 0;
}

3、设计捕获两种不同类型的异常,一个是被0除,另一个是数组越界。

 

#include <iostream>
#include <cstdio>
using namespace std;


int main()
{
	cout<<"请输入除数和被除数\n"<<endl;
	int a,b;
	cin>>a>>b;
	try
	{
		if(b==0)
			throw "除数为空\n";
		else
		{
			cout<<a/b<<endl;
		}
		cout<<"\n请输入数组长度\n";
		int n;
		cin>>n;
		cout<<"请输入要访问的数组下标\n"<<endl;
		cin>>a;
		if(a>=n||a<0)
			throw "非法访问\n";
	}
	catch(char *e)
	{
		cout<<e<<endl;
	}
	
}

4、设计一个程序能计算日期的间隔,如输入两个日期分别为2008-2-3和2008-3-9计算相隔多少天,或2008-2-3加上100天后的日期是多少。

#include <cstdio>
#include <algorithm>
using namespace std;

bool IsRunnian(int year)
{
	if(year%4==0 && year%100!=0|| year%400==0)
		return true;
	return false;
}

typedef struct 
{
	int year;
	int month;
	int day;
}date;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int judge(date d1,date d2)     //d1大返回1,相等返回0,d2大返回-1
{
	if(d1.year>d2.year)
		return 1;
	if(d1.year<d2.year)
		return -1;
	if(d1.month>d2.month)
		return 1;
	if(d1.month<d2.month)
		return -1;
	if(d1.day>d2.day)
		return 1;
	if(d1.day<d2.day)
		return -1;
	return 0;
}

int getday(date d1,date d2)
{
	int day=0;
	if(judge(d1,d2)==1)
		swap(d1,d2);
	for(;d1.year!=d2.year;d1.year++)
	{
		if(IsRunnian(d1.year)&& d1.month<=3)
			day+=366;
		else
			day+=365;

	}
	if(IsRunnian(d1.year))
		month[2]=29;
	else
		month[2]=28;
	if(d1.month>d2.month)
	{
		for(;d2.month!=d1.month;d2.month++)
		{
			day-=month[d2.month];
		}
	}
	if(d1.month<d2.month)
	{
		for(;d1.month!=d2.month;d1.month++)
		{
			day+=month[d1.month];
		}
	}
	
	day+=(d2.day-d1.day);
	
	return day;
}

void getday(date &d1,int d)
{
	if(IsRunnian(d1.year))
				month[2]=29;
			else
				month[2]=28;

				while(d>0)
				{
					if(d>=month[d1.month])
					{
						
						d-=month[d1.month];
						d1.month++;
						if(d1.month>12)
						{
							d1.month=1;
							d1.year++;
							if(IsRunnian(d1.year))
								month[2]=29;
							else
								month[2]=28;
						}
						if(d1.day>month[d1.month])
						{
							d+=(d1.day-month[d1.month]);
							d1.day=month[d1.month];
						}
					}
					else 
					{
						d--;
						d1.day++;
						if(d1.day>month[d1.month])
						{
							d1.month++;
							d1.day=1;
						}
						if(d1.month>12)
						{
							d1.year++;
							d1.month=1;
						}


					}



				}
}

int main()
{
	
	int choose;
	date d1,d2;
	while(1)
	{
		printf("1,计算间隔。2、计算日期。3、退出\n");
		scanf("%d",&choose);
		if(choose==1)
		{
			printf("请输入两个日期\n");
			scanf("%d-%d-%d",&d1.year,&d1.month,&d1.day);
			scanf("%d-%d-%d",&d2.year,&d2.month,&d2.day);
			
			printf("%d\n",getday(d1,d2));

		}
		if(choose==2)
		{
			printf("请输入时间和间隔日期,例如2018-1-1+100\n");
			int d;
			char c;
			scanf("%d-%d-%d%c%d",&d1.year,&d1.month,&d1.day,&c,&d);
			getday(d1,d);
				printf("%d-%d-%d\n",d1.year,d1.month,d1.day);
		

		}
	}

}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值