| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 551 人关注过本帖
标题:[建议]如何帮助
只看楼主 加入收藏
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
 问题点数:0 回复次数:5 
[建议]如何帮助
这里有些人每次就把题目拿出来,暂且不论这个题目是菜是难,难道你把问题问出来的时候一点想法都没有吗?
如果有想法,把自己的想法一起拿出来,不然就那么直接问,直接给你个答案,你能会多少?

建议牛人们,看到这类问题帖能够尽量用启发的方式,让发帖者自己来解决问题
2005-12-17 10:53
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
同意,希望看到讨论,而不是出题答题

2005-12-17 12:37
yuanlaishini
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2004-11-2
收藏
得分:0 
同意,要不作业就都拿这里来了

我的Blog:http://blog..cn/u/1198315640 Email:jianan.ma@
2005-12-17 15:06
yuanlaishini
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2004-11-2
收藏
得分:0 
我不能发新贴子,发表主题,不知道为什么


发到回复里面好了

转自我的Blog:http://blog.sina.com.cn/u/476cd8780100018z

怎样读入未知个数的输入值?


PS:看了《C++ Primer》之后整理的东西,部分内容摘自《C++ Primer》,持续更新。有错误的地方,请您指出,^-^
1. 操作符在iostream上执行的是一个操作,而不只是简单的提供数据。
例如:endl在输出流中插入一个操作符,然后刷新缓冲区
2. 你用过iostream对象cerr么?
没有的话,试试看。(我以前可是一次都没用过)
cerr用来产生给程序用户的警告或错误信息。
3. 怎样读入未知个数的输入值?
int ivalue;
while(cin >> ivalue)
// ... ...
1) cin >> ivalue,从标准输入读入一个正数值。
如果成功,把该值拷贝到ivalue中,表达式结果是左边的istream对象---即cin。
2) while(cin >> ivalue),从标准输入读入一个序列,直到cin为false为止。
两种情况使一个istream对象被计算成false:
读到文件末尾或者遇到一个无效值,例如:3.14159(小数点对于int类型来说是非法的),e(字符e是非法的)。
在读入一个无效值的情况下,istream对象被放置到一种错误状态中,而且对于值的所有读入动作都将停止。(关于iostream对象条件状态的讨论,见后)
3) 缺省情况下,输入操作符丢掉任何中间空白(空格,制表符,换行符,回车),例如:
#include <iostream>
using namespace std;
int main()
{
char ch;
while( cin >> ch)
cout << ch;
cout << endl;
// ...
}
输入字符序列:
ab c
d e
输出:abcde
4) 如果我们希望读入空白字符,或许是为了保存原始的输入格式,或许是为了处理空白字符(例如计算换行符的个数),
方法:使用istream的get()成员函数(一般与ostream的put()成员函数配合使用),例如:
#include <iostream>
using namespace std;
int main()
{
char ch;
while(cin.get( ch ))
cout.put( ch );
// ...
}
4. 条件状态
当我们使用iostream对象的时候,我们主要关心的是:一个流是否出于错误状态。例如:
int ivalue;
cin >> ivalue;
如果我们输入"hello",那么在把字符串“hello”赋值给整形变量ivalue失败后,cin被设置成一种错误状态。
如果我们输入888,则读入成功,而且cin仍然处于正常状态。
判断流对象是否处于正常状态,我们一般只是测试它的真值:
if( !cin )
// 遇到文件末尾或者读操作失败
读入未知数目的元素,我们一般写:
while(cin >> word)
// ...
每个流对象都维护了一组条件状态标志,如果我们需要跟细致的访问流的条件状态,则可以通过这些条件标志监视流的当前状态。可以调用以下四个成员函数:
1) 如果一个流遇到文件结束符,则eof()返回true。
if ( inOut.eof() )
// ...
2) 如果试图做一个无效的操作,例如seeking重定位操作超出了文件尾,则bad()返回true。
3) 如果操作不成功,例如打开一个文件流对象失败,或遇到一个无效的输入格式,则fail()返回true。
ifstream iFile( filename, ios_base::in );
if ( iFile.fail() ) //不能打开
error_message( ... );
4) 如果其他条件都不为true,则good()返回true。
显示的修改流对象的条件状态有两个方法:
方法一:使用clear()成员函数,可以把条件状态复位到一个显示的值。
方法二:使用setstate()成员函数。我们可以不复位条件状态,而是在对象现有条件状态的基础上再增加一个条件。例如:
if ( (ch = is.get() ) != '<' )
{
is.setstate( ios_base::failbit );
return is;
}
可以一次设置多个条件状态:
is.setstate( ios_base::badbit | ios_base::failbit );
可以用的条件值:
ios_base::badbit
ios_base::eofbit
ios_base::failbit
ios_base::goodbit
5) 如果用户发生了输入错误,我们只想给出警告,并且希望程序能继续运行下去,并请求用户在此输入,那么此时我们就会用到clear()成员函数,来重新设置cin为正常状态。
clear()成员函数用来清除流对象的现有状态,并且设置0个或多个新的条件状态。
cin.clear();
将cin重新设置为正常,clear()调用的缺省值是goodbit
因此它与cin.clear( ios_base::goodbit )等价。
6)rdstate()成员函数使我们能够显示的访问iostream类对象的状态。
ios_base::iostate old_state = cin.rdstate();
cin.clear();
process_input();
//重置cin为原来的状态
cin.clear( old_state );

我的Blog:http://blog..cn/u/1198315640 Email:jianan.ma@
2005-12-17 15:13
yuanlaishini
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2004-11-2
收藏
得分:0 

还是不能发新贴,回复到这里了,呵呵,楼主莫怪

转自我的Blog:http://blog.sina.com.cn/u/1198315640


本文是我对C++中关于static(静态类型)的一些理解总结,部分内容摘自《C++ Primer》,错误不足在所难免,欢迎大家指正^-^

主要内容:
一. 面向过程程序设计中的static
1. 全局静态变量
2. 局部静态变量
3. 静态函数(可不是静态成员函数哦)
二. 面向对象程序设计中的static
1. 静态数据成员
2. 静态成员函数

一. 面向过程程序设计中的static
1. 全局静态变量
在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

看下面关于作用域的程序:
//testStatic1.cpp
#include <iostream>
using namespace std;

void display();
extern int n;

int main()
{
n = 20;
cout << n << endl;
display();
return 0;
}

//testStatic2.cpp
#include <iostream>
using namespace std;

static int n; //定义全局静态变量,自动初始化为0,仅在本文件中可见
void display()
{
n++;
cout << n << endl;
}


文件分别编译通过,但link的时候testStatic1.cpp中的变量n找不到定义,产生错误。

定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>其他文件中可以使用相同名字的变量,不会发生冲突。


2 局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
1)内存中的位置:静态存储区
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
例如:

//testStatic1.cpp
#include <iostream>
using namespace std;

void display();
void staticDis();

int main()
{
display();
staticDis();
renturn 0;
}

//testStatic2.cpp
#include <iostream>
using namespace std;

void display()
{
staticDis();
cout << "display() has been called " << endl;
}

void staticDis()
{
cout << "staticDis() has been called" << endl;
}

文件分别编译通过,但是连接的时候找不到函数staticDis()的定义,产生错误。

定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。

存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。

auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。(摘自《C++ Primer》 P337)
由于static变量的以上特性,可实现一些特定功能。


1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如下:

#include <stdio>
#include <iostream>
using namespace std;

void count();
int main()
{
int i;
for (i = 1; i <= 3; i++)
count();
return 0;
}

void count()
{
static num = 0;
num++;
cout << " I have been called" << num << "times" << endl;
}
输出结果为:
I have been called 1 times.
I have been called 2 times.
I have been called 3 times.

二 面向对象程序设计中的static
1. 静态数据成员
1) 内存中的位置:静态存储区
2) 初始化和定义:
<1> 静态数据成员可显示的在类体中被初始化,而非静态数据成员则不可以。
<2> 静态数据成员定义时要分配空间,所以不能在类声明中定义。
<3> 静态数据成员在程序中只能提供一个定义,所以静态数据成员的初始化不能在类的头文件中。
3) 访问:
<1> 类对象名.静态数据成员
<2> 类类型名::静态数据成员

4) 说明:
a.static数据成员和普通数据成员一样遵循public,protected,private访问规则。
b.对于非静态数据成员,每个类对象都有自己的拷贝。静态数据成员被当作类的全局对象,无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类类型的所有对象共享访问。
5) 同全局对象相比,使用静态数据成员有两个优势:
<1> 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
<2> 可以实现信息隐藏。静态成员可以是private成员,而全局对象不能。
6) 应用:
class Account {
Account( double amount, const string &owner );
String owner() { return _owner ;}
private:
static double _interestRate;
double _amount;
string _owner;
};

为什把_interestRate声明为static,而_amount和_owner不呢?
这是因为每个Account对应不同的主人,有不同数目的钱,而所有Account的利率却是相同的。
因为在整个程序中只有一个_interestRate数据成员,他被所有Account对象共享,所以把_interestRate声明为静态数据成员减少了每个Account所需的存储空间。
_interestRate值可能变化,所以不能声明为const。因为_interestRate是静态的,所以它只需要更新一次我们就可以保证每个Account对象都能访问到更新后的值。要是每个类对象都维持自己的一个拷贝,那么每个拷贝都必须更新,这将导致效率低下和更大的错误可能。

7)静态数据成员的“唯一性”本质(独立于类的任何对象而存在的唯一实例),使他能够以独特的方式被使用,这些方式对于非static数据成员来说是非法的。
<1> 静态数据成员的类型可以是其所属类,而非static数据成员只能被声明为该类对象的指针或引用,例如:

class Bar{
public:
//...
private:
static Bar mem1; //OK
Bar *mem2; //OK
Bar mem3; //错误
};

<2> 静态数据成员可以被作为类成员函数的缺省实参,而非static数据成员不可以。例如:

extern int var;

class Foo {
private:
int var;
static int stcvar;
public:
//错误:被解析为非static的Foo:var
//没有相关的类对象
int mem1( int = var );

//OK:解析为static的Foo:stcvar
//无需相关的类对象
int mem2( int = stcvar );

//OK:int var 的全局实例
int mem3( int = ::var );
};

8) 类模板的静态数据成员以后讨论^-^

2. 静态成员函数
1) 声明:在类的成员函数返回值之前加上关键字static,他就被声明为一个静态成员函数。静态成员函数不能声明为const或volatile,这与非静态成员函数不同。
2) 定义:出现在类体外的函数定义不能指定关键字static。
3) 作用:主要用于对静态数据成员的操作
4) 静态成员函数与类相联系,不与类的对象相联系。
5) 静态成员函数不能访问斐静态数据成员。因为非静态数据成员属于特定的类实例。
6) 静态成员函数没有this指针,因此在静态成员函数中隐式或显示的引用这个指针都将导致编译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。
7) 访问:可以用成员访问操作符(.)和箭头(->)为一个类对象或指向类对象的指针调用静态成员函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类对象。



我的Blog:http://blog..cn/u/1198315640 Email:jianan.ma@
2005-12-17 15:17
ElfDN
Rank: 4
等 级:贵宾
威 望:11
帖 子:291
专家分:0
注 册:2005-11-13
收藏
得分:0 

如何判断文件尾是有点麻烦,但是在使用过程中退出就会自动判断读到文件尾了,而且可以用文件输入,文件输入读完自然知道。当然,你可以做出判断文件结束的条件,比如int型的读如-1表示结束,等等。使用eof的话好象应该是判断if(!xx.eof())


2005-12-17 21:41
快速回复:[建议]如何帮助
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021873 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved