ページ 1 / 1
-1,2,-3,4…という数列
Posted: 2016年12月22日(木) 17:06
by こんにちは
-1,2,-3,4,-5…
という数列を表示するプログラムを作りたいのですが、全然できません。
教えてください。
Re: -1,2,-3,4…という数列
Posted: 2016年12月22日(木) 18:24
by みけCAT
(これが課題かはわかりませんが)課題の丸投げは禁止です。
フォーラムルールをお読みください。
なにか試したこと、途中まで書いたコードなどは無いですか?
以下、フォーラムルールより転載
どう質問していいか解らない時は、以下のテンプレをコピペして、
各項目に対して答える形で記載して下さい。
[hr]
[1] 質問文
[1.1] 自分が今行いたい事は何か
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
[1.4] 今何がわからないのか、知りたいのか
[2] 環境
[2.1] OS : Windows, Linux等々
[2.2] コンパイラ名 : VC++ 2008EE, Borand C++, gcc等々
[3] その他
・どの程度C言語を理解しているか
・ライブラリを使っている場合は何を使っているか
[hr]
時々「あああ」とか「あいうえお」などという名前で投稿される方がいますが、
ふざけているように捉えられる場合が多く、熱心に回答してあげようという気を殺いでしまいます。
また、「初心者です」「初心者」「初めまして」「名無し」のような
その場だけの名前、また、多くの人が重複して使うであろう名前は避けてください。
なるべくオリジナルな名前を決め、以後同じ名前を使い続けてください。
Re: -1,2,-3,4…という数列
Posted: 2016年12月22日(木) 21:50
by metaphor
普通はこう書くと思います。
コード:
#include <stdio.h> //ヘッダー部分
int main(void) { //main関数
int a[5] = { -1,2,-3,4,-5 }; //一次元配列の初期化リスト
int i; //ループ変数
for(i=0; i < 5; i++){ //for文i=0より初めて5より小の間 1ずつ増やし
printf("%d\t",a[i]); //標準出力に数列を書き出す
}
return 0; //main関数の返却値:通常0
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 07:43
by box
こんにちは さんが書きました:-1,2,-3,4,-5…
何項めまで出力したいのですか?
さておき、ロジックとしては、
1から上限の数値までループする。
ループの中で、
・その数が奇数ならば-1倍した値を出力する
・その数が偶数ならば、そのまま出力する
てな感じでいいと思います。
どなたかの回答みたいにハードコーディングするのではなくて。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 09:56
by metaphor
ご指摘ありがとうございます。訂正しました。
コード:
#include <stdio.h> //ヘッダー部分
#include <math.h> //数学演算
int main(void) { //main関数
const int N=100;
int i; //ループ変数
for(i=1; i <= N; i++){ //for文i=1より初めてNより小の間 1ずつ増やし
printf("%d\t",(int)( pow((float)-1, (float)i ) * i ) ); //交互に正-負を操り換えし
} //標準出力に数列を書き出す
return N; //main関数の返却値:通常0:必要に応じて-1などを返す
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 10:13
by metaphor
”powを使わないこと”という制限が課せられた問題の場合power関数を自作ください。
ここ
http://detail.chiebukuro.yahoo.co.jp/qa ... 1477039149をご参照して下さい。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 11:12
by metaphor
ペアノの公理的に厳格に定義するとしてみれば、「最初の数には"前者”が存在しない」「他の数には必ず"前者”が存在する」「その数は"前者”より大きいか等しい」という公理をみたさい数列は当てはまらないことになります。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 11:34
by みけCAT
metaphor さんが書きました:コード:
printf("%d\t",(int)( pow((float)-1, (float)i ) * i ) ); //交互に正-負を操り換えし
言語が指定されていませんが、C言語だと仮定するとpow関数の引数はdouble型です。
どうして引数をわざわざfloat型にキャストしているのですか?
N1570 7.12.7.4 The pow functionsより引用
Synopsis
1 #include <math.h>
double pow(double x, double y);
float powf(float x, float y);
long double powl(long double x, long double y);
そもそもiの偶奇によって1か-1を出したいだけなので、わざわざpow関数なんか使わずに
コード:
printf("%d\t", (i % 2 == 0 ? 1 : -1) * i ); //交互に正-負を操り換えし
とすればいいでしょう。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 11:37
by みけCAT
box さんが書きました:・その数が奇数ならば-1倍した値を出力する
・その数が偶数ならば、そのまま出力する
という方法を採用すると、
コード:
printf("%d\t", i % 2 == 0 ? i : -i ); //交互に正-負を操り換えし
となりますね。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 11:53
by metaphor
間違えました。自然数(順序数)に減法を導入してに負の数を考えているので「整数」ですから「最初の数-1には”前者”が存在しない」「”後者”の絶対値は”前者”の絶対値より1大きい」「”後者”の値は”前者”の値と符合が逆になる」だと思います。
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 12:25
by metaphor
ご指摘ありがとうございます。訂正しました。
コード:
#include <stdio.h> //ヘッダー部分
#include <math.h> //数学演算
int main(void) { //main関数
const int N=100;
int i; //ループ変数
for(i=1; i <= N; i++){ //for文i=1より初めてNより小の間 1ずつ増やし
printf("%d\t", i % 2 == 0 ? i : -i ); //交互に正-負を操り換えし:三項演算子
} //標準出力に数列を書き出す::::::条件? 処理1:処理2;
return N; //main関数の返却値:通常0:必要に応じて-1などを返す
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月23日(金) 13:20
by metaphor
>Synopsis
>1 #include <math.h>
>double pow(double x, double y);
>float powf(float x, float y);
>long double powl(long double x, long double y);
このシノプシスは知りませんでした。普通doubleしか使わないのにfloat の方が分かりやすいのかなと思ったけど気付かなかったです。(コンパイラーからワーニングがだせるのかな?W4にすれば)
コード:
/wd<n> 警告 n を無効にする /we<n> 警告 n をエラーとして扱う
/wo<n> 警告 n を 1 度だけ表示する /w<l><n> n の警告レベル 1-4 を設定する
/W<n> 警告レベルを設定する (既定 n=1) /Wall 警告をすべて有効にする
/WL 1 行診断を有効にします /WX 警告をエラーとして扱います
/Yc[file] .PCH ファイルを作成する
/Yd デバッグ情報をすべての .
Re: -1,2,-3,4…という数列
Posted: 2016年12月26日(月) 21:10
by 播磨王
ほい。
コード:
int main()
{
const int N = 100;
for(int i = 1; i < N; i++){
int t = i * (!(i & 0x1) - (i & 0x1));
printf("%d\t", t);
}
return 0;
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月26日(月) 23:04
by metaphor
C++だったのでCに書き換えました。有難うございました。
コード:
#include <stdio.h>
int main()
{
const int N = 100;
int i,t,x,y,z;
for(i = 1; i < N; i++){
x=(i & 0x1); y=!x; z=(y-x);//2進数の1桁は1,0を繰り返す
t = i * z; //zは1-0, 0-1を繰り返す
printf("%d\t", t); //結果1,0を-1,1の符号変換
} //に置き換える
printf("%d\t", t);
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 01:10
by かずま
metaphor さんが書きました:C++だったのでCに書き換えました。
何が C++ なんですか?
C の規格上、printf を使うためには、そのプロトタイプ宣言が必要なのですが、それを無視すると、
コード:
i;main(){while(i-100)printf("%d,",i=((i&1)<<1)-1-i);}
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 09:47
by metaphor
[訂正版]すみません。
コード:
#include <stdio.h>
int main(void)
{
const int N = 100;
int i,t,x,y,z;
for(i = 1; i <= N; ++i){
x=(i & 0x1); y=!x; z=(y-x);//2進数の1桁は1,0を繰り返す
t = i * z; //zは1-0, 0-1を繰り返す
printf("%d\t", t); //結果1,0を-1,1の符号変換
} //に置き換える
return N;
}
>何が C++ なんですか?
.cppだとOKで.cだとエラーになる。ベターCの範疇ではあるような気はします。
[as if」ルール]
http://okwave.jp/qa/q4536269.html
コード:
#include <stdio.h>
const int N = 100;
int i; int x, y, z;
int main(void) {
while (i - N) { //(i-100) が0以外true
x = (i & 1); y = x << 1; z = y - 1 - i; //2進数の1桁目:左シフト=2:y=2Fixのはず?
printf("%d\t", i = y - 1 - i);//printf("%d\t",i=((i&1)<<1)-1-i); }
}return N; // z正解は入る:のに何故か?:PCは正解は出す。?結果が全て。
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 11:41
by metaphor
DirectXの勉強をしていてふと回転行列を考えました。
(ベクトルの180度回転問題と捉えて見ました。)
コード:
#include <stdio.h>
#include <math.h>
const int N=100; int i;
double d_M_PI=3.141592653589793;//(産医師異国に向こう産後厄なく産)
int main(void){
for(i = 1; i <= N; i++){ //ベクトルの180度回転ととらえれば
printf( "%d\t",( (int)(cos(d_M_PI * (double)i))) * i);
}
return N;
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 12:04
by みけCAT
播磨王 さんが書きました:ほい。
コード:
int main()
{
const int N = 100;
for(int i = 1; i < N; i++){
int t = i * (!(i & 0x1) - (i & 0x1));
printf("%d\t", t);
}
return 0;
}
metaphor さんが書きました:>何が C++ なんですか?
.cppだとOKで.cだとエラーになる。ベターCの範疇ではあるような気はします。
このコードは、必要な関数の宣言(宣言を含むヘッダのインクルードを含む)が無いので、
gcc 4.8.2では
C言語としてはコンパイルが通りますが、
C++としてはコンパイルが通りません。
したがって、C++よりはCに近いコードであり、「.cppだとOKで.cだとエラーになる」という主張は不適切でしょう。
for文の初期化での変数宣言は、C99以降では許されているので問題になりません。
このコードに必要なインクルードを補ったものをC言語のコードとみなすことの最大の障害は、規格に合っていなそうなint main()という定義でしょう。
(C++では関数の定義で引数を書かないのはvoidと同じなので問題ありません)
しかし、C言語でのint main() { ... }は引数が無い関数を(引数の情報を宣言せずに)定義するものであり、
引数が無く戻り値がint型のmain関数は規格に合っているので、このコードは必要なインクルードを補えば規格上全く問題ないC言語のコードになるはずです。
c - Difference between int main() and int main(void)? - Stack Overflow
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 12:58
by metaphor
そうでしたか。どうもありがとうございます。
VS2008を使ったので規格は旧いと思われるしMicrosoftn
の独特な”処理系依存”があると思われます。
(Linux系は忘れてしまってgcc,g++は使ってたはずなのに思い出せません。
VS2015は使い始めて3か月にもなりません。インテリセンスの便利さに取り込まれてしまいました。)
Re: -1,2,-3,4…という数列
Posted: 2016年12月27日(火) 17:59
by 播磨王
何やら自分の中途半端なコードであらぬ方向に話が行ってしまって申し訳ないです。
設問に対するメソッドの提示が出来ればそれで良いだろうと判断したので、そのようにしました。
実際、観るべき箇所は1行ですし、こういう方向に話が行くとは思いませんでした。
自分は他言語の利用者で、情報収集の過程でこの掲示板に辿り着きました(頭の体操になると思いコードを書きました)。
C/C++は多少なり知識はありますけれども、語れるほどではありません。
「スコープ内でのみ利用する変数はスコープ内で宣言する」ってコードを書く上での原則だと思うのですが、Cにおいてはそうでもないのですか?
「関数ブロックの前方に変数宣言を纏める」なども含めて、かなり古い習慣だと思うのですが。
もし、それが必要とされるなら、個人的にはこういった書き方した方が良いのでは?って思います。未初期化の変数宣言って落ち着かないですし。
コード:
int i = 0;
for( ; i < 100; i++){
...
}
的はずれな事を言っていたらごめんなさい。
Re: -1,2,-3,4…という数列
Posted: 2016年12月29日(木) 13:49
by metaphor
>何が C++ なんですか?
フェイントに為って注意力散漫になり見事やられた。
[訂正版]
コード:
#include <stdio.h>
const int N = 100;
int i; int x, y, z;
int main(void) { i=0;
while (i - N) { //(i-100) が0以外true
x = (i & 1); y=x << 1; z=i=y - 1 - i;//2進数の1桁目:yは2<->0
printf("%d\t", z);//printf文の中で代入を行っていました//i=-i
}return N;
}
>もしもint main()ではなくvoid main()とかいうゴミが使われていた場合は
日本がゴミだらけにならないよう文部科学省に
「C/C++のmain関数の使用に関する重要案件」として教育勅語を発行してもらわないといけないかなと思います。
Re: -1,2,-3,4…という数列
Posted: 2016年12月30日(金) 00:31
by box
みなさんがんばってコードを書かれていますが、読みやすさや修正しやすさといった点においてどうなんでしょうか。
コード:
#include <stdio.h>
#define N (100)
int main(void)
{
int i;
for (i = 1; i <= N; i++) {
printf("%d\t", i * ((i % 2 == 1) ? -1 : 1));
}
putchar('\n');
return 0;
}
あたりで十分な気がします。
Re: -1,2,-3,4…という数列
Posted: 2016年12月30日(金) 01:19
by みけCAT
こんな感じでどうでしょうか?
コード:
#include <stdio.h>
int main(void) {
int i;
int num = 1; /* 初項の絶対値は1 */
int sign = -1; /* 初項は負 */
for (i = 0; i < 100; i++) { /* 100項出力する */
printf("%d\t", sign * num); /* 絶対値と符号を組み合わせて出力する */
num++; /* 次の項の絶対値は今の項の絶対値+1 */
sign = -sign; /* 次の項の符号は今の項と反対 */
}
return 0;
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月30日(金) 12:27
by metaphor
高度なアドレス渡しという技術を用い複雑な予備機能も備え誰にも分り易く
堅固なアルゴリズムに基づき社内の規範ともいえる。よって金一封.....白日夢da..
コード:
#include <stdio.h>
int Su_Retu(int* num,int* sign){ /* アドレス渡し */
printf("%d\t", *sign * *num); /* 絶対値と符号を組み合わせて出力する */
(*num)++; /* 次の項の絶対値は今の項の絶対値+1 */
*sign = -*sign; /* 次の項の符号は今の項と反対 */
return *num; /* 予備 */
}
int main(void) {
int i;
int num = 1; /* 初項の絶対値は1 */
int sign = -1; /* 初項は負 */
for (i = 0; i < 100; i++) { /* 100項出力する */
Su_Retu(&num,&sign);
}
return 0;
}
Re: -1,2,-3,4…という数列
Posted: 2016年12月31日(土) 01:25
by かずま
掛け算で符号をつけるのが嫌なので、
コード:
#include <stdio.h>
int main(void)
{
const int n = 5; // 数列の項数
for (int i = 1; i <= n; i++)
printf("%d,", i & 1 ? -i : i); // 数列の一般項
puts("...");
return 0;
}
漸化式を使うとすれば、
コード:
#include <stdio.h>
int main(void)
{
int n = 5; // 数列の項数
int a = -1; // 数列の初項
while (--n >= 0) {
printf("%d,", a);
a = (a < 0 ? 1 : -1) - a; // 漸化式による次の項
}
puts("...");
return 0;
}
こんな解答もありでは?
コード:
#include <stdio.h>
int main(void)
{
const int n = 5; // 数列の項数
for (int i = 1; i <= n; i++) {
if (i & 1) putchar('-'); // 奇数なら '-' を表示
printf("%d,", i);
}
puts("...");
return 0;
}
オフトピック
metaphorさんの多くのプログラムで、理解できないこと。
・return N; を使うのはなぜ?
・int x, y, z を使うのはなぜ?
・インデントがおかしい。
Re: -1,2,-3,4…という数列
Posted: 2016年12月31日(土) 17:59
by metaphor
ありがとうございます。追加しました。
コード:
#include <stdio.h>
int main(void)
{
const int n = 5; // 数列の項数
int i;////VC++2008 .cではerrorになるので...
for (i = 1; i <= n; i++)
printf("%d,", i & 1 ? -i : i); // 数列の一般項
puts("...");//2進数の1桁:1なら-i --- 0ならi
return 0;
}
コード:
#include <stdio.h>
int main(void)
{
int n = 5; // 数列の項数
int a = -1; // 数列の初項
while (--n >= 0) {//5 が0になるまで繰り返し
printf("%d,", a);
a = (a < 0 ? 1 : -1) - a; // 漸化式による次の項
} // aが負:1+a --- aが正:-1-a
puts("...");
return 0;
}
コード:
#include <stdio.h>
int main(void)
{
const int n = 5; // 数列の項数
int i = 1;//VC++2008 .cではerrorになるので...
for (i = 1; i <= n; i++) {
if (i & 1) putchar('-'); // 奇数なら '-' を表示
printf("%d,", i);//2進数1桁目を '-'符号に変換
}
puts("...");
return 0;
}
・return N; を使うのはなぜ?
・int x, y, z を使うのはなぜ?
・インデントがおかしい。
べつに(深い)意味はないです。C言語の書き方に慣れてないからです。
(マダキヅカレテナイヨウダ)
[ハマノ マサゴハ尽くるとも世にキュウスウヒョジノ種は尽くまじ-イシカワサユリさんノトーーイシンセキノインタビューヨリ]
Re: -1,2,-3,4…という数列
Posted: 2016年12月31日(土) 18:15
by metaphor
すみません・"スウレツヒョウジ"ノマチガイデス。
Re: -1,2,-3,4…という数列
Posted: 2017年1月03日(火) 18:10
by Math
もしmallocを使いメモリ領域を確保せよという課題が付加されたら..
コード:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const int N = 100; // 数列の項数
int *p; int i;
p = malloc(N * sizeof(int)); //メモリ領域の確保
for (i = 0; i < N; ++i){ p[i]=i+1; }//絶対値を配列に格納
for (i = 0; i < N; ++i)
printf("%d\t,",p[i] & 1 ? -p[i] : p[i]); // 符号変換
return 0;
}