質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

6回答

1070閲覧

C言語5文字に1文字だけ別の文字を表示する

ceg34ry

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2023/09/06 21:51

編集2023/09/06 22:12

実現したいこと

1.C言語を使って任意の値を入力します。
2.値のぶんだけ文字を表示します。
3.表示する4文字はハイフン(-)として5文字目はアスタリスク(*)を表示します。

値:5
表示:----*

値:10
表示:----*----*

値:15
表示:----*----*----*

前提

visual studio2022を使用しています

発生している問題

意図したとおりに表示できないです。
なお、私が書いた下記2つのソースコードについて、どのように表示されるか、ソースコード末尾の実行結果をご覧ください。

該当のソースコード

C

1#include<stdio.h> 2int main(void) { 3 int input = 0; 4 printf("値:"); scanf_s("%d", &input); 5 6 while (input > 0) { 7 if (input % 5 == 0) { 8 printf("-"); 9 10 }else{ 11 printf("*"); 12 } 13 input--; 14 } 15 return 0; 16} 17//実行結果 18//値:10 19//*----*---- 20//*の表示位置が意図どおりでない

試したこと

コードを最初から書き換えてみましたが、意図した表示になりません

C

1#include<stdio.h> 2int main(void) { 3 int input = 0, i = 0 , j = 0; 4 printf("値:"); scanf_s("%d", &input); 5 6 while (1) { 7 while (1) { 8 i++; 9 if (i > 4)break; 10 printf("-"); 11 12 } 13 j = i; 14 j++; 15 printf("*"); 16 if (j > input)break; 17 } 18 return 0; 19} 20//実行結果 21//値:10 22//----****** 23//*の表示位置が意図どおりでない

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/09/06 22:08

どういうふうに表示されるんでしょうか。 質問文を編集して説明を追記しましょう
ceg34ry

2023/09/06 22:23

コメントありがとうございます。追記しました。
y_waiwai

2023/09/06 22:42 編集

勘違いなので削除
YAmaGNZ

2023/09/06 22:45

for文で1~inputまで回して5の余りで判断すれば?
ceg34ry

2023/09/06 22:49

YAmaGNZ様 コメントありがとうございます。 「該当のソースコード」と「試したこと」のソースコードがありますが、 「該当のソースコード」を書き換えたほうがよさそうでしょうか。
jimbe

2023/09/07 03:01

どのコードでもですが、入力が 1 の時、どの行をどの順番に通って各変数がどう変化していくのかを考えているでしょうか。 同じ事を入力が 2 の時、 3 の時、 4,5,6,…とコンピュータになったつもりでご自身がプログラムを"実行"してみてください、
guest

回答6

0

whie文を使って、カウントダウンしてループを回してますが、
ここはカウントアップしてループを回せばお望みの結果となるかと。
まあそのためには、ループの条件のところも変える必要があります

んで、VisualStudioを使っているなら、コードの好きなところにブレークポイントを設定してそこで実行を止めて変数のナカミを見たり、1行づつ実行させてどういうふうにコードが動くのかを見れたりします
コードを組んで動かないからと思考停止してしまわないで、ご自分でどう動くのかを追いかけていきましょう

投稿2023/09/06 22:44

編集2023/09/06 22:48
y_waiwai

総合スコア88163

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ceg34ry

2023/09/09 02:10

ブレークポイントを設定する方法を教えてくださってありがとうございました。
guest

0

皆さま、回答ありがとうございました。

投稿2023/09/09 01:57

ceg34ry

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

「どんな方法がわかりやすいのか?」というのは人それぞれかと思うので,まだ出てないと見える方法を示しておく.

個人的にはこれが(表示内容をいろいろと変えて遊んだりできるという点も含めて)わかりやすいんじゃないかな,とか思うが,**PtrToNextOutputStr あたりが人によってはわかりにくい要素となるのかもしれない.

C

1int main( void ) 2{ 3 //5パターンの文字列の繰り返し程度であれば, 4 //表示パターンをこんな感じで配列として持ってしまうのがわかりやすいと思う. 5 //※ここでは,配列の末尾要素として,パターンの終わりを判定する用の値としてNULLを持たせている. 6 const char *Ptn[] = { "-","-","-","-","*",NULL }; 7 8 // 9 int input = 0; 10 printf("値:"); scanf_s("%d", &input); 11 12 //PtrToNextOutputStr は次に表示すべき文字列を指し示すポインタ. 13 const char **PtrToNextOutputStr = Ptn; //最初はパターンの先頭要素を指す 14 while (input > 0) 15 { 16 //今現在 PtrToNextOutputStr が指している文字列を表示する 17 printf( "%s", *PtrToNextOutputStr ); 18 19 //PtrToNextOutputStr の指す位置を次に進める. 20 //ただし,NULLを指す位置に来た場合には,それは上記のようにパターンの終わりを示すので 21 //その場合には先頭に戻す. 22 ++PtrToNextOutputStr; 23 if( *PtrToNextOutputStr == NULL ){ PtrToNextOutputStr = Ptn; } 24 25 // 26 input--; 27 } 28 29 return 0; 30}

投稿2023/09/08 01:37

編集2023/09/08 01:40
fana

総合スコア12151

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ceg34ry

2023/09/09 02:13

ポインタを使ったやりたかた、理解をうながすためのソースコード中の//コメント、どちらもありがとうございました。
guest

0

まずは、
1.C言語を使って任意の値を入力します。
2.値のぶんだけ文字を表示します。
のプログラムを書いてみましょう。10を入力したら-を10個、13を入力したら-を13個です。

それが期待通り動作するようになったら、カウンターを5で割った余りによって表示文字を*-かを選択します。
ifelseですね。ループの仕方は変えずに表示部分だけ変更します。

なお、入力10に対して、カウンターが0から9まで数えるのか、1から10まで数えるのか2パターン考えられますが、
0から9の場合は、4の時と9の時に*を表示するようにして、
1から10の場合は、5の時と10の時に*を表示するようにということですね。

投稿2023/09/07 02:19

otn

総合スコア86295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/09/07 02:25

この方法だと例えば、「5,15,25,・・の時は"+"を表示する。10,20,30,・・の時は"*"を、それ以外は"-"」 みたいな場合も、表示のifの所をif else if else と3分岐にするだけで対応できますが、 「試したこと」に書いてあるような方針で行くと、ループ構造の作り直しです。 問題の本質的な構造を見極めることが大事です。
ceg34ry

2023/09/09 01:52

回答ありがとうございます。
guest

0

入力値は置いておいて、やりたいのは
*と-を表示します。
表示ルールは、-をひたすら表示して行くが、5の倍数毎に表示したいのは*。
ということ。
printfべた書き以外で、これをまず作ることを考える。
そうすると、一例として
1.何かしらのループを作る。(for or while?)
2.そのループ内で、-を表示させていく。5個目の表示を*にする。
これの繰り返し。
ただこれだけだと分かる。

さて、これを実現する一つの手法として、
ループ内で-を表示していく。
文字表示させたカウンタを持っておき、それが5の倍数の場合には-ではなく*を表示する。
まずこれが作れるか?無限ループでも構わないのでやってみる。
(VisualStudio使っていれば、止めるのも簡単)
これができたら、あとはループに上限を設ける。上限は入力値である。
入力値と比較するのは、上記のカウンタ。

注意としては
・プログラム内でのカウンタの扱い、
0始まりや1始まりでカウンタの判定が変わること。
・0は何で割っても、余りは0である。

投稿2023/09/07 01:19

ardin

総合スコア555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ceg34ry

2023/09/09 02:11

「考え方」を教えてくださってありがとうございました。
guest

0

ベストアンサー

最小限の変更で済ませるなら、後者のコードの

c

1 while (1) { 2 while (1) {

c

1 while (1) { 2 i = 0; 3 while (1) {

に変更すればよいでしょう。

しかし、

1.C言語を使って任意の値を入力します。

というこですから、input は5の倍数ではないのかもしれません。その場合は後者のアプローチでは少々面倒になるので、前者のアプローチでカウントアップするように変更するのがいいと思います。

c

1 for (int i = 1; i <= input; ++i) { 2 if (i % 5 == 0) {

投稿2023/09/06 23:33

int32_t

総合スコア21929

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ceg34ry

2023/09/09 02:14

解決につながりました。感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問