2006程序设计大赛试题
//(考试时间为八个小时),我是做的昏天又暗地啊。不过也没做了几个。觉得自己的信心大受打击.
请各位高人多多指点.!在下多谢了。
说明:共三道试题,第一题满分100分,第二题和第三题满分200分。选手可以选做其中任何一题或两题或三题(全做)。
一、入学考试问题(100分)
某地大学入学考试,相关信息如下:
(1)参加人数:10万。
(2)共有8门考试课程,每门课程满分均为100分,所有课程成绩均进行了4舍5入的处理,考生的总分也照此处理。
(3)所有考生的考试成绩保存在文件scores.txt中,文件格式如下:
每个考生成绩一行,每行格式如下:最开始为考生姓名,然后为每门课程的分数,考生姓名与课程分数之间,以及不同课程分数之间均用一个英文逗号隔开,如:
张三,98,92,60,54,87,75,86,92
个别考生成绩行的格式可能会有误。
(4)共招收三个批次的学生,第一批次8000人,第二批次21000人,第三批次33000人。录取顺序为:第一批次,第二批次,第三批次。
程序要求:
(1)确定每一批次的录取分数线,并将批次、分数线、实际录取人数输出到文本文件soutput.txt中,每一批次录取信息占一行,格式自定。确定分数线时,如果在分数线处有多名考生,则将这些考生全部录取,即每一批次的实际录取人数可能会超过预定人数。例如:假定在确定第一批次分数线时,有7800人的总分高于等于750分,有8050人的总分高于等于749分,则第一批次分数线应确定为749分,实际录取人数为8050人。
(2)如果考生成绩行的格式不对,则丢弃该考生的成绩,不作为确定分数线的依据,但要求将该考生姓名输出到文本文件serror.txt中,格式自定。
(3)将总分为650分的考生姓名输出到文本文件soutput.txt中,格式自定。
(4)将第三批次录取的所有考生的平均成绩(4舍5入)输出到文本文件soutput.txt中,格式自定。
(5)要求将下面两个时间值(单位为秒)输出到文件soutput.txt的最后:从打开scores.txt文件到读完所有考生成绩的时间;从打开scores.txt文件到程序结束的时间。
二、括号嵌套问题(200分)
某个序列完全由圆括号组成,一个“(”和一个“)”称为一对括号,且序列中的括号成对出现。设n为序列中出现的括号对数,k为序列中括号的最大嵌套深度;那么,序列“((()()()))()(())”的n为8,k为3。
1、请编程判断任意给定的圆括号序列,是否是一个深度为k的序列。
要求:(1)先输入嵌套深度k,然后输入任意一个序列,最后给出判定结果(是,不是,或者输入序列中的括号不配对)
(2)可以反复输入数据,当k为0时,程序结束。while(k!=0)
输入示例:
3
((()()()))()(())
2
((()()()))()(())
5
(()()()))()((((()))))
输出的判定结果:
测试1:YES
测试2:NO
测试3:括号不配对
2、编程输出括号对数为n,嵌套深度为k的所有序列。(1<=k<=n<=10)
比如,当n=3,k=2时,共有3个嵌套深度为2的序列,即“()(())”、“(()())”、“(())()”。
要求:(1)每一个输出序列单独占一行;并在末尾输出“×对括号,×层嵌套问题,共求出×××种序列”。
(2)可以反复输入数据,当k>n时,程序结束。
输出结果示例(n=5,k=3):
1: ((()()()))
2: ((()())())
3: ((()()))()
4: ((())(()))
5: ((())()())
6: ((())())()
7: ((()))(())
8: ((()))()()
9: (()(()()))
10: (()(())())
11: (()(()))()
12: (()()(()))
13: (())((()))
14: ()((()()))
15: ()((())())
16: ()((()))()
17: ()(()(()))
18: ()()((()))
5对括号,3层嵌套问题,共求出18种情况
3、求解括号对数为n,嵌套深度为k的序列的总数(不输出具体序列)。(1<=k<=n<=30)
输入示例:
3 2
15 3
20 11
输出结果:
3 2:3种
15 3:497845种
2011:94817125种
三、公司工问题(200分)
某公司(员工不超过5000)需要能够尽可能快的查找到某个员工的情况,从节约成本考虑,不使用数据库,公司中的员工具有行政隶属关系,就是说此公司的每个员工有且只有一个直接上级(公司总裁无上级),公司人员分为三类职称,高级职称,中级职称和初级职称,每个员工的基本数据为编号(非零),姓名,性别,身高,体重,职称六项,对于高级职称人员(职称信息编码为1)来说还需要具有工作年限信息,对于中级职称人员(职称信息编码为2)需要具有学历信息,对于初级职称人员(职称信息编码为3)需要具有年龄信息;
输入信息文件为in.txt,数据信息的格式如下:如果高级职称人员,那么年龄和学历字段为#(表示不存在此两项信息),如果为中级职称人员那么工作年限和年龄字段为#,对于初级职称人员,那么工作年限信息和学历信息字段为#,公司总裁的直接上级编码为0,。
注:职称信息的编码表示为:1、2、3
学历信息的编码表示为:001、002、003、004、005、006、007、008
每两个数据项间使用空格分开。
编号 姓名 性别 身高 体重 职称 直接上级编号 工作年限 学历信息 年龄
X(x>=1) aaa 男 178 98 1 0 8 # #
…………………
23 bbb 女 156 50 2 12 # 003 #
要求能够输入任意编号查找此编号对应的员工并打印此员工的信息、及其直接上级、直接下级、所有下属的信息,打印完毕后并提示用户下一查询输入信息,如果此编号对应的人员不存在,则也提示用户重新输入;
输出到屏幕,格式为:
输入人员编号为:
12345
查找到的员工信息输出格式为:
编号 姓名 性别 身高 体重 职称 直接上级编号 工作年限 学历信息 年龄
直接上级信息输出格式为:
编号 姓名 性别 身高 体重 职称 直接上级编号 工作年限 学历信息 年龄
直接下级信息输出格式为:
编号 姓名 性别 身高 体重 职称 直接上级编号 工作年限 学历信息 年龄
C
所有下级信息输出格式为:
编号 姓名 性别 身高 体重 职称 直接上级编号 工作年限 学历信息 年龄
C
D
E
F
G
//结束
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
//某地大学入学考试,相关信息如下:
//(1)参加人数:10万。
//(2)共有8门考试课程,每门课程满分均为100分,所有课程成绩均进行了4舍5入的处理,考生的总分也照此处理。
//(3)所有考生的考试成绩保存在文件scores.txt中,文件格式如下:
//每个考生成绩一行,每行格式如下:最开始为考生姓名,然后为每门课程的分数,考生姓名与课程分数之间,
//以及不同课程分数之间均用一个英文逗号隔开,如:
//张三,98,92,60,54,87,75,86,92
//个别考生成绩行的格式可能会有误。
//(4)共招收三个批次的学生,第一批次8000人,第二批次21000人,第三批次33000人。录取顺序为:
//第一批次,第二批次,第三批次。
//程序要求:
//(1)确定每一批次的录取分数线,并将批次、分数线、实际录取人数输出到文本文件soutput.txt中,
//每一批次录取信息占一行,格式自定。确定分数线时,如果在分数线处有多名考生,则将这些考生全部录取,
//即每一批次的实际录取人数可能会超过预定人数。例如:假定在确定第一批次分数线时,有7800人的总分高于等于750分,
//有8050人的总分高于等于749分,则第一批次分数线应确定为749分,实际录取人数为8050人。
//(2)如果考生成绩行的格式不对,则丢弃该考生的成绩,不作为确定分数线的依据,
//但要求将该考生姓名输出到文本文件serror.txt中,格式自定。
//(3)将总分为650分的考生姓名输出到文本文件soutput.txt中,格式自定。
//(4)将第三批次录取的所有考生的平均成绩(4舍5入)输出到文本文件soutput.txt中,格式自定。
//(5)要求将下面两个时间值(单位为秒)输出到文件soutput.txt的最后:
//从打开scores.txt文件到读完所有考生成绩的时间;从打开scores.txt文件到程序结束的时间。
//最后生成3个文件
//scores.txt
//soutput.txt
//serror.txt
一、入学考试问题
namespace CS2006_1
{
class Program
{
const int NUMBER_OF_EXAMINEE = 100000;
static int[] Scores = new int[801];
//函数create_scores创造考生成绩
//返回值bool型,成功创立返回true,否则返回false
static bool create_scores()
{
try
{
using (StreamWriter sw = new StreamWriter("scores.txt"))
{
Random r = new Random();
for (int i = 1; i < NUMBER_OF_EXAMINEE + 1; i++)
{
sw.WriteLine("Examinee" + i.ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString() + "," + r.Next(100).ToString());
}
}
return true;
}
catch (Exception e)
{
Console.WriteLine(@"The file scores.txt can't be write:!");
Console.WriteLine(e.Message);
return false;
}
}
//录取考生
static void matriculate()
{
try
{
using (StreamReader sr = new StreamReader("scores.txt"))
{
String line;
// Read and display lines from the file until the end of
// the file is reached.
int score;
char[] separator ={ ',' };
string[] examinee;
while ((line = sr.ReadLine()) != null)
{
score = 0;
examinee = line.Split(separator);
if (examinee.Length == 9)
{
for (int i = 1; i < 9; i++)
{
score += Convert.ToInt32(examinee[i]);
}
Scores[score]++;
}
else
{
try
{
using (FileStream aFile = new FileStream("serror.txt", FileMode.OpenOrCreate))
{
using (StreamWriter sw = new StreamWriter(aFile))
{
sw.WriteLine(examinee[0]);
}
}
}
catch (Exception e)
{
Console.WriteLine(@"The file serror.txt ERROR:");
Console.WriteLine(e.Message);
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine(@"The file scores.txt can't be read:");
Console.WriteLine(e.Message);
}
//int totalNum = 0;
//int i = 800;
//int j = 0;
for (int i = 800, j = 1, totalNum = 0; (i > -1) && (j != 4); i--)
{
totalNum += Scores[i];
if (((j == 1) && (totalNum >= 8000)) || ((j == 2) && (totalNum >= 29000)) || ((j == 3) && (totalNum >= 62000)))
{
printS(j, i, totalNum);
j++;
}
}
try
{
using (StreamWriter sw = File.AppendText("soutput.txt"))
{
sw.WriteLine("650 score " + Scores[650]);
}
}
catch (Exception e)
{
Console.WriteLine(@"The file soutput.txt ERROR:");
Console.WriteLine(e.Message);
}
}
static void printS(int j, int score, int totalNum)
{
try
{
using (StreamWriter sw = File.AppendText("soutput.txt"))
{
sw.WriteLine(j.ToString() + "," + score.ToString() + "," + totalNum.ToString());
}
}
catch (Exception e)
{
Console.WriteLine(@"The file soutput.txt ERROR:");
Console.WriteLine(e.Message);
}
}
static void Main(string[] args)
{
DateTime stardt = DateTime.Now;
if (create_scores())
{
matriculate();
TimeSpan ts = DateTime.Now.Subtract(stardt);
double count = ts.TotalSeconds;
try
{
using (StreamWriter sw = File.AppendText("soutput.txt"))
{
sw.WriteLine(count.ToString() + " Seconds");
}
}
catch (Exception e)
{
Console.WriteLine(@"The file soutput.txt ERROR:");
Console.WriteLine(e.Message);
}
}
}
}
}