write in advance
这两天考试,遇到了两道简单的送分题,与文件I/O 有关。只需要简单的文件操作就可以解决问题。可惜忘记了与文件相关的有关操作,悔不当初。此处水一篇文章,记录该次考试的两道试题:
第一题:重定向输入
#include<iostream>
#include<fstream>
const int Max = 2000;
int main()
{
char temp[Max];
std::ofstream outfile;
outfile.open("mytest.txt");
do
{
std::cin.getline(temp, Max);
outfile << temp << std::endl;
}while(strcmp(temp,"quit"));
// version 2, both ok
//while (std::cin.getline(temp, Max))
//{
// if (!strcmp(temp, "quit"))
// {
// outfile << "quit";
// break;
// }
// outfile << temp << std::endl;
//}
outfile.close();
return 0;
}
该题需要将console 的输入输出到文件中,在console输入 quit 后,将 quit 输入文件,并结束接收输入。程序结束。做题时想到的是重定向, redirection,直接将console 的 input 输入到 file中,并对输入的内容进行条件判断, 当输入 quit 后,程序结束。
可惜 redirection 的概念我了如指掌,但操作忘得干净。此处采用另一种方法,先将一行的输入暂存到一个数组中,再在循环中将 数组 temp 的内容输出。注意条件判断需放置在 while loop 中的前半部分,否则不符合程序期待。数组的长度需要足够大,这样可以很方便地省去输入字符过长,超出限制的问题。——当然,这并不是标准做法,标准做法就是 redirection, 我后面再补充。
在这个程序中,我并没有对可能存在的异常情况进行判断。在简单的题目中,当然可以只考虑正确的代码。但在实际开发中,最好加上对文件读取成功与否等异常情况的检测,尤其是当文件工程浩大时。那会节约定位错误的时间,有利于改进。
第二题 所谓的水仙花数
#include<iostream>
bool check(int );
int calcu(int);
int main()
{
int lower, upper;
std::cin >> lower >> upper;
for (int i = lower; i < uppper + 1; i++)
{
if (check(i))
std::cout << i << " ";
}
std::cout << "that is all,done!\n";
return 0;
}
bool check(int num)
{
int one = num % 10;
int ten = num / 10 % 10;
int hundred = num / 100 % 10;
if (num == calcu(one) + calcu(ten) + calcu(hundred))
return true;
return false;
}
int calcu(int num)
{
return num * num * num;
}
水仙花数是一个十进制三位数,其数字本身等于其各位的三次幂相加。主要考察的还是取余操作。这里有必要提出,因为计算机擅长高速执行执行重复指令,取余在很多程序中都发挥着重要的作用。它是很重要的运算符。
summary
仅以此篇,警醒自己,送分的题得拿满。不要一昧地前冲学习class and OOP, 但把基础的语法知识忘记了。当然还有记录试题,省得日后忘记。
日后可能会上传自己做的其他更需要脑子更有意思的题目,挖个坑。