C言語の勉強しているものですが、以下の問題がわからなくて困っております。
途中まで作成してみましたが、もっとも長い文字列が複数ある場合に対応できるように作成する方法がわかりません。
差し支えなければ、どなたか教えていただけたら幸いです。
環境は、Windows10,Visual Studio2017
(問題)キーボードから3つの文字列を入力させ、そのうち最も長い文字列を表示するプログラムを作りなさい。ただし、同じ長さの文字列が複数ある場合は、すべて表示すること。
期待される実行結果の例①(最長のものが1つしかない場合)
文字列1:lemon ← キーボードから入力
文字列2:apple ← キーボードから入力
文字列3:pineapple ← キーボードから入力
もっとも長い文字列:
pineapple
期待される実行結果の例②(最長のものが複数の場合)
文字列1:yellow ← キーボードから入力
文字列2:green ← キーボードから入力
文字列3:orange ← キーボードから入力
もっとも長い文字列:
yellow
orange
私が作成したものです↓
#include<stdio.h>
#include<string.h>
#define size 256
void main(){
char s1[size], s2[size], s3[size];
int len1,len2,len3;
printf("文字列1:");
scanf_s("%s", s1,size);
printf("文字列2:");
scanf_s("%s", s2,size);
printf("文字列3:");
scanf_s("%s", s3,size);
len1 = strlen(s1);
len2 = strlen(s2);
len3 = strlen(s3);
if (len1 > len2) {
if (len1 > len3) {
printf("もっとも長い文字列:%s\n",s1);
}
}
if (len2 > len1) {
if (len2 > len3) {
printf("もっとも長い文字列:%s\n", s2);
}
}
if (len3 > len1) {
if (len3 > len2) {
printf("もっとも長い文字列:%s\n", s3);
}
}
}
No.3ベストアンサー
- 回答日時:
システム開発の仕事を30年ほどしていました。
こういった質問をされる方は多いのですが、その多くはプログラム言語で答えとなる処理手順を考えておられていて、日本語で考えることをされておられないようにお見受けします。
どういう入力操作を行うこととし、プログラム内部にどういうデータ領域を用意し、どういう処理手順で入力データを処理したら求める結果が得られるか。そしてその結果をどう表示するか。そこを日本語でしっかり考えまとめることが大変重要です。
プログラム内部に持つデータ構造は使用する言語に依存する場合もありますが、それ以外の部分、処理手順(アルゴリズム)は言語には大きくは依存しないかと思います。特にC言語を含む手続き型言語の場合は。
そのプランが持てていないので「分からない」となっているかと思います。
ザッと考えると基本的には以下のような感じでしょう。
よく考えてませんので漏れは幾つもあるはずですが。(^^;
-----
前提として以下のデータ領域を用意する。
・最長文字数を格納するデータ
・最長文字列の個数を格納するデータ
・最長文字数を格納するデータ
・最長文字列を格納するデータを3個
処理手順は以下のとおり。(各種エラー判定や詳細処理は除きます)
(1) 上記の各データを初期化する ※使用言語によってはデータ領域の定義で実施可
(2) 以下の処理を3回繰り返す
1)キーボードから入力された文字列を取り出し文字数を求める
2)この値が「最長文字数を格納するデータ」の値より長ければ以下の処理を行う。
2-1)この値を新たに「最長文字数を格納するデータ」に格納する
※ 3個ある「最長文字数を格納するデータ」の何処に格納するかには「最長文字列の個数を格納するデータ」を使う
2-2)「最長文字列を格納するデータ」と「最長文字列の個数を格納するデータ」を初期化する
2-3)入力文字列を「最長文字列を格納するデータ」に格納する
2-4)「最長文字列の個数を格納するデータ」をカウントアップする
3)この値が「最長文字数を格納するデータ」の値と同じならば以下の処理を行う
3-1)入力文字列を「最長文字列を格納するデータ」に格納する
3-2)「最長文字列の個数を格納するデータ」をカウントアップする
(3) 「最長文字列の個数を格納するデータ」の値だけ以下の処理を繰り返す
1)「最長文字列を格納するデータ」の内容を標準出力する
参考まで。
No.4
- 回答日時:
配列を使うのが一般的ですが、
簡単に処理するなら以下のようにしては如何でしょうか
文字列 s1 の長さを調べる
文字列 s2 の長さを調べる
文字列 s3 の長さを調べる
長さの最大数を求める → M
文字列 s1 の長さを調べる / Mと同じなら s1 を表示
文字列 s2 の長さを調べる / Mと同じなら s2 を表示
文字列 s3 の長さを調べる / Mと同じなら s3 を表示
No.2
- 回答日時:
簡単な動作確認しかしていませんが、以下のようにしてください。
もし、配列とポインターを既に習っているならもっと簡単になると思いますが、
とりあえず、今回は、力ずくで行う方法です。
#include<stdio.h>
#include<string.h>
#define size 256
void main(){
char s1[size], s2[size], s3[size];
int len1,len2,len3;
printf("文字列1:");
scanf_s("%s", s1,size);
printf("文字列2:");
scanf_s("%s", s2,size);
printf("文字列3:");
scanf_s("%s", s3,size);
len1 = strlen(s1);
len2 = strlen(s2);
len3 = strlen(s3);
if (len1 >= len2) {
if (len1 >= len3) {
printf("もっとも長い文字列:%s\n",s1);
if (len1 == len2){
printf("もっとも長い文字列:%s\n",s2);
}
if (len1 == len3){
printf("もっとも長い文字列:%s\n",s3);
}
return;
}
}
if (len2 >= len1) {
if (len2 >= len3) {
printf("もっとも長い文字列:%s\n",s2);
if (len2 == len1){
printf("もっとも長い文字列:%s\n",s1);
}
if (len2 == len3){
printf("もっとも長い文字列:%s\n",s3);
}
return;
}
}
if (len3 >= len1) {
if (len3 >= len2) {
printf("もっとも長い文字列:%s\n",s3);
if (len3 == len1){
printf("もっとも長い文字列:%s\n",s1);
}
if (len3 == len2){
printf("もっとも長い文字列:%s\n",s2);
}
return;
}
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 【C言語】全角文字の配列を、全角のまま1文字ずつ出力する方法 4 2023/05/09 15:08
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
[C言語]fputsとfprintfの違い
-
VBの「As String * 128」とは?
-
VBscriptからバッチに変数を渡...
-
MS SQLServer のSQLで文字列の...
-
Excelはなんで先頭の0を消すん...
-
Excelで3E8を3.00E+8にしない方...
-
VBA2005 16進を2桁で表示したい。
-
A B C D E の五文字のすべてを...
-
ORCLEでの小数の表示方法の変更...
-
エクセルで文字列の最大値を抽...
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
sedなどで、特定の文字列の後の...
-
Excelで指数表現しないようにす...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
[C言語]fputsとfprintfの違い
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
エクセルで文字列の最大値を抽...
-
Excelはなんで先頭の0を消すん...
-
MS SQLServer のSQLで文字列の...
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
Msgboxの×が押されたとき
-
sedなどで、特定の文字列の後の...
-
【Excel VBA】複数ある特定の文...
-
OnTime 使用時のプロシージャへ...
おすすめ情報