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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

7回答

1456閲覧

[C言語] アルゴリズムの省略 同等の式

friskblack

総合スコア3

C

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

1クリップ

投稿2020/08/20 11:00

前提・実現したいこと

ソースコードの簡略化を目指しており、
期待出力結果が以下の時に、

1
2
3
4

4
3
2
1

コメント分にある「同等の式」の個所を同じソースコードで記述したいのですが、
いいアイディアはございませんでしょうか?
それとも、そもそも1行では実現できないですかね...

該当のソースコード

C

1int main( void ) 2{ 3 4 for( int8_t i = 1; i < 5; i++ ) { 5 printf("%d " , i ); //同等の式 6 printf("\n" ); 7 } 8 9 printf("\n" ); 10 11 for( int8_t i = -1; i > -5; i-- ) { 12 printf("%d " , 5+i ); //同等の式 13 printf("\n" ); 14 } 15 16}- リスト

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

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

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

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

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

Zuishin

2020/08/20 11:03

関数を作ればいいのではないでしょうか。
guest

回答7

0

ベストアンサー

C

1#include <stdio.h> // printf 2#include <stdlib.h> // abs 3 4int main() { for (int i = 5; --i > -5; printf("%d\n"+(2*!i), 5 - abs(i))); }

追記
1行で書くなら、

int abs(int), printf(const char *, ...); int main() { for (int i = -5; ++i < 5; printf("%d\n"+!i+!i, 5 - abs(i))); }

追記2

コメント分にある「同等の式」の個所を同じソースコードで記述したいのですが、

その行以外は変更しないのでしょうか? それなら、

C

1 printf("%d " , (5-i)/5*5+i ); //同等の式

追記3
究極の 1行コード

C

1main(){puts("1\n2\n3\n4\n\n4\n3\n2\n1");}

追記4

ソースコードの簡略化を目指しており、

お尋ねします。

ソースコードの簡略化を目指しているのなら、
なぜ printf("%d " , i ); printf("\n" ); のように printf を 2つに分けて書くのですか?
printf("%d\n", i); で十分なのに。

ソースコードの簡略化を目指しているのなら、
なぜ、for( int8_t i = -1; i > -5; i-- ) { のように i の値を負の値にするんですか?
for (int8_t i = 4; i > 0; i--) { とすれば、printf も最初の forループと
同じ形で書けるのに。

投稿2020/08/20 12:22

編集2020/08/20 23:54
kazuma-s

総合スコア8224

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

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

fana

2020/08/22 07:59

私は,この質問の意味を, 「//同等の式」というコメントが書かれている2箇所に関して(現状では異なる記述になっているが),ここを同一の記述にするためにはどうしたらいいか? であろうと読んだ.であれば > for (int8_t i = 4; i > 0; i--) { とすれば、printf も最初の forループと同じ形で書けるのに。 がその回答ということになろうかと.
guest

0

皆様回答ありがとうございます。
kazuma-s様の追記2のご回答により、本問題を解決することができました。

私の質問の意図としましては、
同等の式の部分の可変引数部を一つの式で行いたかったので質問させていただきました。
それ以外の部分は、本サイトに投稿するためわかりやすく記述したつもりだったのですが、
逆に本来の意図が分かりにくい形となってしまいました。
今回私の質問が拙い中、多くの知恵をお貸しいただきありがとうございました。

投稿2020/08/26 07:46

friskblack

総合スコア3

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

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

0

マジックナンバーと三項演算子使っていいならこれでもいけます。

c

1#include <stdio.h> 2#include <stdint.h> 3 4int main( void ){ 5 for( int8_t i = 1; i < 5; ++i )i==4 ? printf("%d \n\n" , i ) : printf("%d \n" , i ); 6 for( int8_t i = -1; i > -5; --i )printf("%d \n" , 5+i ); 7}

追記: 一行版

c

1#include <stdio.h> 2#include <stdint.h> 3 4int main( void ){ 5 for( int8_t i = 1; i < 9; ++i )i>=4 ? i==4 ? printf("%d \n\n" , i ) : printf("%d \n" , (i-9)*-1 ) : printf("%d \n" , i ); 6}

投稿2020/08/20 12:34

編集2020/08/20 13:05
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

C++

1#include <stdio.h> 2 3int main(void) { 4 int N = 4; 5 for( int i = 0; i < N*2+1; i++) i < N ? printf("%d\n", i+1) : i == N ? printf("\n") : printf("%d\n", N*2+1-i); 6 return 0; 7}

投稿2020/08/20 11:41

編集2020/08/20 11:42
can110

総合スコア38341

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

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

0

C++

1#include <stdio.h> 2 3void print(int n) 4{ 5 if( n <= 4){ 6 printf("%d\n", n); 7 print(n+1); 8 printf("%d\n", n); 9 } 10 else if( n == 5){ 11 printf("\n"); 12 } 13} 14 15int main(void) { 16 print(1); 17 return 0; 18}

投稿2020/08/20 11:28

can110

総合スコア38341

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

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

0

C

1int t[] = {1,2,3,4,0,4,3,2,1}; 2for(int n=0;n<9;n++){ 3 int i=t[n] && 4 printf("%d ",i); 5 printf("\n" ); 6}

こういう事??

「同等の式」の個所を同じソースコードで記述したい

の意味がいまいちわからない…
その部分はコードをいじってはダメなのか。
その部分だけを同等の別の式に置き換えたいのか。
単純に、2か所のその部分を同じ書き方にしたい、なのか。

コメントの付いた行を書き換えて良くて、配列を使うのはズルいなら。こうかなー?
単一ループで。

C

1for(int i=-4; i<5; i++){ 2 i && printf("%d ",5-(i<0?-i:i)); 3 printf("\n" ); 4}

absを使っていいなら。真ん中はi && printf("%d ",5-abs(i));にするとスッキリする。

投稿2020/08/20 11:16

編集2020/08/20 12:51
amiya

総合スコア1218

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

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

0

えーと...

C

1#include <stdio.h> 2#include <stdint.h> 3 4int main() { 5 6 int delta = 1; 7 int n = 1; 8 for( int8_t i = 1; i < 10; i++ ) { 9 if ( i == 5 ) { 10 delta = -1; 11 } else { 12 printf("%d" , n ); 13 } 14 printf("\n" ); 15 n += delta; 16 } 17 return 0; 18}

投稿2020/08/20 11:11

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問