ページ 1 / 1
飛び飛びで表示するには
Posted: 2019年1月14日(月) 11:16
by tend-11001
「キーボードから半角文字1文字をchar型変数moziに読み込みます。 その後半角文字のみで構成された文字列を読み込み、文字列の中にmoziが飛び飛びで3回連続出現する回数をカウントして表示するプログラムを作成しましょう。」
という問題なのですが飛び飛びで3回連続という部分なのですが、for文をつかうのでしょうか>?
表示結果が以下のようになるようです。
どの文字を探す? > x⏎
半角文字列 > xxxxxxxxx⏎
'x' が飛び飛びで出現する回数は 5 回です。⏎
コード:
include<stdio.h>
int main(void) {
char mozi,count;
printf("どの文字を探す?>");
scanf("%c", &mozi);
for (count = 0; count <= 3; count++) {
printf("半角文字列>");
scanf("%c",&count);
}
}
ここまで考えましたがわからないのでご協力をお願いします。
Re: 飛び飛びで表示するには
Posted: 2019年1月14日(月) 13:34
by Math
初心者の方のようなので メモリーの動的確保などせず
分かりやすく書けばこんな感じでしょうか。
これをfor分を使うなど改良すればいいでしょう。
(Windows10でMinGW gcc 8.2.0 使用)
main.c
コード:
#include <stdio.h>
int main(void) {
char mozi='a'; // [,count;]
int count=0; // [回数をカウントするので整数型がいいでしょうね]
char a[256]={ 0 }; // [文字列を格納する配列を用意する。いまとりあえず最大256文字とする]
printf("どの文字を探す?>");
scanf("%c", &mozi); //キーボードから半角文字1文字をchar型変数moziに読み込みます
printf("文字列を入力>");
scanf("%s", &a);
// for (count = 0; count <= 3; count++) {
// printf("半角文字列>");
// }
for(int i=0; i < (255-3); i++){
// 3回連続出現する回数をカウント
if(a[i]==mozi && a[i+1]==mozi && a[i+2]==mozi)count++;
// null文字 ターミネート
if(a[1]=='\0' || a[i+1]=='\0' || a[i+2]=='\0')break;
}
printf("\n\n3回連続出現する回数=%d \n", count);
return 0;
}
gc8.bat
コード:
gcc main.c
dir a.exe
a.exe
pause
http://www2.koyoen.birdview.co.jp/~abcx ... 14-01-.PNG
http://www2.koyoen.birdview.co.jp/~abcx ... 14-02-.PNG
Re: 飛び飛びで表示するには
Posted: 2019年1月14日(月) 14:19
by かずま
Math さんが書きました: ↑6年前
初心者の方のようなので メモリーの動的確保などせず
分かりやすく書けばこんな感じでしょうか。
そんな感じではないと思います。
そのプログラムだと、半角1文字が 'x' のとき、文字列 "xxxxxxxxx"
の中に 7回と出て、質問の例と合いません。
飛び飛びの x ですから "x.x.x" (. は何でもよい) の回数でしょう。
コード:
|xxxxxxxxx|
|x.x.x |
| x.x.x |
| x.x.x |
| x.x.x |
| x.x.x|
5回です。
Re: 飛び飛びで表示するには
Posted: 2019年1月14日(月) 16:13
by Math
あなるほどサンプルはそうなってますね。
Re: 飛び飛びで表示するには
Posted: 2019年1月21日(月) 00:16
by かずま
tend-11001さん、これは参考になりますか?
コード:
#include <stdio.h> // scanf, printf
#include <string.h> // strlen
int main(void)
{
char 文字, 文字列[256];
int i, 最後, 回数 = 0;
printf("どの文字を探す? > ");
scanf(" %c", &文字);
printf("半角文字列 > ");
scanf("%s", 文字列);
最後 = strlen(文字列) - 5; // strlen("x.x.x") == 5
for (i = 0; i <= 最後; i++)
if (文字列[i]==文字 && 文字列[i+2]==文字 && 文字列[i+4]==文字)
回数++;
printf("'%c' が飛び飛びで出現する回数は %d 回です。\n", 文字, 回数);
return 0;
}
コンパイラは何を使っていますか?
コンパイルできますか?
できない場合、自分で修正できますか?
Re: 飛び飛びで表示するには
Posted: 2019年1月21日(月) 07:02
by Math
[訂正版]
コード:
#include <stdio.h>
int main(void) {
char mozi='a'; // [,count;]
int count=0; // [回数をカウントするので整数型がいいでしょうね]
char a[256]={ 0 }; // [文字列を格納する配列を用意する。いまとりあえず最大256文字とする]
printf("どの文字を探す?>");
scanf("%c", &mozi); //キーボードから半角文字1文字をchar型変数moziに読み込みます
printf("文字列を入力>");
scanf("%s", &a);
// for (count = 0; count <= 3; count++) {
// printf("半角文字列>");
// }
for(int i=0; i < (255-5); i++){
// 3回連続出現する回数をカウント 飛び飛びチェック
if(a[i]==mozi && a[i+2]==mozi && a[i+4]==mozi)count++;
// null文字 ターミネート---不要
//if(a[1]=='\0' || a[i+1]=='\0' || a[i+2]=='\0')break;
}
printf("\n\n3回連続出現する回数=%d \n", count);
return 0;
}
これでサンプルは5になるね。
http://www2.koyoen.birdview.co.jp/~abcx ... 21-01-.PNG