例13.1 有一元二次方程ax2+bx+c=0,其一般解为
x1,2=-b±b2-4ac[]2a,但若a=0,或b2-4ac<0时,用此公式出错。
编程序,从键盘输入a,b,c的值,求x1和x2。如果a=0或b2-4ac<0,输出出错信息。
可写出以下程序:
#include <iostream>
#include <cmath>
usingnamespacestd;
intmain( )
{floata,b,c,disc;
cout<<"please input a,b,c:";
cin>>a>>b>>c;
if(a==0)
cerr<<"a is equal to zero,error!"<<endl;
//将有关出错信息插入cerr流,在屏幕输出
else
if((disc=b*b-4*a*c)<0)
cerr<<"disc=b*b-4*a*c<0"<<endl; //将有关出错信息插入cerr流,在屏幕输出
else
{cout<<"x1="<<(-b+sqrt(disc))/(2*a)<<endl;
cout<<"x2="<<(-b-sqrt(disc))/(2*a)<<endl;
}
return0;
}
例13.10用ignore函数跳过输入流中的字符。
先看不用ignore函数的情况:
#include <iostream>
usingnamespacestd;
intmain( )
{charch[20];
cin.get(ch,20,'/');
cout<<"The first part is:"<<ch<<endl;
cin.get(ch,20,'/');
cout<<"The second part is:"<<ch<<endl;
return0;
}
将程序改为
#include <iostream>
usingnamespacestd;
intmain( )
{charch[20];
cin.get(ch,20,'/');
cout<<"The first part is:"<<ch<<endl;
cin.ignore( );//跳过输入流中一个字符
cin.get(ch,20,'/');
cout<<"The second part is:"<<ch<<endl;
return0;
}
例13.11 有一个整型数组,含10个元素,从键盘输入10个整数给数组,将此数组送到磁盘文件中存放。
#include <fstream>
usingnamespacestd;
intmain( )
{inta[10];
ofstream outfile("f1.dat",ios::out);//定义文件流对象,打开磁盘文件"f1.dat"
if(!outfile) //如果打开失败,outfile返回0值
{cerr<<"open error!"<<endl;
exit(1);
}
cout<<"enter 10 integer numbers:"<<endl;
for(inti=0;i<10;i++)
{cin>>a[i];
outfile<<a[i]<<" ";} //向磁盘文件"f1.dat"输出数据
outfile.close(); //关闭磁盘文件"f1.dat"
return0;
}
例13.12 从例13.11建立的数据文件f1.dat中读入10个整数放在数组中,找出并输出10个数中的最大者和它在数组中的序号。
#include <fstream>
intmain( )
{inta[10],max,i,order;
ifstream infile("f1.dat",ios::in|ios::nocreate);
//定义输入文件流对象,以输入方式打开磁盘文件f1.dat
if(!infile)
{cerr<<"open error!"<<endl;
exit(1);
}
for(i=0;i<10;i++)
{infile>>a[i];//从磁盘文件读入10个整数,顺序存放在a数组中
cout<<a[i]<<" ";} //在显示器上顺序显示10个数
cout<<endl;
max=a[0];
order=0;
for(i=1;i<10;i++)
if(a[i]>max)
{max=a[i]; //将当前最大值放在max中
order=i; //将当前最大值的元素序号放在order中
}
cout<<"max="<<max<<endl<<"order="<<order<<endl;
infile.close();
return0;
}
例13.13 从键盘读入一行字符,把其中的字母字符依次存放在磁盘文件f2.dat中。再把它从磁盘文件读入程序,将其中的小写字母改为大写字母,再存入磁盘文件f3.dat。
#include <fstream>
usingnamespacestd;
// save_to_file函数从键盘读入一行字符,并将其中的字母存入磁盘文件
voidsave_to_file( )
{ofstream outfile("f2.dat");
//定义输出文件流对象outfile,以输出方式打开磁盘文件f2.dat
if(!outfile)
{cerr<<"open f2.dat error!"<<endl;
exit(1);
}
charc[80];
cin.getline(c,80);//从键盘读入一行字符
for(inti=0;c[i]!=0;i++) //对字符逐个处理,直到遇'/0'为止
if(c[i]>=65&& c[i]<=90||c[i]>=97&& c[i]<=122)//如果是字母字符
{outfile.put(c[i]); //将字母字符存入磁盘文件f2.dat
cout<<c[i];} //同时送显示器显示
cout<<endl;
outfile.close(); //关闭f2.dat
}
//从磁盘文件f2.dat读入字母字符,将其中的小写字母改为大写字母,再存入f3.dat
voidget_from_file()
{charch;
ifstream infile("f2.dat",ios::in|ios::nocreate);
//定义输入文件流outfile,以输入方式打开磁盘文件f2.dat
if(!infile)
{cerr<<"open f2.dat error!"<<endl;
exit(1);
}
ofstream outfile("f3.dat");
//定义输出文件流outfile,以输出方式打开磁盘文件f3.dat
if(!outfile)
{cerr<<"open f3.dat error!"<<endl;
exit(1);
}
while(infile.get(ch))//当读取字符成功时执行下面的复合语句
{if(ch>=97&& ch<=122) //判断ch是否为小写字母
ch=ch-32; //将小写字母变为大写字母
outfile.put(ch); //将该大写字母存入磁盘文件f3.dat
cout<<ch; //同时在显示器输出
}
cout<<endl;
infile.close( ); //关闭磁盘文件f2.dat
outfile.close(); //关闭磁盘文件f3.dat
}
intmain( )
{save_to_file( );
//调用save_to_file( ),从键盘读入一行字符并将其中的字母存入磁盘文件f2.dat
get_from_file( );
//调用get_from_file(),从f2.dat读入字母字符,改为大写字母,再存入f3.dat
return0;
}
例13.14 将一批数据以二进制形式存放在磁盘文件中。
#include <fstream>
usingnamespacestd;
structstudent
{charname[20];
intnum;
intage;
charsex;
};
intmain( )
{student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'};
ofstream outfile("stud.dat",ios::binary);
if(!outfile)
{cerr<<"open error!"<<endl;
abort( );//退出程序
}
for(inti=0;i<3;i++)
outfile.write((char*)&stud[i],sizeof(stud[i]));
outfile.close( );
return0;
}
例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。
#include <fstream>
usingnamespacestd;
structstudent
{string name;
intnum;
intage;
charsex;
};
intmain( )
{student stud[3];
inti;
ifstream infile("stud.dat",ios::binary);
if(!infile)
{cerr<<"open error!"<<endl;
abort( );
}
for(i=0;i<3;i++)
infile.read((char*)&stud[i],sizeof(stud[i]));
infile.close( );
for(i=0;i<3;i++)
{cout<<"NO."<<i+1<<endl;
cout<<"name:"<<stud[i].name<<endl;
cout<<"num:"<<stud[i].num<<endl;;
cout<<"age:"<<stud[i].age<<endl;
cout<<"sex:"<<stud[i].sex<<endl<<endl;
}
return0;
}
例13.16 有5个学生的数据,要求:
(1)把它们存到磁盘文件中;
(2)将磁盘文件中的第1,3,5个学生数据读入程序,并显示出来;
(3)将第3个学生的数据修改后存回磁盘文件中的原有位置。
(4)从磁盘文件读入修改后的5个学生的数据并显示出来。
#include <fstream>
usingnamespacestd;
structstudent
{intnum;
charname[20];
floatscore;
};
intmain( )
{student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,
1006,"Tan",76.5,1010,"ling",96};
fstream iofile("stud.dat",ios::in|ios::out|ios::binary);
//用fstream类定义输入输出二进制文件流对象iofile
if(!iofile)
{cerr<<"open error!"<<endl;
abort( );
}
for(inti=0;i<5;i++)//向磁盘文件输出5个学生的数据
iofile.write((char*)&stud[i],sizeof(stud[i]));
student stud1[5]; //用来存放从磁盘文件读入的数据
for(inti=0;i<5;i=i+2)
{iofile.seekg(i*sizeof(stud[i]),ios::beg); //定位于第0,2,4学生数据开头
iofile.read((char*)&stud1[i/2],sizeof(stud1[0]));
//先后读入3个学生的数据,存放在stud1[0],stud[1]和stud[2]中
cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl;
//输出stud1[0],stud[1]和stud[2]各成员的值
}
cout<<endl;
stud[2].num=1012; //修改第3个学生(序号为2)的数据
strcpy(stud[2].name,"Wu");
stud[2].score=60;
iofile.seekp(2*sizeof(stud[0]),ios::beg); //定位于第3个学生数据的开头
iofile.write((char*)&stud[2],sizeof(stud[2])); //更新第3个学生数据
iofile.seekg(0,ios::beg); //重新定位于文件开头
for(inti=0;i<5;i++)
{iofile.read((char*)&stud[i],sizeof(stud[i])); //读入5个学生的数据
cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl;
}
iofile.close( );
return0;
}
例13.17 将一组数据保存在字符数组中。
#include <strstream>
usingnamespacestd;
structstudent
{intnum;
charname[20];
floatscore;
}
intmain( )
{student stud[3]={1001,"Li",78,1002,"Wang",89.5,1004,"Fun",90};
charc[50];//用户定义的字符数组
ostrstream strout(c,30); //建立输出字符串流,与数组c建立关联,缓冲区长30
for(inti=0;i<3;i++) //向字符数组c写3个学生的数据
strout<<stud[i].num<<stud[i].name<<stud[i].score;
strout<<ends; //ends是C++的I/O操作符,插入一个'\\0'
cout<<"array c:"<<c<<endl; //显示字符数组c中的字符
}
例13.18 在一个字符数组c中存放了10个整数,以空格相间隔,要求将它们放到整型数组中,再按大小排序,然后再存放回字符数组c中。
#include <strstream>
usingnamespacestd;
intmain( )
{charc[50]="12 34 65 -23 -32 33 61 99 321 32";
inta[10],i,j,t;
cout<<"array c:"<<c<<endl;//显示字符数组中的字符串
istrstream strin(c,sizeof(c)); //建立输入串流对象strin并与字符数组c关联
for(i=0;i<10;i++)
strin>>a[i]; //从字符数组c读入10个整数赋给整型数组a
cout<<"array a:";
for(i=0;i<10;i++)
cout<<a[i]<<" "; //显示整型数组a各元素
cout<<endl;
for(i=0;i<9;i++) //用起泡法对数组a排序
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
ostrstream strout(c,sizeof(c)); //建立输出串流对象strout并与字符数组c关联
for(i=0;i<10;i++)
strout<<a[i]<<" "; //将10个整数存放在字符数组c
strout<<ends; //加入'\\0'
cout<<"array c:"<<c<<endl; //显示字符数组c
return0;
}
例13.2 用控制符控制输出格式。
#include <iostream>
#include <iomanip>//不要忘记包含此头文件
usingnamespacestd;
intmain()
{inta;
cout<<"input a:";
cin>>a;
cout<<"dec:"<<dec<<a<<endl; //以十进制形式输出整数
cout<<"hex:"<<hex<<a<<endl; //以十六进制形式输出整数a
cout<<"oct:"<<setbase(8)<<a<<endl; //以八进制形式输出整数a
char*pt="China"; //pt指向字符串"China"
cout<<setw(10)<<pt<<endl; //指定域宽为10,输出字符串
cout<<setfill('*')<<setw(10)<<pt<<endl; //指定域宽10,输出字符串,空白处以'*'填充
doublepi=22.0/7.0; //计算pi值
cout<<setiosflags(ios::scientific)<<setprecision(8);//按指数形式输出,8位小数
cout<<"pi="<<pi<<endl; //输出pi值
cout<<"pi="<<setprecision(4)<<pi<<endl; //改为4位小数
cout<<"pi="<<setiosflags(ios::fixed)<<pi<<endl;//改为小数形式输出
return0;
}
例13.3 用流控制成员函数输出数据。
#include <iostream>
usingnamespacestd;
intmain( )
{inta=21
cout.setf(ios::showbase);//显示基数符号(0x或0)
cout<<"dec:"<<a<<endl; //默认以十进制形式输出a
cout.unsetf(ios::dec); //终止十进制的格式设置
cout.setf(ios::hex); //设置以十六进制输出的状态
cout<<"hex:"<<a<<endl; //以十六进制形式输出a
cout.unsetf(ios::hex); //终止十六进制的格式设置
cout.setf(ios::oct); //设置以八进制输出的状态
cout<<"oct:"<<a<<endl; //以八进制形式输出a
cout.unseft(ios::oct);
char*pt="China"; //pt指向字符串"China"
cout.width(10); //指定域宽为10
cout<<pt<<endl; //输出字符串
cout.width(10); //指定域宽为10
cout.fill('*'); //指定空白处以'*'填充
cout<<pt<<endl; //输出字符串
doublepi=22.0/7.0; //输出pi值
cout.setf(ios::scientific); //指定用科学记数法输出
cout<<"pi="; //输出"pi="
cout.width(14); //指定域宽为14
cout<<pi<<endl; //输出pi值
cout.unsetf(ios::scientific); //终止科学记数法状态
cout.setf(ios::fixed); //指定用定点形式输出
cout.width(12); //指定域宽为12
cout.setf(ios::showpos); //正数输出“+”号
cout.setf(ios::internal); //数符出现在左侧
cout.precision(6); //保留6位小数
cout<<pi<<endl; //输出pi,注意数符“+”的位置
return0;
}
例13.4 有一个字符串"BASIC",要求把它们按相反的顺序输出。
#include <iostream>
usingnamespacestd;
intmain( )
{char*a="BASIC";//字符指针指向'B'
for(inti=4;i>=0;i--)
cout.put(*(a+i)); //从最后一个字符开始输出
cout.put('\\n');
return0;
}
例13.5 通过测试cin的真值,判断流对象是否处于正常状态。
#include <iostream>
usingnamespacestd;
intmain( )
{floatgrade;
cout<<"enter grade:";
while(cin>>grade)//能从cin流读取数据
{if(grade>=85) cout<<grade<<"GOOD!"<<endl;
if(grade<60) cout<<grade<<"fail!"<<endl;
cout<<"enter grade:";
}
cout<<"The end."<<endl;
return0;
}
例13.6 用get函数读入字符。
#include <iostream>
intmain( )
{intc;
cout<<"enter a sentence:"<<endl;
while((c=cin.get())!=EOF)
cout.put(c);
return0;
}
例13.7 用getline函数读入一行字符。
#include <iostream>
usingnamespacestd;
intmain( )
{charch[20];
cout<<"enter a sentence:"<<endl;
cin>>ch;
cout<<"The string read with cin is:"<<ch<<endl;
cin.getline(ch,20,'/');//读19个字符或遇'/'结束
cout<<"The second part is:"<<ch<<endl;
cin.getline(ch,20); //读19个字符或遇'/n'结束
cout<<"The third part is:"<<ch<<endl;
return0;
}
例13.8 逐个读入一行字符,将其中的非空格字符输出。
#include <iostream>
usingnamespacestd;
intmain( )
{charc;
while(!cin.eof( ))//eof( )为假表示未遇到文件结束符
if((c=cin.get( ))!=' ') //检查读入的字符是否为空格字符
cout.put(c);
return0;
}
例13.9 peek函数和putback函数的用法。
#include <iostream>
usingnamespacestd;
intmain( )
{charc[20];
intch;
cout<<"please enter a sentence:"<<endl;
cin.getline(c,15,'/');
cout<<"The first part is:"<<c<<endl;
ch=cin.peek( );//观看当前字符
cout<<"The next character(ASCII code) is:"<<ch<<endl;
cin.putback(c[0]); //将'I'插入到指针所指处
cin.getline(c,15,'/');
cout<<"The second part is:"<<c<<endl;
return0;
}