文章目录

  • 第一题:
  • 思路:
  • 答案:
  • 第二题:
  • 思路:
  • 答案:
  • 第三题:
  • 思路:
  • 答案:
  • 第四题:
  • 思路:
  • 答案:
  • 第五题:
  • 思路:
  • 答案:
  • 第六题:
  • 思路:
  • 答案:
  • 第七题:
  • 思路:
  • 答案
  • 第八题:
  • 思路:
  • 答案:
  • 总结



第一题:

  • 编写一个函数,求数列1-1/2+1/3-1/4…+1/n,利用主函数调用这个函数并输出结果。

思路:

  • 题目并不难,用一个变量作为分母逐次增加,再用一个变量作为符号逐次跳变,求和注意精度即可。

答案:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

void solve(double *ans,int n) {
	double deno=1;//分母
	bool sym=true;//符号
	while(n--) {
		if(sym==true) {
			(*ans)+=1.0/deno;
			sym=false;
		} else {
			(*ans)-=1.0/deno;
			sym=true;
		}
		deno++;
	}
}

int main() {
	int n;
	cin>>n;
	double ans;
	solve(&ans,n);
	cout<<ans<<'\n';
	return 0;
}

第二题:

  • 编写程序,打印出如下的杨辉三角,要求打印六行。

思路:

  • 传统的杨辉三角以数组存储为主,新式的杨辉三角递归计算即可,省时省空。

答案:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

long Yh_tri(int r, int c) {	//杨辉三角算法函数
	return (c == 1 || c == r) ? 1 : Yh_tri( r - 1, c - 1 ) + Yh_tri( r - 1, c );
}

void solve(int n) {
	for(int  i = 1; i <= n; i++) {	// 共n行
		for(int j = 0; j < n - i; j++)	//空格,为了显示成等腰三角形
			printf("  ");
		for(int j = 1; j <= i; j++)
			printf("%4d", Yh_tri(i, j));	//递归输出杨辉三角形
		puts("");
	}
}

int main() {
	int n=6;
	printf("请输入杨辉三角形的行数(默认为6):");
	cin>>n;
	solve(n);
	return 0;
}

第三题:

  • 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输入到磁盘文件“test.txt”中保存。输入的字符以 !结束。

思路:

  • 大小写转换,然后利用文件指针保存到对应的文件中,注意结束标志不要保存到文件中。

答案:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main() {
	char str[100];
	FILE *p;//定义文件指针
	int len=0;
	while((str[len]=getchar())!='!') {	//输入的同时判断是否遇到结束符‘!’ 
		len++;	//下标同时用于记录长度 
	}
	str[len]=false;	//用于保证最后输入的结束标志‘!’不会被放入文件中 
	for(int i=0; i<len; i++)
		if(str[i]>='a'&&str[i]<='z')
			str[i]-=32;	//大小写转换 
	p=fopen("test.txt","w");	//打开文件,不写路径的话就默认为cpp文件所在的路径 
	fputs(str,p);	//放入数据 
	fclose(p);	//关闭文件指针 
	return 0;
}

第四题:

  • 输入某年某月某日,判断这一天是这一年的第几天?

思路:

  • 先计算当前月份之前月份的天数总和,然后加上当前月份已有天数,最后判断是否为闰年以及是否过了二月,如果是则总天数加一。

答案:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main() {
	int year, month, day,sum,leap;
	puts("需要判断的日期(年,月,日):");
	scanf("%d %d %d", &year, &month, &day);
	switch (month) {	//这边计算的是当前月份之前所有月份的累计天数
		case 1:
			sum = 0;
			break;
		case 2:
			sum = 31;
			break;
		case 3:
			sum = 59;
			break;
		case 4:
			sum = 90;
			break;
		case 5:
			sum = 120;
			break;
		case 6:
			sum = 151;
			break;
		case 7:
			sum = 181;
			break;
		case 8:
			sum = 212;
			break;
		case 9:
			sum = 243;
			break;
		case 10:
			sum = 273;
			break;
		case 11:
			sum = 304;
			break;
		case 12:
			sum = 334;
			break;
		default:
			puts("输入日期格式错误");
			break;
	}
	sum = sum + day;	//然后加上当前月份已有天数
	if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
		leap = 1;
	} else {
		leap = 0;
	}
	//最后在判断一下是否为闰年,如果是闰年而且月份已经超过了二月,则需要在总日期上加上一天。
	if (leap == 1 && month > 2) {
		sum = sum + 1;
	}
	printf("这是%d年的第%d天\n", year, sum);
	return 0;
}

第五题:

  • 设在文件a.txt和文件b.txt中分别有两个字符串,设计一个程序将这两个字符串按依序交叉的方式合并为一个字符串(如"aaaa"与"bbb"的合并结果为"abababaa",而"bbb"与"aaaaa"的合并结果为"bababaaa),并将结果存入a.txt中。

思路:

  • 使用文件指针打开对应文件,先将a.txt和b.txt中的字符按序交叉(对文件流进行取出/放入操作即可实现按序交叉合并),先存放在c.txt,最后用c.txt覆盖a.txt即可,别忘了关闭文件流。

答案:

#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

int main() {
    FILE *fa, *fb, *fc;	//定义三个文件指针 
    char ch;
    if ((fa = fopen("a.txt", "r+")) == nullptr) {
        cout << "can not open file a.txt" << endl;
        exit(0);	//打开文件a.txt,若打开失败则直接退出程序 
    }
    if ((fb = fopen("b.txt", "r")) == nullptr) {
        cout << "can not open file b.txt" << endl;
        exit(0);	//打开文件b.txt,若打开失败则直接退出程序 
    }
    // exit()与return有什么区别呢?见文末详情链接。
    fc = fopen("c.txt", "w+");  //打开文件c.txt 
    //这边不能用feof()来判断是否结束,为什么?见文末详情链接。
    while (fscanf(fa, "%c", &ch) != EOF) {	
        fprintf(fc, "%c", ch);
        if (fscanf(fb, "%c", &ch) != EOF) {
            fprintf(fc, "%c", ch);
        }
    }
    while (fscanf(fb, "%c", &ch) != EOF) {
        fprintf(fc, "%c", ch);
    }
    rewind(fa);	//重定位文件指针至文件开头 
    rewind(fc);
    while (fscanf(fc, "%c", &ch) != EOF) {
        fprintf(fa, "%c", ch);
    }
    fclose(fa);	//关闭文件流 
    fclose(fb);
    fclose(fc);
    system("pause");
    return 0;
}

exit()与return的区别.
feof函数的滞后性.

第六题:

  • 有一篇文章,共有三行文字,每行有60个字符,要求分别求出其中的英文大写字母、数字以及其他字符的个数。

思路:

  • 这题比较简单,循环输入循环判断即可,注意题目只要统计大写字母和数字,所以小写字母和空格也属于其他字符。

答案:

#include <iostream>
#include <cstring>

using namespace std;

int upr,num,oth;

int main() {
	for(int i=0; i<3; ++i) {
		string s;
		getline(cin,s);
		for(int j=0; j<(int)s.length(); ++j) {
			if(s[j]>='A'&&s[j]<='Z')
				upr++;
			else if(s[j]>='0'&&s[j]<='9')
				num++;
			else
				oth++;
		}
	}
	cout<<"大写字母个数为:"<<upr<<"\n数字个数为:"<<num<<"\n其他字符个数为:"<<oth;
	return 0;
}

第七题:

  • 从键盘上输入三个整数a,b,c,输出这三个数,然后交换他们中的数,把a中原来的值给b,把b中原来的值给c,把c中原来的值给a,并输出交换后的数字。

思路:

  • 简单暴力,用临时变量交换即可。

答案

#include <iostream>
#include <cstdio>

using namespace std;

int main() {
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	printf("交换前a=%d b=%d c=%d\n",a,b,c);
	int t;	//临时变量 
	t=c;
	c=b;
	b=a;
	a=t;
	printf("交换后a=%d b=%d c=%d\n",a,b,c);
	return 0;
}

第八题:

  • 实现一个学生类Student类,对学号、姓名、三门课的成绩进行管理。
    (1)类应该能够单独设置和获取三门课的成绩;
    (2)可以计算平均成绩。

思路:

  • 中规中矩的类封装题目,难度不大。

答案:

#include <iostream>

using namespace std;

class Student {
   private:
    string no;
    string name;
    double score_1;
    double score_2;
    double score_3;

   public:
    void setNo(string no) { this->no = no; }
    string getNo() { return no; }
    void setName(string name) { this->name = name; }
    string getName() { return name; }
    void setScore_1(int score_1) { this->score_1 = score_1; }
    void setScore_2(int score_2) { this->score_2 = score_2; }
    void setScore_3(int score_3) { this->score_3 = score_3; }
    int getScore_1() { return score_1; }
    int getScore_2() { return score_2; }
    int getScore_3() { return score_3; }
    int getAvgScore() { return (score_1 + score_2 + score_3) / 3; }
};
int main() {
    Student zzsj;
    zzsj.setNo("092618128");
    zzsj.setName("zzsj");
    zzsj.setScore_1(70);
    zzsj.setScore_2(80);
    zzsj.setScore_3(90);
    string no = zzsj.getNo();
    string name = zzsj.getName();
    int score_1 = zzsj.getScore_1();
    int score_2 = zzsj.getScore_2();
    int score_3 = zzsj.getScore_3();
    double avg = zzsj.getAvgScore();
    cout << "学号:" << no << '\n';
    cout << "姓名:" << name << '\n';
    cout << "第一门课成绩为:" << score_1 << '\n';
    cout << "第二门课成绩为:" << score_2 << '\n';
    cout << "第三门课成绩为:" << score_3 << '\n';
    cout << "平均成绩为:" << avg << '\n';
    return 0;
}

总结

以上就是2012年江南大学硕士研究生入学考试试题,851算法与程序设计考研真题。