文档库 最新最全的文档下载
当前位置:文档库 › cin、cin.get()、getline()的详细讲解

cin、cin.get()、getline()的详细讲解

cin、cin.get()、getline()的详细讲解
cin、cin.get()、getline()的详细讲解

cin、cin.get()、getline()的详细讲解

cin<<, cin.get,cin.getline等函数深入分析

很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如

cin.clear(),cin.ignore(), cin.fail(), cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

3.int main(){

4. intm, n;

5. cin>>m;

6. cin>>n;

7. return0;

8.}

测试情况:如果用户每次都输入两个合法的数,程序不会出问题!但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不会再执行第二条输入语句。似乎有点奇怪!!程序2:#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

2.int main(){

3. charstr[8];

4. cin.getline(str,5);

5. cout<

6. cin.getline(str,5);

7. cout<

8. return0;

9.}

程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。程序执行情况:测试一:abcd (回车)abcd (输出)efgh(回车)efgh (输出)当用户第一次输入的字符串字符数小于4时,程序执行正常!测试二:abcdefgh (回车)abcd (输出) (输出-换行)当用

户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!cin的一些输入函数和操作符cin is a extern istream object。提供了很多可用的成员函数和重载的操作符,如:cin<<,cin.get(), cin.getline()等。下面我们来了解一下这几个函数:一.cin<<该操作符是根据后面变量的类型读取数据。输入结束条件:遇到Enter、Space、Tab键。(这个很重要!)对结束符的处理:丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab) 读字符的情况:程序3:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespacestd;

3.int main(){

4.char c1, c2;

5. cin>>c1;

6. cin>>c2;

7. cout<

8. return 0;

9. }测试一输入:a[Enter]b[Enter]输出:a b 测试二输入:a b[Enter]输出:a b 读字

符串的情况:程序4:#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

11.int main(){

12. charstr1[10], str2[10];

13. cin>>str1;

14. cin>>str2;

15. cout<

16. cout<

17. return0;

}测试一输入:abcd[Enter]efgh[Enter]输出:abcdefgh【分析】输入遇到回车符结束,很正常。测试二输入:abcd efgh输出:abcdefgh【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据室,读入操作直接从缓冲区中取数据。

二.cin.get()该函数有三种格式:无参,一参数,二参数即cin.get(),cin.get(char ch), cin.get(array_name, Arsize) 读取字符的情况:输入结束条件:Enter键对结束符处理:不丢弃缓冲区中的Entercin.get() 与cin.get(char ch)用于读取字符,他们的使用是相似的,即:ch=cin.get() 与cin.get(ch)是等价的。程序5:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespacestd;

3.int main()

4.{

5.char c1, c2;

6. cin.get(c1);

7. cin.get(c2);

8. cout<

9. cout<<(int)c1<<""<<(int)c2<

10. return 0;

11.}

测试一输入:a[Enter]输出:a 97 10【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的'a',第二个变量取的是Enter(ASCII值为10),这是因为该函数不丢弃上次输入结束时的Enter字符,所以第一次输入结束时缓冲区中残留的是上次输入结束时的Enter 字符!测试二输入:a b[Enter]输出:a 97 32【分析】显然第一个字符变量取的'a',第二个变量取的是Space(ASCII值为32)。原因同上,没有丢弃Space字符。读取字符串的情况:cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。程序6:

#include

https://www.wendangku.net/doc/c32166859.html,ing namespacestd;

2.int main (){

3.char a[20];

4. cin.get(a, 10);

5. cout<

6. return 0;

https://www.wendangku.net/doc/c32166859.html,ing namespacestd;

2.int main (){

3.char ch, a[20];

4. cin.get(a, 5);

5. cin>>ch;

6. cout<

7. cout<<(int)ch<

8. return 0;

}测试一输入:12345[Enter]输出:123453【分析】第一次输入超长,字符串按长度取了"1234",而'5'仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了

'5',所以打印的ASCII值是53('5'的ASCII值)。测试二输入:1234[Enter]a[Enter]输出:123497【分析】第二次输入有效,说明该函数把第一次输入后的Enter丢弃了!

三.cin.getline()cin.getline()与cin.get(array_name,Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。但是这两个函数是有区别的:cin.get(array_name, Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是

cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。(具体原因将在下一部分"cin的错误处理"中详细介绍)程序8:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

3.int main (){

4. charch, a[20];

5. cin.getline(a,5);

6. cin>>ch;

7. cout<

8. cout<<(int)ch<

9. return0;

}测试输入:12345[Enter]输出:1234-52

【分析】与cin.get(array_name,Arsize)的例程比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!下一部分将详细介绍。

在前一节中我们有几个例子中提到了cin函数出错,以致不再执行读操作(程序8)。而且我们经常会看到程序中会出现cin.clear(),cin.ignore(), cin.fail()等函数。这些函数都是与cin 的错误处理有关的。这一节我们来分析一下cin的错误处理机制,并且学习几个重要的函数:cin.fail(), cin.bad(), cin.good(), cin.clear(), cin.ignore()等。

程序执行时有一个标志变量来标志输入的异常状态,其中有三位标志位分别用来标志三种异常信息,他们分别是:failbit,eofbit,badbit。这三个标志位在标志变量中是这样分配的:

看一下这几个标志位的作用(引用msdn):

badbit, to record a loss of integrity of the stream buffer.

eofbit, to record end-of-file while extracting from a stream.

failbit, to record a failure to extract a valid field from a stream.

In addition, a useful value is goodbit, where no bits are set.

接下来我么看几个ios类的数据定义(引用msdn):

typedef T2 iostate;

static const iostate badbit, eofbit, failbit, goodbit;

这里ios类定义了这四个常量badbit, eofbit, failbit, goodbit,其实这四个标志常量就是取对应标志位的掩码,也即输入的四种异常情况!

以上四个常量对应的取值为:

ios::badbit 001 输入(输出)流出现致命错误,不可挽回

ios::eofbit 010 已经到达文件尾

ios::failbit 100 输入(输出)流出现非致命错误,可挽回

ios::goodbit 000 流状态完全正常, 各异常标志位都为0

我们可以用输出语句来验证这几个常量的值:

cout << ios:: failbit << endl;

cout << ios:: eofbit << endl;

cout << ios:: badbit << endl;

cout << ios:: goodbit << endl;

输出的结果为:

4

2

1

【注意】它们不是failbit、badbit、eofbit、goodbit这四个标记位的存贮变量,而是四个标志四种异常状态的常量,其实他们就相当于取对应状态标志位的掩码。如果标志变量为flag,则flag & failbit 就取得fail标志位。

搞清楚了标志位的原理后,我们来看几个关于异常标志的函数:

1、iostate ios::rdstate()

取标志变量的值,我们可以用该函数取得整个标志变量的值,再与前面定义的标志位常量相与就可以获得对应标志位的状态。如:

1.void TestFlags( ios& x ) // 获得x流的三个标志位状态

2.{

3.cout << ( x.rdstate( ) & ios::badbit ) << endl;

4.cout << ( x.rdstate( ) & ios::failbit ) << endl;

5.cout << ( x.rdstate( ) & ios::eofbit ) << endl;

6.cout << endl;

7.}

2、bool ios::fail()const;

1 or true if rdstate & failbit is nonzero, otherwise 0 or false. (引用msdn)

其中rdstate即通过rdstate()取得的标识变量的值,与failbit相与,即取得failbit标志位的值,如果结果非零则放回true,否则返回false。即该函数返回failbit的状态,将标志位状态通过bool值返回。

3、bool ios::bad() const;

1 or true if rdstate & badbit is nonzero; otherwise 0. (引用msdn)

与fail()相似。

4、bool ios::good()const;

1 or true if rdstate == goodbit (no state flags are set), otherwise, 0 orfalse. (引用msdn) 改函数取goodbit的情况,即三个标志位都0(即没有任何异常情况)时返回true,否则返回false。

5、voidios::clear(iostate _State=goodbit);

该函数用来重置标识变量,_State是用来重置的值,默认为goodbit,即默认时将所有标志位清零。用户也可以传进参数,如:clear(failbit),这样就将标识变量置为failbit(即:001)。

我们一般是用它的默认值,当cin出现异常,我们用该函数将所有标志位重置。如果cin 出现异常,没有重置标志的话没法执行下一次的cin操作。如上一节的程序2的测试二为什么第二次输入操作没有执行?程序8中cin>>ch 为什么没有执行?都是这个原因!!!

所以经常在程序中使用cin.clear(), 为了重置错误标志!

6、另外还有一个函数void ios::setstate(iostate_State);

这个函数也是用来设置标识变量的,但与clear()不同。clear()是将所有标志清零,在置以参数新的标志。而该函数不清零其他的标志,而只是将参数对应的标志位置位。这个函数不是经常使用,这里不再赘述。

在搞清楚了这几个函数后,对cin输入操作的错误处理就有了比较深的了解了。下面我们回过头来看看上一节程序8的测试,因为第一次用getline()读取字符串超长,所以导致出现异常,大家可以查看一下标志位来验证一下!所以会导致后面的cin>>ch 语句没有执行。那我们利用前面学习的clear()函数来强制重置错误标志,看看会出现什么情况呢?

程序9:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

3.int main ()

4.{

5.char ch, str[20];

6.cin.getline(str, 5);

7.cout<<"flag1:"<

8.cin.clear(); // 清除错误标志

9.cout<<"flag1:"<

10.cin>>ch;

11.cout<<"str:"<

12.cout<<"ch :"<

13.return 0;

14.}

测试输入:

12345[Enter]

输出:

flag1:0 // good()返回false说明有异常

flag2:1 // good()返回true说明,clear()已经清除了错误标志

str:1234

ch :5

【分析】程序执行结束还是只执行了一次读操作,cin>>ch还是没有从键盘读取数据,但是与程序8中不同,这里打印了ch的值为'5',而且在cin>>ch之前已经清楚了错误标志,也就是cin>>ch的读操作实际上执行了。这就是前面讲的cin读取数据的原理:它是直接从输入缓冲区中取数据的。此例中,第一次输入"12345",而getline(str, 5)根据参数'5'只取缓冲区中的前4个字符,所以str取的是"1234",而字符'5'仍在缓冲区中,所以cin>>ch直接从缓冲区中取得数据,没有从键盘读取数据!

也就是当前一次读取数据出错后,如果缓冲区没有清空的话,重置错误标志还不够!要是能将缓冲区的残留数据清空了就好了哦!下面我们再来看一个很重要的函数!

7、basic_istream&ignore(streamsize _Count = 1, int_type _Delim = traits_type::eof()); function: Causes a number of elements to be skipped from the current readposition. Parameters:

_Count, The number of elements to skip from the current read position.

_Delim, The element that, if encountered before count, causes ignore to returnand allowing all elements after _Delim to be read. (引用msdn)

这个函数用来丢弃输入缓冲区中的字符,第一参数定义一个数,第二个参数定义一个字符变量。下面解释一下函数是怎样执行的:函数不停的从缓冲区中取一个字符,并判断是不是_Delim,如果不是则丢弃并进行计数,当计数达到_Count退出,如果是则丢弃字符退出。例:cin.ignore(5, 'a'); 函数将不断从缓冲区中取一个字符丢弃,直到丢弃的字符数达到5或者读取的字符为'a'。下面我们看个程序例子:

程序10:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

3.int main ()

4.{

5.cin.ignore(5, 'a');

6.return 0;

7.}

测试一输入:

c[enter]

c[enter]

c[enter]

c[enter]

c[enter]

程序结束。

【分析】程序开始时缓冲区是空的,cin.ignore()到缓冲区中取数据,没有则请求从键盘输入,每次从键盘输入一个字符,如果不是'a'则丢弃,所以该测试中共输入了5次,直到计数达到5。

测试二输入:

c[enter]

c[enter]

a[enter]

程序结束。

【分析】前面两个字符不是'a'丢弃且计数没达到5,第三次输入为'a', 丢弃该字符程序结束!

丢弃一个字符:

我们看看这个函数的默认值,第一个参数默认为1,第二个参数默认为EOF。所以

cin.ignore()就是丢弃缓冲区中的第一个字符,这在程序中也是比较常用的!我们回过头看看程序5,程序5中用cin.get()读取字符,第一次读取时用回车符结束,而get函数不丢弃回车符,所以回车符仍残留在缓冲区中,导致第二次读取数据直接从缓冲区中取得回车符!这与我们最初的用以是不相符的,既然cin.get()不会自动丢弃输入结束时的回车符,这里我们学会了ignore()函数,我们就可以自己手动求其回车符啊!所以程序5可以这样改动:

程序11:

1.#include

https://www.wendangku.net/doc/c32166859.html,ing namespace std;

3.int main()

4.{

5.char c1, c2;

6.cin.get(c1);

7. cin.ignore(); // 用该函数的默认情况,丢弃一个字符,即上次输入结束的回

车符

8.cin.get(c2);

9.cout<

10.cout<<(int)c1<<" "<<(int)c2<

11.return 0;

12.}

测试一输入:

a[Enter]

b[Enter]

输出:

a

b

97 98

【分析】这样程序就正常了!

清空整个缓冲区:

其实该函数最常用的方式是这样的,将第一个参数设的非常大,将第二个参数设为'\n',这样就可以缓冲区中回车符中的所有残留数据,因为一般情况下前面输入残留的数据是没有用的,所以在进行新一次输入操作前将缓冲区中所有数据清空是比较合理。

如:cin.ignore(1024, '\n');

或者:cin.ignore(std::numeric_limits::max(), '\n');

(std::numeric_limits::max()应该是定义的一个最大值。

初三数学 坐标与函数

初三数学坐标与函数 1. 如图,方格纸上一圆经过(2,5),(-2,l),(2,-3),( 6,1)四点,则该圆的圆心的坐标为() A.(2,-1)B.(2,2)C.(2,1)D.(3,l) 2.已知M(3a-9,1-a)在第三象限,且它的坐标都是整数,则a等于() A.1 B.2 C.3 D.0 3.在平面直角坐标系中,点P(-2,1)关于原点的对称点在() A.第一象限;B.第M象限; C.第M象限;D.第四象限 4.如图,△ABC绕点C顺时针旋转90○后得到AA′、B′C′, 则A点的对应点A′点的坐标是() A.(-3,-2); B.(2,2); C.(3,0); D.(2,l) 5.点P(3,-4)关于y轴的对称点坐标为_______,它 关于x轴的对称点坐标为_______.它关于原点的对 称点坐标为_____. 6.李明、王超、张振家及学校的位置如图所示. ⑴学校在王超家的北偏东____度方向上,与王超家 大约_____米。 ⑵王超家在李明家____方向上,与李明家的距离大约是____米; ⑶张振家在学校____方向上,到学校的距离大约是______ 米. 7.东风商场文具部的某种毛笔每支售价25元,书法练习本每本售价5元.该商场为了促销制定了两种优惠方法,甲:买一支毛笔就赠送一本书法练习本;乙:按购买金额打九折付款.某书法兴趣小组欲购买这种毛笔10支,书法练习本x(x>10)本. (1)写出每种优惠办法实际付款金额y甲(元)、y乙(元)与x(本)之间的关系式;(2)对较购买同样多的书法练习本时,按哪种优惠方法付款更省钱? 8. 某居民小区按照分期付款的形式福利售房,政府给予一定的贴息,小明家购得一套现价为120000元的房子,购房时首期(第一年)付款30000元,从第二年起,以后每年应付房款为5000元与上一年剩余欠款利息的和,设剩余欠款年利率为0.4%. (1)若第x(x≥2)年小明家交付房款y元,求年付房款y(元)与x(年)的函数关系式;(2)将第三年,第十年应付房款填人下列表格中 9. 如图所示,在直角坐标系中,第一次将△OAB变换成△OA1B1;第二次将OA1B1变换

使用ifstream和getline读取文件内容

使用ifstream和getline读取文件内容[c++] 假设有一个叫data.txt的文件, 它包含以下内容: Fry: One Jillion dollars. [Everyone gasps.] Auctioneer: Sir, that's not a number. 数据读取,测试。 以下就是基于data.txt 的数据读取操作: #include #include #include using namespace std; //输出空行 void OutPutAnEmptyLine() { cout<<"\n"; } //读取方式: 逐词读取, 词之间用空格区分 //read data from the file, W ord B y W ord //when used in this manner, we'll get space-delimited bits of text from the file //but all of the whitespace that separated words (including newlines) was lost. void ReadDataFromFileWBW() { ifstream fin("data.txt"); string s; while( fin >> s ) { cout << "Read from file: " << s << endl; } } //读取方式: 逐行读取, 将行读入字符数组, 行之间用回车换行区分 //If we were interested in preserving whitespace, //we could read the file in L ine-B y-L ine using the I/O getline() function. void ReadDataFromFileLBLIntoCharArray() { ifstream fin("data.txt"); const int LINE_LENGTH = 100; char str[LINE_LENGTH]; while( fin.getline(str,LINE_LENGTH) )

函数返回值

函数返回值 1.不带返回值的函数:return; 不带返回值的函数的返回类型为void,这样的函数会在函数的最后一个语句完成时隐式调用return;也可以在函数的结尾显式地调用return; 对于任意一个函数,只要执行了return语句,函数就强制结束了。 对于返回类型为void的函数,如果不显式地调用return;则只有在函数结束时才会隐式调用。可以在函数执行的某一阶段,显式地调用return;来结束函数,不再执行return语句之后的函数部分。 由于break语句只能用于循环和switch语句中,因此,想要结束if语句直接退出函数,可用return; 只有一种情况下,返回类型为void的函数可以使用return expression这一形式,那就是返回另一个返回类型同样是void的函数的调用结果。 如: void A() void B() { { .... .... .... .... return; return A(); } }//因为A返回类型为void,所以可以这样调用。 2.具有返回值的函数:return expression; 代码: int max(int x,int y) #include { int main() int z; { if(x>=y) int a,b,c; z=x; scanf("%d%d",&a,&b); else c=max(a,b); z=y; printf("%d\n",c); return z; return 0; } } 在main函数中调用max函数,函数调用语句为max(a,b); 仔细研究一下max(a,b)。 对于一个表达式来说,它要完成一定的功能,还要返回一个操作结果(即表达式的值)。如i++,它的功能是使变量i的值加1,它的值是i自增前的值。同样的,函数调用也同样如此:max(a,b)的功能是把实参a,b的值传递给形参并执行函数中的各个语句;max(a,b)的值是一个int类型的值。 ++i的值是i自增后的值,相当于i=i+1,return i;对于i++来说,它的值是i自增前的值,那么如何获得这个值呢?编译器是这样做的:编译器自动创建一个临时变量并用i自增前的值来初始化这个临时变量。用这个临时变量的值来作为i++这个表达式的值。 同样的,执行max(a,b)后,首先完成参数传递并执行函数max中的各条语句。接着创建一个int型的临时变量并用return expression中expression的值来初始化这个临时变量。临时变量的类型为函数的返回值类型,即函数名之前的类型名。对max()函数来说就是int。

几种常见窗函数及其MATLAB程序实现

几种常见窗函数及其MATLAB程序实现 2013-12-16 13:58 2296人阅读评论(0) 收藏举报 分类: Matlab(15) 数字信号处理中通常是取其有限的时间片段进行分析,而不是对无限长的信号进行测量和运算。具体做法是从信号中截取一个时间片段,然后对信号进行傅里叶变换、相关分析等数学处理。信号的截断产生了能量泄漏,而用FFT算法计算频谱又产生了栅栏效应,从原理上讲这两种误差都是不能消除的。在FFT分析中为了减少或消除频谱能量泄漏及栅栏效应,可采用不同的截取函数对信号进行截短,截短函数称为窗函数,简称为窗。 泄漏与窗函数频谱的两侧旁瓣有关,对于窗函数的选用总的原则是,要从保持最大信息和消除旁瓣的综合效果出发来考虑问题,尽可能使窗函数频谱中的主瓣宽度应尽量窄,以获得较陡的过渡带;旁瓣衰减应尽量大,以提高阻带的衰减,但通常都不能同时满足这两个要求。 频谱中的如果两侧瓣的高度趋于零,而使能量相对集中在主瓣,就可以较为接近于真实的频谱。不同的窗函数对信号频谱的影响是不一样的,这主要是因为不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样。信号的加窗处理,重要的问题是在于根据信号的性质和研究目的来选用窗函数。图1是几种常用的窗函数的时域和频域波形,其中矩形窗主瓣窄,旁瓣大,频率识别精度最高,幅值识别精度最低,如果仅要求精确读出主瓣频率,而不考虑幅值精度,则可选用矩形窗,例如测量物体的自振频率等;布莱克曼窗主瓣宽,旁瓣小,频率识别精度最低,但幅值识别精度最高;如果分析窄带信号,且有较强的干扰噪声,则应选用旁瓣幅度小的窗函数,如汉宁窗、三角窗等;对于随时间按指数衰减的函数,可采用指数窗来提高信噪比。表1 是几种常用的窗函数的比较。 如果被测信号是随机或者未知的,或者是一般使用者对窗函数不大了解,要求也不是特别高时,可以选择汉宁窗,因为它的泄漏、波动都较小,并且选择性也较高。但在用于校准时选用平顶窗较好,因为它的通带波动非常小,幅度误差也较小。

get,getline..

c++ cin、cin.get()、cin.getline()、getline()、gets()函数的用法2009年02月09日星期一 22:121、cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include using namespace std; main () { int a,b; cin>>a>>b; cout< using namespace std; main () { char a[20]; cin>>a; cout< using namespace std; main () { char ch;

ch=cin.get(); //或者cin.get(ch); cout< using namespace std; main () { char a[20]; cin.get(a,20); cout< using namespace std; main () { char m[20]; cin.getline(m,5); cout<

函数参数返回值总结

函数的参数、返回值总结 (一)参数 ◆函数分: 有参函数:函数名(实参列表) 无参函数:函数名() ◆有参函数调用语句中的实参应与被调函数中的形参在个数、类型、顺序上一致。 ◆参数传递时,实参向形参一一对应进行单向的值传递。值:可是数值(变量或数 组元素)或数值的地址值(指针或数组名)。 (二)返回值 函数的返回值即为函数调用后的结果,可有如下返回结果的方法: (1)通过return语句返回一个值; (2)利用地址做参数返回一个或多个值; (3)利用全局变量返回一个或多个值。 (三)例 1、170页实验内容(1):打印由正三角和倒三角组成的图形。 有一个参数,无返回值。实参向形参传递一个数值。 #include /* 有一个参数,无返回值的函数,打印正三角 */ void f1(int n) /* 形参只能是变量,用来接收实参传来的数值 */ { int i,j,k; for(k=1;k<=n;k++) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); printf("\n");} } /* 有一个参数,无返回值的函数,打印倒三角*/ void f2(int n) {int i,j,k; for(k=n;k>=1;k--) {for(i=1;i<=10-k;i++) printf(" "); for(j=1;j<=k;j++) printf(" *"); /*双引号内应为“空格加半角星号”*/ printf("\n");} } main() { int n; scanf("%d",&n);

弹拨音乐滤波去噪--使用三角窗设计FIR滤波器

长沙理工大学城南学院 《数字信号处理》课程设计报告 任健 院系城南学院专业通信工程班级通信1104班学号 2 学生姓名任健指导教师熊文杰 课程成绩完成日期2014年

7月4日

课程设计成绩评定 院系城南学院专业通信工程 班级通信1104班?学号201185250426 学生姓名任健指导教师熊文杰 完成日期2014 年7月 4 日 指导教师对学生在课程设计中的评价 指导教师对课程设计的评定意见

课程设计任务书 城南学院通信工程专业

语音信号滤波去噪——使用三角窗 设计FIR滤波器 学生姓名:任健指导老师:熊文杰 摘要本课程设计主要是通过使用三角窗设计一个FIR滤波器以对语音信号进行滤波去噪处理。本设计首先用麦克风采集一段语音信号,绘制波形并观察其频谱,给定相应技术指标,用三角窗设计一个满足指标的FIR滤波器,对该语言信号进行滤波去早处理,比较滤波前后的波形和频谱分析,根据结果和学过的理论的出合理的结论。通过对比滤波前后的波形图,深入了解滤波器的相关技术指标和性能,掌握设计滤波器的基本方法,通过程序调试及完善,该设计基本满足设计要求。 关键词MATLAB;三角窗;FIR滤波器;滤波去噪 1 引言 数字信号处理是将信号以数字方式表示并处理的理论和技术。数字信号处理与模拟信号处理是信号处理的子集。数字信号处理的目的是对真实世界的连续模拟信号进行测量或滤波。因此在进行数字信号处理之前需要将信号从模拟域转换到数字域,这通常通过模数转换器实现。而数字信号处理的输出经常也要变换到模拟域,这是通过数模转换器实现的[1]。 数字滤波器是一种用来过滤时间离散信号的数字系统,它是通过对抽样数据进行数学处理来达到频域滤波的目的。随着现代通信的数字化,数字滤波器变得更加重要。数字滤波器的种类很多,但总的来说可以分成两大类,一类是经典滤波器,另一类可称为现代滤波器。从滤波特性方面考虑,数字滤波器可分成数字

CPPstring类常用函数

C++string类常用函数 string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作: const char &operator[](int n)const; const char &at(int n)const; char &operator[](int n); char &at(int n); operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。 const char *data()const;//返回一个非null终止的c字符数组 const char *c_str()const;//返回一个以null终止的c字符串 int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目 string的特性描述: int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数) int max_size()const; //返回string对象中可存放的最大字符串的长度 int size()const; //返回当前字符串的大小 int length()const; //返回当前字符串的长度 bool empty()const; //当前字符串是否为空 void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分 string类的输入输出操作: string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。 函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。 string的赋值: string &operator=(const string &s);//把字符串s赋给当前字符串 string &assign(const char *s);//用c类型字符串s赋值 string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值 string &assign(const string &s);//把字符串s赋给当前字符串 string &assign(int n,char c);//用n个字符c赋值给当前字符串 string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串 string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部

C语言函数说明与返回值

C语言函数说明与返回值 在学习C语言函数以前,我们需要了解什么是模块化程序设计方法。 人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。 在C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现C语言程序。 利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。 函数是C语言的基本构件,是所有程序活动的舞台。函数的一般形式是: type-specifier function_name(parameter list) parameter declarations { body of the function } 类型说明符定义了函数中return语句返回值的类型,该返回值可以是任何有效类型。如果没有类型说明符出现,函数返回一个整型值。参数表是一个用逗号分隔的变量表,当函数被调用时这些变量接收调用参数的值。一个函数可以没有参数,这时函数表是空的。但即使没有参数,括号仍然是必须要有的。参数说明段定义了其中参数的类型。

当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句,通知编译程序这个函数返回什么值。下例示出了这种方法。 第一个函数的类型说明sum()函数返回浮点类型的数据。这个说明使编译程序能够对sum( ) 的调用产生正确代码。 函数类型说明语句的一般形式是: type_specifier function_name (; ) 即使函数使用形参,也不要将其写入说明句。若未使用类型说明语句,函数返回的数据类型可能与调用者所要求的不一致,其结果是难以预料的。如果两者同处于一个文件中,编译程序可以发现该错误并停止编译。如果不在同一个文件中,编译程序无法发现这种错误。类型检查仅在编译中进行,链接和运行时均不检查。因此,必须十分细心以确保绝不发生上

MATLAB各种“窗函数”定义及调用

MATLAB窗函数大全 1.矩形窗(Rectangle Window)调用格式:w=boxcar(n),根据长度n 产生一个矩形窗w。 2.三角窗(Triangular Window)调用格式:w=triang(n),根据长度n 产生一个三角窗w。 3.汉宁窗(Hanning Window)调用格式:w=hanning(n),根据长度n 产生一个汉宁窗w。 4.海明窗(Hamming Window)调用格式:w=hamming(n),根据长度n 产生一个海明窗w。 5.布拉克曼窗(Blackman Window)调用格式:w=blackman(n),根据长度n 产生一个布拉克曼窗w。 6.恺撒窗(Kaiser Window)调用格式:w=kaiser(n,beta),根据长度n 和影响窗函数旁瓣的β参数产生一个恺撒窗w。 窗函数: 1.矩形窗:利用w=boxcar(n)的形式得到窗函数,其中n为窗函数的长度,而返回值w为一个n阶的向量,它的元素由窗函数的值组成。‘w=boxcar(n)’等价于‘w=ones(1,n)’. 2.三角窗:利用w=triang(n)的形式得到窗函数,其中n为窗函数的长度,而返回值w为一个n阶的向量,它的元素由窗函数的值组成。 w=triang(N-2)等价于bartlett(N)。

3.汉宁窗:利用w=hanning(n)得到窗函数,其中n为窗函数的长度,而返回值w 为一个n 阶的向量,包含了窗函数的n个系数。 4.海明窗:利用w=hamming(n)得到窗函数,其中n为窗函数的长度,而返回值w 为一个n 阶的向量,包含了窗函数的n个系数。它和汉宁窗的主瓣宽度相同,但是它的旁瓣进一步被压低。 5.布拉克曼窗:利用w=blackman(n)得到窗函数,其中n为窗函数的长度,而返回值w为一个n阶的向量,包含了窗函数的n个系数。它的主瓣宽度是矩形窗主瓣宽度的3倍,为12*pi/N,但是它的最大旁瓣值比主瓣值低57dB。 6.切比雪夫窗:它是等波纹的,利用函数w=chebwin(N,R)方式设计出N阶的切比雪夫2窗函数,函数的主瓣值比旁瓣值高RdB,且旁瓣是等波纹的。 7.巴特里特窗:利用w=bartlett(n)的形式得到窗函数,其中n为窗函数的长度,而返回值w为一个n阶的向量,包含了窗函数的n个系数。 8.凯塞窗:利用w=kaiser(n,beta)的形式得到窗函数。

一次函数表达式与坐标

一次函数表达式与坐标(讲义) 一、 知识点睛 1. 一次函数表达式 直线(函数图象) 坐标 点 2. 坐标系中处理问题的原则 (1)坐标转线段长、线段长转坐标; (2)作横平竖直的线. 二、 精讲精练 1. 若点M 在函数y =2x -1的图象上,则点M 的坐标可能是( ) A .(-1,0) B .(0,-l) C .(1,-1) D .(2,4) 2. 若直线y =2x +1经过点(m +2,1-m ),则m =______. 3. 一次函数y =-2x +3与x 轴交于点_____,与y 轴交于点_____. 4. 在一次函数2 1 21+=x y 的图象上,与y 轴距离等于1的点的坐标为 __________________. 5. 若点(3,-4)在正比例函数y =kx 的图象上,那么这个函数的解析式为( ) A .43y x = B .43y x =- C .34y x = D .3 4 y x =- 6. 若正比例函数的图象经过点(-1,2),则这个图象必经过点( ) A .(1,2) B .(-1,-2) C .(2,-1) D .(1,-2) 7. 已知某个一次函数的图象过点A (-2,0),B (0,4),求这个函数的表达式. 8. 已知某个一次函数的图象过点A (3,0),B (0,-2),求这个函数的表达式. 9. 如图,直线l 是一次函数y =kx +b 的图象,填空: (1)k =______,b =______; (2)当x =4时,y =______; (3)当y =2时,x =______.

10. 已知y 是x 的一次函数,下表给出了部分对应值,则m 的值是________. 11. 一次函数y=kx +3的图象经过点A (1,2),则其解析式为____________. 12. 若一次函数y=2x+b 的图象经过点A (-1,1),则b =______,该函数图象经过 点B (1,___)和点C (_____,0). 13. 若直线y =kx +b 平行于直线y =3x +4,且过点(1,-2),则将y =kx+b 向下平移3 个单位得到的直线是_____________. 14. 在同一平面直角坐标系中,若一次函数y =-x +3与y =3x -5的图象交于点M , 则点M 的坐标为( ) A .(-1,4) B .(-1,2) C .(2,-1) D .(2,1) 15. 直线y =2x+b 经过直线y=x -2与直线y =3x +4的交点,则b 的值为( ) A .-11 B .-1 C .1 D .6 16. 当b=______时,直线y =2x +b 与y =3x -4的交点在x 轴上. 17. 一次函数y =kx +3的图象与坐标轴的两个交点间的距离为5,则k 的值为 __________. 18. 直线y =3x -1与两坐标轴围成的三角形的面积为_________. 19. 已知直线y =kx +b 经过(5,0),且与坐标轴所围成的三角形的面积为20,则 该直线的表达式为______________________. 20. 点A ,B ,C ,D 的坐标如图所示,求直线AB 与直线CD 的交点E 的坐标. 21. 如图,已知直线l 1:y =2x +3,直线l 2:y =-x +5,直线l 1,l 2分别交 x 轴于B , C 两点,l 1,l 2相交于点A . (1)求A ,B ,C 三点坐标; (2)S △ABC =________.

C++按行读取文本文件

#include #include #include < string > using namespace std; void OutPutAnEmptyLine()//输出空行 { cout<< "\n" ; } //读取方式: 逐词读取, 词之间用空格区分 void ReadDataFromFileWBW() { cout<<"逐词读取, 词之间用空格区分"<> s ) { cout<< "Read from file: " << s <

cout<<"逐行读取, 将行读入字符串, 行之间用回车换行区分"<

VBA函数返回值

VBA之函数返回值 1.返回一个值 Function define_yy(ByVal names As String, ByVal workbooks As String) As String Dim str_return As String '返回值 Dim i, t As Integer ........ ........ ........ ........ ........ define_yy = str_return End Function 对于函数返回值的要点已经用粗体表示出来了.调用此函数的格式为: call modle_connection.define_yy() (这个是不需要返回值的调用方法) bb=modle_connection.define_yy(a,b) (这是需要返回值的方法) 注:modle_connection为程序块名 2.返回值为多个值,可以采用返回数组的类型 Function return_data(ByVal strSEL As String, ByRef x As Integer) As String() '需要有括号,代表数组 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim bb(1000, 20) As String Dim i As Integer, j As Integer cn.Open strCN rs.Open strSEL, cn i = 1 Do While Not rs.EOF If x = 1 Then bb(i, 1) = rs(0) Else For j = 1 To x bb(i, j) = rs(j - 1) Next j End If i = i + 1 rs.MoveNext Loop x = i - 1 return_data = bb() 'BB()本身也需要定义为数组

窗函数设计低通滤波器 电信课设

XXXX大学 课程设计报告 学生姓名:xxx 学号:xxx 专业班级:电子信息工程 课程名称:数字信号处理课程设计 学年学期20XX——20XX 学年第X学期指导教师:xxx 2014年6月

课程设计成绩评定表 学生姓名XXX 学号XXXXXX 成绩 专业班级XXXXX 起止时间20XX-X-X至20XX-X-XX 设计题目1.窗函数设计低通滤波器 2.用哈明窗设计FIR带通数字滤波器 指 导 教 师 评 语 指导教师: 年月日

目录 1. 窗函数设计低通滤波器 1.1设计目的 (1) 1.2设计原理推导与计算 (1) 1.3设计内容与要求 (2) 1.4设计源程序与运行结果 (3) 1.5思考题 (10) 2. 用哈明窗设计FIR带通数字滤波器 2.1设计要求 (14) 2.2设计原理和分析 (14) 2.3详细设计 (15) 2.4调试分析及运行结果 (15) 2.5心得体会 (17) 参考文献 (17)

1.窗函数设计低通滤波器 1.1设计目的 1. 熟悉设计线性相位数字滤波器的一般步骤。 2. 掌握用窗函数法设计FIR 数字滤波器的原理和方法。 3. 熟悉各种窗函数的作用以及各种窗函数对滤波器特性的影响。 4. 学会根据指标要求选择合适的窗函数。 1.2设计原理推导与计算 如果所希望的滤波器的理想的频率响应函数为() ωj d e H ,则其对应的单位脉冲响应为 ()() ωπ ωωπ π d e e H n h j j d d ?- = 21 (4.1) 窗函数设计法的基本原理是设计设计低通FIR 数字滤波器时,一般以理想低通滤波特性为逼近函数()ωj e H ,即 () ?????≤<≤=-π ωωωωωαω c c j j d ,, e e H 0,其中21-=N α ()() ()[]() a n a n d e e d e e H n h c j j j j d d c c --= = = ??- -- πωωπ ωπ ωαωω ωαω π π ω sin 21 21 用有限长单位脉冲响应序列()n h 逼近()n h d 。由于()n h d 往往是无限长序列,而且是非因果的,所以用窗函数()n ω将()n h d 截断,并进行加权处理,得到: ()()()n n h n h d ω= (4.2) ()n h 就作为实际设计的FIR 数字滤波器的单位脉冲响应序列,其频率响应函 数()ωj e H 为 ()()n j N n j e n h e H ωω ∑-==1 (4.3) 式中,N 为所选窗函数()n ω的长度。 用窗函数法设计的滤波器性能取决于窗函数()n ω的类型及窗口长度N 的取

平面直角坐标系与函数知识要点归纳

平面直角坐标系与函数知识要点归纳 怎样确定自变量的取值范围

函数自变量的取值范围是使函数解析式有意义的自变量的所有可能取值,它是一个函数被确定的重要因素。求函数自变量的取值范围通常有以下七种方法: 一、整式型:当函数解析是用自变量的整式表示时,自变量的取值范围是一切实数。 例1. 求下列函数中自变量x 的取值范围:(1);(2) 5 3213-=x y )( 二、分式型:当函数解析式是用自变量的分式表示时,自变量的取值范围应使分母不为零。 例2. 函数中,自变量x 的取值范围是________。 三、偶次根式型(主要是二次根式): 当函数解析式是用自变量的二次根式表示时,自变量的取值应使被开方数非负。 例3. 函数中,自变量x 的取值范围是________。 四、零指数或负指数: 当函数解析式是用自变量的零指数或负指数表示时,自变量的取值应使零指数或负指数的底数不为零。 例4、函数y=3x +(2x-1)0+(-x +3)-2 五、综合型:当函数解析式中含有整式、分式、二次根式、零指数或负指数时,要综合考虑,取它们的公共部分。 的取值范围是中,自变量、函数例x x x x x y 20 )3(1)2(5-++---= 。 六、实际问题型:当函数解析式与实际问题挂钩时,自变量的取值范围应使解析式具有实际意义。 例6. 拖拉机的油箱里有油54升,使用时平均每小时耗油6升,求油箱中剩下的油y (升)与使用时间t (小时)之间的函数关系式及自变量t 的取值范围。 七、几何问题型:当函数解析式与几何问题挂钩时,自变量的取值范围应使解析式具有几何意义。 例7. 等腰三角形的周长为20,腰长为x ,底边长为y 。求y 与x 之间的函数关系式及自变量x 的取值范围。

C++读取txt文件资料

c++学习笔记—c++对txt文件的读取与写入 标签:c++IO 2015-01-13 17:43 1880人阅读评论(0) 收藏举报分类: c/c++编程(8) 声明:本文为博主原创文章,未经博主允许不得。 一、文件的输入输出 头文件fstream定义了三个类型支持文件IO:ifstream从给定文件读取数据、ofstream向一个给定文件写入数据、fstream读写给定数据。这些类型与cin和cout 的操作一样,我们可以用IO操作符来读写文件,还可以用getline从一个ifstream 读取数据。 1、getline()函数 getline的函数原型为: [cpp]view plain copy 1.istream& getline(istream& is, string& str, char delim); 2.istream& getline(istream&& is, string& str, char delim); 3.istream& getline(istream& is, string& str); 4.istream& getline(istream&& is, string& str); 通常我们使用getline函数读取一整行,该函数接受一个输入流和一个string对象, 函数从给定的输入流中读取容,直到遇到换行符为止,然后将所读的容存入到个string对象中。 另外,当函数为istream& getline (istream& is, string& str, char delim);形式时,函数遇到delim也会停止。 2、使用文件流对象

C++ 中cin 输入流的多种函数用法

[语法]C++ 中cin 输入流的多种函数用法cin、cin.get()、cin.getline()、getline()、gets()函数的用法 1、cin>> 用法1:最基本,也是最常用的用法,输入一个数字: #include using namespace std; main () { int a,b; cin>>a>>b; cout< using namespace std; main ()

{ char a[20]; cin>>a; cout< using namespace std; main () { char ch; ch=cin.get(); //或者cin.get(ch); cout<

输入:jljkljkl 输出:j 用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格 #include using namespace std; main () { char a[20]; cin.get(a,20); cout<

函数练习题(C语言)带答案

C语言函数练习题 一、选择题 1. 一个完整的C源程序是【】。 A)要由一个主函数或一个以上的非主函数构成 B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【】。 A)C语言程序将从源程序中第一个函数开始执行 B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【】。 A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【】。 A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现 C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置 5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【】。 A)函数未被调用时,系统将不为形参分配内存单元 B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式 7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是 【】。 A)参数的形实结合 B)函数返回值 C)全局变量 D)同名的局部变量 8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【】。 A)实参与其对应的形参共占存储单元 B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元 D)实参将数据传递给形参后,立即释放原先占用的存储单元

相关文档
相关文档 最新文档