• ベストアンサー

プログラムが~~~!!

こんにちは。今、プログラム書いてるんですけど目的としては、 1、テキストファイルから文字列を読み込む。(大体数万文字) 2、それを100個ずつに区切る。 3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその 百個の中での割合を示す。 4、さらに次の百個を・・・・ みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが もう、お手上げです。 どなたか、助けてください。 #include<iostream.h> #include<stdio.h> #include<string.h> int main() { char pch[3]; int count=0; FILE *fin; fin=fopen('C:\ahowaki.dat','r'); fscanf(fin,'%s',&pch); cout<<"入力\n"; while(pch){ cin.read(pch,2); if((strcmp(pch,"gc"))==0) count++; if(count>=0 && count<=25) cout<<"Under25%\n"; if(count>=26&& count<=50) cout<<"Under50\n"; if(count>=51&& count<=75) cout<<"Under75%\n"; if(count>=76&& count<=100) cout<<"Under99%\n"; else cout<<"Over100%\n"; } return 0; fclose(fin); }

質問者が選んだベストアンサー

  • ベストアンサー
  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 前回の質問はこういうことだったのですね。 ちょっと、確認しますが、 1.C:\ahowaki.datファイルを読み込み、以下の処理を行いたい。 2.100バイトごとに特定の文字列の出現回数を採りたい。 これを前提にサンプルを書きます。 (インデントするために先頭に全角スペースを入れています) int main() {   FILE *fin;   char pch[101];   int numread=0;   int count=0;   int i=0;   if( (fin = fopen( "C:\\ahowaki.dat", "r+t" )) != NULL )   {     do     {       memset( pch, 0x00, sizeof(pch));       /* 100文字を読み込む */       numread = fread( pch, sizeof( char ), 100, fin );       count = fncCheck(pch, "gc");       printf( "%d:%d\n",i, count );       i++;     }     while(numread==100);     fclose( fin ); }   return 0; } int fncCheck(char *pch, char *item) {   int count=0;   int i=0;   /* 文字列の最後まで検索する */   for( i=0; i<stelen(pch); i++)   {     /*一致した場合は、カウントする*/     if(memcomp(&pch[i], item, 2) == 0)     {       count++;     }   }   return count; } テストしていないのでコンパイルエラー&バグがあるかもしれません。

yabuchanchan
質問者

お礼

こんにちは。そうです、実はこれが目的だったんです。本当に毎回的確なご回答ありがとうございます。 なんか、itohhさんにはお世話になりっぱなしで、なんとお礼をいったら良いのか分からないぐらいです。今回のプログラムを元に(といっても、90%これと同じですが・・・・♪)自分なりに書いてみることができました。エラーとかも自力で取り除くことができました。なんかちょっと自信つきました。本当にありがとうございます。 それにしてもプログラムって難しいですね。これほどのものをすぐかけるってすごいですね。僕も頑張ってもっと勉強したいと思います。 同じ目的でもプログラムっていろんな書き方があるんですね。あるごりずむってやつですか?僕もアルゴリズム本格的に勉強してみたくなりました!!!!!!! 本当にありがとうございました!!!!!

その他の回答 (1)

  • misoka
  • ベストアンサー率35% (56/160)
回答No.1

たとえば、こんな感じでしょうか? バグもあるかも。 これだと、100文字目が g で、101文字目が c の場合も カウントされると思います。これじゃまずいなら、 変数の初期化のところで、flg も初期化してください。 #include <stdio.h> #include <string.h> void showResult( int gccnt, int cnt ); int main() {  /* filename は C:\ahowaki.dat みたいですが... */  FILE *fl = fopen( "filename", "r" );  /* ファイルから読み込んだ1文字 */  int c;  /* ファイルから読み込んだ文字数(100までいくと初期化される) */  int cnt = 0;  /* 'gc'の数(cntが100までいくと初期化される) */  int gccnt = 0;  /* 1文字前が 'g' だったかどうか判定のフラグ */  int flg = 0;  if( fl == NULL ) {   /* ここには、ファイルが開けなかったよ、というエラーを書く */   printf( "ファイルがないみたい。\n" );   exit( -1 );  }  while( ( c = fgetc( fl ) ) != EOF ) {   if( flg ) {    if( c == 'c' ) {     gccnt++;    } else {     flg = 0;    }   }   flg = ( c == 'g' );   if( ++cnt == 100 ) {    /* 結果表示 */    showResult( gccnt, cnt );    /* 変数の初期化 */    cnt = 0;    gccnt = 0;   }  }  /* 文字数が100じゃ割り切れなかった場合ここで表示 */  if( cnt != 0 ) {   showResult( gccnt, cnt );  }  fclose( fl );  return( 0 ); } void showResult( int gccnt, int cnt ) {  printf( "%d 文字の中に 'gc'を %d 個みつけました。\n", cnt, gccnt ); }

yabuchanchan
質問者

お礼

ありがとうございます。 なんとか、実行することができました。まだ、ファイル処理の書き方になれてなくて、うまくいかなかったんですが、たすかりました。 ほんとうにありがとうございました。

関連するQ&A

  • 配列の練習問題

    #include<iostream> using namespace std; //count関数の宣言 int count(char str[], char ch); int main() { char str[100]; char ch; cout << "文字列を入力して下さい。\n"; cin >> str; cout << "文字列から探す文字を入力して下さい。\n"; cin >> ch; int c = count(str, ch); cout << str << "の中に" << ch << "は" << c << "個あります。\n"; return 0; } //count関数の定義 int count(char str[], char ch) { int i = 0; int c = 0; while (str[i]) { if (str[i] == ch) c++; i++; } return c; } こんにちは。 この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 確認がてらに質問します。 よろしくお願いします。

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • なぜエラーになるのかわかりません

    入力した文字列からthがいくつ含まれるのかというプログラミングを作りたいのですが>if( sentence[i] == 'th' )の部分で 「比較において定数が範囲外」というエラーがでてしまいます。eなどひとつの文字でならでないのですが・・・よくわからないので教えてください #include <iostream.h> main() { const int Max_Length = 80 ; char sentence[Max_Length] ; int count ; int th ; for(;;){ // 文字列の入力 cout << "\n 文字列を入力して下さい(英数字のみ) >> " ; cin.getline( sentence, Max_Length ) ; // 文字数を数える count = 0 ; while( sentence[count] != '\0' ){ count++ ; } //thの数を数える th = 0 ; for( int i = 0 ; i <= count ; i++ ){ if( sentence[i] == 'th' ) th++ ; } // 文字列の再表示と結果の表示 cout << "\n 文字列= " << sentence << endl ; if( th == 0 ) cout << "thは含まれません" << endl ; cout << "thの数は" << th << endl ; } }

  • 文字列のある行数を表示する

     お世話になっています。  前回、文字列の検索の質問をしたものです。  このプログラムは文字列を入力して、ファイルから文字列を検索する。  そして、検索した文字列の総数と、存在する行数目を出すというものです。    現状の問題は、検索した文字列の総数は出るようになりました。      しかし、存在する行だけを出したいのに、全ての行数目を      出してしまいます。           どのようにすれば検索した文字列のある行数目だけを表示できるようになるのでしょうか。  以下、現在のソースの状態です。 #include <stdio.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <string.h> #define FALSE 0 #define TRUE 1 using namespace std; int main( ) { FILE *fp;//ファイルポインタ char filename[256];//ファイル名 char key[128];//検索文字列 char key2[128];//見つけた文字列の保存 int iCnt[128];//見つけた文字 char c;    int keylen;//検索文字列の長さ int i = 0;//検索文字列の位置 int search = FALSE;//検索中フラグ int count = 0;//検索文字列出現回数 int j = 0; //検索対象ファイル名と検索文字列をコンソール入力 cout << "ファイル名を入力してください⇒  "; cin >> filename ; cout << "検索文字列を入力してください⇒  "; cin >> key; keylen = strlen(key); if((fp = fopen(filename,"r")) == NULL)     { cout << "ファイルオープンエラー\n" ; exit(1); } //ファイル読み込み while((c = fgetc(fp)) != EOF) { if(search) {//検索中       //検索文字列に一致しない文字が現れた    if(c != key[i]) { search = FALSE; i = 0; } else{  i++; } }   else{ //検索中ではない if(c == key[i]) { search = TRUE; i++; } }     //検索文字列と全て一致した場合 if(keylen == i) { count++; i = 0; iCnt[i] = 1; search = FALSE; } } fclose(fp); cout << "出現回数は " << count << '\n'; //ファイル(filename)からの読み込み        ifstream ifs(filename); string buf; while(getline(ifs, buf) && ifs ) { // ここで行目数の処理を行っています。 j++; if((count++ && search = FALSE) == TRUE) { cout << j << "行目" << endl; } } return 0; }

  • ファイル中のデータの読むとき・・・・

    こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

  • プログラムの動作の仕方

    この下のプログラムは、WRITE <ファイル名>をコマンド行で入力すると、動作するプログラムなのですが、この通りにWRITE <test>としてもできません。 やり方を教えてください. #include <iostream> #include <fstream> using namespace std; int main(int argc,char *argv[]) { if(argc!=2){ cout << "使い方:WRITE<ファイル名>" << endl; return 1; } ofstream out(argv[1]); //出力ファイル if(!out){ cout << "出力ファイルが開けません" << endl; return 1; } char str[80]; cout << "文字列をディスクに書き込み、$で停止します" << endl; do{ cout << ": "; cin >> str; out << str << endl; }while(*str!='$'); out.close(); return 0; } お願いします。

  • 以下のプログラムについて教えてください

    #include<iostream.h> int main() { int i; int ninzu=0; int tensu[6]; int rakudai[6]; cout<<"6人の点数を入力!\n"; for(i=0; i<6;i++) { cout<<i+1<<"番:"; cin>>tensu[i]; if(tensu[i]<60) { rakudai[ninzu]=i; ninzu++;} } cout<<"60点未満は"<<ninzu<<"人です。\n"; for(i=0; i<ninzu; i++) cout<<rakudai[i]+1<<"番:"<<tensu[rakudai[i]]<<"点\n"; return(0); } というテストの点数が60点未満の学生の一覧表を出力するというプログラムなんですが、12行目からの rakudai[ninzu]...以降が よくわかりません。配列の数を指定するところに数字以外のものが来るというのはいったいどういうことなのでしょう?どなたか教えてください。

  • 入力文字数がでません。

    C++です。以下を実行したのですが、実行結果に改行数は出るが文字数がでません。お願いします。 #include <iostream.h> int main(void) { char c; int ccount = 0; int ncount = 0; while (cin.get(c)) { ccount++; if (c == '\n') ncount++; } cout << "文字数=" << ccount << '\n'; cout << "改行数=" << ncount << '\n'; return (0); }

  • ファイルの読み込みと書き込み

    はじめまして。 最近プログラムを勉強し始めたのですが、ファイルの書き込みと 読み込みで行き詰ってしまいました。 ファイルAで演算したものをファイルBで読み込み表示したいと思い、 以下のようなプログラムを作成したのですが、エラーが出てしまいます。 かなり初歩的なこととは思いますが、アドバイスをお願いします。 【ヘッダファイル(stdafx.h)】 #include <stdio.h> #include <tchar.h> #include <fstream> #include <iostream> 【ソースファイルA】 #include "stdafx.h" using namespace std; int main() { int a; cout << "数値入力:" ; cin >> a; a = a * 2; ofstream fout("sample.txt"); fout << a; fout.close(); return 0; } 【ソースファイルB】 #include "stdafx.h" using namespace std; int main() { ifstream fin("sample.txt"); fin >> a;     fin.close(); int b; b = a; cout << "結果 = " << b << '\n'; return 0; }

  • C++で二次方程式のプログラム

    大分前に二次方程式のプログラムを作るって問題が出ていました。 しかし、セットで作ったプログラムのフローチャートを書くんですがフローチャートが分かりません。 条件は 虚数解 a=0 実数解 の場合分けをして、解を出すってプログラムなんですが、多分、それ自体は合っていると思います。 しかし、そのフローチャートを書きなさいって問題があったんですが、それが未だに分からないんですが、これをフローチャートに書くとすると、どう書けばいいですか? #include <iostream> #include <cmath> using namespace std; int main() { double a,b,c,d,x0,x1; cout << "aを入力してください\n"; cin >> a; cout << "bを入力してください\n"; cin >> b; cout << "cを入力してください\n"; cin >> c; d=b*b-4*a*c; x0 = (-b + sqrt(d)) / (2 * a); x1 = (-b - sqrt(d)) / (2 * a); if(a==0) { cout << "解は1つで" << -c/b << "です\n"; } else if(d>0) { cout << "解は二つの実数解で,解は" << x0 << "," << x1 << "です\n"; } else { cout << "解は二つの虚数解で,解は" << (-b) / (2 * a) << "+i" << sqrt(-d) / (2 * a) << " , " << (-b) / (2 * a) << "-i" << sqrt(-d) / (2 * a) << "です\n"; } return 0; }