• 締切済み

出現文字の種類の数

下記のプログラムのファイルから読み込んだ出現文字の種類の数を取得するにはどうすれば良いでしょうか? また、 ー アルファベットでは大文字を全て小文字に置換 ー スペース、タブ、改行記号はスペースに置換 ー 数字は全て0に置換 ー その他の記号はそのまま使う という条件になっています。 #include<stdio.h> #include<ctype.h> #include<math.h> int cnt[256]; char chs[256]; int n=256; int main(void) { int k; for(k=0;k<n;k++) cnt[k]=0; inputdata(); heapsort(1,n); printdata_reverse(); } void inputdata() { char c; char *fnam="English.txt"; FILE *fp; char bff[80]; char *p; int k; fp = fopen(fnam,"r"); while(fgets(bff,80,fp)!=NULL) { for(p=bff;*p;p++) { c = *p; if(isalpha(*p)) c=tolower(*p); if(isdigit(*p)) c = '0'; if(isspace(*p)) c = ' '; cnt[c]++; chs[c] = c; } } fclose(fp); } void heapsort(int s,int t) { int i; makeheap(s,t); for(i = t; i>= s+1; i--) { swap(s,i); heapify(s,i-1); } } void makeheap(int s,int t) { int i; for(i = t; i >= s; i--) heapify(i,t); } void heapify(int p,int q) { int r; r = 2*p; if(r <= q){ if(r < q && cnt[r] > cnt[r+1]) r = r+1; if(cnt[p] > cnt[r]){ swap(p,r); heapify(r,q); } } } void swap(int i, int j) { int temp1,temp2; temp1=cnt[i]; cnt[i]=cnt[j]; cnt[j]=temp1; temp2=chs[i]; chs[i]=chs[j]; chs[j]=temp2; } void printdata_reverse() { int k; int m=0; double pcnt[100]; for(k=0;k<n;k++) { if(cnt[k]>0) m += cnt[k]; } printf("Characters in UN Charter.\n"); printf(" # C occ. %%\n"); for(k=0;k<n;k++) { if(cnt[k]>0) { pcnt[k] = 1.0*cnt[k]/m; printf("%3d '%c' %5d %f\n", k,chs[k],cnt[k],pcnt[k]); } } } 実行結果 Characters in UN Charter. # C occ. % 1 ' ' 4576 0.190643 2 'e' 2804 0.116819 3 't' 1827 0.076115 4 's' 1464 0.060992 5 'o' 1339 0.055785 6 'a' 1315 0.054785 7 'n' 1313 0.054701 8 'r' 1257 0.052368 9 'i' 1103 0.045953 10 'h' 972 0.040495 11 'c' 755 0.031454 12 'l' 645 0.026872 13 'd' 639 0.026622 14 'u' 593 0.024705 15 'f' 492 0.020497 16 'p' 430 0.017914 17 'm' 400 0.016665 18 'g' 285 0.011874 19 '0' 278 0.011582 20 'b' 253 0.010540 21 '.' 238 0.009915 22 'v' 203 0.008457 23 'y' 199 0.008291 24 ',' 192 0.007999 25 'w' 167 0.006957 26 '-' 54 0.002250 27 'k' 38 0.001583 28 'x' 34 0.001416 29 ''' 30 0.001250 30 'j' 27 0.001125 31 '(' 20 0.000833 32 ')' 20 0.000833 33 'z' 17 0.000708 34 'q' 13 0.000542 35 ':' 11 0.000458

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

前回と一字一句同じに質問するのではなく、 「下の例では、『35』という数になります。これをプログラム内で取得するにはどうすれば良いでしょうか?」と記載し、 かつ、 >また、 >ー アルファベットでは大文字を全て小文字に置換 >ー スペース、タブ、改行記号はスペースに置換 >ー 数字は全て0に置換 >ー その他の記号はそのまま使う >という条件になっています。 この↑6行を削除していれば、ズバリの回答があったかと思います・・。 この6行は、質問主旨とは全く関係ないもので、反って回答者を混乱させるだけです。 ・というか、本当に上のが質問主旨ですか?。  (= http://okwave.jp/qa4567672.html 「補足」) ・「取得」とは、ファイルに書き出す、ということ?(「リダイレクト」で検索)。 ・ソース内容(再帰呼出し等)と、随分と乖離してますが・・。 ++++++++++++++++++++++++++++++++++++++++++++++ (微積分できる人から、九九を尋ねられるような気持ちの悪さが・・) ☆「出現文字の種類の数」用の変数を用意し代入する(◆)だけ、です。  具体的には、printdata_reverse() を以下のように変更してみてください。  (インデントに全角空白使用)。  または、変数を0で初期化しておいて、インクリメントするとか・・。 int igLast; // ◆「出現文字の種類の数」用(グローバル変数) void printdata_reverse( void ) {   int   k;   int   iTotal = 0; // m から変更   double  pcnt;    // 配列の必要なし   for( k = 1; k < 0x7F; k++ ){  // [ 0 ] は初期化時を除き未使用、0x7e まで     if( cnt[ k ] )  igLast = k; // ◆降順ソート済み、出現最少 = 種類の数     iTotal += cnt[ k ];  // 0 はいくら加えても・・   }   printf( "Characters in UN Charter.\n" );   printf( " # C occ. %%\n" );   for( k = 1; k <= igLast; k++ ){     pcnt = 100.0 * (double)cnt[ k ] / (double)iTotal;     printf( "%3d '%c' %5d %6.2lf%\n", k, chs[ k ], cnt[ k ], pcnt );   } } グローバル変数ですので、printdata_reverse() 呼び出し後ならどこでも使えますよ。 参考:http://e-words.jp/p/r-ascii.html ++++++++++++++++++++++++++++++++++++++++++++++ 年寄りの小言  エラー・警告の無いものを投稿するのがマナーと思います。  エラー・警告を無くすことができない場合は、そのことを質問。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

種類の数、ということは、  ・英小文字  ・スペース  ・ゼロ の3個が答えではないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「出現文字の種類の数」って何? なんで置換なんてするの?

全文を見る
すると、全ての回答が全文表示されます。
  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

http://okwave.jp/qa4567672.html で、出力結果として何がどうあれば正しいわけ? せめて、どこで何を行っている(行いたい)のかコメントくらいつけようよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 出現文字の種類の数

    下記のプログラムのファイルから読み込んだ出現文字の種類の数を取得するにはどうすれば良いでしょうか? また、 ー アルファベットでは大文字を全て小文字に置換 ー スペース、タブ、改行記号はスペースに置換 ー 数字は全て0に置換 ー その他の記号はそのまま使う という条件になっています。 #include<stdio.h> #include<ctype.h> #include<math.h> int cnt[256]; char chs[256]; int n=256; int main(void) { int k; for(k=0;k<n;k++) cnt[k]=0; inputdata(); heapsort(1,n); printdata_reverse(); } void inputdata() { char c; char *fnam="English.txt"; FILE *fp; char bff[80]; char *p; int k; fp = fopen(fnam,"r"); while(fgets(bff,80,fp)!=NULL) { for(p=bff;*p;p++) { c = *p; if(isalpha(*p)) c=tolower(*p); if(isdigit(*p)) c = '0'; if(isspace(*p)) c = ' '; cnt[c]++; chs[c] = c; } } fclose(fp); } void heapsort(int s,int t) { int i; makeheap(s,t); for(i = t; i>= s+1; i--) { swap(s,i); heapify(s,i-1); } } void makeheap(int s,int t) { int i; for(i = t; i >= s; i--) heapify(i,t); } void heapify(int p,int q) { int r; r = 2*p; if(r <= q){ if(r < q && cnt[r] > cnt[r+1]) r = r+1; if(cnt[p] > cnt[r]){ swap(p,r); heapify(r,q); } } } void swap(int i, int j) { int temp1,temp2; temp1=cnt[i]; cnt[i]=cnt[j]; cnt[j]=temp1; temp2=chs[i]; chs[i]=chs[j]; chs[j]=temp2; } void printdata_reverse() { int k; int m=0; double pcnt[100]; for(k=0;k<n;k++) { if(cnt[k]>0) m += cnt[k]; } printf("Characters in UN Charter.\n"); printf(" # C occ. %%\n"); for(k=0;k<n;k++) { if(cnt[k]>0) { pcnt[k] = 1.0*cnt[k]/m; printf("%3d '%c' %5d %f\n", k,chs[k],cnt[k],pcnt[k]); } } } 実行結果 Characters in UN Charter. # C occ. % 1 ' ' 4576 0.190643 2 'e' 2804 0.116819 3 't' 1827 0.076115 4 's' 1464 0.060992 5 'o' 1339 0.055785 6 'a' 1315 0.054785 7 'n' 1313 0.054701 8 'r' 1257 0.052368 9 'i' 1103 0.045953 10 'h' 972 0.040495 11 'c' 755 0.031454 12 'l' 645 0.026872 13 'd' 639 0.026622 14 'u' 593 0.024705 15 'f' 492 0.020497 16 'p' 430 0.017914 17 'm' 400 0.016665 18 'g' 285 0.011874 19 '0' 278 0.011582 20 'b' 253 0.010540 21 '.' 238 0.009915 22 'v' 203 0.008457 23 'y' 199 0.008291 24 ',' 192 0.007999 25 'w' 167 0.006957 26 '-' 54 0.002250 27 'k' 38 0.001583 28 'x' 34 0.001416 29 ''' 30 0.001250 30 'j' 27 0.001125 31 '(' 20 0.000833 32 ')' 20 0.000833 33 'z' 17 0.000708 34 'q' 13 0.000542 35 ':' 11 0.000458

  • 入力に出現する数字文字をカウントするプログラム

    こんにちは、毎度お世話になります。 #include<iostream> using namespace std; int main(void){ char c; int cnt[10] = {0}; while(cin.get(c)){ if(c >= '0' && c <= '9') cnt[c - '0']++; } for (int = 0; i < 10; i++) cout << i << "の出現回数:" << cnt[i] << '\n'; return(0); } [/code] ここで質問なんですが、このプログラムの中で数字文字をカウントしているのはどこでしょうか? そして while(cin.get(c)){ if(c >= '0' && c <= '9') cnt[c - '0']++; } ここの部分が何を表しているのか解りません。 よろしくお願いします。

  • このプログラムの復元処理教えでください。助けてくだ

    #include <stdio.h> int main(void) { char a[51]; char b[101]; char c[51]; int i,k; int cnt; printf("文字例-->"); scanf("%s",a); i = 0; k = 0; while(a[i] !='\0') { cnt = 0; b[k] = a[i]; while(b[k] = a[i]) { cnt++; i++; } k++; b[k] = cnt + 48; k++; } b[k]='\0'; printf("b=%s\n",b); printf("c=%s\n",c); //-------------------------------------------------- getchar(); return 0; }

  • コンパイルするとエラーに。C言語(改め)

    インクルード 定義 メイン関数 エラー内容 が収まりませんでした; (長すぎてどうすればよいのやら;) int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len-1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } return nlines; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(char *v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); swap(v, left, last); kr_qsort(v, left, last-1, comp); kr_qsort(v, last+1, right, comp); } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } void readargs(int argc, char *argv[]) { char c; int atoi(char *); while (--argc > 0 && (c = (*++argv)[0] == '-' || c == '+') { if (c == '-' && !isdigit(*(argv[0]+1))) while (c = *++argv[0]) switch (c) { case 'd': option |= DIR; break; case 'f': option |= FOLD; break; case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); error("Usage: sort -dfnr [+pos1] [-pos2]"); break; } else if (c == '-') pos2 = atoi(argv[0]+1); else if ((pos1 = atoi(argv[0]+1)) < 0) error("Usage: sort -dfnr [+pos1] [-pos2]"); } if (argc || pos1 > pos2) error("Usage: sort -dfnr [+pos1] [-pos2]"); } } void writelines(char *lineptr[], int nlines, int order) { int i; if (order) for (i = nlines-1; i >= 0; i--) printf("%s\n", lineptr[i]); else for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } int charcmp(char *s, char *t) { char a, b; int i, j, endpos; int option, pos1, pos2; int fold = (option & FOLD) ? 1 : 0; int dir = (option & DIR) ? 1 : 0; i = j = pos1; if (pos2 > 0) endpos = pos2; else if ((endpos = strlen(s)) > strlen(t)) endpos = strlen(t); do { if (dir) { while (i < endpos && !isalnum(s[i]) && s[i] != ' ' && s[i] != '\0') i++; while (j < endpos && !isalnum(t[j]) && t[j] != ' ' && t[j] != '\0') j++; } if (i < endpos && j < endpos) { a = fold ? tolower(s[i]) : s[i]; i++; b = fold ? tolower(t[j]) : t[j]; j++; if (a == b && a == '\0') return 0; } } while (a == b && i < endpos && j < endpos); return a - b; } int numcmp(char *s1, char *s2) { double v1, v2; char str[MAXSTR]; substr(s1, str, MAXSTR); v1 = atof(str); substr(s2, str, MAXSTR); v2 = atof(str); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } void substr(char *s, char *str, int maxstr) { int i, j, len; extern int pos1, pos2; len = strlen(s); if (pos2 > 0 && len > pos2) len = pos2; else if (pos2 > 0 && len > pos2) error("substr: string too short"); for (j = 0, i = pos1; i < len; i++, j++) str[j] = s[i]; str[j] = '\0'; } int getline (char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; } void error(char *s) { printf("%s\n", s); exit(1); }

  • 課題でつまってます・・・

    閲覧ありがとうございます。 main内のkr_sortの部分と、kr_sortのswapがおかしいのですが、どうやっても「警告: 互換性のないポインタ型からの引数 1 個の `swap' を渡しますです」という風になってしまいます。どなたかご指摘お願いします。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define NUMERIC 1 #define DECR 2 #define LINES 100 #define MAXLEN 1000 #define ALLOCSIZE 10000 #define MAXLINES 5000 int numcmp(char *s1, char *s2); int readlines(char *lineptr[], int maxlines); int getline (char s[], int lim); void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)); void writelines(char *lineptr[], int nlines, int decr); char *lineptr[MAXLINES]; char linestor[20]; char *alloc(int n); static char option = 0; static char allocbuf[ALLOCSIZE]; static char *allocp = allocbuf; main(int argc, char *argv[]) { char *lineptr[LINES]; int nlines; int c, rc = 0; while (--argc > 0 && (*++argv)[0] == '-') while (c = *++argv[0]) switch (c) { case 'n': option |= NUMERIC; break; case 'r': option |= DECR; break; default: printf("sort: illegal option %c\n", c); argc = 1; rc = -1; break; } if (argc) printf("Usage: sort -nr \n"); else if ((nlines = readlines(lineptr, LINES)) > 0) { if (option & NUMERIC) kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) numcmp); else kr_qsort((void **) lineptr, 0, nlines-1, (int (*) (void *, void *)) strcmp); writelines(lineptr, nlines, option & DECR); } else { printf("input too big to sort \n"); rc = -1; } return rc; } int numcmp(char *s1, char *s2) { double v1, v2; v1 = atof(s1); v2 = atof(s2); if (v1 < v2) return -1; else if (v1 > v2) return 1; else return 0; } int readlines(char *lineptr[], int maxlines) { int len, nlines; char *p, line[MAXLEN]; nlines = 0; while ((len = getline(line, MAXLEN)) > 0) if (nlines >= maxlines || (p = alloc(len)) == NULL) return -1; else { line[len-1] = '\0'; strcpy(p, line); lineptr[nlines++] = p; } return nlines; } char *alloc(int n) { if (allocbuf + ALLOCSIZE - allocp >= n) { allocp += n; return allocp - n; } else return 0; } void kr_qsort(char *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int i, int j); if (left >= right) return; swap(v, left, (left + right)/2); last = left; for (i = left+1; i <= right; i++) if ((*comp)(v[i], v[left]) < 0) swap(v, ++last, i); swap(v, left, last); kr_qsort(v, left, last-1, comp); kr_qsort(v, last+1, right, comp); } void writelines(char *lineptr[], int nlines, int decr) { int i; if (decr) for (i = nlines-1; i >= 0; i--) printf("%s\n", lineptr[i]); else for (i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } void swap(char *v[], int i, int j) { char *temp; temp = v[i]; v[i] = v[j]; v[j] = temp; } int getline (char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c=getchar()) != EOF && c != '\n') s[i++] = c; if (c == '\n') s[i++] = c; s[i] = '\0'; return i; }

  • プログラミング(配列と関数の引数)

    a : ABCDE a : ABCDEFGH Len : 8 a : FGHIJ a : FGH a : FGH, c : FGH 上記のように表示されるプログラムを作りたいのですが、なかなかできません。下記のようなプログラムを作ったのですがどこが間違っているのかよくわかりません。分かる方、指摘をお願いします。 #include <stdio.h> void my_strcpy(char s[], char t[]); int my_strlen(char s[]); void my_strcat(char s[], char t[]); int main(){ char a[10]; char b[10] = "ABCDE"; char c[] = "FGH"; int len; my_strcpy(a, b); printf("a : %s\n", a); my_strcat(a, c); printf("a : %s\n", a); len = my_strlen(a); printf("Len : %d\n", len); my_strcpy(a, "FGHIJ"); printf("a : %s\n", a); a[3] = '\0'; printf("a : %s\n", a); if(strcmp(a, c) == 0){ printf("a : %s, c : %s\n", a, c); } int i, s, t; my_strcpy(a, b + 2); printf("a : %s\n", a); void my_strcpy(char s[], char t[]){ for (i = 0; t[i] != '\0'; i++){ s[i] = t[i]; } s[i] = '\0'; } int my_strlen(char s[]){ int i; for (i = 0; s[i] != '\0'; i++); return i; } void my_strcat(char s[], char t[]){ int i, j; for (i = 0; s[i] != '\0'; i++); for (j = 0; t[j] != '\0'; i++, j++){ s[i] = t[j]; } s[i] = '\0'; } }

  • 文字列から文字を探す

    以下のプログラムです。 #include <stdio.h> main () { char s[]="I love cat and dog."; char c='a'; char *p=s; int n=0; printf("\"%s\"の中から\'%c\'を探します。",s,c); while(*p != '\0') { if(*p == 0) { printf("%d文字目で発見しました。\n",p-s+1); n++; } p++; } if(n == 0) printf("1つも見つかりませんでした。\n"); else printf("全部で%d個見つかりました。\n",n); } C言語の本で勉強しています。 ・p-s+1の意味がわかりません。 ここには何が割り当てられているのでしょうか? ・*pとpの違いもあいまいです。 ・\"%s\"は「"」を印刷するためには必要なのでしょうか? どう質問していいのかもわからないのですが、よろしくお願いします。

  • 重複文字を出力させない!!

    こんにちは!! ご質問させてください。 右辺値のダブルクオートくくりの 文字列をテキストから読み込みファイルに書き込む処理ですが..... うまく取れません。下記にソースコードを提示しましたので 一読の上アドバイスいただけたらと思います。 テキストファイルのないようは k="seikyo"-"himawari" k="north"+"seikyo" これを読み込んだ場合.tファイルに書き込む内容は seikyo himawari north seikyo ですが重複した場合は書き込まないようにプログラムしたつもりです。 seikyo himawari north としたいと思っています。 希望通りの形にならないので皆様どうか お力をお貸しください。よろしくお願いします。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<syslog.h> #define MAX_REC_A 256 #define MAXFIELD 128 #define BUFFLEN 256 #define MAX 10000 #define MBF 1024 int makemoutputhrightside(); int main(int argc ,char **argv) { makemoutputhrightside(argv[1]); } /* 右辺の値をとって.tファイルに書き込む関数 */ int makemoutputhrightside(char sum[BUFFLEN]) { FILE *ft; FILE *fh; int c; char cPid[BUFFLEN]; char *p; char *q; char *str[BUFFLEN]; int flag = 0; int i = 0; int n = 0; int k; char filename[64]; char cdmy[MAX]; strcpy(filename,sum); strcat(filename,".txt"); ft = fopen(filename, "r"); fh = fopen("moutput.t", "a"); if (ft == NULL || fh == NULL) { syslog(LOG_ERR,"開けないファイルがあります。\n"); return 1; } //ファイルを1文字ずつ読み込む while ((c = fgetc(ft)) != EOF) { switch (c) { case '"': flag = 1 - flag; /*右のクオート*/ if (flag == 0) { cPid[i] = '\0'; p = strcpy(cdmy,cPid); for(k = 0;k < n;k++){ if(*str[k] != *p) continue; if(strcmp(str[k],p) == 0) break; } if(k < n) continue; q = malloc(strlen(p) + 1); strcpy(q,p); str[n] = q; fprintf(fh, "%s ",q); i = 0; } n++; break; case '\n': if (flag == 1) { cPid[i] = '\0'; fprintf(fh, "%s \n", cPid); } flag = 0; } i = 0; break; default: if (flag == 1) { cPid[i] = c; if (i < BUFFLEN - 1) { i++; } } break; } } /* ファイルの最後が改行じゃなかった場合 */ if (i>0) { cPid[i]='\0'; fprintf(fh,"%s\n",cPid); } fclose(ft); fclose(fh); return 0; }

  • 文字列検索について

    下記のようなC++プログラムにおいて、Good Morning! の「r」以後が、 検索にひっかからないで、-1を返します。 何故なのか、どうぞよろしくお願いします。 -------------------------------------------------------- #include <iostream> #include <cstring> using namespace std; int flag = 0; // 該当文字があったかどうかのフラグ int strch_idx(const char* s, char c){ int temp; cout << strlen(s) << endl; for(int i=0; i<(signed)strlen(s); i++){ if(*s == c){ temp=i+1; // 配列のインデックスは0オリジンだが、インデックスは1からだから1+する flag = 1; break; } s++; } if(flag == 1) return temp; else return -1; } int main(){ const char* s = "Good Morning!"; int idx = strch_idx(s, 'i'); cout << "検索文字のインデックス:" << idx << endl; return 0; }

  • 文字列とポインタの問題です。

    #include<stdio.h> int f(char *s); int main(void){ char*str="nasida Institute of Technology"; int i; i=f(str); printf("%s:%d\n",str,i); return 0; } int f(char *s) { int j=0; while(*s!='\0'){ if(*s=='t'){ j++; } s++; } return j; } このプログラムの答えが3になるんですが、if文のとこの動作がよく分からないので、よろしくお願いします。