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


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

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



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

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

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

744 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:31:01 ]
>>743
トランプのポーカーを AI 付で

745 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:36:18 ]
>>743
OS。本が売ってるからそれに従えばおk

746 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 09:55:58 ]
>>744
色々ネットにソースありましたが、AIって部分が難しそうですね・・・
ゲーム作ってみたかったので参考にさせて頂きます。

>>745
アセンブラも使うそうですし、OSとなると自分には無理な気がしてならないですがw
30日でOSが出来るならとなると少し興味もありますね。
レビューのみでは分からなかったのでこれから本屋行って二つを見て周って来ます

レス下さった方有難うございました

747 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:45:16 ]
int a[256]={0} という配列を定義して
例えば1024をscanfでこの配列に
a[0]=1024 , a[1]=0 ,a[2]=0,......,a[255]=0
ではなく
a[0]=4 ,a[1]=2, a[2]=0, a[3]=1.a[4]=0,.....,a[255]=0
という風に格納したいのですが、どういう風にプログラムを書けばいいのか思いつきません
よろしくお願いします。

748 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 13:48:11 ]
int n, a[256] = {0}, i;

scanf("%d", &n);
for(i=0; n; i++, n/=10) a[i] = n % 10;

749 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:06:25 ]
>>748
ありがとうございます!
int型やdouble型以上の桁の数字を扱う方法として
一桁ずつ格納する方法ならば!と思ったのですが、
どちらにしろ一度int型の変数に代入しないといけないことにプログラム見て気付きましたorz

char型の配列(例えばstr[256])に文字として数値を文字として格納した後に、
それをint型の配列(a[256])に入れなおすことって出来ませんよね…


750 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:19:16 ]
>>749
こういうこと?

char buf[] = "123456789";
int val[sizeof(buf)];
for (unsigned ic = 0; ic < sizeof(buf); ++ic) {
val[ic] = buf[ic] == '\0' ? 0 : buf[ic] - '0';
}

751 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:20:01 ]
int i, j=0, a[256];
char str[256];

scanf("%s", str);
for(i=0; str[i]; i++);
whil(i--) a[j++] = str[i] - '0';

752 名前:デフォルトの名無しさん [2007/11/26(月) 14:20:10 ]
void array_double(int *a, int n)
{
int i;
for(i=0;i<n-1;i++,n--)
{
a[i] = a[n-1];
}}
配列aとそのサイズnを受け取り、要素を逆順にするプログラムを考えているんですが、
うまくコンパイルすることができず、1,2,3,4,5と入力すると、5,4,3,4,5と出力されます。
どこがおかしいのでしょうか?



753 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:25:38 ]
>>752
>どこがおかしいのでしょうか?
頭。

コードと結果が合致してさえいないぞ。自分のコードくらい間違うな。

754 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:29:45 ]
>>752
ヒント: 上書きと交換は違う


755 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:31:48 ]
>>753
ヒント: ピントが外れている

756 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:32:11 ]
>>753
お前の頭もおかしいよ

757 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:06 ]
>>752
自分の頭(紙と鉛筆でもいい)の中で実行して
1行ずつ変数の中身がどうなるか考えてみよう
ループを展開するんだ。
a[0] = a[5-1];
a[1] = a[5-1];




758 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:36:57 ]
>>757
お前もちゃんとコード見ろ

759 名前:753 mailto:sage [2007/11/26(月) 14:40:36 ]
とりあえず、>755のお蔭でn--を見落としていたのは判ったw

>>757
同士よw

760 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:52:32 ]
>>752
a[i] = a[n-1] を

int temp = a[i];
a[i] = a[n-1];
a[n-1] = temp;

にすればok

761 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 14:58:31 ]
Cに交換演算子が欲しいと思う恭子の頃。

762 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:31:04 ]
>>761
具体的にどう実装する?



763 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:33:38 ]
>>762
>760の例なら
a[i] <> a[n - 1];
とか。
評価の回数を減らせるし、swapマクロを作って自爆することもなくなるし、
CPUに交換ニモニックがあれば使えるべさ。

764 名前:デフォルトの名無しさん [2007/11/26(月) 16:08:54 ]
今大学でプログラミング授業を取ってるんだが、色々とワカンネorz

演習内容うpするので教えてくれませんか?

765 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:16:21 ]
>>764
スレ違い

766 名前:デフォルトの名無しさん [2007/11/26(月) 16:18:44 ]
>>765
キティーだから許して。スレ違いだったらスマン

板いろいろ探したんだが、何処で聞いたらいい?
ググレ以外の回答を頼むw

767 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:09 ]
C/C++の宿題を片付けます 100
pc11.2ch.net/test/read.cgi/tech/1195668114/l50


768 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 16:26:32 ]
>>764
宿題スレも見つけられないなら大人しく首括っとけ。

769 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:57:03 ]
Visual C++ 2005を使用しています。
文字列をLONGLONG型の整数値に変換したいんですが、atoll関数が見つかりません。
Visual C++ 2005の環境では、atoll関数は自作するしかないでしょうか。


770 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 17:58:25 ]
>>769
つ[strtoll()]

771 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 18:42:36 ]
_atoi64

772 名前:デフォルトの名無しさん [2007/11/26(月) 18:51:11 ]
boost::lexical_cast



773 名前:769 mailto:sage [2007/11/26(月) 18:53:19 ]
>>770-772
ありがとうございます。
_atoi64でいけました。

774 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 19:59:33 ]
>>770
VC2005はC99に未対応じゃね?

775 名前:デフォルトの名無しさん [2007/11/26(月) 20:56:49 ]
変な質問ですが、C言語をマスターするのにだいたいどのくらいかかりますか?

776 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:01:58 ]
オレにも教えて下さい。C言語って何が出来ますか?
入門書卒業後何をしたらいいのやら。

グラフィック系統の本みたけど、これを利用してぱらぱら漫画みたいなの作れないですか

777 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:05:11 ]
Cでできないことはほとんどない

778 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:06:05 ]
>>776
それだけなら画像表示ツール自身でできるからなぁ。
あんたの質問は、「英語で何ができますか?」と同じくらい無意味なんだよ。

779 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:40:46 ]
#include <stdio.h>

int main(void)
{
FILE *fp;
int x;
int y = 30;

fp = fopen("test.txt","r");
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);
fp = fopen("test.txt","w");
fprintf(fp,"%d",x);
fscanf(fp,"%d",&x);
printf("%d",x);
fclose(fp);

return(0);
}

------test.txt-----
10
-----------------
馬鹿な質問で申し訳ないです。
実行結果が107になるんですが、何か見落としてるのでしょうか。

780 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:47:04 ]
"w" なのになんで fscanf を?

781 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:48:45 ]
>>779
>何か見落としてるのでしょうか。


冗談さておき、"w"でオープンしたストリームからは読み込めません。
まして、fprintf()で出力した先には何もありません。

782 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:49:26 ]
あ、ホントだ。
ありがとうございます。

また"r"で開きなおさないとダメなんですね。
"r+"とか"w+"の使い方もいまいち不明だし。



783 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 21:58:29 ]
ついでに質問です。
"r+"と"a+"の違いって何でしょう?
両方ともファイルに出力したら追記されますよね。

単純にファイルが新規に作成されるか否かですか?

784 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:01:41 ]
r+ は途中にも書き込める。
a+ はファイルの終わりにしか書き込めない。

785 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:14:53 ]
>>784
挿入可能って事ですか?
それとも上書きが出来るって事でしょうか。

色々試してみてるけど思うように扱えないです。

786 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:23:12 ]
r+ は上書き可能。こんな感じ。       ポップアップ用アンカー >>786
#include <stdio.h>
#include <stdlib.h>

int main() {
static const char FILENAME[] = "test.txt";
FILE *fp;
int x = 0;

/* とりあえず 10 と書き込む */
fp = fopen(FILENAME, "w");
fprintf(fp, "%d", 10);
fclose(fp);

fp = fopen(FILENAME, "r+"); /* r+ で開く */

/* ファイルの先頭から数値を読み出す */
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 10 と出力されるはず */

/* ファイルの先頭に移動して 30 と書き込む */
fseek(fp, 0, SEEK_SET);
fprintf(fp, "%d", 30);

/* またファイルの先頭に移動して数値を読み出す */
fseek(fp, 0, SEEK_SET);
fscanf(fp, "%d", &x);
printf("%d\n", x); /* 30 と出力されるはず */

fclose(fp);
return EXIT_SUCCESS;
}

787 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:32:56 ]
分かり易い解説ありがとうございます。
上記の例で、"a+"だと、
10
1030
と出力されちゃうんですね。

fseek関数はまだ触った事ないので勉強してみようと思います。

788 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:07:17 ]
/* fseekってイマイチよく分からん。 オフセットとかなんだか知らんが
読んだときか書き込んだときでかは忘れたけど、数字で
int型の4バイトの時と、char型の1バイトの時があってイミフ。
チラシの裏で馬鹿なレスだからスルーしてね^^ */

789 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:43:55 ]
>>788
それは恐らくfseek()が判らないのではなくて、fprintf()で書き込むのかfwrite()で書き込むのかの
違いがよく判っていないんジャマイカ。

>>787
書き込み後は、fseek()(或いはそのサブセットのrewind())をするか、明示的にfflush()しないと
書き込んだ結果が実際のストリームに出力される保障がないことに注意。

まぁ、ファイル先頭に移動するにはrewind()の方が判りやすいだろうね。

790 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 23:56:48 ]
条件によって01を記録し、
記録した情報を順番に読み取って01を判別し、
条件分けをしたいのですが思ったとおりになりません。。
具体的には、書き込み
FILE *fp;
char output = 0;
int bit = 0;
fp = fopen("bitstream","rb");
for(i=0; i...... )
{
if(bit == 8)
{bit = 0; fputc(output,fp);}
if(条件)
{手順1; output = ((output<<1) | 0x01); bit++;}
else
{手順2; output <<= 1; bit++;}
}
output = (output<<(7-bit));
fputc(output,fp);
読み込み
char a;
for(i=0; ){
if(bit == 8)
{a = getc(fp); bit = 0;}
if( ( a >> (7-bit) ) & 0x01 )
{手順1; }
else
{手順2; }
bit++;}
こんな感じで書いてるんですが、どこかおかしいところがあればご指摘ください。

791 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:13:53 ]
float *a;
a = new float();
*a = 120;
float *temp = a;

これはOKですよね

float *temp = 120

これはなんでダメなんですか?


792 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:29:03 ]
tempが格納するのはアドレスだから。
120を変数に格納して、その変数のアドレスをtempに渡すなどする必要がある。



793 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:17 ]
newはC++なんだけど

794 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:30:49 ]
セミコロンが無いから。

795 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:32:19 ]
つまり
float *tempは、ポインタとして宣言してる状態で、そこにaのアドレスが入って、
temp = a となっている、ということですか?上の例だと

で、3行目の
*a =120 は aのアドレスをもったところに120をぶち込んでる、ということで
float *tempとは別ものなんですよね?



796 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:27 ]
564.1
451.6
154.1
[EOF]

こういう風になってるテキストファイルがあるときに
「EOFまで数字をテキストファイルから読み込む」という作業をする場合はどうすればいいんでしょうか?

i=0;
while(1){
if(fread(&c,sizeof(char),1,fp)==EOF) break;
else
{
data[i]=fscanf(fp,"%lf\n",&value);
i++;
}
}

こんな感じにかいたらdata[0][1][2]には564.1 451.6 154.1 が入っているんでしょうか?
よくfreadとfscanfなどがわかっていないのでよろしくお願いします。


797 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 00:47:38 ]
別もの。
*a=120の*はデリファレンス、float *tempの*はポインタ宣言。

798 名前:ワカメ高専 mailto:sage [2007/11/27(火) 01:05:59 ]
[-3,3] fx=1/(1+5x^2) 分点の数 10個(n=9)
これをラグランジュで求めて結果を出力するプログラムを作れって(c or c++)言われたけどさっぱりでしゅ

799 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:44:24 ]
>>798
課題丸投げは宿題スレへ
pc11.2ch.net/test/read.cgi/tech/1195668114/

800 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:49:31 ]
>>796
i=0;
while(1){
if (fscanf(fp, "%lf", &data[i]) == EOF) {
break;
}
i++;
}

801 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 01:55:32 ]
>>795
そう。上の例は
float *a;
a = new float();
*a = 120;
float *temp;
temp = a;
に等しい。下の例は
float *temp;
temp = 120;
ということになる。floatポインタに整数120は代入できない(型が異なる)のでエラー。

802 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:14:26 ]
エラーにはならないだろボケ




803 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 02:16:13 ]
>>791
別に駄目じゃねーよ。
期待してるのとは違う動作だろうけどな。

804 名前:801 mailto:sage [2007/11/27(火) 02:19:44 ]
本当だ、エラーにはならんね、すまそ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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