I have a pen.
You have 6 brothers.
と書かれたテキストファイルを入力し,
文字の連結を調べたいと思っています。
例えば
have
だったら、
h-aが1つ
a-vが1つ
v-eが1つ
ところが、
have a
となっているためか
e-aも1つとしてカウントされるのです。
スペースや数字はカウントせずに処理したいんですが、
どうすればよいでしょうか?
一応、ソースは、
#include<stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void)
{
int count[26]={0};
int ren[26][26]={0};
char c,cc='a',ccc='a';
FILE *fp,*fo;
int j,jj,k=0;
int i[50000]={0};
if((fp=fopen("penin.txt","r"))!=NULL){
while((c=fgetc(fp))!=EOF){
putchar(c);
c = tolower(c);
i[k]=c-'a';
count[i[k]]++;
if(k>1){
ren[i[k-1]][i[k]]++;
}
k++;}
}
if((fo = fopen("penout.tsv", "w")) == NULL){ /* 出力ファイルオープン */
printf("出力ファイルがオープンできません\n");
exit(1); /* 強制終了 */
}
for(j=0;j<=25;j++){
fprintf(fo,"%c = %d個\n",cc,count[j]);
cc=cc++;
}
cc='a';
for(j=0;j<=25;j++){
for(jj=0;jj<=25;jj++){
fprintf(fo,"%c %c = %d個\n",cc,ccc,ren[j][jj]);
ccc=ccc++;
}
ccc='a';
cc=cc++;}
fclose(fp);
fclose(fo);
return(0);
}
です。
もし、ソース自体をもっと
スマートにできるのであれば
それもご教授ください。
No.2
- 回答日時:
c = tolower(c);
i[k]=c-'a';
count[i[k]]++;
/*-----------------変更箇所-------------*/
if(k>1){
ren[back][i[k]]++;
back=i[k-1];
}else if(k==1){
back=i[k];
}
/*-----back は char型で宣言しておく-----*/
k++;
}
ってしたらできませんか?動作確認なんてしてませんが。
No.3
- 回答日時:
ほんとすみません。
間違えました。c = tolower(c);
i[k]=c-'a';
count[i[k]]++;
/*-----------------変更箇所-------------*/
if(k>1){
ren[back][i[k]]++;
if((i[k] != ' ') && (!isdigit(i[k])){
back=i[k];
}
}else if(k==1){
back=i[k];
}
/*-----back は char型で宣言しておく-----*/
k++;
}
No.4
- 回答日時:
★アドバイス
>もし、ソース自体をもっと
>スマートにできるのであれば
>それもご教授ください。
文字列をトークン(単語)ごとに切り出してから処理すれば分かりやすくなります。
サンプルを載せると下のようになります。
サンプル:
#include <ctype.h>
#include <stdio.h>
// メイン関数
int main( void )
{
char token[ 256 ]; // 1つの単語
FILE *fp = stdin; // 本当はファイル・ポインタを入れる
int c, n = 0;
printf( "キーボードから入力して下さい。CTRL+Cで終了\n\n" );
while ( (c = fgetc(fp)) != EOF ){
if ( isspace(c) ){
if ( n != 0 ){
token[ n ] = '\0';
printf( "%-20s :%d 個\n", token, (n - 1) );
}
n = 0;
}
else{
token[ n++ ] = (char)c;
}
}
// ここも記述しておく(上と同じなので関数にすべき)
if ( n != 0 ){
token[ n ] = '\0';
printf( "%-20s :%d 個\n", token, (n - 1) );
}
return 0;
}
上記の token を調べれば h-a、a-v、v-e、e-\0となって最後のe-\0は連結なしとして
カウントしなければ良い。表示する printf() 部分に次のカウンタ加算を記述。
int i, count[ 26 ] = { 0 }; ←宣言部に追加。
for ( i = 0 ; i < n ; i++ ){
if ( token[i + 1] != '\0' ){ ←最後以外を処理
c = tolower( token[i] );
count[ c - 'a' ] += 1; ←加算
}
}
とすれば h=1、a=1、v=1、e=0 と加算されていきます。
カウンタ部分と結果表示部分を作れば下のようになります。
結果:
a = 2個
b = 1個
c = 0個
d = 0個
:
z = 0個
No.5ベストアンサー
- 回答日時:
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
FILE *fp1, *fp2;
int c[26] = {0}, cc[26][26] = {0}, c0, c1, i, j;
if(argc != 3) return 1;
if(!(fp1 = fopen(argv[1], "r"))) return 1;
for(c0 = tolower(fgetc(fp1)); c0 !=EOF; c0 = c1){
c1 = tolower(fgetc(fp1));
if(isalpha(c0)){
c[c0 - 'a'] ++;
if(isalpha(c1)) cc[c0 - 'a'][c1 - 'a'] ++;
}
}
fclose(fp1);
if(!(fp2 = fopen(argv[2], "w"))) return 1;
for(i = 0; i < 26; i ++){
if(c[i]) fprintf(fp2, "%c %d\n", 'a' + i, c[i]);
}
for(i = 0; i < 26; i ++){
for(j = 0; j < 26; j ++){
if(cc[i][j]) fprintf(fp2, "%c - %c %d\n", 'a' + i, 'a' + j, cc[i][j]);
}
}
fclose(fp2);
return 0;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
インクリメント演算子のみを用...
-
Windows formアプリで データグ...
-
右ビットシフト
-
Linux Cプログラミングを学ぶた...
-
プログラミングについて。 1つ...
-
ArduinoのジャイロモジュールMP...
-
c言語
-
これなにがちがうんですか??
-
Int('1234') で、strをかんたん...
-
C言語 配列と関数の練習問題
-
質問失礼します。 プログラム言...
-
C言語の関数と配列に関する質問
-
どなたかこのプログラミングを...
-
VisualStudio2022でC言語プログ...
-
C言語をコンパイルするとコンピ...
-
どちのほうがすきですか?
-
Notepad++の関数リスト表示の変...
-
WindowsのCapsLock(キャップス...
-
double型が正常に認識されてい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列と関数の練習問題
-
システムエンジニアの適正について
-
[C言語]fputsとfprintfの違い
-
C言語をコンパイルするとコンピ...
-
mallocについて
-
どちのほうがすきですか?
-
ArduinoのジャイロモジュールMP...
-
大量のデータを読み込んで表示...
-
gccを行ってもexeファイルが生...
-
VisualStudio2022でC言語プログ...
-
C言語 列挙型(enum型)変数について
-
こんなことてしますか??
-
C言語の関数と配列に関する質問
-
Linuxでの開発環境構築や設定の...
-
質問失礼します。 プログラム言...
-
MACで動く実行ファイルをWindow...
-
WindowsのCapsLock(キャップス...
-
これなにがちがうんですか??
-
卒業研究でよく分からないとこ...
-
gcc13.2のバグ?
おすすめ情報