13.1 输入三角形的三边a,b,c,计算三角形的面积的公式是
area=√(s(s−a)(s−b)(s−c))
s=(a+b+c)/2
构成三角形的条件是:a+b>c, b+c>a, c+a>b
编写程序,输入a,b,c,检查a,b,c是否满足以上条件,如不满足,由cerr输出有关出错信息。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double a, b, c, s, area;
cout << "Please enter a, b, c: ";
cin >> a >> b >> c;
if ((a + b) <= c || (b + c) <= a || (c + a) <= b)
cerr << "Error!" << endl;
else
{
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
cout << "area=" << area << endl;
}
return 0;
}
13.2 从键盘输入一批数值,要求保留3位小数,在输出时上下行小数点对齐。
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
float a[5];
int i;
cout << "input data:";
for (i = 0; i < 5; i++)
cin >> a[i];
cout << setiosflags(ios::fixed) << setprecision(3);
for (i = 0; i < 5; i++)
cout << setw(10) << a[i] << endl;
return 0;
}
13.3 编写程序,在显示屏上显示一个由字母B组成的三角形。
#include<iostream>
#include<iomanip> //用于输出控制符
using namespace std;
int main()
{
for (int n = 1; n < 8; n++)
{
cout << setw(20 - n) << setfill(' ') << " " << setw(2 * n - 1) << setfill('B') << "B" << endl;
/*第一行:域宽19的空格(最后一位为空格,之前用空格填充,最终20个空格),域宽1(最后的一个B)*/
}
return 0;
}
13.4 建立两个磁盘文件f1.dat和f2.dat,编写程序实现以下工作:
(1)从键盘输入20个整数,分别存放在两个磁盘文件中(每个文件中放10个整数);
(2)从f1.dat读入10个数,然后存放到f2.dat文件原有数据的后面。
(3)从f2.dat中读入20个整数,将它们按从小到大的顺序存放到f2.dat中(不保留原来的数据)。
#include <iostream>
#include <fstream>
using namespace std;
//fun1函数从键盘输入20个整数,分别存放在两个磁盘文件中
void fun1()
{
int a[10];
int i;
ofstream outfile1("f1.dat"), outfile2("f2.dat"); //分别定义两个文件流对象
if (!outfile1) //检查打开f1.dat是否成功
{
cerr << "open f1.dat error!" << endl;
exit(1);
}
if (!outfile2) //检查打开f2.dat是否成功
{
cerr << "open f2.dat error!" << endl;
exit(1);
}
cout << "enter 10 integer numbers:" << endl;
for (i = 0; i < 10; i++) //输入10个数存放到f1.dat文件中
{
cin >> a[i];
outfile1 << a[i] << " ";
}
cout << "enter 10 integer numbers:" << endl;
for (i = 0; i < 10; i++) //输入10个数存放到f2.dat文件中
{
cin >> a[i];
outfile2 << a[i] << " ";
}
outfile1.close(); //关闭f1.dat文件
outfile2.close(); //关闭f2.dat文件
}
//从f1,dat读入10个数,然后存放到f2.dat文件原有数据的后面
void fun2()
{
ifstream infile("f1.dat"); //f1.dat作为输入文件
if (!infile)
{
cerr << "open f1.dat error!" << endl;
exit(1);
}
ofstream outfile("f2.dat", ios::app);/*ios::app 追加模式打开文件夹, 以ios::app打开,如果没有文件,那么生成空文件;如果有文件,那么在文件尾追加*/
//f2.dat作为输出文件,文件指针指向文件尾,向它写入的数据放在原来数据的后面
if (!outfile)
{
cerr << "open f2.dat error!" << endl;
exit(1);
}
int a;
for (int i = 0; i < 10; i++)
{
infile >> a; //磁盘文件f2.dat读入一个整数
outfile << a << " "; //将该数存放到f2.dat中
}
infile.close();
outfile.close();
}
//从f2.dat中读入20个整数,将它们按从小到大的顺序存放到f2.dat
void fun3()
{
ifstream infile("f2.dat"); //定义输入文件流infile,以输入方式打开f2.dat
if (!infile)
{
cerr << "open f2.dat error!" << endl;
exit(1);
}
int a[20];
int i, j, t;
for (i = 0; i < 20; i++)
infile >> a[i]; //从磁盘文件f2.dat读入20个数放在数组a中
for (i = 0; i < 19; i++) //用起泡法对20个数排序
for (j = 0; j < 19 - i; j++)
if (a[j] > a[j + 1])
{
t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
}
infile.close(); //关闭输入文件f2.dat
ofstream outfile("f2.dat", ios::out);/*或ofstream outfile("f2.dat");*/
// f2.dat作为输出文件,文件中原有内容删除
if (!outfile)
{
cerr << "open f2.dat error!" << endl;
exit(1);
}
cout << "data in f2.dat:" << endl;
for (i = 0; i < 20; i++)
{
outfile << a[i] << " "; //向f2.dat输出已排序的20个数
cout << a[i] << " ";
} //同时输出到显示器
cout << endl;
outfile.close();
}
int main()
{
fun1(); //分别调用3个函数
fun2();
fun3();
return 0;
}
13.5 编写程序实现以下功能:
(1)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄、工资)输出到磁盘文件中保存。
(2)从键盘输入两个员工的数据(职工号大于已有的职工号),增加到文件的末尾。
(3)输出文件中全部职工的数据。
(4)从键盘输入一个号码,在文件中查找有无此职工号,如有则显示此职工是第几个职工,以及此职工的全部数据。如没有,就输出“无此人”。可以反复多次查询,如果输入查找的职工号为0,就结束查询。
#include<iostream>
#include<fstream>
using namespace std;
struct staff
{
int num;
char name[20];
int age;
double pay;
};
int main()
{
staff staf[7] =
{
2101,"Li",34,1203,
2104,"Wang",23,674.5,
2108,"Fun",54,778,
3006,"Xue",45,476.5,
5101,"Ling",39,656.6
}, staf1;
ofstream outfile1("staff.dat"); //分别定义文件流对象 建立文件
if (!outfile1) //检查打开staff.dat是否成功
{
cerr << "open staff.dat error!" << endl;
exit(1);
}
ofstream outfile("staff.dat", ios::out); //清空文件原有数据
fstream iofile("staff.dat", ios::in | ios::out | ios::binary);
if (!iofile)
{
cerr << "open error!" << endl;
abort();
}
int i, m, num;
cout << "Five staff:" << endl;
for (i = 0; i < 5; i++)
{
cout << staf[i].num << " " << staf[i].name << " " << staf[i].age << " " << staf[i].pay << endl;
iofile.write((char*)&staf[i], sizeof(staf[i]));
}
cout << "please input 2 staff data you want to insert:" << endl;
iofile.seekp(0, ios::end);
for (i = 0; i < 2; i++)
{
cin >> staf1.num >> staf1.name >> staf1.age >> staf1.pay;
iofile.write((char*)&staf1, sizeof(staf1));
}
cout << "Seven staff:" << endl;
iofile.seekg(0, ios::beg);
for (i = 0; i < 7; i++)
{
iofile.read((char*)&staf[i], sizeof(staf[i]));
cout << staf[i].num << " " << staf[i].name << " " << staf[i].age << " " << staf[i].pay << endl;
}
bool find;
cout << "enter number you want search,enter 0 to stop.";
cin >> num;
while (num)
{
find = false;
iofile.seekg(0, ios::beg);//ios::beg 从开头开始
for (i = 0; i < 7; i++)
{
iofile.read((char*)&staf[i], sizeof(staf[i]));
if (num == staf[i].num)
{
m = iofile.tellg();
cout << num << " is No." << m / sizeof(staf1) << endl;
cout << staf[i].num << " " << staf[i].name << " " << staf[i].age << " " << staf[i].pay << endl;
find = true;
break;
}
}
if (!find)
cout << "not found the stuff" << endl;
cout << "enter number you want search,enter 0 to stop.";
cin >> num;
}
iofile.close();
return 0;
}
13.6 在例13.14的基础上,修改程序,将存放在c数组中的数据读入并显示出来。
#include<iostream>
#include<sstream>//这是最新的头文件
#include<cstring>
using namespace std;
struct student
{
int num;
char name[20];
double score;
};
int main()
{
student stud[3] =
{
1001,"Li",78,
1002,"Wang",89.5,
1004,"Fang",90
}, stud1[3];
char c[50] = { 0 };
int i;
ostringstream strout;
for (i = 0; i < 3; i++)
{
strout << stud[i].num << " " << stud[i].name << " " << stud[i].score << " ";
}
strout << ends;
strcpy(c, strout.str().c_str());
cout << "array c:" << endl << c << endl << endl;
istringstream strin(c);
for (i = 0; i < 3; i++)
{
strin >> stud1[i].num >> stud1[i].name >> stud1[i].score;
}
cout << "data from array c to array stud1:" << endl;
for (i = 0; i < 3; i++)
{
cout << stud1[i].num << " " << stud1[i].name << " " << stud1[i].score << endl;
}
cout << endl;
return 0;
}
<sstream>库定义了三种类:
istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。
另外,每个类都有一个对应的宽字符集版本。注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。