[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/28 00:11 / Filesize : 251 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 20



1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 19
pc11.2ch.net/test/read.cgi/tech/1190342593/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 97代目
pc11.2ch.net/test/read.cgi/tech/1191937213/

692 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:50:59 ]
要するにconstあり/なしの組み合わせの数がたくさんあるってこと。
ポインタじゃないただの変数の場合、constあり/なしの2種類しかない。

char c;
const char c;

ポインタには、指す先のconstあり/なしとポインタ自体のconstあり/なしがあるから、全部で4通りになる。

charへのポインタ … char *p;
charへのconstポインタ … char *const p;
const charへのポインタ … const char *p;
const charへのconstポインタ … const char *const p;

ポインタを指すポインタは、指す先が4種類あって、ポインタ自体のconstあり/なしもあるから、全部で8通り。

charへのポインタ へのポインタ … char **p;
charへのconstポインタ へのポインタ … char *const *p;
const charへのポインタ へのポインタ … const char **p;
const charへのconstポインタ へのポインタ … const char *const *p;

charへのポインタ へのconstポインタ … char **const p;
charへのconstポインタ へのconstポインタ … char *const *const p;
const charへのポインタ へのconstポインタ … const char **const p;
const charへのconstポインタ へのconstポインタ … const char *const *const p;

693 名前:デフォルトの名無しさん [2007/11/02(金) 17:53:33 ]
もうやめて>>692>>690-691のライフは0よ!

694 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:56:01 ]
>>692 まとめおつ!!

695 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:01:20 ]
「ポインタ完全制覇」だっけかに考え方が書いてあるよ

const char **const p;
の場合、右から順に考えて
p が const
*p はノーマル
**p が const
という風に機械的に解釈するといいらしい

696 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:03:18 ]
どうせコンパイラも機械的に解釈してるしな

697 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:09:13 ]
初心者だが上に挙げた事例でどこら辺の物まで
実際のプログラムで活用されるの?

なんか、>>692とかわけわかめなんだ。


698 名前:プリンがー mailto:aaa [2007/11/02(金) 18:11:37 ]
三角形の面積を求めよ。

#include <stdio.h>
int main (void)
{
double height teihen;
double S;

printf("height=");
scanf("%lf",&height);
printf("teihen=");
scanf("%lf",&height);

S=height*teihen/2;

printf("面積S=%f\n",S);
}

これであってますか?

699 名前:プリンがー mailto:aaa [2007/11/02(金) 18:20:13 ]
e=1+1/1!+1/2!+・・・+1/10!を求めよ。

#include <stdio.h>
int main (void)
{
int i;
double e;

for(i=1;i<=10;i++){

e+=0.1+1/i!:

}
printf("e=%f\n",e);
return(0);
}
あってます?

700 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:21:53 ]
constのポインタだと
どこらへんがおいしいの?



701 名前:デフォルトの名無しさん [2007/11/02(金) 18:22:44 ]
>>698
teihen の値が怖いwwwww


>>699
e+= が怖いwwwww

702 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:23:54 ]
!

703 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:27:18 ]
>>697
例えば、
Manpage of QSORT
ttp://www.linux.or.jp/JM/html/LDP_man-pages/man3/qsort.3.html

に、(char * const *) p1が出てくる。

704 名前:デフォルトの名無しさん [2007/11/02(金) 18:34:47 ]
e+=0.1+1/i!:

eが初期化してない。
1/i!なんて式初めて見た。

705 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:38:43 ]
for(i=1;i<=10;i++)

のケースだと i! はいつも 0 になり、ゼロディバイドw

706 名前:デフォルトの名無しさん [2007/11/02(金) 18:43:07 ]
>>705
!iならそうだろうけど・・・。
i!でもおk

707 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:52:45 ]
>>703
thx
使うときは使うんだな。もっかいポインタやりなおすわ。

708 名前:プリンがー mailto:aaa [2007/11/02(金) 19:10:08 ]
>>701
teihenじゃなくどうすればいいですか?ippen?

>>704
初期化・・このときe=0の初期化が必要なんですか?

709 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:14:25 ]
>>708
printf("teihen=");
scanf("%lf",&height); // テーヘンだ!テーヘンだ!

710 名前:プリンがー mailto:aaa [2007/11/02(金) 19:19:49 ]
>>709
あ、入力ミスですw
変数名はteihenで構わないですよね?




711 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:21:09 ]
>>708
>>698の自分のプログラムをよく見ましょう
単純なケアレスミス

あとCにはi!なんて記法は存在しません

712 名前:プリンがー mailto:aaa [2007/11/02(金) 19:28:03 ]
>>711
そうなんですか。
そうした場合>>699の問題でプログラムの本体はどうすればいんですか?

713 名前:デフォルトの名無しさん [2007/11/02(金) 19:29:56 ]
>>712

まずn!の意味を考えると・・・

n! = 1*2*3*4*5 ・・・ * n


あとはそれをプログラムするだけ。

714 名前:プリンがー mailto:aaa [2007/11/02(金) 19:34:23 ]
>>713
なるほど。
プログラム内に「・・・」の表記はありなんですか?

715 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:14 ]
あまりにアホすぎて釣りにしか見えない

716 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:38:21 ]
>>714
まず問題の前に書式の勉強をしておいで。

717 名前:プリンがー mailto:aaa [2007/11/02(金) 19:40:32 ]
初心者なもんですんまそ。


718 名前:プリンがー mailto:aaa [2007/11/02(金) 19:46:23 ]
なしですね。

719 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 19:58:25 ]
本気だったならごめん
勉強がんばれ

720 名前:プリンがー mailto:aaa [2007/11/02(金) 20:00:47 ]
>>719
ありがとうございます。




721 名前:プリンがー mailto:aaa [2007/11/02(金) 20:47:49 ]
e=1+1/1!+1/2!+・・・+1/10!を求めよ。
これって関数使わずにプログラム作れますか?

722 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:06 ]
mainもつかわずに?

723 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:09 ]
>>721
追記
関数でfactorial使ってできるんだろな〜てのは分かるんですが関数の学習
はまだちょこっとしかしてなくて

724 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:51:53 ]
ハンドルネーム使ってる時点で…なぁ

725 名前:プリンがー mailto:aaa [2007/11/02(金) 20:51:59 ]
>>722
mainは使ってです。

726 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:52:24 ]
プリプロセッサメタプログラミングで求めろってことか

727 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:00 ]
作れるよ

728 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:53:24 ]
>>723
そんなのしなくても出来る。

まずn!を計算する処理を考える、
それが出来たらnn!を計算する処理を考える
それが出来たら1/nn!を計算する処理を考える。

729 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:00 ]
関数使って作れるならそれをインライン展開したものを考えてみよう

730 名前:プリンがー mailto:aaa [2007/11/02(金) 20:55:14 ]
>>727
そうですか〜。
for〜if〜使えばいいのかな?



731 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 20:55:59 ]
うん

732 名前:プリンがー mailto:aaa [2007/11/02(金) 20:59:16 ]
>>728
n!が俺には謎めいてきたw

733 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:04:13 ]
>>730
二重ループは知ってる?

734 名前:プリンがー mailto:aaa [2007/11/02(金) 21:07:24 ]
>>733
はい。条件分岐はだいたい分かってます。

735 名前:デフォルトの名無しさん [2007/11/02(金) 21:07:42 ]
C言語結構粘るな。そろそろ終わってもいいと思うんだが

736 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:12:35 ]
答えはこのとおりだが、自分で考えたいだろうから読みにくくしている。
考え方だけ参考にして。ちなみに行儀の悪いコーディングの例でもあります
#include<stdio.h>
int main(void){int i,n=10;
double e=1.0,x=1.0;for(i=1;
i<=n;i++)e+=(x/=i);printf(
"%f\n",e);return 0;}

737 名前:プリンがー mailto:aaa [2007/11/02(金) 21:20:58 ]
>>736
大変ありがとうございます。
ちなみにn=10とx=1.0は必要ないですよね!?


738 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:27:23 ]
>>737
何故そう思う?

739 名前:プリンがー mailto:aaa [2007/11/02(金) 21:42:12 ]
>>738
n=10はiの範囲のうち。x=1.0はe+=1.0/iの1.0はiを格上げするため。
double/int→doubleここはなんて説明すればいいのか・・・

740 名前:プリンがー mailto:aaa [2007/11/02(金) 21:43:38 ]
xは1.0のままだからボックスを作る必要がない。




741 名前:デフォルトの名無しさん [2007/11/02(金) 21:44:52 ]
>>738
>>736のコードが難しすぎたようだ。
初心者にe+=(x/=i);をぱっと理解できるとはおもえん。

742 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:45:00 ]
1.0のままではありませんよ

743 名前:プリンがー mailto:aaa [2007/11/02(金) 21:57:17 ]
>>742
なぜ1.0のままじゃないんですか??
めんどくさくなければ教えて下さい。

744 名前:デフォルトの名無しさん [2007/11/02(金) 21:58:27 ]
>>743

x /= i

x = x/i;
のこと。

x/iをxに代入する。

745 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 21:58:46 ]
>>739 の解釈だと >>736
e=1 + 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 + 1/7 + 1/8 + 1/9 + 1/10
ってことになるよ

とりあえず x の値を表示させてみては?


746 名前:プリンがー mailto:aaa [2007/11/02(金) 22:04:39 ]
>>744
それは分かってます。
>>745
ちょっと説明間違ったかなー
分子は1.0のままでしょ


747 名前:デフォルトの名無しさん [2007/11/02(金) 22:17:12 ]
>>746
じゃあ1/3!は 0.5/3だって理解は出来る?
同様に 1/4!は 0.166/4

748 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:21:55 ]
>>746
前回のループで計算したxが分子だよ

749 名前:プリンがー mailto:aaa [2007/11/02(金) 22:22:53 ]
>>747
1/3!=(1/2)/3
1/4!=(1/6)/4

750 名前:デフォルトの名無しさん [2007/11/02(金) 22:26:12 ]
>>749
そうそう。
あれ、分子が1.0のまんま?はて?



751 名前:プリンがー mailto:aaa [2007/11/02(金) 22:27:29 ]
>>750
頭が痛くなってきた。

752 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:29:31 ]
e+=(x/=i);を分解すると、
x = x / i;
e = e + x;

xのところに直値で1.0を入れることはできない

753 名前:デフォルトの名無しさん [2007/11/02(金) 22:29:48 ]
>>751
つまり分子は1.0のままではない。って事。

1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5



754 名前:プリンがー mailto:aaa [2007/11/02(金) 22:33:33 ]
>>753
てか階乗の意味ってもともと
1/3!=(1/2!)/3
1/4!=(1/3!)/4
1/5!=(1/4!)/5
なの?
1/3!=1/1*2*3
1/4!=1/1*2*3*4
1/5!=1/1*2*3*4*5
じゃなくて?

755 名前:デフォルトの名無しさん [2007/11/02(金) 22:34:04 ]
西暦を入力すると干支が出るようにしたいんですが、何が違うのかわかりません。教えてください
if文が全般的に違うようです。
#include<stdio.h>

main() {
int year(void);
printf("西暦・・・");
scanf("%d", &year);
if(year % 12 = 2) {printf("%d 年は戌年",year);}
else if(year % 12 = 3) {printf("%d年は亥年\n",year);}
else if(year % 12 = 4) {printf("%d年は子年\n",year);}
else if(year % 12 = 5) {printf("%d年は丑年\n",year);}
else if(year % 12 = 6) {printf("%d年は寅年\n",year);}
else if(year % 12 = 7) {printf("%d年は卯年\n",year);}
else if(year % 12 = 8) {printf("%d年は辰年\n",year);}
else if(year % 12 = 9) {printf("%d年は巳年\n",year);}
else if(year % 12 = 10) {printf("%d年は午年\n",year);}
else if(year % 12 = 11) {printf("%d年は未年\n",year);}
else if(year % 12 = 0) {printf("%d年は申年\n",year);}
else {printf("%d年は酉年\n",year);}
return 0;
}


756 名前:デフォルトの名無しさん [2007/11/02(金) 22:35:47 ]
>>754
意味は同じでしょ?
結果が同じならおk

757 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:36:03 ]
>>755
比較は == で

758 名前:デフォルトの名無しさん [2007/11/02(金) 22:36:26 ]
>>755
switchで頼むわ・・・。

759 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:37:31 ]
テーブル使おうや・・

760 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:11 ]
Hi, Let's use array.



761 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:38:14 ]
int year(void);
って関数じゃなくて変数の宣言をしたいんじゃないの

762 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:50:41 ]
>>757-761
お前らそんな一気に言ったら>>755が可哀想だろw

>>755
これを参考に。

#include<stdio.h>

const char *eto[] = {"申年","酉年","戌年","亥年","子年","丑年","寅年","卯年","辰年","巳年","午年","未年"}

int main(){
int year;

printf("西暦・・・");
scanf("%d", &year);
printf("%d年は%s",year, eto[year%12]);

return 0;
}

763 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:54:15 ]
>>762
year にゲタをはかせて、テーブル自体は 「子」 から始まって 「亥」 で終わって欲しい

764 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 22:57:06 ]
>>763
ああ、まあ、そっちの方が綺麗か
適当に脳内修正しといて

765 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:11 ]
>>757
ですね。ちょいとプリントアウトでもして頭整理します。
ありがとです。

766 名前:プリンがー mailto:aaa [2007/11/02(金) 23:03:46 ]
>>756だた。


767 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:29:09 ]
>>755
それで警告が出るようにコンパイラオプションを指定しろ。
VC++なら/W4、gccなら-Wallとか。

768 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:17 ]
ってそもそもエラーになるな、あほだ俺orez

769 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:30:30 ]
>>767
警告っていうか、エラーにならないか?

770 名前:プリンがー mailto:aaa [2007/11/02(金) 23:43:00 ]
for(i=0.5;i<=8.2;i++)
このときのi++は0.1刻みに増え(i=i+0.1)ますか?
それとも1ずつ増え(i=i+1)ますか?



771 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:44:47 ]
>>770
やってみればいいじゃないか?

772 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:46:46 ]
インクリメント・デクリメントできるのは整数型だけですよ

773 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:05 ]
>>770
0.1刻みに増えると思う根拠は何だい?

774 名前:プリンがー mailto:aaa [2007/11/02(金) 23:47:06 ]
>>771
コンパイラ?もってないからできない。

775 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:47:23 ]
>>770
基本的にループ変数にfloatやdoubleを使うのはトラブルの元だよ
累積誤差が無視できない

776 名前:プリンがー mailto:aaa [2007/11/02(金) 23:48:24 ]
>>772
なるほど。

777 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:48:42 ]
>>774
今すぐインストールしなさい

778 名前:デフォルトの名無しさん [2007/11/02(金) 23:50:40 ]
コンパイラもなくコード書いてどーするwwwwwwwwwwwwwwwww

779 名前:プリンがー mailto:aaa [2007/11/02(金) 23:52:08 ]
>>775
例えばy=x^3-x^2を1.5から8.5まで0.1ずつ変化させたときのyの値を
出力せよ。の場合ループを使わざるを得ないよね!?

780 名前:デフォルトの名無しさん [2007/11/02(金) 23:53:06 ]
>>779
そういう時は i += 0.1であって i++ではない。



781 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:16 ]
>>779
ループは使うがループ変数は整数型でもできる

782 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:53:56 ]
>>779
ループ変数にはintを使ってループの中で10.で割って使う

783 名前:プリンがー mailto:aaa [2007/11/02(金) 23:54:38 ]
>>777
コンパイラ購入しないといけないでしょ?
ある程度入門書終わらせたら買うけど




784 名前:デフォルトの名無しさん [2007/11/02(金) 23:54:45 ]
一定時間ごとに処理を行うようなプログラムは
どのように作ればいいですか?


785 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 23:55:36 ]
>>784
C標準だけではできない
割り込みとかポーリングとかOSやハードウェアをいじくる

786 名前:デフォルトの名無しさん [2007/11/02(金) 23:56:04 ]
>>783
google先生に 無料のコンパイラは無いか聞いてみれ

787 名前:プリンがー mailto:aaa [2007/11/02(金) 23:57:39 ]
>>782
なるほどー!そうなのか

788 名前:プリンがー mailto:aaa [2007/11/02(金) 23:59:47 ]
>>786
いつか聞いてみる!
いい道具だしてくれるかな〜ドラえもん

789 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:20 ]
>>783
本に付属してるものならともかく今時の入門者はコンパイラ単体で買うのは珍しいと思う
いろんなコンパイラがネットから無料でダウンロードできるしね

790 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:00:53 ]
>>788
今すぐ聞け



791 名前:プリンがー mailto:aaa [2007/11/03(土) 00:05:00 ]
>>789
そうんだ〜!とある人から聞いたら
コンパイラは買わないといけないよって聞いた!
あぶね〜

792 名前:デフォルトの名無しさん mailto:sage [2007/11/03(土) 00:11:12 ]
>>791
特殊な環境用のコンパイラは買わないと無いかも知れない (PIC用とか)
MS-Windows とか MacOS とか Linux ならフリーのコンパイラがある
勉強ならパソコンでやればいい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef