第十二次作业

目录

1. 编写一个程序,可以读入一个C++语言的源文件

2. 假定有两个文本文件("a.txt"、"b.txt"),请编程将它们合并为第三个文本文件("c.txt")

3.由键盘输入n和m,编程将n~m之间的素数保存到一个文本文件("sushu.txt")中

4. 已经有一个文本文件("data.txt"),内容包括多名学生的信息

5.一个文本文件有多行信息,编写程序读取其内容,统计最长的一行信息和最短的一行信息各有多少个字符

6. 假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中

7.编写一个程序,要求读出一个cpp文件中的C++语法保留字(至少10个)到另一个文本文件中。 比如:main、while、return、...

8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中, 不同行的内容保存到第五个文本文件中


题目内容

1. 编写一个程序,可以读入一个C++语言的源文件

每一行加上行号后保存到另一个后缀为.prn的同名文件中。

#include<iostream>
#include<fstream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
	
	//打开文件
	ifstream fin("3-1.cpp");
	ofstream fout;
	char filename[20] = "3-1.prn"; //string 不能作为文件名输入...;  
	fout.open(filename,ios::app|ios::out);
	if(!fin||!fout)
	{
		cout<<"不可以打开文件"<<endl;
		return 1;
	}
	//读文件
	char ch[100];
	while(fin)
	{
		if(fin)
		{
		fin.getline(ch,99);	//这里的fin.getline有点类似cin.getline,可以保留空格的那种,如果是普通的,就是单个字符,遇到空格会分开 
		cout<<ch<<'\n';
		fout<<ch<<'\n';
		}
	}
	//关闭文件
	fin.close();
	fout.close();
	cout<<"已经输出";
	return 0;
	 
	 
}

2. 假定有两个文本文件("a.txt"、"b.txt"),请编程将它们合并为第三个文本文件("c.txt"

合并规则如下:

交替取前两个文本文件的每一行,并依次放入第三个文本文件中。

第3个文件的内容如下:

第1文件的第1

第2文件的第1

第1文件的第2

第2文件的第2

......

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	//open
	ifstream f1("3-1.cpp"), f2("3-2.cpp");
	ofstream f3;
	f3.open("c.txt",ios::out|ios::app);
	if(!f1||!f2||!f3)
	{
		cout<<"文件打开失败"<<endl; 
		return 1;
	}
	//operate
	while(f1&&f2)
	{
		if(f1&&f2){
		char x[100],y[100];
		f1.getline(x,99);
		f2.getline(y,99);
		f3<<x<<'\n'<<y<<'\n';
		cout<<x<<'\n'<<y<<'\n';		
		}

	}
	//close
	f1.close();
	f2.close();
	f3.close();
	cout<<"ok";
	return 0;
}

3.由键盘输入n和m,编程将n~m之间的素数保存到一个文本文件("sushu.txt")中

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
bool issushu(int x)
{
	bool flag=true;
	for(int i = 2;i<=x/2;i++)
	{
		if(x%i==0)
		{
			flag=false;
			return flag;
		}
	}
	return flag;
}
int main()
{
	ofstream f1;
	f1.open("sushu.txt",ios::out|ios::app);
	int n,m;
	cout<<"please input n and m:";
	cin>>n>>m;
	for(int i=n;i<m+1;i++)
	{
		if(issushu(i))
		{
			f1<<i<<'\n';
		}
		
	 } 
	 return 0;
	
}

4. 已经有一个文本文件("data.txt"),内容包括多名学生的信息

学号、姓名、班级、分数1、分数2、分数3

请读取其中的每个学生信息,计算总分并显示出来。

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
int main()
{
	ifstream f1;
	char num[20];
	char name[20];
	char banji[10];
	int score1,score2,score3;
	while(f1)
	{
		if(f1)
		{
			f1>>num>>name>>banji>>score1>>score2>>score3;
			cout<<num<<'\t'<<name<<'\t'<<banji<<'\t'<<score1<<'\t'<<score2<<'\t'<<score3;
			int all_score;
			all_score=score1+score2+score3;
			cout<<'\t'<<all_score<<endl;
		}
	}
	return 0;
}

5.一个文本文件有多行信息,编写程序读取其内容,统计最长的一行信息和最短的一行信息各有多少个字符

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstring>
using namespace std;
int main()//对于char 数组,sizeof和strlen 不一样 
{
	ifstream f1("3-1.cpp");
	char temp[1000];
	int max,min;
	f1.getline(temp,999);
	max=strlen(temp);
	min=strlen(temp);
	while(f1)
	{
		if(f1)
		{
			f1.getline(temp,999);
			//cout<<'\n'<<temp<<'\n';
			if(max<strlen(temp))
			{
				max=strlen(temp);
			}
			else if(min>strlen(temp))
			{
				max=strlen(temp);
			}
		}
	}
	cout<<min<<'\n'<<max;
	return 0;
}

6. 假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中

附加知识点

#include<iostream> 
#include <string>
using namespace std; 
int main()
{
 string str("cvicses");
 string s(str.rbegin(),str.rend());
 cout << s <<endl;
 return 0;
}
//既然是c++的string,可以考虑用用string的反向迭代器了
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	//假定有一个文本文件,请编程分别将它每行字符串逆序和全部行逆行保存到第2和第3个文本文件中。
	ofstream f2,f3;
	ifstream f1("3-1.cpp");
	f2.open("3-1-12-6.txt");
	f3.open("3-1-12-6-1.txt");
	string x[100];
	int n=0;
	while(f1)
	{
		if(f1)
		{
			string x1;
			f1>>x1;
			x[n]=x1;
			n++;
			string x2(x1.rbegin(),x1.rend());//string逆序的写法 
		//	cout<<x2<<endl;
			f2<<x2<<endl;
		}
	}
	//cout<<"___________________";
	for(int i=0;i<n;i++)
	{
		f3<<x[n-1-i]<<endl;
		//cout<<x[n-1-i]<<endl;
	}
	
	
	
}

7.编写一个程序,要求读出一个cpp文件中的C++语法保留字(至少10个)到另一个文本文件中。 比如:main、while、return、...

#include<iostream>
#include<fstream>
#include<iomanip>
//Q:这里的main()需不需要去括号,好家伙,直接find就结束了 
//这里的main,还有return是提前弄好的吗 ,是哒 
using namespace std;
int main()
{
	ifstream f1("3-1.cpp");
	ofstream f2;
	f2.open("3-1-read.txt",ios::out);
	string s[10];
	s[0]="main";
	s[1]="while";
	s[2]="return";
	s[3]="if";
	s[4]="cout";
	s[5]="cin";
	s[6]="include";
	int num=4;
	while(f1)
	{
		if(f1)
		{
			string x;
			f1>>x;
			for(int i=0;i<7;i++)
			{
				if(x.find(s[i])!=x.npos)
				{
					f2<<s[i]<<endl;
					break;
				}
			}
		}
	}
	
	f1.close();
	f2.close();
	return 0;
 } 

遇到的问题

我用了string 的find

但我定义了整数,把find的返回值赋给他,他在显示屏上才显示整数,否则就显示一些很奇怪的数字

我感觉也不像数字,更像是一个地址

原本的-1变成了18446。。。这些的

原因:

std::string::find找不到的返回值严格来说不是-1

我感觉他返回的应该是string::npos的值,然后这个最诡异的是如果我把这个npos赋给一个整数,这个整数就变成-1了.....如果我直接输出,就是court<<x.find(s[i])它就这样

-1的补码是11111....11(如果是整型,就是32位1)

但是size_t是无符号的,所以1111…11就被当作一个很大的正整数输出了

把它赋给整型变量其实进行了一次类型转换

正确写法

应该写为:
if(x.find((s[i])!=x.npos){ //找到
...
}else{
   ...
}

8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中, 不同行的内容保存到第五个文本文件中

知识点:

string按行读取 getline(in,string);

char 按行读取 in.getline(char,n);

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
	//8.编写一个程序,要求读出三个文本文件中共同行的内容保存到第四个文本文件中,不同行的内容保存到第五个文本文件中。
	//我有一个大胆的想法,但是感觉挺蠢的,不管了,能做出来就是好的。。。。 
	ifstream f1("3-1.cpp"),f2("3-2.cpp"),f3("3-3.cpp");
	ofstream f4,f5;
	f4.open("12-8-1.txt");
	f5.open("12-8-2.txt");
	
	string x1[100],x2[100],x3[100];
	int n1=0,n2=0,n3=0;
	while(f1)
	{
		if(f1)
		{
			string y1;
			getline(f1,y1);
			x1[n1]=y1;
			n1++;
		}
	}
	while(f2)
	{
		if(f2)
		{
			string y2;
			getline(f2,y2);
			x2[n2]=y2;
			n2++;
		 } 
	}
	while(f3)
	{
		if(f3)
		{
			string y3;
			getline(f3,y3);
			x3[n3]=y3;
			n3++;
		}
	}
	//相同的部分 ,一次3for结构
	int flag1=-1;
	for(int i=0;i<n1;i++)
	{
		for(int j=0;j<n2;j++)
		{
			if(x1[i]==x2[j])
			{
			for(int k=0;k<n3;k++)
			{
				if(x1[i]==x3[k])
				{
					f4<<x1[i]<<endl;
				//	cout<<x1[i]<<endl;
					flag1=0;
					break;
				}
			}
			if(flag1==0)
			{
				flag1=-1;
				break;
			}				
			}

		}
	}
	
	//不同的结构,三个不同的,三个3for结构 
	//cout<<"不一样"<<endl;
	//3-1
	int flag2=-1;
	for(int i=0;i<n1;i++)
	{
		for(int j=0;j<n2;j++)
		{
			if(x1[i]!=x2[j])
			{
			for(int k=0;k<n3;k++)
			{
				if(x1[i]==x3[k])
				{
				flag2=0;
				break;
				}
			}
			if(flag2==0)
			{
				break;
							}				
			}
			else
			{
				flag2=0;
				break;
			}

		}
		if(flag2==-1)
		{
			f5<<x1[i]<<'\n';
		//	cout<<x1[i]<<endl;
		}
		else
		{
			flag2=-1;
		}
	}
	
//3-2
	flag2=-1;
	for(int i=0;i<n2;i++)
	{
		for(int j=0;j<n1;j++)
		{
			if(x2[i]!=x1[j])
			{
			for(int k=0;k<n3;k++)
			{
				if(x2[i]==x3[k])
				{
				flag2=0;
				break;
				}
			}
			if(flag2==0)
			{
				break;
							}				
			}
			else
			{
				flag2=0;
				break;
			}

		}
		if(flag2==-1)
		{
			f5<<x2[i]<<'\n';
		//	cout<<x2[i]<<endl;
		}
		else
		{
			flag2=-1;
		}
	}
//3-3
	flag2=-1;
	for(int i=0;i<n3;i++)
	{
		for(int j=0;j<n2;j++)
		{
			if(x3[i]!=x2[j])
			{
			for(int k=0;k<n1;k++)
			{
				if(x3[i]==x1[k])
				{
				flag2=0;
				break;
				}
			}
			if(flag2==0)
			{
				break;
							}				
			}
			else
			{
				flag2=0;
				break;
			}

		}
		if(flag2==-1)
		{
			f5<<x3[i]<<'\n';
		//	cout<<x3[i]<<endl;
		}
		else
		{
			flag2=-1;
		}
	}
	
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值