求C++编程题目【菜单】计算机菜单中有N个操作,而每个操作都会用一个或更多的单词来描述。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求C++编程题目【菜单】计算机菜单中有N个操作,而每个操作都会用一个或更多的单词来描述。相关的知识,希望对你有一定的参考价值。
菜单(存盘文件名为izbornik.pas/c/cpp)
【问题描述】
计算机菜单中有N个操作,而每个操作都会用一个或更多的单词来描述。菜单中从开始到结束的操作,我们会定义快捷键(即从操作描述中选一个字母作快捷键),快捷定义规则如下:
l 它尽量是某个操作描述的所有单词的首字母(从开始到结束)。但这个首字母不能和其它操作描述相同(不可能两个操作用同一个快捷键)
l 如果所有首字母已经被定义,则考虑剩下的字母中找(从开始到结束)
l 如果所有字母都被用了,则没有快捷键
l 这里不区分大小写
给出N个操作描述,输出对应的快捷键。
【输入格式】(输入文件名为izbornik.in)
第1行:正整数N(1≤N≤30),代表菜单中N个操作描述;
第2到N+1行: 每行一个操作描述,最多有5个单词,单词间用一个空格格开。每个单词最多有10个英文字母。
【输出格式】(输出文件名为izbornik.out)
输出N行,要与输入顺序一致,如有快捷键在快捷键字母处加”[]”。
【样例1】
izbornik.in
5
New
Open
Save
Save As
Save All
izbornik.out
[N]ew
[O]pen
[S]ave
Save [A]s
Sa[v]e All
【样例2】
izbornik.in
8
New window
New file
Copy
Undo
Format
Font
Cut
Paste
izbornik.out
[N]ew window
New [f]ile
[C]opy
[U]ndo
F[o]rmat
Fon[t]
Cut
[P]aste
#include <cctype> // toupper
#include <string> // string
#include <vector> // vector
#include <sstream> // stringstream
#include <fstream> // ifstream, ofstream
using namespace std;
bool letterExist[26] = false ; // 用于查询快捷键(即字母)是否存在的标志
vector< vector<string> > menuVec; // 存储所有菜单信息的二维向量(类似于二维数组)
const string inputFile = "./izbornik.in";
const string outputFile = "./izbornik.out";
int input()
ifstream read(inputFile, ios::in);
if(!read)
cerr << "[READ] Open file error!" << endl;
return -1;
string menu;
while (getline(read, menu)) // 从文件读取菜单信息(一行,包括空格)
// 拆分一行的菜单,形成菜单的单词向量(数组)
stringstream ss;
ss << menu;
string word;
vector<string> wordVec;
while(ss >> word)
wordVec.push_back(word);
//
menuVec.push_back(wordVec);
read.close();
return 0;
void process()
// 初始化标志
for (int i = 0; i < 26; ++i)
letterExist[i] = false;
// 处理每个菜单
for (int i = 0; i < menuVec.size(); ++i)
bool isFind = false;
// step 1: 首先找同一菜单每个单词的首字母
// [0]所有单词首字母
for (int j = 0; j < menuVec[i].size(); ++j)
int index = toupper(menuVec[i][j][0]) - 'A';
//cout << i << "|" << j << "|" << "0" << endl;
if (!letterExist[index])
//
string headStr;
headStr += '[';
headStr += menuVec[i][j][0];
headStr += ']';
menuVec[i][j] = headStr +
menuVec[i][j].substr(1, menuVec[i][j].size() - 1);
//
letterExist[index] = true;
isFind = true;
break;
//![0]
// step 2: 让后从剩下的所有单词字母中找
// [1]除去首字母之外后的所有字母
if (!isFind)
for (int j = 0; j < menuVec[i].size(); ++j)
for (int k = 1; k < menuVec[i][j].size(); ++k)
int index = toupper(menuVec[i][j][k]) - 'A';
//cout << i << "|" << j << "|" << k << endl;
if (!letterExist[index])
//
string headStr;
headStr += menuVec[i][j].substr(0, k);
headStr += '[';
headStr += menuVec[i][j][k];
headStr += ']';
menuVec[i][j] = headStr +
menuVec[i][j].substr(k + 1, menuVec[i][j].size() - k - 1);
//
letterExist[index] = true;
isFind = true;
break;
if (isFind)
break;
//![1]
int output()
ofstream write(outputFile, ios::out);
if (!write)
cerr << "[WRITE] Open file error!" << endl;
return -1;
for (int i = 0; i < menuVec.size(); ++i)
int j;
for (j = 0; j < menuVec[i].size() - 1; ++j)
write << menuVec[i][j] << " ";
write << menuVec[i][j] << endl;
write.close();
return 0;
int menu_main()
if (input() == 0)
process();
if(output() == 0)
cout << "All process done!" << endl;
return 0;
else
return -1;
else
return -1;
备注:
输入文件放在当前目录下(和main文件同级),文件只存放菜单内容,如:
New
Open
Save
Save As
Save All
其他格式可按照题目要求改~
参考技术A #include <bits/stdc++.h>using namespace std;
int n,k;
string a,b;
bool c[100]=1;
int zh(int x)
if(x>='a')x-=32;
if(x==' ')x=0;
return x;
int main()
cin>>n;
getline(cin,a);
for(int i=1;i<=n;i++)
k=0;
getline(cin,a);
b=a;
while(b.find(' ')!=-1)
if(c[zh(b[0])]==0)
k=b[0];
c[zh(k)]=1;
break;
b.erase(0,b.find(' ')+1);
if(k==0)
b=a;
while(b.length())
if(c[zh(b[0])]==0)
k=b[0];
c[zh(k)]=1;
break;
b.erase(0,1);
for(int i=0;i<a.length();i++)
if(a[i]!=k)cout<<a[i];
else
cout<<'['<<char(k)<<']';
k=0;
cout<<endl;
return 0;
参考技术B @喧世幽人 答案我这儿编译错误
以上是关于求C++编程题目【菜单】计算机菜单中有N个操作,而每个操作都会用一个或更多的单词来描述。的主要内容,如果未能解决你的问题,请参考以下文章
c++编程题目,求1到N之间数字1出现的个数。程序不用写,告诉我规律就好,自己写的老是超时