文章目录
- 第一题:
- 思路:
- 答案:
- 第二题:
- 思路:
- 答案:
- 第三题:
- 思路:
- 答案:
- 第四题:
- 思路:
- 答案:
- 第五题:
- 思路:
- 答案:
- 第六题:
- 思路:
- 答案:
- 第七题:
- 思路:
- 答案
- 第八题:
- 思路:
- 答案:
- 总结
第一题:
- 编写一个函数,求数列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算法与程序设计考研真题。