part 2:
1 // 合并两个文件内容到一个新文件中。 2 // 文件名均从键盘输入 3 4 #include5 #include 6 #include 7 #include 8 using namespace std; 9 10 int main() {11 char filename1[10], filename2[10], newfilename[10];12 13 cout << "输 入要合并的两个文件名: " ;14 gets(filename1); gets(filename2);15 cout << "输 入合并后新文件名: " ;16 cin >> newfilename;17 18 ofstream fout; // 输出文件流对象 19 ifstream fin; // 输入文件流对象 20 21 22 fin.open(filename1); // 将输入文件流对象fin与文件filename1建立关联 23 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出 24 cerr << "fail to open file " << filename1 << endl;25 system("pause");26 exit(0); 27 }28 29 fout.open(newfilename); // 将输出文件流对象fout与文件newfilename建立关联 30 if(!fin.is_open()) { // 如果创建/打开文件失败,输出错误提示信息并退出 31 cerr << "fail to open file " << newfilename << endl;32 system("pause");33 exit(0);34 }35 36 char ch;37 38 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中 39 while(fin.get(ch)) 40 fout << ch;41 42 fin.close(); // 关闭文件输入流对象fin与文件filename1的关联 43 44 fout << endl; // 向文件输出流对象fout中插入换行 45 46 47 fin.open(filename2); // 将输入文件流对象fin与文件filename2建立关联 48 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出49 cerr << "fail to open file " << filename2 << endl;50 system("pause");51 exit(0); 52 }53 54 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中55 while(fin.get(ch))56 fout << ch;57 58 fin.close(); // 关闭文件输入流对象fin与文件filename2的关联59 60 fout<<"\nmerge successfully."<
part 3:
第一题、
这题需要生成项目,这里只有关键代码。
阶段一:初实验:
1 #include2 #include 3 #include "utils.h" 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 int main() {11 12 string filename;13 14 filename = getCurrentDate();15 16 cout << "日 期:" << filename << endl;17 18 19 char file1[100];20 cout<<"请 输入文件:";21 gets(file1);22 int n;23 cout<<"请 输入抽取人数:";24 cin>>n;25 26 ofstream fout;27 ifstream fin;28 fin.open(file1);29 if(!fin.is_open()){30 cerr << "fail to open file " << file1 << endl;31 system("pause");32 exit(0);33 }34 char date[100];35 strcpy(date,filename.c_str());36 char *txt=".txt";37 strcat(date,txt);38 cout<<"输 出文件名:"< <
阶段二:
2019/6/9
更新部分程序段:
1、调整逻辑;
2、支持读取失败后重新输入;
3、名单升序排列。
1 #include2 #include 3 #include "utils.h" 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 int main() {11 12 string filename;13 14 filename = getCurrentDate();15 16 cout << "日 期:" << filename << endl;17 18 19 char file1[100];20 cout<<"请 输入文件:";21 gets(file1);22 23 ofstream fout;24 ifstream fin;25 fin.open(file1);26 while(!fin.is_open()){27 cerr << "打 开文件 " << file1 <<" 失败!"<< endl;28 system("pause");29 cout<<"请 重新输入文件: ";30 gets(file1);31 fin.open(file1);32 }33 34 int num=0;35 string a[1000];36 ifstream infile(file1);37 while(!infile.eof()){38 getline(infile,a[num],'\n');39 num++;40 }41 42 int n;43 cout<<"请 输入抽取人数:";44 cin>>n;45 while(n>num){46 cout<<"抽 取人数超过名单人数!\n"47 <<"请 重新输入抽取人数:";48 cin>>n;49 }50 51 char date[100];52 strcpy(date,filename.c_str());53 char *txt=".txt";54 strcat(date,txt);55 cout<<"输 出文件名:"< < luck[j]) min=j;80 if(min!=i){81 int t=luck[min];82 luck[min]=luck[i];83 luck[i]=t;84 }85 }86 for(int i=0;i
阶段三:
2019/6/11
1、优化算法;
2、增加过渡环节(避免误以为卡死)。
1 #include2 #include 3 #include "utils.h" 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 void fun1(int luck[],int n,char date[],int num);//生成随机数 11 void fun2(int luck[],int n);//升序排序 12 13 void fun1(int luck[],int n,char date[],int num){ 14 for(int i=0;i luck[j]) min=j; 42 if(min!=i){ 43 int t=luck[min]; 44 luck[min]=luck[i]; 45 luck[i]=t; 46 } 47 } 48 } 49 50 int main() { 51 52 string filename; 53 54 filename = getCurrentDate(); 55 56 cout << "日 期:" << filename << endl; 57 58 char file1[100]; 59 cout<<"请 输入文件:"; 60 gets(file1); 61 62 ofstream fout; 63 ifstream fin; 64 fin.open(file1); 65 while(!fin.is_open()){ 66 cerr << "打 开文件 " << file1 <<" 失败!"<< endl; 67 system("pause"); 68 cout<<"请 重新输入文件: "; 69 gets(file1); 70 fin.open(file1); 71 } 72 73 int num=0; 74 string a[1000]; 75 ifstream infile(file1); 76 while(!infile.eof()){ 77 getline(infile,a[num],'\n'); 78 num++; 79 } 80 81 int n; 82 cout<<"请 输入抽取人数:"; 83 cin>>n; 84 while(n>num){ 85 cout<<"抽 取人数超过名单人数!"< >n; 88 } 89 90 char date[100]; 91 strcpy(date,filename.c_str()); 92 char *txt=".txt"; 93 strcat(date,txt); 94 fout.open(date); 95 if(!fin.is_open()){ 96 cerr << "生 成失败! " << date << endl; 97 system("pause"); 98 exit(0); 99 }100 101 system("cls");102 int luck[n];103 srand((double)time(0));104 if(n<=num/2||n<=num/2+1){105 fun1(luck,n,date,num);106 fun2(luck,n);107 }108 else{109 int tluck[num-n];110 fun1(tluck,num-n,date,num);111 fun2(tluck,num-n);112 int tluckn=0,luckn=0;113 for(int i=0;i
阶段四:
阶段三要40+s 才能完成目标,太慢了。
我还能更快。
2019/6/11晚,受文艺复兴启发,
算法终极优化,彻底避免重复和卡机。
1 #include2 #include 3 #include "utils.h" 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 10 void fun1(int luck[],int n,int num,int i,int all[]);//生成随机数 11 void fun2(int luck[],int n);//升序排序 12 13 void fun1(int luck[],int n,int num,int i,int all[]){ 14 if(i luck[j]) min=j; 29 if(min!=i){ 30 int t=luck[min]; 31 luck[min]=luck[i]; 32 luck[i]=t; 33 } 34 } 35 } 36 37 int main() { 38 39 string filename; 40 41 filename = getCurrentDate(); 42 43 cout << "日 期:" << filename << endl; 44 45 char file1[100]; 46 cout<<"请 输入文件:"; 47 gets(file1); 48 49 ofstream fout; 50 ifstream fin; 51 fin.open(file1); 52 while(!fin.is_open()){ 53 cerr << "打 开文件 " << file1 <<" 失败!"<< endl; 54 system("pause"); 55 cout<<"请 重新输入文件: "; 56 gets(file1); 57 fin.open(file1); 58 } 59 60 int num=0; 61 string a[1000]; 62 ifstream infile(file1); 63 while(!infile.eof()){ 64 getline(infile,a[num],'\n'); 65 num++; 66 } 67 68 int n; 69 cout<<"请 输入抽取人数:"; 70 cin>>n; 71 while(n>num){ 72 cout<<"抽 取人数超过名单人数!"< >n; 75 } 76 77 char date[100]; 78 strcpy(date,filename.c_str()); 79 char *txt=".txt"; 80 strcat(date,txt); 81 fout.open(date); 82 if(!fin.is_open()){ 83 cerr << "生 成失败! " << date << endl; 84 system("pause"); 85 exit(0); 86 } 87 88 int all[num]; 89 for(int i=0;i
第二题、
1 #include2 #include 3 #include 4 using namespace std; 5 6 int main() { 7 char filename1[10], filename2[10], newfilename[10]; 8 9 cout << "输 入文件名:" ;10 gets(filename1);11 12 ifstream fin;13 14 fin.open(filename1);15 if(!fin.is_open()) {16 cerr << "fail to open file " << filename1 << endl;17 system("pause");18 exit(0); 19 }20 21 char ch;22 int numstr=0,numword=0,numline=0;23 int k=1;24 while(fin.get(ch)){25 if(ch==' '){26 numstr++;27 if(k==0) k=1;28 }29 else if(ch=='\n'){30 numline++;31 if(k==0) k=1;32 }33 else if(k&&((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))){34 numword++;numstr++;k=0;35 }36 else numstr++;37 }38 if(ch=='\n') numline--;39 else numline++;40 cout<<"字 符数:"< <<"\n"41 <<"单 词数:"< <<"\n"42 <<"行 数:"< <
问题:
1、error: no matching function for call to 'std::basic_ifstream<char>::open(std::string&)
没有c++11的解决方案:
例如代码:
1 string filename = "1.txt"; 2 ifstream fin; 3 fin.open(filename);
error: no matching function for call to 'std::basic_ifstream<char>::open(std::string&)
原因是C++的string类无法作为open的参数。
解决方案:使用C的字符串。
char filename[10]; strcpy(filename, "1.txt"); ifstream fin; fin.open(filename);
注:转载自:https://www.cnblogs.com/cszlg/archive/2012/12/15/2910424.html
2、string类转为char类:
1 #include2 …… 3 …… 4 …… 5 string filename; 6 filename=getCurrentDate(); 7 cahr filename_in_char[100]; 8 strcpy(filename_in_char,filename.c_str()); 9 ……10 ……11 ……
这只是个模板,根据自己需求改。
3、按时间生成随机数:
头文件:
个人感觉:
1、高重复率:
srand((int)time(0));
2、低重复率:
srand((double)time(0));