好文档 - 专业文书写作范文服务资料分享网站

信息学奥赛培训教程C++版

天下 分享 时间: 加入收藏 我要投稿 点赞

char cname[200]; sstr<>cname; cout<

5.5 输入/输出的状态标志

接下来我们来学习一下输入/输出的状态标志的相关知识,C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。 goodbit 无错误

Eofbit 已到达文件尾

failbit 非致命的输入/输出错误,可挽回 badbit 致命的输入/输出错误,无法挽回

有两种方法可以获得输入/输出的状态信息。一种方法是通过调用rdstate()函数,它将返回当前状态的错误标记。例如,假如没有任何错误,则rdstate()会返回goodbit. 下例示例,表示出了rdstate()的用法: #include using namespace std; int main() {

int a; cin>>a;

cout<

if(cin.rdstate() == ios::goodbit) {

cout<<\输入数据的类型正确,无错误!\ }

if(cin.rdstate() == ios_base::failbit) {

cout<<\输入数据类型错误,非致命错误,可清除输入缓冲区挽回!\ }

system(\ }

另一种方法则是使用下面任何一个函数来检测相应的输入/输出状态: bool bad(); bool eof(); bool fail(); bool good();

下例示例,表示出了上面各成员函数的用法: #include using namespace std;

-71-

int main() {

int a; cin>>a;

cout<

cout<<\输入数据的类型正确,无错误!\ }

if(cin.fail()) {

cout<<\输入数据类型错误,非致命错误,可清除输入缓冲区挽回!\ }

system(\ }

如果错误发生,那么流状态既被标记为错误,你必须清除这些错误状态,以使你的程序能正确适当地继续运行。要清除错误状态,需使用clear()函数。此函数带一个参数,它是你将要设为当前状态的标志值。,只要将ios::goodbit作为实参。 示例代码如下:

#include using namespace std; int main() {

int a; cin>>a;

cout<

通常当我们发现输入有错又需要改正的时候,使用clear()更改标记为正确后,同时也需要使用get()成员函数清除输入缓冲区,以达到重复输入的目的。 示例代码如下:

#include using namespace std; int main() {

int a; while(1) {

cin>>a;

if(!cin)//条件可改写为cin.fail() {

cout<<\输入有错!请重新输入\

-72-

cin.clear(); cin.get(); } else {

cout<

system(\}

最后再给出一个对文件流错误标记处理的例子,巩固学习,代码如下: #include #include using namespace std; int main() {

ifstream myfile(\if(myfile.fail()) {

cout<<\文件读取失败或指定文件不存在!\} else {

char ch;

while(myfile.get(ch)) {

cout<

if(myfile.eof()) {

cout<<\文件内容已经全部读完\}

while(myfile.get(ch)) {

cout<

system(\ }

-73-

第6章 控制结构

6.1 简介

编写解决特定问题的程序之前,首先要彻底了解问题并认真计划解决问题的方法。编写程序时,还要了解可用的基本组件和采用实践证明的程序结构原则。本章将讨论结构化编程的理论和原理的所有问题。这里介绍的技术适用于大多数高级语言,包括C++。

6.2 算法

任何计算问题都可以通过按特定顺序执行一系列操作而完成。解决问题的过程(procedure)称为算法(algorithm),包括:

1.执行的操作(action) 2.执行操作的顺序(order)

下例演示正确指定执行操作的顺序是多么重要: 考虑每个人早晨起床到上班的“朝阳算法”:(1)起床,(2)脱睡衣,(3)洗澡,(4)穿衣,(5)吃早饭,(6)搭车上班。

总裁可以按这个顺序,从容不迫地来到办公室。假设把顺序稍作调换:(1)起床,(2)脱睡衣,(3)穿衣,(4)洗澡,(5)吃早饭.(6)搭车上班。

如果这样,总裁就得带着肥皂水来上班。指定计算机程序执行语句的顺序称为程序控制(program control),本章介绍C++程序的控制功能。

6.3 控制结构

通常,程序中的语句按编写的顺序一条一条地执行,称为顺序执行(sequential execution)。程序员可以用稍后要介绍的不同C++语句指定下一个执行的语句不是紧邻其后的语句,这种技术称为控制转移(transfer of control)。

20世纪60年代,人们发现,软件开发小组遇到的许多困难都是由于控制转移造成的。goto语句使程序员可以在程序中任意指定控制转移目标,因此人们提出结构化编程就是为了清除goto语句。

Bohm和JMoP5n1的研究表明,不用goto语句也能编写程序。困难在于程序员要养成不用goto语句的习惯。直到20世纪70年代,程序员才开始认真考虑结构化编程,结果使软件开发小组的开发时间缩短、系统能够及时交付运行并在颅算之内完成软件项目。这些成功的关键是.结构化编程更清晰、更易调试与修改并且不容易出错。

BohM和J·jecopini的研究表明,所有程序都可以只用三种控制结构(control structure)即顺序结构(sequence structure)、选择结构(selection structure)和重复结构(repetition structure)。顺序结

-74-

构是C++内置的,除非另外指定,计算机总是按编写的顺序一条一条地执行。图2.1的流程图(flowchart)演示了典型的顺序结构.按顺序进行两次计算。

流程图是算法或部分算法的图形表示。流程图用一些专用符号绘制,如长方形、菱形、椭圆和小圆,这些符号用箭头连接,称为流程。

C++提供三种选择结构,本章将介绍这三种选择结构。if选择结构在条件为true时执行一个操作,在条件为false时跳过这个操作。if/else选择结构在条件为true时执行一个操作,在条件为false时执行另一个操作。swutch选择结构根据表达式取值不同而选择不同操作。

if选择结构称为单项选择结构(single—selection,structure),选择或忽略一个操作。if/else选择结构称为双项选择结构(double-selection structure),在两个不同操作中选择。switch选择结构称为多项选择结构(multiple-selection structure),在多个不同操作中选择。

C++提供三种重复结构while、do/while和for。if、else、switch、while、do和for等都是C++关键字(keyword)。这些关键字是该语言保留的,用于实现如C++控制结构等不同特性。

C++只有七种控制结构:顺序结构、三种选择结构和三种重复结构。每个C++程序都是根据程序所需的算法组合这七种控制结构。这种单入/单出控制结构(single-entry/single-exit control structure)使程序容易建立,只要将一个控制结构的出口与另一个控制结构的入口连接,即可组成程序。这点很像小孩子堆积木,因此称为控制结构堆栈(control-structure stacking),还有另一种控制结构连接方法,称为控制结构嵌套(control-structure nesing)。

6.4 if选择结构

选择结构在不同操作之间选择。例如,假设考试成绩60分算及格,则下列伪代码: if student's grade is greater than or equal to 60 print \确定“学生成绩大于或等于60分”是true或false,如果是true,则该生及格,打印“Passed”字样,并顺序“执行”下一个伪代码语句(记住,伪代码不是真正的编程语言)。如果条件为false,则忽略打印语句,并顺序“执行”下一个伪代码语句。注意这个选择结构第二行的缩排,这种缩排是可选的,但值得提倡,因为它能体现结构化程序的内部结构。将伪代码变成C++代码时,C++编译器忽略空格、制表符、换行符等用于缩排和垂直分隔的空白字符。

上述伪代码的if语句可以写成如下C++语句: if (grade>=60)

cout<<\ cout<<\

注意C++代码与伪代码密切对应,这是伪代码的一个属性,使得其成为有用的程序开发工具。

注:伪代码常用于程存设计期间“构思”程序,然后再将伪代码程序转换为C++程序。

if结构也是单入/单出结构。

-75-

7147t1zw3j3ef8l93ts6
领取福利

微信扫码领取福利

微信扫码分享