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

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

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

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Q&A

解決済

3回答

8104閲覧

C言語 ひし形の出力について

Ryo-chan

総合スコア9

C

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

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

0グッド

0クリップ

投稿2021/08/01 08:53

標準入力に正の整数 n を入力すると,半角数字を使用して,
2n−1 段のひし形を標準出力に出力するプログラムを作成したのですが、

なぜか全体的に1桁余分な空白が出てしまいます。
どこが問題か教えていただけますでしょうか。

作成したプログラム

#include <stdio.h> //関数のプロトタイプ宣言 void writeUpper(); void writeLower(); int n, center; int num=1; int main(void){ scanf("%d", &n); n = 2*n-1; // 中央が何段目になるか計算する center = (n / 2); // 上半分の表示 writeUpper(); // 下半分の表示 writeLower(); return 0; } // 上半分の表示 void writeUpper(){ // 中央に達するまで表示 for(int i = 0 ; i <= center ; i++){ for(int j = i ; j <= center ; j++){ // 空白の表示 printf(" "); } // 中央の1個分表示 printf("%d",num); for(int j = 0 ; j < i*2 ; j++){ // 現在の段数*2(左右分)表示 printf("%d",num); } printf("\n"); num =(num+1)%10; } } // 上半分の表示 void writeLower() { // 中央から1つ短くするため-1しています for(int i = center - 1 ; i >=0 ; i--){ for(int j = center-i ; j >= 0 ; j--){ // 空白の表示 printf(" "); } // 中央の1個分表示 printf("%d",num); // 現在の段数*2(左右分)表示 for(int j = 0 ; j < i*2 ; j++){ printf("%d",num); } printf("\n"); num =(num+1)%10; } }

出力結果

1↵ 222↵ 33333↵ 4444444↵ 555555555↵ 6666666↵ 77777↵ 888↵ 9↵ ``` 本来はこのように出力したい。
1↵ 222↵ 33333↵ 4444444↵ 555555555↵ 6666666↵ 77777↵ 888↵ 9↵ ``` 分かりますでしょうか?出力結果の方は若干右寄りになってまして、 5の列は1文字スペースがあります。

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

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

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

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

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

guest

回答3

0

解決済みなので別解を示します。

n が 4 のとき、空白の個数 j は 3, 2, 1, 0, 1, 2, 3 と変化します。
これは -3, -2, -1, 0, 1, 2, 3 と変化する i の絶対値 abs(i) です。
表示する数字の個数は (n - j) * 2 - 1 です。

C

1#include <stdio.h> // scanf, putchar 2#include <stdlib.h> // abs 3 4int main(void) 5{ 6 int n, m = 0; 7 scanf("%d", &n); 8 for (int i = -n; ++i < n; putchar('\n')) { 9 int j = abs(i), k = (n - j) * 2, c = ++m % 10 + '0'; 10 while (j--) putchar(' '); 11 while (--k) putchar(c); 12 } 13}

追記
++m を (n + i) に変えると、変数 m が要らなくなります。

1行を printf 1つで出力することもできます。

C

1#include <stdio.h> // scanf, printf 2#include <stdlib.h> // abs, malloc 3#include <string.h> // memset 4 5int main(void) 6{ 7 int n; 8 scanf("%d", &n); 9 char *p = malloc(n * 2); 10 for (int i = -n; ++i < n; ) { 11 int j = abs(i), k = (n - j) * 2 - 1; 12 memset(p, (n + i) % 10 + '0', k); 13 printf("%*.*s\n", j + k, k, p); 14 } 15}

投稿2021/08/01 23:16

編集2021/08/02 06:44
kazuma-s

総合スコア8224

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

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

0

途中で "増減の向きを変える" ことで上下に分けずにも出来ます。
「上が間違ったから下も」ということが無くなります。

c

1#include <stdio.h> 2 3int main(void){ 4 int n; 5 scanf("%d", &n); 6 7 for(int i=1, jmax=n-1, kmax=1, d=1; i<=n*2-1; i++, jmax-=d, kmax+=d*2) { 8 9 for(int j=0; j<jmax; j++) printf(" "); 10 int v = i%10; 11 for(int k=0; k<kmax; k++) printf("%d",v); 12 printf("\n"); 13 14 if(jmax == 0) d = -d; //折り返し 15 } 16 17 return 0; 18}

投稿2021/08/01 18:28

jimbe

総合スコア13209

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

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

0

ベストアンサー

void writeUpper()

for(int j = i ; j <= center ; j++){


--> for(int j = i ; j < center ; j++){

とする。

投稿2021/08/01 09:05

pepperleaf

総合スコア6385

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

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

pepperleaf

2021/08/01 09:07

自分で書かれたコードなら、ここで何を行ってるか分かると思うのですが、、、
Ryo-chan

2021/08/01 09:16

あ…。 writeUpper()とwriteLower()それぞれ修正したらいけました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問