*统计字母出现频率,排序
*找出与给定字母最亲密的三个字母(真是麻烦啊…==)
*找出出现频率最高的五个单词
*输出结果到文件resulttxt
*都要统计排序…用map比较好
*用ifstream来读取文件
*把文件按行保存到vector里吧…为了第二个…
*istringstream来把行拆分成单词,把单词拆分成字母
*很显然第二个是重复的工作…定义成函数吧
*用ofstream写入文件
开工~
#include <iostream>#include <sstream> //istringstream
#include <fstream>
#include <map>
#include <vector>
int main()
{
std::ifstream ifile("datatxt");
if(ifileif_open()) { //当然要在文件存在并且能打开的情况( ̄▽ ̄")
//第一步,读取文件并保存
std::vector<std::string> file_content;
std::string line;
while(std::getline(ifile, line))
file_contentpush_back(line);
//第二步,统计
std::map<std::string, std::size_t> wordCount; //单词计数
std::map<char, std::size_t> letterCount; //字母计数
for(const auto& word : file_content) { //对于每行
std::istringstream strin(word);
std::string ww;
while(strin >> ww) { //拆分它
++wordCount[ww]; //计数
std::istringstream charin(ww);
char letter = 0;
while(charin >> letter) {
++letterCount[letter];
}
}
}
//输出
std::ofstream ofile("resulttxt");
ofile << "字母出现次数统计:"<<std::endl;
for(const auto& i : letterCount) {
ofile << ifirst << "\t" << isecond << std::endl;
}
ofile << std::endl << "出现次数最多的五个单词:" << std::endl;
auto beg = wordCountbegin();
for(;beg != beg+5;++beg) {
ofile << beg->first << "\t" << beg->second << std::endl;
}
}else
std::cout << "File open failed" << std::endl;
}
//我把这个统计最亲密的三个字母的函数写出来…(不过函数返回什么好呢==)
char countLeterInt(char ch, std::vector<std::string>& file_content)
{
char count = new char[3]{0};
std::map<char, std::size_t> IntLeterCount; //用于统计
//所谓相邻,是指左右相邻吧…
for(const auto &line : file_content) {
//抽出每一行(现在觉得还不如每一个单词的存,你自己改吧)
std::istringstream strin(line);
std::string word;
while(strin >> word) {
auto pos = wordfind(ch);
while(pos != std::string::npos) {
//这里要防止访问越界
if(pos == 0) {
++IntLetterCount[word[pos+1]];
}else if(pos == wordsize()-1) {
++IntLetterCount[word[pos-1]];
}else {
++IntLetterCount[word[pos-1]];
++IntLetterCount[word[pos+1]];
}
pos = wordfind(ch, pos+1);
}
}
//好了手机没电了…总之接下来就是
//IntLetterCount里虽然统计了相邻字母,但不是按出现次数排序的,而是按
//字母的字典顺序排序的
//加油吧~记得delete返回的指针
}
}问题:\r\n键盘上某些特定的键,在C-free 的编辑器里面无法输入(按键没有反应),如 tab 键,Backspace 键,enter 键等等\r\n\r\n解决方案:\r\n将C:\Documents and Settings\你的Widnows登录名\Application Data\C-Free\50 目录下的keysdat文件删除,然后将default_keysdat文件复制为 keysdat用vb实现“绿色”软件
现在很流行“绿色”软件,不须要什么安装程序只要一个 EXE 文件就可以运行程序了,而在 VB 的编程中有许多地方需要调用第三方的控件(非常难用 API 函数搞定所有的功能),这就须要制做一个安装程序,把所需要的控件、DLL 文件或其他文件打包进去了,那么在 VB 中怎么用变通的方法实现“绿色”软件呢,请看示例:
1、主程序EXE
用 VB60 编写的程序,调用了 Winsock 控件,要是在没有安装VB50、60 的机器上运行则会出现错误,导致程序运行失败,这时如果按一般的方法,唯有把这个程序用VB50、60 的安装程序进行打包,不然唯有用用2的方法来解决了。
2、注册程序EXE
用 VB60 编写的程序,使用资源文件的方法,把 Winsock 控件封装到本程序中,在运行主程序EXE之前,先运行本程序,通过API函数GetSystemDirectory取得系统的Winddows\System的目录,然后把Winsock控件复制到该目录下,并用Shell来完成控件的注册。
⑴启动 VB60,在“外接程序→外接程序管理器”中加载“Visual Basic 6 资源编辑器”
⑵在 VB 资源编辑器窗口中,点击“添加自定义资料”,增加 Winsock 控件(C:\Winddows\System\nsckocx),再双击刚刚创建的自定义资源,d出”编辑属性”窗口,定义如下:
类型: “OCX”
标识号: 101
语言: 中文(中国)
⑶保存资源文件,写如下代码:
Option Explicit
Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lPBuffer As String, ByVal nSize As Long) As Long
Const MAX_PATH = 260 注释:定义足够长的字符串
Private Sub Form_Load()
Dim TempFile() As Byte
Dim FileNum As Integer
Dim TempDir As String
TempDir = GetWinSysDir 注释:自定义函数取得系统的 Winddows\System 的目录
TempFile = LoadResData(101, "OCX") 注释:用以从资源 (res) 文件装载若干可能类型的数据,并返回一个 Byte 数组
FileNum = FreeFile
Open TempDir你打开一个 cmd 窗口
然后依次运行
G:
cd MyProject\little_test
test1exe
如果出错,请贴出出错提示
如果没出错(显示出Hello了),那就是你装的C-Free50啥的有问题
(PS 为啥要用这么非主流的IDE)
1、首先打开C-Free50,然后一个空白的C语言页面保存为switchc文件,继续输入一般的C语言的基础格式。
2、C语言的输入语句,首先定义一个整型数值,然后从外面写入这个值。#include <stdioh>main(){int a;printf("请输入一个1-5之间的数值: ");scanf("%d",&a);}这里的scanf() 就是从外面读入一个值给a。
3、要看下输入的值是不是赋值给了a,可以把a的值输出,如下图调试。从下图可以得出,a的值就是输入的值。
4、接着按照获得的值来执行相应的步骤,代码如下图。
5、从系统中输入一个数值,然后switch根据读到的数值判断应该做什么,注意,输入的值必须是定义的值,就比如本程序里面switch里面是一开始定义的aint a;printf("请输入一个1-5之间的数值: ");scanf("%d",&a);switch (a){}调试下程序,看看对不对。
把win8文档文件夹下的CFREE删除,然后重装一下输入法,如果你用的微软自带输入法,那就装一个新的输入法,重启电脑再打开CFREE试试,我是win81,正在运行CFREE完美兼容。
不过VC++60也可以通过一些方法在win81上运行。百度
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)