C言語何でも質問掲示板


アンケートにご協力下さい → >> アンケートフォーム <<

規約と使い方

 
   逆ポーランド記法電卓 ....   
     ・[4394] box 
     ・[4395] 大工 
   教えてください。   
     ・[4385] Yuki 
     ・[4387] 初心者 
     ・[4389] box 
     ・[4391] 初心者 
     ・[4392] box 
   すみません課題なんで ....   
     ・[4371] Yuki 
     ・[4372] keichan 
     ・[4373] もも 
     ・[4374] Yuki 
     ・[4375] バグ 
     ・[4378] もも 
     ・[4380] Yuki 
     ・[4381] バグ 
     ・[4383] もも 
     ・[4384] Yuki 
     ・[4386] バグ 
     ・[4388] もも 
     ・[4390] box 
   音声認識について   
     ・[4366] Justy 
     ・[4367] 大工 
     ・[4370] 管理人 
     ・[4376] 大工 
     ・[4377] Yuki 
     ・[4379] 大工 
   今ボタンを押した の ....   
     ・[4360] 管理人 
     ・[4361] 管理人 
     ・[4368] GPGA 
   はじめまして!大学の ....   
     ・[4157] box 
     ・[4224] ルーク 
     ・[4226] box 
     ・[4228] 管理人 
     ・[4271] ルーク 
     ・[4275] box 
     ・[4338] ルーク 
     ・[4345] box 
     ・[4350] ルーク 
     ・[4354] box 
     ・[4355] box 
     ・[4365] ルーク 
   フロー図について   
     ・[4323] フリオ 
     ・[4324] box 
     ・[4336] ふぐお 
     ・[4347] box 
     ・[4363] ふぐお 
   質問です   
     ・[4329] バグ 
     ・[4330] Yuki 
     ・[4333] バグ 
     ・[4358] 管理人 
   クイックソート   
     ・[4356] 管理人 
     ・[4357] 管理人 
   nios Timer   
     ・[4353] むつ 
   お願いします><><   
     ・[4253] keichan 
     ・[4257] まいまい 
     ・[4266] keichan 
     ・[4281] まいまい 
     ・[4282] むつ 
     ・[4287] まいまい 
     ・[4294] むつ 
     ・[4307] keichan 
     ・[4351] まいまい 
   課題です。。   
     ・[4152] box 
     ・[4158] もも 
     ・[4169] 管理人 
     ・[4173] もも 
     ・[4174] keichan 
     ・[4175] box 
     ・[4184] むつ 
     ・[4187] 管理人 
     ・[4284] しっぽ 
     ・[4290] むつ 
     ・[4325] しっぽ 
     ・[4348] しっぽ 
   makeについて   
     ・[4339] box 
     ・[4340] 大工 
     ・[4341] Hermit 
     ・[4342] 大工 
     ・[4344] Hermit 
     ・[4346] 大工 
   16進数の順番について   
     ・[4314] parapara 
     ・[4315] parapara 
     ・[4316] parapara 
     ・[4318] GPGA 
     ・[4331] parapara 
     ・[4332] (報告) 
   ポインタについて   
     ・[4207] 管理人 
     ・[4209] box 
     ・[4210] 管理人 
     ・[4212] むつ 
     ・[4221] にゃんこ 
     ・[4222] にゃんこ 
     ・[4229] しっぽ 
     ・[4231] box 
     ・[4232] しっぽ 
     ・[4242] にゃんこ 
     ・[4243] box 
     ・[4328] にゃんこ 
   線形リストの課題につ ....   
     ・[4322] box 
   Windows環境   
     ・[4283] むつ 
     ・[4286] 大工 
     ・[4292] むつ 
     ・[4293] 大工 
     ・[4298] おためし 
     ・[4300] 大工 
     ・[4311] おためし 
     ・[4312] 大工 
   【雑談】フレキシブル ....   
     ・[4270] Hermit 
     ・[4301] keichan 
   スタティックライブラ ....   
     ・[4273] Hermit 
     ・[4274] 大工 
     ・[4276] 大工 
     ・[4277] GPGA 
     ・[4278] box 
     ・[4279] 大工 
     ・[4288] 大工 
     ・[4295] 大工 
     ・[4297] box 
     ・[4299] 大工 
   すみません。課題につ ....   
     ・[4296] box 
   こんにちはCについて質 ....   
     ・[4248] Hermit 
     ・[4249] box 
     ・[4250] fuguo 
     ・[4261] バグ 
     ・[4263] box 
     ・[4264] むつ 
     ・[4269] Hermit 
     ・[4285] ふぐお 
     ・[4289] むつ 
   配列について   
     ・[4260] 大工 
     ・[4262] box 
     ・[4265] むつ 
   共有ライブラリでのワ ....   
     ・[4255] 大工 
     ・[4256] しっぽ 
     ・[4258] 大工 
   ポインタ〜その2   
     ・[4194] GPGA 
     ・[4195] 大工 
     ・[4197] box 
     ・[4198] GPGA 
     ・[4199] box 
     ・[4200] 大工 
     ・[4202] box 
     ・[4203] 大工 
     ・[4204] box 
     ・[4205] GPGA 
     ・[4206] box 
     ・[4215] 大工 
     ・[4216] バグ 
     ・[4217] GPGA 
     ・[4218] keichan 
     ・[4219] バグ 
     ・[4220] 大工 
     ・[4227] 管理人 
     ・[4230] 大工 
     ・[4233] 管理人 
     ・[4237] 大工 
     ・[4238] 管理人 
     ・[4251] keichan 
     ・[4254] 大工 
   メイク後実行の際に   
     ・[3803] P 
     ・[3815] 紫石 
     ・[3861] P 
     ・[3913] 管理人 
     ・[4247] 紫石 
   ブロック崩しのゲーム ....   
     ・[4225] バグ 
     ・[4235] tower 
   無題   
     ・[4167] 管理人 
     ・[4182] おためし 
     ・[4214] しっぽ 
     ・[4234] 管理人 
   Timer関数に関連 ....   
     ・[4160] しっぽ 
     ・[4161] バグ 
     ・[4162] きの(初心者) 
     ・[4163] バグ 
     ・[4164] きの(初心者) 
     ・[4165] バグ 
     ・[4170] しっぽ 
     ・[4172] きの(初心者) 
     ・[4213] しっぽ 
   質問者さんへのお願い   
     ・[4211] バグ 
   ちょっとお尋ねします ....   
     ・[4168] 管理人 
     ・[4171] むつ 
     ・[4201] ももた 
   無題   
     ・[4189] バグ 
     ・[4190] at 
     ・[4191] ☆ 
     ・[4192] 女郎花 
   課題ができません   
     ・[4084] box 
     ・[4091] 管理人 
     ・[4098] トント 
     ・[4099] Justy 
     ・[4100] むつ 
     ・[4102] 管理人 
     ・[4185] トント 
     ・[4186] 管理人 
   ポインタです   
     ・[4177] box 
     ・[4178] 大工 
     ・[4179] box 
     ・[4180] 大工 
     ・[4181] keichan 
     ・[4183] 大工 
   ルーレットについて   
     ・[4033] バグ 
     ・[4061] kazu 
     ・[4062] バグ 
     ・[4155] kazu 
   変数などの「記号」に ....   
     ・[4136] box 
     ・[4138] ま〜く 
     ・[4143] keichan 
     ・[4146] バグ 
     ・[4147] Yuki 
     ・[4153] sign 
   WNDCLASSでの質問・・ ....   
     ・[4137] ま〜く 
     ・[4140] at 
     ・[4141] at 
     ・[4150] ま〜く 
   おたすけ   
     ・[4129] box 
     ・[4130] むつ 
     ・[4144] asd 
     ・[4145] keichan 
     ・[4148] よし☆かわ 
     ・[4149] box 
   月日入力/結果表示   
     ・[4124] バグ 
     ・[4125] box 
     ・[4126] むつ 
     ・[4128] box 
     ・[4142] バグ 
   無題   
     ・[4132] box 
     ・[4135] むつ 
     ・[4139] 管理人 
   構造体の課題   
     ・[4122] keichan 
   無題   
     ・[4112] box 
     ・[4116] keichan 
     ・[4118] 大工 
     ・[4120] box 
   標準入力関数の事を教 ....   
     ・[4106] 管理人 
     ・[4107] バグ 
     ・[4108] 管理人 
     ・[4109] バグ 
     ・[4110] ヒロ 
     ・[4113] 管理人 
     ・[4114] keichan 
     ・[4115] ヒロ 
     ・[4117] keichan 
     ・[4119] ヒロ 
   積分   
     ・[4003] 管理人 
     ・[4041] さっさ 
     ・[4047] 管理人 
     ・[4048] 管理人 
     ・[4051] 管理人 
     ・[4068] さっさ 
     ・[4074] 管理人 
     ・[4105] さっさ 
   課題で…。   
     ・[3944] 管理人 
     ・[3979] 坊主 
     ・[3980] box 
     ・[3983] 管理人 
     ・[4081] 坊主 
     ・[4082] box 
     ・[4104] 坊主 
   ★2007年 ROLEX -ロレ ....   
     ・[4092] 管理人 
     ・[4095] ヒロ 
     ・[4096] Yuki 
     ・[4101] 管理人 

Name: 大工  ..初心者(8,195ポイント)   Date: 2007/02/09(金) 23:36   No:4393       
Title: 逆ポーランド記法電卓のプログラム    
逆ポーランド記法電卓のプログラムを本を見ながら書いてコンパイルしたんですが
エラーをどう処理していいかワカリマセン。


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "stack.h"//自作ヘッダーファイル.

#define STACK_SIZE 100
#define NUM 256
#define DONE 257

stack_t *creat_stack(unsigned int sz);
void puch(stack_t *stack, int num);
int pop(stack_t *stack);
static int token(int *val);
static void error_recover(stack_t *stack, char *msg);


int main ( void ){
stack_t *stack;
int tok;
int val, x, y;

//スタックを作成する.

if( (stack = create_stack(STACK_SIZE)) == NULL ){
fprintf(stderr, "failed to create stack.\n");
exit(EXIT_FAILURE);
}
printf("> ");
for(;;){
if((tok = token(&val)) == DONE){
break;
}
switch(tok){
case NUM:
push(stack, val);
break;
case '+':
y = pop(stack); x = pop(stack);
push(stack, x + y);
break;
case '-':
y = pop(stack); x = pop(stack);
push(stack, x - y);
break;
case '*':
y = pop(stack); x = pop(stack);
push(stack, x * y);
break;
case '/':
y = pop(stack); x = pop(stack);
if(y == 0){
error_recover(stack, "divide by zero");
continue;
}
push(stack, x / y);
break;
case '\n':
if(sp_read(stack) == 1){
printf("%d\n", pop(stack));
printf("> ");
break;
}
ungetc(tok, stdin);
default: //不正なトークンを検出.s
error_recover(stack, "invalid input");
printf("> ");
break;
}
}
free(stack);

return EXIT_SUCCESS;
}

stack_t *creat_stack(unsigned int sz){
stack_t *new_stack;
//スタックデータの確保.
new_stack = (stack_t*)malloc( sizeof(stack_t) + sizeof(int)*(sz - 1) );
if(new_stack == NULL){
return NULL;
}
new_stack->top = 0;
new_stack->size = sz;

return new_stack;
}
/*
push:
引数で指定したスタックstackに値numをプッシュする.
*/
void push(stack_t *stack, int num){
//スタックが満杯の場合はメッセージを出力して終了する.
if(is_full(stack)){
fprintf(stderr, "stack overflow.\nss");
exit(EXIT_FAILURE);
}
stack->data[stack->top++] = num;
}
/*
pop:
引数で指定したスタックstackから値をポップする.
*/
int pop(stack_t *stack){
//スタックが空の場合はメッセージを出力して終了する.
if(is_empty(stack)){
fprintf(stderr, "stack underflow.\n");
exit(EXIT_FAILURE);
}
return stack->data[--stack->top];
}
//token: トークンを取得する.
static int token(int *val){
int ch;

while ((ch = getchar()) != EOF){
if(ch == ' ' || ch == '\t'){
continue;
}
else if(isdigit(ch)){
ungetc(ch, stdin);
scanf(" %d", val);
return NUM;
}
else{
return ch;
}
}
return DONE;
}
//error_recover: エラーからの回復処理.
static void error_recover(stack_t *stack, char *msg){

int ch;

fprintf(stderr, "ERROR: %s.\n", msg);
init_stack(stack);
while((ch = getchar()) != EOF){
if(ch == '\n') return;
}
exit(EXIT_FAILURE);
}

自作ヘッダファイル.

typedef struct stack{
int top; //スタックトップの位置.
int size; //データ部の大きさ.
int data[1]; //データ部.
} stack_t;

//スタックの状態を判定するマクロ.
#define is_empty(st) ((st)->top == 0)
#define is_full(st) ((st)->top == (st)->size)
#define sp_read(st) ((st)->top)
#define init_stack(st) ((st)->top = 0)

//スタック操作関数のプロトタイプ宣言.
extern stack_t *create_stack(unsigned int sz);
extern void push(stack_t *st, int num);
extern int pop(stack_t *st)

エラー
stack.c: In function `pop':
stack.c:13: error: storage class specified for parameter `token'
stack.c:14: error: storage class specified for parameter `error_recover'
stack.c:17: error: parse error before '{' token
stack.c:17: error: old-style parameter declarations in prototyped function definit
ion
stack.c: At top level:
stack.c:103: error: redefinition of 'pop'
stack.c:17: error: previous definition of 'pop' was here
stack.c:131: error: conflicting types for 'error_recover'
stack.c:52: error: previous implicit declaration of 'error_recover' was here


1,161ポイント を手に入れた。


Name: box  ..熟練のプログラマー(45,766ポイント)   Date: 2007/02/09(金) 23:55   No:4394     
Title: Re:逆ポーランド記法電卓のプログラム    
>extern int pop(stack_t *st)

セミコロンが抜けています。

それから、関数名で
creat_stack
create_stack
が混在しています。


68ポイント を手に入れた。

Name: 大工  ..初心者(8,253ポイント)   Date: 2007/02/10(土) 00:00   No:4395 解決!     
Title: Re:逆ポーランド記法電卓のプログラム    
あちゃ〜・・・

お恥ずかしいエラーですil:il|;l|;il:i(-ω-`;)ll|l|il|;:il|!

ありがとうございます。


58ポイント を手に入れた。



Name: 初心者  ..入門者(4,964ポイント)   Date: 2007/02/09(金) 18:20   No:4382       
Title: 教えてください。    
void main()
{
int p;
int ret;


}

関数point_set()を作成し、main関数からpoint_set()の呼び出しを行いpoint_set()の関数でpに100を入れる。
又、point_set()を呼び出す前後でpの値を表示しなさい。(よろポインタを使う事)
よろしくお願いします。


81ポイント を手に入れた。


Name: Yuki  ..初心者(5,564ポイント)   Date: 2007/02/09(金) 18:32   No:4385     
Title: Re:教えてください。    
こちらのHPの(2)アドレスによる渡し を熟読していただければヒントがあると思います。
http://www9.plala.or.jp/sgwr-t/c/sec11-2.html


59ポイント を手に入れた。

Name: 初心者  ..初心者(5,125ポイント)   Date: 2007/02/09(金) 18:56   No:4387     
Title: Re:教えてください。    
サイトを見て自分なりにしてみました! これで正しいでしょうか?

#include <stdio.h>

int point_set();

int main(void)
{
int *p;
int ret;

ret=0;
p=&ret;
printf("最初のpの値を表示します\n");
printf("p=%d\n", *p);

*p=point_set(&p);

printf("変更後のpの値を表示します\n");
printf("p=%d\n", *p);

return 0;
}

int point_set(int *x)
{
*x=100;

return *x;
}


161ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,997ポイント)   Date: 2007/02/09(金) 19:38   No:4389     
Title: Re:教えてください。    
> サイトを見て自分なりにしてみました! これで正しいでしょうか?

もし、お手元にコンパイル・実行できる環境があるならば、
まずはご自分で確かめてみてください。


26ポイント を手に入れた。

Name: 初心者  ..初心者(5,175ポイント)   Date: 2007/02/09(金) 19:43   No:4391     
Title: Re:教えてください。    
すみません^^; 一様コンパイルができ、結果も表示されたのですが、これでいいのか不安だったので・・・。

50ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,698ポイント)   Date: 2007/02/09(金) 20:03   No:4392     
Title: Re:教えてください。    
> 一様コンパイルができ、結果も表示されたのですが、これでいいのか不安だったので・・・。

一様じゃなくって「一応(いちおう)」です。それはさておき、
くだんのコードをBorland C++ Compilerでコンパイルすると、

警告 W8065 D:\My Programs\C\temp1\temp1.c 15: プロトタイプ宣言のない関数 'point_set' の呼び出し(関数 main )

という警告が出ました。これは、コードの3行目にあるプロトタイプ宣言

int point_set();

で、カッコの中に引数の宣言がないからです。そこで、

int point_set(int *x);

と修正したところ、今度は

警告 W8075 D:\My Programs\C\temp1\temp1.c 15: 問題のあるポインタの変換(関数 main )

という警告が出ました。これは、コードの15行目で

*p=point_set(&p);

と書いているカッコの中がint **型であり、point_set関数の実際の引数の型と
異なっているからです。この警告を無視して実行してみたところ、
プログラムが異常終了しました。

さて、こういった風に、くだんのコードにはいろいろと問題があります。
「結果が表示された」というのが、私にはにわかに信じがたいです。


328ポイント を落としてしまった。



Name: もも  ..ぴよぴよ(992ポイント)   Date: 2007/02/09(金) 13:39   No:4369       
Title: すみません課題なんですが・・・・    
構造体 TEST_Vの実体testをmain関数のローカルで宣言し、test()関数を呼び出す。
test()関数内でtestの内容を設定する。設定内容は以下の通り。
a:1000,
b:[システムサポート],
c:文字[P]を代入しなさい。

test()関数を呼び出す前後で各メンバを表示する事。
又、main()関数の先頭でtestくぉ初期化する事。0x00で埋める。

#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

void change(test);


int main(void)
{
test_v test={0,"0",'0'};

printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test1=change(test);

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

ここからわかりません。・・・どなたか教えてください・・・


2倍のポイントを手に入れた! 508ポイント を手に入れた。


Name: Yuki  ..初心者(5,189ポイント)   Date: 2007/02/09(金) 15:25   No:4371     
Title: Re:すみません課題なんですが・・・・    

>構造体 TEST_V
とあるので、構造体の宣言はこのようになります。
#typedef struct test_v{
int a;
char b[256];
char c;
}TEST_V;
※ C言語では大文字、小文字が区別されるので注意してください。

#typedefをまだ習っていないようでしたら、以下の説明の「TEST_V」は「struct TEST_V」に
置き換えてお考えください。


>構造体 TEST_Vの実体testをmain関数のローカルで宣言し、test()関数を呼び出す。
>void change(test);
test関数?change関数?どちらですか?

とりあえずchange関数で構造体に値を設定すると仮定して、
上記の関数宣言ではchange関数はtestがどんな型かわかりませんよね?
void change(TEST_V test);
としてあげると良いでしょう。

>test()関数内でtestの内容を設定
change関数で設定された値をmain関数でも使用したい場合は、
2つのやり方があります。
【1】構造体をリターン値として受け取る
TEST_V change(void);
としてあげます。

【2】構造体をポインタで渡す
void change(TEST_V *ptest);
としてあげます。
※ main関数のtestと区別しやすくするために、変数名をptestにしました。

関数内で構造体に値を設定する方法は、↓のHPを熟読していただければ
ヒントが得られると思います。
http://www9.plala.or.jp/sgwr-t/c/sec15-4.html

またわからないことがありましたら、問い合わせください。



550ポイント を手に入れた。

Name: keichan  ..中級者(13,678ポイント)   Date: 2007/02/09(金) 15:39   No:4372     
Title: Re:すみません課題なんですが・・・・    

#typedef struct test_v{
int a;
char b[256];
char c;
}TEST_V;

×:#typedef
○:typedef

typedefに # は付けてはいけません。
(#はプリプロセッサ命令及び文字連結に使用します)


73ポイント を手に入れた。

Name: もも  ..かけだし(1,404ポイント)   Date: 2007/02/09(金) 16:05   No:4373     
Title: Re:すみません課題なんですが・・・・    
#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

struct test_v test(void);

int main(void)
{
struct test_v test1;

test1.a=0;

test1.c='0';



printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test1=test();

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%c\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

struct test_v test(void)
{
struct test_v test2;

test2.a=1000;

test2.c='p';

return test2;

}

こんな感じでしてみました^^;しかし、bの初期化と関数内でどのように書けばいいのかわかりません。


412ポイント を手に入れた。

Name: Yuki  ..初心者(5,313ポイント)   Date: 2007/02/09(金) 16:24   No:4374     
Title: Re:すみません課題なんですが・・・・    
keichanさん
>typedefに # は付けてはいけません。
いつもの悪い癖が出てしまいました。ご指摘ありがとうございます。


ももさん
>bの初期化と関数内でどのように書けばいいのかわかりません。
構造体は置いておいて
char str[256];
という変数があったときに、初期化はどうしますか?
また、どのように値を代入していましたか?



124ポイント を手に入れた。

Name: バグ  ..プログラマー(27,138ポイント)   Date: 2007/02/09(金) 16:25   No:4375     
Title: Re:すみません課題なんですが・・・・    
初期化はmemset関数を使えば便利かもしれませんが…使い方が分からなければ、ループで初期化してもいいのではないでしょうか?

for( i = 0 ; i < 256 ; i++ )
{
test1.b[i] = '\0';
}

こんな感じでどうでしょう?

文字列への代入(?)はsprintf関数を使うといいですよ(^-^)

ところで、今回の課題に<string.h>って、必要ない気がするのですが…?


14ポイント を手に入れた。

Name: もも  ..かけだし(1,467ポイント)   Date: 2007/02/09(金) 16:47   No:4378     
Title: Re:すみません課題なんですが・・・・    
for( i = 0 ; i < 256 ; i++ )
{
test1.b[i] = '\0';
}
を利用したんですが、表示に0がかあり並びました^^;
1つだけ0を表示したかったんですが・・。


63ポイント を手に入れた。

Name: Yuki  ..初心者(5,457ポイント)   Date: 2007/02/09(金) 16:57   No:4380     
Title: Re:すみません課題なんですが・・・・    
>test1.b[i] = '\0';
これはどこでやっていますか?

今できているソースをすべてアップしてくれると、指摘しやすいのですが。


66ポイント を手に入れた。

Name: バグ  ..プログラマー(27,215ポイント)   Date: 2007/02/09(金) 16:57   No:4381     
Title: Re:すみません課題なんですが・・・・    
あら?0x00で初期化というのは、文字列の終わりを示す'\0'で初期化という意味ではなかったのですね。
1つだけ0をするのであれば…

sprintf( test1.b , "0" );

でいけるかと思います。


77ポイント を手に入れた。

Name: もも  ..かけだし(1,497ポイント)   Date: 2007/02/09(金) 18:22   No:4383     
Title: Re:すみません課題なんですが・・・・    
先ほどの問題なんですが、ポインタでするようです。。。ポインタでやるとどうなるのでしょか?

30ポイント を手に入れた。

Name: Yuki  ..初心者(5,505ポイント)   Date: 2007/02/09(金) 18:30   No:4384     
Title: Re:すみません課題なんですが・・・・    
私が紹介したHPは熟読していただけたでしょうか?

【2.アドレス渡し】
の項にヒントがあると思うのですが。


48ポイント を手に入れた。

Name: バグ  ..プログラマー(27,375ポイント)   Date: 2007/02/09(金) 18:46   No:4386     
Title: Re:すみません課題なんですが・・・・    
ヒントです(^-^)


#include <stdio.h>

void Plus( int *pVal )
{
( *pVal ) += 5;
}

int main( void )
{
int nVal = 0;

printf( "変更前の nVal の値\n" );
printf( "nVal = %d\n" , nVal );

Plus( &nVal );

printf( "Plus関数通過後の nVal の値\n" );
printf( "nVal = %d\n" , nVal );

return( 0 );
}


160ポイント を手に入れた。

Name: もも  ..かけだし(1,745ポイント)   Date: 2007/02/09(金) 19:21   No:4388     
Title: Re:すみません課題なんですが・・・・    
#include <stdio.h>
#include <string.h>

struct test_v{
int a;
char b[256];
char c;
};

void test(struct test_v *test1);

int main(void)
{
struct test_v test1={0,"\0",'0'};



printf("初期状態を表示\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

test(&test1);

printf("変更後の変数a,b,cを表示します\n");
printf("a=%d\n", test1.a);
printf("b=%s\n", test1.b);
printf("c=%c\n", test1.c);

return 0;
}

void test(struct test_v *test1)
{
struct test_v test2;

test2->a=1000;
strcpy(test2->b,"システムサポート");
test2->c='p';

}

こんな感じなんでしょうか? 少し自分なりに書いてみました。


248ポイント を手に入れた。

Name: box  ..熟練のプログラマー(46,026ポイント)   Date: 2007/02/09(金) 19:39   No:4390     
Title: Re:すみません課題なんですが・・・・    
> こんな感じなんでしょうか? 少し自分なりに書いてみました。

もし、お手元にコンパイル・実行できる環境があるならば、
まずはご自分で確かめてみてください。


29ポイント を手に入れた。



Name: 大工  ..初心者(6,917ポイント)   Date: 2007/02/08(木) 23:56   No:4364       
Title: 音声認識について    
将来やってみたい分野です。

音声認識(コンピュータとの対話など)を経験された方に聞きたいのですが・・・・・

C言語で実現可能でしょうか??(対話などを)

あと、音声認識やりたいなら○○○○○○の分野をやっておくといいよ とか開発環境は○○○○がおススメとかを教えて下さい。


82ポイント を手に入れた。


Name: Justy  ..熟練のプログラマー(54,699ポイント)   Date: 2007/02/09(金) 02:01   No:4366     
Title: Re:音声認識について    
 実は今度それをやることになるかもしれません。


C言語で実現可能でしょうか??(
 問題無くできます。


○○○○○○の分野をやっておくといいよ (
 今の音声認識は結構高度なことをしています。
 既存のライブラリを使わないで、ということであればとりあえず

・ 音解析
 FFTなど音の解析全般に関する基本知識。
 必要な音だけの抽出(特徴量の抽出とか周囲の雑音の排除とか)。
 単語の認識理論。

・ 言語と音響データベース
 音声から該当する単語候補を検索し、前後の文・単語の繋がりからより高い候補を導き出す。

・ ネットワーク
 最近は認識部分をサーバーで処理するケースも増えています。

 とかですかね。
 
 
 環境は Linuxだろうが、Windowsだろうが Macだろうが、特に。
 開発環境的には CPUとメモリはある程度合った方がいいと思います(コンパイルに時間がかかるのは無駄な開発コストですから)。

 ただ、実行環境は最近はモバイル方面での音声認識の利用が進んでいますので、低スペックでも実行できた方がいいと思います。


519ポイント を手に入れた。

Name: 大工  ..初心者(6,981ポイント)   Date: 2007/02/09(金) 09:59   No:4367     
Title: Re:音声認識について    
返信ありがとうございます。難しいんですね^^;

サーバーで処理するんですかぁ・・・・っていまいちサーバーで処理するということが理解できません。。


64ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(186,208ポイント)   Date: 2007/02/09(金) 15:15   No:4370     
Title: Re:音声認識について    
音声認識とコンピュータとの対話は別の分野だと思います。

音声認識というのは、音声の波形を分析してプログラムする事を想定していらっしゃるのでしょうか?

コンピュータとの対話というのは、入力される音声は既に分析できるライブラリやソフトを使用して、入力は文字列として処理できる事を前提にプログラムされるのでしょうか。

後者ならやったことがあります。Linuxで、ですが、Juliusを使って入力される音声は文字列に変換したのち、プログラムしました。
コンピュータと対話が出来、以前の対話から会話を進化させていく、なんちゃって人工知能みたいな物です。

後者なら簡単ですが、前者だと専門的な知識が必要だと思うので、回答できません・・・力不足でごめんなさい。


234ポイント を手に入れた。

Name: 大工  ..初心者(6,997ポイント)   Date: 2007/02/09(金) 16:25   No:4376     
Title: Re:音声認識について    
返信ありがとうございます。

自分がやりたいのは前者ですが後者もやってみたいです^^

JuliusはWindows環境での動作を推奨していないみたいですね・・・^^;


16ポイント を手に入れた。

Name: Yuki  ..初心者(5,391ポイント)   Date: 2007/02/09(金) 16:29   No:4377     
Title: Re:音声認識について    
音声認識はやったことがないので、スレ主さんのご期待に添える回答はできませんが、
「音声認識プログラム」でググったらこんなHPがヒットしました。

音声認識ソフトを作ろう
http://www1.bbiq.jp/kougaku/speech_reco.html

もう知ってたらスルーしてください。


78ポイント を手に入れた。

Name: 大工  ..初心者(7,034ポイント)   Date: 2007/02/09(金) 16:49   No:4379     
Title: Re:音声認識について    
おぉっ!!

知りませんでしたっいつもY○hooで検索してるからかなぁ^^;??

ありがとうございます。


37ポイント を手に入れた。



Name: しぐ  ..ぴよぴよ(157ポイント)   Date: 2007/02/08(木) 17:21   No:4359       
Title: 今ボタンを押した の判定    
初めて投稿させてもらいます。よろしくお願いします。

ゲームプログラミングの館で紹介されている内容は重宝させてもらっています。

今、何かを「押した」という判定をしたい時、ほぼ全部のコマンドにおいて判定したいので、それ全てに変数を用意していたら大変になってしまうので、

何かいい方法はないか質問させてもらいました。

くだらない質問でごめんなさい。


157ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(185,687ポイント)   Date: 2007/02/08(木) 17:30   No:4360     
Title: Re:今ボタンを押した の判定    
しぐさん、こんにちは^^

私がやっている方法であって、最良かどうかはわかりませんけど、

GetHitKeyStateAll( KeyBuf ) ;

の関数を使う時ですよね?

char KeyBuf[256];

char KeyBufOld[256]={};
を2つ用意します。

ループの最初に

GetHitKeyStateAll( KeyBuf ) ;

を呼びます。
この関数の次に、


for(i=0;i<256;i++)
if(KeyBufOld[i]==0 && KeyBuf[i]==1)//前回は入力がなく、今回入力が有る
KeyBuf[i]=2;


これを書き、ループの最後に


for(i=0;i<256;i++)
KeyBufold[i]=KeyBuf[i];


これを書きます。
すると、処理の中でKeyBufが2の時、その瞬間に押した事がわかります。
KeyBufが>0の時、押している事が解ります。

勝手にそんな感じで使っているのですが、他に方法があるのかもしれません^^;
とりあえず私がよいと思っている方法は上記の方法です^^

ゲームプログラミングの館は、とにかく仕組みをわかってもらおうとして、逆に手間になったり非効率になったりする方法で紹介している部分が多々ありますので、
解ってきたらご自分でアレンジされることを期待しています^^;


493ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(185,974ポイント)   Date: 2007/02/08(木) 17:41   No:4361     
Title: Re:今ボタンを押した の判定    
ゲームプログラミングの館で紹介している歩くモーションも実はあの方法ではやってほしくないんですよ><;

あれでは1マス単位で移動する仕様ではなかった場合、中途半端なかっこうでとまってしまうはずです。
それに、以前質問もでましたが、クオータービューにするとき一筋縄ではいきません。

本当は、モーションにカウンタをつけ、歩き出して何カウントかを計算して表示画像を決定してほしいんです。

しかしそうするとソースが少々難しくなってしまいますので、避けました・・・が、かといってあれも解りやすくは無いような気がします^^;

色々ソースを書いていく中でアルゴリズムを改善していってください☆(他人任せ


287ポイント を手に入れた。

Name: GPGA  ..上級者(18,874ポイント)   Date: 2007/02/09(金) 11:51   No:4368     
Title: Re:今ボタンを押した の判定    
私の場合、キー専用の構造体を用意してアプリ起動時に初期化し
毎ループの最初に更新を行い、実際にキーの取得を行う必要が出たときに
専用の関数を呼び出し、キーの取得を行うということをやっています。

添付ファイルにサンプルを乗せました。
上キー押しっぱなし、下キーを押したとき、Zキーを離したときに
文字が出るようになっています。


137ポイント を手に入れた。



Name: ルーク  ..ぴよぴよ(186ポイント)   Date: 2007/01/31(水) 19:29   No:4154       
Title: はじめまして!大学の課題なんですが、お願いします。    
nCr において,n=0〜6の全ての組み合わせについて求めるプログラムを作成しなさい。

表示例

0C0 = 1

1C0 = 1 1C1= 1

2C0 = 1 2C1 = 2 2C2 = 1

3C0 = 1 3C1 = 3 3C2 = 3 3C3 = 1

4C0 = 1 4C1 = 4 4C2 = 6 4C3 = 4 ・・・

・・・・

という問題なのですが、以下のように自分はプログラムを考えたのですが、
うまく実行できません。どこが間違ってるのでしょうか?

#include<stdio.h>

main(){
int n,r,nC0,a;
for(n=0;n<7;n++){
for(r=0;r<=n;r++){
nC0=1;
a=nC0;
a=(n-r+1)/r*a;
}
}
printf("%dC%d=%d\n",n,r,a);
}




186ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,750ポイント)   Date: 2007/01/31(水) 21:13   No:4157     
Title: Re:はじめまして!大学の課題なんですが、お願いします。    
> nCr において,n=0〜6の全ての組み合わせについて求めるプログラムを作成しなさい。

まずは、nとrで制御する二重のループで、
下記のように出力するコードを書いてみてください。
等号の右にはnCrの値を出力しますが、その方法は別途考えるということで。

0C0=

1C0= 1C1=

2C0= 2C1= 2C2=

3C0= 3C1= 3C2= 3C3=

4C0= 4C1= 4C2= 4C3= 4C4=

5C0= 5C1= 5C2= 5C3= 5C4= 5C5=

6C0= 6C1= 6C2= 6C3= 6C4= 6C5= 6C6=


2倍のポイントを手に入れた! 284ポイント を手に入れた。

Name: ルーク  ..ぴよぴよ(253ポイント)   Date: 2007/02/03(土) 14:21   No:4224     
Title: C言語はすごく苦手なので申し訳ありませんが、詳しくやり方を説明していただきたいのですが    
すみません、二重ループ自体が苦手なのでわからないです。
あと、上から順序良く表示させる方法もわからなです。配列とか使うんですかね?


67ポイント を手に入れた。

Name: box  ..熟練のプログラマー(43,845ポイント)   Date: 2007/02/03(土) 14:56   No:4226     
Title: Re:C言語はすごく苦手なので申し訳ありませんが、詳しくやり方を説明していただきたいのですが    
> すみません、二重ループ自体が苦手なのでわからないです。
> あと、上から順序良く表示させる方法もわからなです。配列とか使うんですかね?

初めに投稿されたコードの、nとrに関する二重のfor文の書き方は正しいです。
ループの中身はちょっと問題ありでしたけど。
以下に示す回答の内容が理解できたら、ループの中身をどう書くかについて別途説明します。
なお、配列を使わなくても今回の問題は解けます。

私が前に回答した出力例を上から順に見てください。
先頭の行はnが0の場合です。
次の行はnが1の場合です。という具合にnが1ずつ増えていって、
一番下の行はnが6の場合です。

さて、今度は各行を右へ見ていきます。
rが0から始まって、どこまであるかというと、その行のnまであります。
よって、二重のfor文は、
nに関するfor文:0〜6
各々のnについての、rに関するfor文:0〜n
となります。最初の投稿で書かれたfor文の書き方の正しいことがわかります。
ここまではいいですか?




203ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(184,314ポイント)   Date: 2007/02/03(土) 15:31   No:4228     
Title: Re:C言語はすごく苦手なので申し訳ありませんが、詳しくやり方を説明していただきたいのですが    
> すみません、二重ループ自体が苦手なのでわからないです。

苦手なのでしたら是非克服してください^^
苦手な分野があればプログラムの場合、

「概念を解説書である程度理解する」→「とにかく自分でプログラムを書いてみる」

の繰り返してマスターできるはずですよ♪

2重ループと言うのは以下の場合、今変数iとjがあったとき、iが1増える間にjは10増える、iが10増える間にjは100増えるといった関係が有ります。


for(i=0;i<10;i++){
for(j=0;j<10;j++){
//処理
}
}


では、このように書いたとき、出力はどうなるでしょうか?


for(i=0;i<10;i++){
for(j=0;j<10;j++){
printf("%d %d\n",i,j);
}
}


出力される結果を想像してみてください。

0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10
1 0
1 1
1 2
(・・略・・)

こんな感じになるはずですね。では、2重ループを使って、y=xのグラフを書いてみましょう。


for(x=0;x<10;x++){
for(y=0;y<10;y++){
if(x==y)
printf("*");
else
printf(" ");
}
printf("\n");
}


座標がxが0〜10、yが0〜10(正確には9まで)の格子点は100個ありますね?
xが0の間にyは0〜10を調べ、xが1の間にyは0〜10をしらべ・・
つまりこの2重ループで100個全ての格子点が調べられます。
その時、yとxが同じ時に「*」を書き、そうでないときに、「 」(スペース)を書けば、
直線のグラフがかけると思いませんか?

ご自分で実際にコンパイルしてみてください。

苦手な分野があれば、それを使わないようにするのではなく、是非克服してみてください^^


475ポイント を手に入れた。

Name: ルーク  ..ぴよぴよ(267ポイント)   Date: 2007/02/05(月) 19:09   No:4271     
Title: 返信遅れました。    
はい、そこまでは、わかります。

14ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,694ポイント)   Date: 2007/02/05(月) 20:34   No:4275     
Title: Re:返信遅れました。    

nとrで制御する二重ループの中身の説明です。
例えば、nが3のときにはこんな行を出力する必要があるわけですね。

> 3C0= 3C1= 3C2= 3C3=

右辺の内容はさておくとして、左辺と等号までの内容をnとrを
使って書くと、どうなるでしょうか。
Cの左に来るのがnで、右に来るのがrですね。
出力するためのprintf関数の書き方は、例えばこんな感じです。

printf("%dC%d= ", n, r);

1行分出力し終わったら、つまりrに関するループを抜けたら、
改行します。

ここまではいいですか?
理解できたら、私boxが1月31日の21:13に投稿した出力例のための
コードを書いてみてください。



237ポイント を手に入れた。

Name: ルーク  ..ぴよぴよ(343ポイント)   Date: 2007/02/07(水) 18:27   No:4338     
Title: 一応書きましたが、これであってますか??    
#include<stdio.h>
main(){
int n,r;
for(n=0;n<7;n++){
for(r=0;r<=n;r++){
printf("%dC%d= ",n,r);
}
}
}


76ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,579ポイント)   Date: 2007/02/07(水) 20:22   No:4345     
Title: Re:一応書きましたが、これであってますか??    

サンプルコードを2つほど提示します。解読してみてください。

【1個目】
#include <stdio.h>

int ncr(int n, int r);
int kaijou(int n);

int main(void)
{
int n, r;

for (n = 0; n <= 6; n++) {
for (r = 0; r <= n; r++)
printf("%dC%d=%2d ", n, r, ncr(n, r));
printf("\n\n");
}
return 0;
}

/* nCrを計算する関数 */
int ncr(int n, int r)
{
return kaijou(n) / kaijou(r) / kaijou(n-r);
}

/* 階乗を計算する関数 */
int kaijou(int n)
{
if (n == 0)
return 1;
else
return n * kaijou(n-1);
}


【2個目】
#include <stdio.h>

int ncr(int n, int r);

int main(void)
{
int n, r;

for (n = 0; n <= 6; n++) {
for (r = 0; r <= n; r++)
printf("%dC%d=%2d ", n, r, ncr(n, r));
printf("\n\n");
}
return 0;
}

/* nCrを計算する関数(パスカルの三角形) */
int ncr(int n, int r)
{
if (r == 0 || n == r)
return 1;
else
return ncr(n-1, r-1) + ncr(n-1, r);
}


572ポイント を手に入れた。

Name: ルーク  ..ぴよぴよ(467ポイント)   Date: 2007/02/07(水) 23:53   No:4350     
Title: 丁寧な返信どうもありがとうございます。    
わかりました!◎
自分は、nCr=(n−r+1)/r*nCr-1 という式を用いて、
ループを回した感じでしあげたいのですが、その場合はどうしたら
よろしいのですか??


2倍のポイントを手に入れた! 124ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,763ポイント)   Date: 2007/02/08(木) 09:16   No:4354     
Title: Re:丁寧な返信どうもありがとうございます。    

> 自分は、nCr=(n−r+1)/r*nCr-1 という式を用いて、

考え方はこれまでのサンプルと同じです。
使いたい式をそのまま関数化します。

#include <stdio.h>

int ncr(int n, int r);

int main(void)
{
int n, r;

for (n = 0; n <= 6; n++) {
for (r = 0; r <= n; r++)
printf("%dC%d=%2d ", n, r, ncr(n, r));
printf("\n\n");
}
return 0;
}

int ncr(int n, int r)
{
if (r == 0 || n == r)
return 1;
else
return ncr(n, r-1) * (n - r + 1) / r;
}


115ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,971ポイント)   Date: 2007/02/08(木) 09:40   No:4355     
Title: Re:丁寧な返信どうもありがとうございます。    

> 自分は、nCr=(n−r+1)/r*nCr-1 という式を用いて、

別のサンプルコードです。
これがいちばんシンプルかも。

#include <stdio.h>

int main(void)
{
int n, r;

for (n = 0; n <= 6; n++) {
for (r = 0; r <= n; r++) {
int ncr;
if (r == 0 || n == r)
ncr = 1;
else
ncr = ncr * (n - r + 1) / r;
printf("%dC%d=%2d ", n, r, ncr);
}
printf("\n\n");
}
return 0;
}


2倍のポイントを手に入れた! 208ポイント を手に入れた。

Name: ルーク  ..ぴよぴよ(535ポイント)   Date: 2007/02/09(金) 00:29   No:4365 解決!     
Title: どうもありがとうございます!!。    
これで宿題が解決しました。
また、知識も深まりました。ホントにどうもありがとうございました。
また、お世話になることがありましたらよろしくおねがいします◎


68ポイント を手に入れた。



Name: ふぐお  ..かけだし(1,427ポイント)   Date: 2007/02/06(火) 23:17   No:4320       
Title: フロー図について    
このアドレスのフロー図の最小のソースを誰か書いてくれませんか?
http://www.comb.kokushikan.ac.jp/inlab/C-exec/Mondai03b.html
すいません言葉であらわせそうになかったので、

ちなみにこれが僕の書いたソースです。

#include<stdio.h>

int main(void)
{
int i,j;
scanf("%d%d",&i,&j);
if(i<10||(j<=15&&i>=10)){
if(-3<=j&&j<4){
i+=j;
}else{
if(i<0)
i*=-1;
}
}else{
i/=j;
}
printf("%d",i);
return 0;
}


153ポイント を手に入れた。


Name: フリオ  ..初心者(5,059ポイント)   Date: 2007/02/07(水) 00:18   No:4323     
Title: Re:フロー図について    
 
"iの絶対値 と i の大きいほうを i にする"
が、
"iの絶対値 と i の小さくないほうを i にする"
なら、
最小かどうかはわかりませんが、

#include <stdio.h>

int main(void)
{
int i, j;

scanf("%d %d", &i, &j);
if(i >= 10 && j > 15) i /= j;
else if(-3 <= j && j < 4) i += j;
else if(i < 0) i *= -1;
printf("%d\n", i);
return 0;
}

 


2倍のポイントを手に入れた! 326ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,973ポイント)   Date: 2007/02/07(水) 00:27   No:4324     
Title: Re:フロー図について    
そもそも「最小」の定義は何ですか?
ソースファイルのバイト数?
実行ファイルのバイト数?
他の要素?

また、最小であることをどうやって証明しますか?


53ポイント を手に入れた。

Name: ふぐお  ..かけだし(1,516ポイント)   Date: 2007/02/07(水) 17:58   No:4336     
Title: Re:フロー図について    
フリオさん!!
ありがとうございます!!
完璧ですね。
ありがとう

boxさん
すいません説明意不足でしたね
僕が言いたい最小とは文章が短くすっきりした感じという意味です。
それが最小である証明はなしでいいです
これが最小だ!!と自分で思うものをおねがいします。
ありがとうございます




89ポイント を手に入れた。

Name: box  ..熟練のプログラマー(45,648ポイント)   Date: 2007/02/07(水) 20:45   No:4347     
Title: Re:フロー図について    
boxの投稿は無意味でした。

69ポイント を手に入れた。

Name: ふぐお  ..かけだし(1,525ポイント)   Date: 2007/02/08(木) 20:25   No:4363     
Title: Re:フロー図について    
ありがとうございましたw

9ポイント を手に入れた。



Name:  ..ぴよぴよ(122ポイント)   Date: 2007/02/07(水) 01:56   No:4327       
Title: 質問です    
はじめまして脱初心者の中です。
C言語でゲームやソフトを作る場合は特別なソフトや
違う言語を学ぶ必要があると聞いたことがあります。
その、特別なソフトや違う言語とは何か教えてください。
また、それらを学ぶときに役立つ本も教えていただけたら幸いです。


122ポイント を手に入れた。


Name: バグ  ..プログラマー(27,160ポイント)   Date: 2007/02/07(水) 08:03   No:4329     
Title: Re:質問です    
C言語だけでもゲームを作るには充分過ぎる程ですよ(^-^)
あまり色々と手広くやるよりは、まずは1つの言語だけを勉強する事をオススメします。他の言語を勉強する際にその方が理解が早いはずですよ。
書籍に関しては、人によって好みや環境、スキルレベルも違うでしょうから、実際に書店で中身を確認してみた方が確実ですよ。


78ポイント を手に入れた。

Name: Yuki  ..入門者(4,639ポイント)   Date: 2007/02/07(水) 08:10   No:4330     
Title: Re:質問です    
どんなゲームを作りたいかにもよると思うのですが。

例えばジャンケンゲームなんかはC言語でも作れると思いますし、
もうちょっとビジュアル的に懲りたいのであれば、VC等も利用できますし。
3Dとかやりたいのであれば、もっと違う知識も必要だと思いますし。

「○○ゲームを作ろう!」「○○ソフトを作ろう!」
等の目標を決めてから、どうやって作ればよいのかを調べてみたほうが良いと思います。
既存のモノを自分で作ってみるというのも有益だと思います。

amazon等で検索してみて、気になった書籍を本屋で立ち読みしてみてはいかがでしょう。
国語辞典にもいろいろあるように、同じことが書いてあっても人によって好みがあります。
自分で見てみて読みやすいもの、理解しやすく書いてあるものを選んでみてください。


228ポイント を手に入れた。

Name: バグ  ..プログラマー(27,202ポイント)   Date: 2007/02/07(水) 12:50   No:4333     
Title: Re:質問です    
参考になるかどうかは分かりませんが…

http://www.amazon.co.jp/exec/obidos/ASIN/4797325453/

個人的にはお気に入りです(^-^)


42ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(185,194ポイント)   Date: 2007/02/08(木) 17:12   No:4358     
Title: Re:質問です    
中さん、こんにちは^^

>特別なソフトや違う言語・・

とおっしゃっていますが、特別なソフトを学ぶというのはどういうことでしょう?
また、ゲームを作るにはCで十分可能ですよ☆

特別なソフトや違う言語ではなく、「特別なライブラリ」を学ぶ必要が有るの取り違えでは無いでしょうか?
ライブラリとは関数の集合です。
ソースを書くとき、様々な関数を使いますよね?printfも関数の一種です。
printf関数は
#include<stdio.h>
をかかなければ使用できません。

これは、stdio.hに関数の説明書がかいてあって、それをインクルードするから使えるようになるだとおもってください。

関数の説明書「ライブラリ」をインクルードすることで様々な関数が使えるようになります。

・画像を表示する関数
・音楽を流す関数

など、標準関数ではできなかったことができるようになります。

DirectXもCで動きますし。C言語さえ知っていればどんなゲームでも作れると思います。
突然DirectXを使うのは難しいと思うので、それを簡略化したようなライブラリでDXライブラリっていうのがあります。

http://homepage2.nifty.com/natupaji/DxLib/

ここはホントに楽にCでゲームが作れる関数のライブラリがあるので、是非お試し下さい☆

利用方法がわからない場合は、当HPでも使用方法を紹介しているので、是非参考にしてみてください^^

http://dixq.net/
(ゲームプログラミングの館)


449ポイント を手に入れた。



Name: 初心者  ..入門者(4,883ポイント)   Date: 2007/02/07(水) 23:46   No:4349       
Title: クイックソート    
ここのクイックソートアプリのソース前提にした質問なのですが

if(l<i-1){//左範囲が分割可能なら
sort(l,i-1,x);//左範囲を分割してソートを行う
}
if(j+1<r){//右範囲が分割可能なら
sort(j+1,r,x);//右範囲を分割してソートを行う
}

この部分を最初の段階で抜けて、1番左の数字が確定し再帰する時
l=1になっていますが1になるのはどの時点で代入されるんですか?
分かりにくい文章かと思いますがよろしくお願いします。
アプリでいうと85ページあたりだったと思います。


151ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(184,674ポイント)   Date: 2007/02/08(木) 12:45   No:4356     
Title: Re:クイックソート    
初心者さん、こんにちは。
いつも、回答が出来ずすみません><;
今日こそオンラインの環境でパソコン出来る時間を確保します(_ _|||)

85ページでは、確かにlは0だと思います。
もしlが1だと書いてあれば間違いだと思うのですが、そのような記述は何番目に書いてありました?


71ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(184,745ポイント)   Date: 2007/02/08(木) 12:50   No:4357     
Title: Re:クイックソート    
なお、89の時点でlが1になるのは正常な話です。
戻ってくるのは199の話ですが、そこではlの話はしていませんし。。
何番の話でしょうか?


71ポイント を手に入れた。



Name: きの  ..ぴよぴよ(580ポイント)   Date: 2007/02/08(木) 05:19   No:4352       
Title: nios Timer    
初心者なので、お願いします。。。

niosのタイマーを使いたいんですが、データシートを見ていたらこんなソースコードが出てきました。

これは1秒のタイマーみたいですが、10mm秒オーダーのタイマーに書き換えることはできますか?

できるなら、教えていただけないでしょうか?卒論直前であせってます。。。(>_<;)


typedef volatile struct
{
int np_timerstatus; // read only, 2 bits (any write to clear TO)
int np_timercontrol; // write/readable , 4 bits
int np_timerperiodl; // write/readable , 16 bits
int np_timerperiodh; // write/readable , 16 bits
int np_timersnapl; // read only , 16 bits
int np_timersnaph; // read only , 16 bits
} np_timer;



#include "nios.h"

int main(void)
{
int t = 0;

// Set timer for 1 second
na_timer1 ->np_timerperiodl = (short)(nasys_clock_freq & 0x0000ffff);
na_timer1 ->np_timerperiodh = (short)((nasys_clock_freq >> 16) & 0x0000ffff);

// Set timer running, looping, no interrupts
na_timer1 ->np_timercontrol = np_timercontrol_start_mask + np_timercontrol_cont_mask;

//
while(1)
{
if(na_timer1 ->np_timerstatus & np_timerstatus_to_mask)
{
printf("A Second passed! (%d) \n",t++);

// Clear the to (timeout) bit
na_timer1 -> np_timerstatus = 0; // (any value)
}
}
}


580ポイント を手に入れた。


Name: むつ  ..かけだし(1,355ポイント)   Date: 2007/02/08(木) 05:59   No:4353     
Title: Re:nios Timer    
nr_timer_milliseconds
でGoogle検索すると、先頭に「Nios Timer Data Sheet」というPDFファイルが見つかります。
これが目的の物であればいいのですが。


39ポイント を手に入れた。



Name: まいまい  ..かけだし(1,339ポイント)   Date: 2007/02/04(日) 00:35   No:4241       
Title: お願いします><><    
大学の課題でどぉしても、わからないところがあります。。
システムプログラミングというC言語の授業なんですが、
UDPでチャットを作りなさい。という問題です。
なんとか普通のものはできたのですが、オプション機能を付け加えることが
できません><
分かる方いらしたら、お願いします><

UDPを利用したチャットシステムを作りなさい。
プロトコル

パケットの先頭の一文字はパケットの種類を表す。


C→S S→C 引数
i login 開始 ユーザが入室  ニックネーム
o logout 終了 ユーザが退室  ニックネーム
m message 発言 他のユーザの発言 メッセージ
e error エラー エラー エラーのあった行


すべての通信は行単位で行う。
1文字目は上記のいずれか
2文字目からが引数の内容

サーバの動作
起動時に標準入出力、標準エラー出力は閉じる。停止はシグナルで行う。 SIGINTを受け取ったら、全員に停止メッセージを送って終了する。

i 登録し、入室情報を全員に通知同一ニックネームを使っている場合は(1)のように番号を後につける
o 登録を削除し、退室情報を全員に通知
m メッセージを全員に通知

クライアントの動作
起動時に login プロトコルをサーバに送る
終了時に logout プロトコルをサーバに送る
ユーザがキーボードから入力したメッセージはサーバに送る。行単位で処理。
サーバから送られてきたメッセージは画面に表示


クライアントはこちらです。
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>

main(int argc, char *argv[]) {
int s;
struct sockaddr_in my_addr, server;
int serverlen, nc;
struct hostent *host;
char buf[1024];

serverlen = sizeof(server);

s = socket(AF_INET, SOCK_DGRAM, 0);
if(s<0) error("socket");

host = gethostbyname(argv[1]);
if(host==NULL) error("gethostbyname");
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(8000);
memcpy(&server.sin_addr, host->h_addr,host->h_length);

fgets(buf, 1023, stdin);
while(buf[0]!='.') {
sendto(s, buf, strlen(buf), 0, (struct sockaddr *)&server, sizeof(server));
memset(buf, 0, 1024);
nc = recvfrom(s, buf, 1023, 0, (struct sockaddr *)&server, &serverlen);
printf("%s", buf);
fgets( buf, 1023, stdin);
}
}

error(char *msg) { perror(msg); exit(1); }

サーバーはこちらです。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>

#define BUFMAX 256
#define PORT_NO 8000
char rmsg[10], smsg[BUFMAX];
int sofd;
struct sockaddr_in sv_addr, cl_addr;

error(char *msg) {
fprintf(stderr, "server- "); perror(msg); exit(1);
}

main() {
sofd = socket(AF_INET, SOCK_DGRAM, 0);
if(sofd<0)error("socket");

bzero((char *)&sv_addr, sizeof(sv_addr));
sv_addr.sin_family = AF_INET;
sv_addr.sin_port = htons(PORT_NO);
sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind (sofd,(struct sockaddr *) &sv_addr, sizeof(sv_addr))<0) error("bind");
servpro();
}

servpro() {
int cc, cadlen, nbyte, i;
char *msg[] = { "Hi.\n", "Bye.\n", ".\n", 0};
char buf[1024];
fd_set mask;
struct timeval to;

while(1) { // 無限ループ
FD_ZERO(&mask); //mask をクリア
FD_SET(sofd, &mask); //sofdのマスクをセット
to.tv_sec = 10; //タイムアウトの時間を設定
FD_SET(0, &mask); //標準入力のマスクをセット
if(select(sofd+1, &mask, NULL, NULL, &to)<0)error("select"); // 入力があるまで待つ

if(FD_ISSET(0, &mask)) { // 標準入力の場合
bzero(buf, 1024);
gets(buf);
if(buf[0]=='.') break;
printf("Key board: %s.\n",buf); // 自分に出力

cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");
if(sendto(sofd, buf, strlen(buf), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
sendto(sofd, "\n", 1, 0,(struct sockaddr *) &cl_addr, cadlen);
}

if(FD_ISSET(sofd, &mask)) { // ネットワークから送られてきた場合
cadlen = sizeof(cl_addr);
cc = recvfrom(sofd, rmsg, 10, 0,(struct sockaddr *) &cl_addr, &cadlen);
if(cc < 0) error("recvfrom");

if(sendto(sofd, rmsg, strlen(rmsg), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
/*
for(i=0; msg[i]; i++) {
if(sendto(sofd, msg[i], strlen(msg[i]), 0,(struct sockaddr *) &cl_addr, cadlen)<0) error("sendto");
}
*/
}
}
}
長くなってすみません><




1,339ポイント を手に入れた。


Name: keichan  ..中級者(13,115ポイント)   Date: 2007/02/05(月) 00:41   No:4253     
Title: Re:お願いします><><    
ソースコードは見ていません。

オプションって何ですか?


2倍のポイントを手に入れた! 54ポイント を手に入れた。

Name: まいまい  ..かけだし(1,664ポイント)   Date: 2007/02/05(月) 01:53   No:4257     
Title: お願いします><><    
  C→S S→C 引数
i login 開始 ユーザが入室  ニックネーム
o logout 終了 ユーザが退室  ニックネーム
m message 発言 他のユーザの発言 メッセージ
e error エラー エラー エラーのあった行


すべての通信は行単位で行う。
1文字目は上記のいずれか
2文字目からが引数の内容

サーバの動作
起動時に標準入出力、標準エラー出力は閉じる。停止はシグナルで行う。 SIGINTを受け取ったら、全員に停止メッセージを送って終了する。

i 登録し、入室情報を全員に通知同一ニックネームを使っている場合は(1)のように番号を後につける
o 登録を削除し、退室情報を全員に通知
m メッセージを全員に通知

クライアントの動作
起動時に login プロトコルをサーバに送る
終了時に logout プロトコルをサーバに送る
ユーザがキーボードから入力したメッセージはサーバに送る。行単位で処理。
サーバから送られてきたメッセージは画面に表示
です><><


325ポイント を手に入れた。

Name: keichan  ..中級者(13,443ポイント)   Date: 2007/02/05(月) 13:19   No:4266     
Title: Re:お願いします><><    
ソースコードを眺めてみましたが、どうやらUNIX系OS上でのプログラムみたいですね。

要求されている追加項目が複数ありますので、一つずつやっていきましょう。
−サーバ側−
レシーバは既に実装されているので、後は受け取ったメッセージに沿って処理を分けていくだけです。
1.ログイン処理
2.ログアウト処理
3.メッセージをログインメンバー全員に通知
4.SIGINT(Ctrl + Cかな?)を受け取ったらログインメンバー全員に終了することを通知後、終了処理

−クライアント側−
1.起動直後にログイン名を入力させる
2.ログイン情報をサーバへ送信
3.サーバから受信したメッセージを出力
4.終了時にログアウト情報をサーバへ送信
5.クライアントから入力したメッセージをサーバへ送信


大きくまとめましたが、どこでつまづいているのでしょうか?

#Linux環境がないため、当方ではソースコードのコンパイルチェックはしておりません。


328ポイント を手に入れた。

Name: まいまい  ..かけだし(1,802ポイント)   Date: 2007/02/05(月) 22:15   No:4281     
Title: お願いします><><    
UNIX上なんですかぁ!!??
Windowsで動かしてるはずなんですが><

つまづいてるトコロはまず引数についてでし。
これは処理ごとにメソッドにするのですか?
またログイン情報やログアウト情報をサーバーに送るというのが
どうすればいいか、よくわからないです><
すごい初歩的な質問ですみません。。

お願いします!!!!!!!!!!!!!!!


138ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(461ポイント)   Date: 2007/02/05(月) 23:51   No:4282     
Title: Re:お願いします><><    
送られてきたログイン情報に次のリストのポインタをつけて
管理するといいのではないでしょうか。
サーバー側が決定すればクライアント側は簡単に出来るのではないでしょうか・・多分。
** UDPServer.h **
#define PORTNUMBER
#define TIMEOUT
struct ホストリスト
{
 名前
 ポート
 接続時間
 クライアントのアドレス
 次のリストのポインタ
}
○○さんようこそといったサーバメッセージ
各関数プロトタイプ宣言

** UDPServer.c **
・main
 ○○番ポートを空けて待つ
 空のホストリスト構造作成
 受信処理
 if or switchでコマンド処理(i o m e 例外)

・空のホストリスト構造作成
・リストにホスト追加
・リストからホスト削除
・ホスト取得
・受信内容表示
・全てに送信
・個別メッセージ送信
・アイドル状態のホスト削除


234ポイント を落としてしまった。

Name: まいまい  ..かけだし(1,858ポイント)   Date: 2007/02/06(火) 00:27   No:4287     
Title: お願いします><><    
UDPServer.c とUDPServer.h と分けてありますが、これは分けたほうがいいのですか?

ヘッダファイル?はまだよくわからなくて・・・・
もし分けた場合はどのように定義するのでしょうか?


56ポイント を手に入れた。

Name: むつ  ..かけだし(1,243ポイント)   Date: 2007/02/06(火) 02:22   No:4294     
Title: Re:お願いします><><    
>ヘッダファイル?分けたほうがいいの?
今回の内容で、どうしても分ける必要は無いでしょうが。

Cのコンパイラは上から下に向かって解釈していくので、
int main(){
say_hello();
}
void say_hello(){
printf("hello\n");
}
この場合、mainの辺りにくると、say_helloって何?と警告がでる。
長いソースになると全体の見通しが悪くなるので、
プロトタイプ宣言をする事で関数を書く順番を常に意識しなくていい。
void say_hello();
ヘッダファイルに含めるものは、
 ・マクロの定義(プリプロセッサーの#define)
 ・構造体、共用体、列挙型の宣言
 ・typedefの宣言
 ・外部関数の宣言
 ・グローバル変数の宣言
との事。
ヘッダファイルでstaticを使うなとかあるようですが、
まだまだ勉強不足です。


283ポイント を手に入れた。

Name: keichan  ..中級者(13,595ポイント)   Date: 2007/02/06(火) 15:34   No:4307     
Title: Re:お願いします><><    
>UNIX上なんですかぁ!!??
>Windowsで動かしてるはずなんですが><
失礼しました。
当方の持っている処理系(VC8)では存在しない標準ヘッダがありましたので
軽くググってlinux版のサンプルで同様のコードがありましたので
勘違いしました。
おそらくgcc系列ではあるのかな?

どちらにしても私はVCしかインストールしていませんのでコンパイルできませんでした。


136ポイント を落としてしまった。

Name: まいまい  ..かけだし(1,926ポイント)   Date: 2007/02/08(木) 00:33   No:4351     
Title: お願いします><><    
わかりました。><
ちょっとがんばってみます><
また質問すると思うのでそのときは
よろしくお願いします><


2倍のポイントを手に入れた! 68ポイント を手に入れた。



Name: もも  ..ぴよぴよ(201ポイント)   Date: 2007/01/31(水) 14:17   No:4151       
Title: 課題です。。    
コマンドラインからファイル名を読み込みそのファイルの行数を数えるプログラムを作りたいんですが、教えてください。

46ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,466ポイント)   Date: 2007/01/31(水) 14:30   No:4152     
Title: Re:課題です。。    
> コマンドラインからファイル名を読み込みそのファイルの行数を数えるプログラムを作りたいんですが、教えてください。

そのプログラムは、ざっと以下の要素に分解できそうです。

1)行数の値を初期化する。
2)読み込むファイルの名前をコマンドラインから受け取る。
3)読み込むファイルをオープンする。
4)ファイルの中身を読み、行数を数える。
5)数えた行数の値を出力する。
6)読み込みに使ったファイルをクローズする。

上記のどこが理解できていて、どこが理解できていないですか?


128ポイント を手に入れた。

Name: もも  ..ぴよぴよ(299ポイント)   Date: 2007/01/31(水) 21:52   No:4158     
Title: Re:課題です。。    
お返事誠にありがとうございます。
えっと、実は全部ぴんとこないんです、でも少し自分で考えてみてまたここにきてみます。


2倍のポイントを手に入れた! 98ポイント を手に入れた。

Name: 管理人  ..ハッカー(182,157ポイント)   Date: 2007/02/01(木) 00:38   No:4169     
Title: Re:課題です。。    
ももさん、素晴らしい姿勢ですね^^

上記手順でつまったらとりあえずgoogleで、可能なかぎり調べてみてください。
たいていの事は8000台のgoogleの端末が解決してくれます♪


78ポイント を手に入れた。

Name: もも  ..ぴよぴよ(484ポイント)   Date: 2007/02/01(木) 11:47   No:4173     
Title: Re:課題です。。    
ファイルのオープンといいますと、こんなのしか思い浮かばないんです。。
すみません、何度も・・・もし全然的外れでしたら悪いので返信下さらなくてもいいんですが、お時間あれば
お願いします。

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
FILE*fin;
char buf[256];
char filename1[]="rep1.txt";

if((fin = fopren(filename1,"r")) == NULL){
printf("%sをオープンできません.\n",filename1);
exit(1);
}

while (fgets(buf,256,fin) !=NULL){
printf("%s",buf);
}



185ポイント を手に入れた。

Name: keichan  ..中級者(12,444ポイント)   Date: 2007/02/01(木) 13:17   No:4174     
Title: Re:課題です。。    
ファイルオープンに関してはそれで概ね問題ないように見えます。
後は行数をカウントする処理を書いて、最後にファイルを使い終わったら
fclose(fin);
すれば期待する動作をするプログラムが完成すると思います。


85ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,834ポイント)   Date: 2007/02/01(木) 13:50   No:4175     
Title: Re:課題です。。    
さて、肝心の「行数を数える」です。
いったん、プログラムから離れて考えてみましょう。

エディタか何かでテキストファイルを開いているとき、
そのファイルの行数を確認するにはどういう方法があるでしょうか。
ある行と次の行とを区切っているのは何でしょう?


84ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(76ポイント)   Date: 2007/02/01(木) 20:34   No:4184     
Title: Re:課題です。。    
気になった点とヒントをいくつか。

・#define CRLF '??'
 ??を改行文字に置き換えてみる。
 なぜCRLFとしたかは、余裕がある時に調べてもらえればいいです。

・int main(void) -> int main(コマンドライン引数)
 このvoidの所でコマンドラインからファイル名を取得します。

・char buf[256] -> unsigned int buf;
 注意:あくまでも、ファイルの行数をカウントするだけで、
    内容の取得を意識していませんので。
    また、全角文字対策の為にint ではなくunsigned int を使用しました。

・int flcount = 0;
 ファイル内の行数値を初期化

・switch(コマンドライン引数の総個数)
 case 2:
 default:
 コマンドライン引数が誤りの場合の処理を追加

・if((fin = fopren() -> if((fin = fopen()

・while (fgets(buf,256,fin) !=NULL) -> while (fgets(fin) != ???)
 ???に当てはまるファイルの終端を表す文字は?
 また、この中でflcountをカウントアップ

・fclose(fin);

・printf("%s",buf); -> printf("%d", flcount);
 ファイルクローズした後に結果表示

・int mainとしたので、return( 0 ); を返しておきます。


387ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(182,669ポイント)   Date: 2007/02/01(木) 23:03   No:4187     
Title: Re:課題です。。    
ファイルをオープンして、ファイルから1行とってくるプログラムのサンプルがここにあります。

http://always-pg.com/c/runtime_rd/file/fgets.html

このループ内で、行数をカウントすればよいことがわかりますね。

このプログラムを参考に、また、上記の回答してくださった方々のご意見を参考に、やってみてください。


99ポイント を手に入れた。

Name: しっぽ  ..入門者(2,539ポイント)   Date: 2007/02/06(火) 00:04   No:4284     
Title: Re:課題です。。    
むつさんへ

私には分からない点が多々ありますので教えてくだされば幸いです。

---------------

>・#define CRLF '??'
> ??を改行文字に置き換えてみる。
> なぜCRLFとしたかは、余裕がある時に調べてもらえればいいです。

「CRLF」とは 0XD 0XA のことですか。ウィンドウズのファイルをバイナリーモードで開くのなら
分かるのですが、アスキーモードで、う〜む。何のことでしょう?


>・char buf[256] -> unsigned int buf;
> 注意:あくまでも、ファイルの行数をカウントするだけで、
>    内容の取得を意識していませんので。
>    また、全角文字対策の為にint ではなくunsigned int を使用しました。

"1\n" の場合、または "1\d\nあ\d\n" と書かれたファイルの場合、対策はほど遠いように
思います。


>・while (fgets(buf,256,fin) !=NULL) -> while (fgets(fin) != ???)
> ???に当てはまるファイルの終端を表す文字は?
> また、この中でflcountをカウントアップ

fgets(FILE *) というCの関数はありましたか?この関数が分からないので「???」も
何のことだかさっぱりです。


>・fclose(fin);
この課題では必須とは言えないでしょう。



498ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(932ポイント)   Date: 2007/02/06(火) 01:11   No:4290     
Title: Re:課題です。。    
>しっぽさん
質問者とは他の方ですよね。

改行コードをマクロ定義する際、当方はwindows環境を使用しているので、
CRLFという記号定数にしました。という事です。

fgetc()の間違いでした。
とはいえ、どうしてもコレを使う訳ではないので。

"1\d\nあ\d\n" とありますが、
読み込むファイルとはCソースという事でしょうか。
当方は、以下のようなデータファイルを想定していました。


++ fcount.c ++
#include <stdio.h>
#define CRLF '\n'

int main( int argc, char *argv[])
{
FILE *fp;
unsigned int c;
int nl = 0;
switch( argc ) {
case 2:
if(( fp = fopen(argv[1], "r") ) == NULL ) {
printf( "ファイル名(%s)が誤りです。\n", argv[1] );
return( 2 );
}
break;
default:
printf( "引数が誤りです。\n" );
return( 2 );
}
while( ( c = fgetc( fp ) ) != EOF )
if( c == CRLF ) nl++;
if( argc == 2 ) fclose( fp );
printf( "行数= %d\n", nl );
return( 0 );
}
++ estimate.dat ++
材料A 200,000
材料B 150,000
工賃 50,000



389ポイント を手に入れた。

Name: しっぽ  ..入門者(2,588ポイント)   Date: 2007/02/07(水) 01:18   No:4325     
Title: Re:課題です。。    
>>しっぽさん
>質問者とは他の方ですよね。

全くの別人です。申し訳ないですが、今日は帰りが遅かったので
明日読ませてください。


49ポイント を手に入れた。

Name: しっぽ  ..入門者(2,748ポイント)   Date: 2007/02/07(水) 22:57   No:4348     
Title: Re:課題です。。    
>#define CRLF '\n'

私の頭の中では「キャレジリターン・ラインフィールド」= 0X0D0A と
なってしまっているので、へんだなと思い尋ねてみました。


>fgetc()の間違いでした。

なので残りの2つの疑問も解消です。


108ポイント を手に入れた。



Name: 大工  ..初心者(6,693ポイント)   Date: 2007/02/07(水) 18:03   No:4337       
Title: makeについて    
ちょっと解説お願いします。

Cygwinでmakeコマンドを使うとそんなコマンドはないと表示されます。。。

なんでなんでしょう??ちゃんとインストールしたはずなんですが


77ポイント を手に入れた。


Name: box  ..熟練のプログラマー(45,007ポイント)   Date: 2007/02/07(水) 19:06   No:4339     
Title: Re:makeについて    
> なんでなんでしょう??ちゃんとインストールしたはずなんですが

makeコマンドが存在するディレクトリーをフルパスで指定したら起動しますか?
だとすると、環境変数PATHに設定してあるディレクトリー群の中に
makeコマンドが存在するディレクトリーを含んでいないことになると思います。
その場合は、環境変数PATHに、makeコマンドが存在するディレクトリーを
追加してください。


34ポイント を手に入れた。

Name: 大工  ..初心者(6,728ポイント)   Date: 2007/02/07(水) 19:14   No:4340     
Title: Re:makeについて    
フルパスですか・・・・ん〜、すみませんフルパスがわかんないです。

35ポイント を手に入れた。

Name: Hermit  ..ぴよぴよ(676ポイント)   Date: 2007/02/07(水) 19:34   No:4341     
Title: Re:makeについて    
最近 cygwin 使っていないので、違ってるかもしれませんが、
デフォルトでは、gcc などはインストールされないって事では?
make がどうだったか覚えてないけど、


75ポイント を落としてしまった。

Name: 大工  ..初心者(6,749ポイント)   Date: 2007/02/07(水) 19:37   No:4342     
Title: Re:makeについて    
いままで散々gccを使ってきましたからそれは大丈夫なはず・・^^;


21ポイント を手に入れた。

Name: Hermit  ..ぴよぴよ(666ポイント)   Date: 2007/02/07(水) 20:01   No:4344     
Title: Re:makeについて    
じゃ、とりあえずフルパスは、
/bin;/usr/bin;/usr/local/bin のどれかのはずですので、
それを探しましょう。
デフォルトの、bash 使ってるとしてですが。


23ポイント を手に入れた。

Name: 大工  ..初心者(6,835ポイント)   Date: 2007/02/07(水) 20:37   No:4346     
Title: Re:makeについて    
え〜と・・・・

お恥ずかしい話・・

フルパスはどのように使ったら・・・

(すみません、startxもそんなコマンドはありませんと・・・)

いっそ、cygwinをアインストールしてもう一度インストールしようかと考えているんですが
初心者でも分かりやすいサイトを教えて下さい。


86ポイント を手に入れた。



Name: parapara  ..ぴよぴよ(407ポイント)   Date: 2007/02/06(火) 17:50   No:4313       
Title: 16進数の順番について    
こちらの不手際で次の質問欄に書き込みします。

407ポイント を手に入れた。


Name: parapara  ..かけだし(1,016ポイント)   Date: 2007/02/06(火) 18:00   No:4314     
Title: 16進数の順番について===訂正===    
始めまして、独学でC言語を勉強してる物ですが、

コンピューターの中の16進数の事があまり良く分からないので教えてください。
PCはDELLのディメンション8300です。
コンパイラはMicrosoft Visual C++ .NET 55577-640-4383485-18159
説明不足だと思いますが、以下の状況(16進数のPCの中での順番が分からない)です。
#include<stdio.h>
#include<stdlib.h>
int main(void){
char ss[]="ABCDEF";
void *vpt;
int idt;

vpt=ss; //Aを指しているポインタ
idt=*(char *)vpt;
printf("char:%X\n",idt);
idt=*(int *)vpt;
printf("int :%X\n\n",idt);

{//変数を新たに宣言するためのブロック
int dt=0x41424344;
int *ip;
char *cp;
ip=&dt;
cp=(char *)ip;
printf("%x\n",*ip);
printf("%x\n",*cp++);
printf("%x\n",*cp++);
printf("%x\n",*cp++);
printf("%x\n",*cp++);
}
return(EXIT_SUCCESS);
}
=============実行結果===============================================
char:41 ←これは分かる
int :44434241 ←この行以下なんでこの順番なのかが分からない

41424344
44
43
42
41
Press any key to continue


609ポイント を手に入れた。

Name: parapara  ..かけだし(1,029ポイント)   Date: 2007/02/06(火) 18:51   No:4315     
Title: Re:16進数の順番について===訂正===    
禁止事項だとは知らずにマルチポスト(の言葉自体知らなかった)してしまいました。
深く反省しましたが、何卒どうか質問にお答えください。


13ポイント を手に入れた。

Name: parapara  ..かけだし(1,096ポイント)   Date: 2007/02/06(火) 19:15   No:4316     
Title: Re:16進数の順番について===訂正===    
リトルエンディアンのことだと思いますが。
それが具体的に私のソースコードと直接どういう風に関係しているのか知りたいのです。それを詳解してる書籍などでも教えていただけると、幸いです。今使っている書籍は、”林 晴比古のシニア編”です。


67ポイント を手に入れた。

Name: GPGA  ..上級者(18,737ポイント)   Date: 2007/02/06(火) 20:15   No:4318     
Title: Re:16進数の順番について===訂正===    

char ss[] = "ABCDEF";

ここの ss のアドレスが 仮に 100番地だったとしましょう。
その場合

番地: 100 101 102 103
値 : 0x41 0x42 0x43 0x44

となります。

int idt = *((int *)ss);

上記のようにint型のidtにキャストした場合、リトルエンディアンだと

idtの0バイト目:0x41(100番地)
idtの1バイト目:0x42(101番地)
idtの2バイト目:0x43(102番地)
idtの3バイト目:0x44(103番地)

になるので

対応するバイト: 3210
↓↓↓↓
idt == 0x44434241

となります。
自分で説明していて、わかりづらいな〜とは思うのですけど
この説明でわかりますでしょうか?

なおビッグエンディアンの場合は、キャストした際に
idtの0バイト目:0x44(103番地)
idtの1バイト目:0x43(102番地)
idtの2バイト目:0x42(101番地)
idtの3バイト目:0x41(100番地)

になるので

対応するバイト: 3210
↓↓↓↓
idt == 0x41424344

となります。



217ポイント を手に入れた。

Name: parapara  ..かけだし(1,106ポイント)   Date: 2007/02/07(水) 09:37   No:4331 解決!     
Title: Re:16進数の順番について===訂正===    
これ以上がない位的確に詳細に教えてもらえたと思います。
しかし難しくてなかなか理解できず、暫く理解するために考えてみる事にします。
本当にありがとうございました。


10ポイント を手に入れた。

Name: (報告)  ..ぴよぴよ(15ポイント)   Date: 2007/02/07(水) 09:54   No:4332     
Title: Re:16進数の順番について===訂正===    
既に解決済みですがマルチポスト先をリンクさせておきます。
http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+29713


15ポイント を手に入れた。



Name: にゃんこ  ..かけだし(1,864ポイント)   Date: 2007/02/02(金) 12:54   No:4196       
Title: ポインタについて    
また大学の課題なんですけど、

行列A=
a[1][1]=1 a[1][2]=1 a[1][3]=1 a[1][4]=1
a[2][1]=2 a[2][2]=4 a[2][3]=5 a[2][4]=3
a[3][1]=-1 a[3][2]=-3 a[3][3]=-6 a[3][4]=2
a[4][1]=5 a[4][2]=7 a[4][3]=8 a[4][4]=7
ベクトルb=
b[1]=4
b[2]=6
b[3]=2
b[4]=16

のとき、行列Aとベクトルbを配列とポインタを用いて作成し、さらにAx=bの拡大行列を表示して表示するプログラムを作成せよ。


上の課題、配列を用いて作成し、拡大行列を表示することは出来たんですがポインタをどのように使っていいのかが分かりません。ちなみに作成したプログラムは↓↓です。

#include <stdio.h>

#define MYMATRIX_SIZE 4


double matrix[MYMATRIX_SIZE][MYMATRIX_SIZE];
double vector[MYMATRIX_SIZE];

main()
{
int iRow,iCol;

/* A */
matrix[0][0] = 1;
matrix[0][1] = 1;
matrix[0][2] = 1;
matrix[0][3] = 1;
matrix[1][0] = 2;
matrix[1][1] = 4;
matrix[1][2] = 5;
matrix[1][3] = 3;
matrix[2][0] = -1;
matrix[2][1] = -3;
matrix[2][2] = -6;
matrix[2][3] = 2;
matrix[3][0] = 5;
matrix[3][1] = 7;
matrix[3][2] = 8;
matrix[3][3] = 7;

/* b */
vector[0] = 4;
vector[1] = 6;
vector[2] = 2;
vector[3] = 16;

/* 表示 */
printf("拡大行列 = \n");
for(iRow=0; iRow<MYMATRIX_SIZE; iRow++){
for(iCol=0; iCol<MYMATRIX_SIZE; iCol++){
printf("%8.4g",matrix[iRow][iCol]);
if(iCol==3){
printf("%8.4g\n",vector[iRow]);
}
}
}
}


ポインタはすごく苦手でまったく分からないのでよろしくお願いします!!


2倍のポイントを手に入れた! 1,592ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(183,023ポイント)   Date: 2007/02/02(金) 16:20   No:4207     
Title: Re:ポインタについて    
ポインタはネットでもいいですので、勉強しましょう。

まず普通のポインタを勉強しましょう。

http://www5c.biglobe.ne.jp/~ecb/c/c00.html

ここの6章から7.4章まで勉強してください。

ポインタは難しいですから、概念を一通り学んだ後、自分で色々関数を作って実行してみてください。
其の中でわかってくるはずです。

一通りわかったら以下のプログラムを見てください。

2次元配列の掛け算を行うプログラムです。

#include <stdio.h>


void calc(int arr1[][2],int arr2[][2],int arr3[][2]){
arr3[0][0]=arr1[0][0]*arr2[0][0]+arr1[0][1]*arr2[1][0];
arr3[0][1]=arr1[0][0]*arr2[0][1]+arr1[0][1]*arr2[1][1];
arr3[1][0]=arr1[1][0]*arr2[0][0]+arr1[1][1]*arr2[1][0];
arr3[1][1]=arr1[1][0]*arr2[0][1]+arr1[1][1]*arr2[1][1];
return ;
}

int main() {
int arr1[2][2]={{1,2},{3,4}},arr2[2][2]={{5,6},{7,8}},i,j,arr3[2][2];
calc(arr1,arr2,arr3);
printf("%d %d\n",arr3[0][0],arr3[0][1]);
printf("%d %d\n",arr3[1][0],arr3[1][1]);
return 0;
}



例えば上記のプログラムでしたらarr1という2次元配列の先頭アドレスをcalcに渡します。
受け取ったアドレスをarr1[][2]で受け取ります。
最上位の要素のみ省略する事が出来ます。
受け取り方は
void calc(int (*arr1)[2],int (*arr2)[2],int (*arr3)[2]){
このように書いてもかまいません。

掛け算はうまくスマートにかけるように工夫してみてください。

頑張って☆


354ポイント を手に入れた。

Name: box  ..熟練のプログラマー(43,642ポイント)   Date: 2007/02/02(金) 16:45   No:4209     
Title: Re:ポインタについて    

> 行列Aとベクトルbを配列とポインタを用いて作成し

ポインタをどう使えばいいか、ですけど、
こんなことを想定されてるんでしょうか…。よくわからないです。

#include <stdio.h>

#define SIZE (4)

int main (void)
{
double *mat_a[SIZE];
double vec_b[] = { 4, 6, 2, 16 };
double m[] = { 1, 1, 1, 1, 2, 4, 5, 3, -1, -3, -6, 2, 5, 7, 8, 7 };
int i, j;

for (i = j = 0; i < SIZE; i++, j += SIZE)
mat_a[i] = &m[j];
for (i = 0; i < SIZE; i++) {
for (j = 0; j < SIZE; j++) {
printf("%8.4g", mat_a[i][j]);
if (j == SIZE - 1)
printf("%8.4g\n", vec_b[i]);
}
}
return 0;
}


287ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(183,406ポイント)   Date: 2007/02/02(金) 16:55   No:4210     
Title: Re:ポインタについて    
ポインタを用いて配列を作製するという意味は確かによくわかりませんが、
計算をするのに単に関数へアドレスを渡して計算するということなのではないでしょうか?



アドレスと配列の関係は


int a[5];
と宣言したとし、aの先頭アドレスが10000番地だったとすると、int型変数は1つ4バイトですから

a[0]のアドレスは10000番地
a[1]のアドレスは10004番地
a[2]のアドレスは10008番地
a[3]のアドレスは10012番地
a[4]のアドレスは10016番地

ということに成ります。

問題をもう少し明確にしたほうがいいかもしれません。


101ポイント を落としてしまった。

Name: むつ  ..ぴよぴよ(367ポイント)   Date: 2007/02/02(金) 17:10   No:4212     
Title: Re:ポインタについて    
++ 質問の意図とは違うと判断した為消去します ++

291ポイント を手に入れた。

Name: にゃんこ  ..入門者(2,726ポイント)   Date: 2007/02/03(土) 03:51   No:4221     
Title: Re:ポインタについて    
分かりにくい質問で申し訳ありませんでした。。
私自身あまりポインタの使い方が分かっていないので、質問自体も分かりにくくなってしまったようです(*_*)
皆さんの意見を参考にもう少し自分で勉強してみようと思います。
本当にありがとうございました。

あと、ポインタとは離れますがこの問題の続きで

問2 問1で作成した拡大行列に前進消去を適用し、三角形式の行列にし、その結果を表示するプログラムを作成せよ。

問3 問2で作成した三角形式の行列に後退代入を適用して与えられた連立方程式を解き、その結果を表示するプログラムを作成せよ。

問2は自分でやってみたところ実行結果が以下のようになりました。

1   1    1    1    4
0   2    3    1    -2
0   0    -2    4  4
0 0 0    1 -2

それぞれの要素を

α[1][1] = 1 α[1][2] = 1 α[1][3] = 1 α[1][4] = 1 β[1] = 4
・      ・      ・     ・      ・
  ・      ・      ・     ・      ・
  ・      ・      ・     ・      ・

と表すと、連立方程式は

α[1][1]x[1] + α[1][2]x[2] + α[1][3]x[3] + α[1][4]x[4] = β[1]
        α[2][2]x[2] + α[2][3]x[3] + α[2][4]x[4] = β[2]
                α[3][3]x[3] + α[3][4]x[4] = β[3]
                        α[4][4]x[4] = β[4]

したがって

x[4] = β[4]/α[4][4]
x[3] = (β[3]-α[3][4]x[4])/α[3][3]
x[2] = (β[2]-α[2][3]x[3]-α[2][4]x[4])/α[2][2]
x[1] = (β[1]-α[1][2]x[2]-α[1][3]x[3]-α[1][4]x[4])/α[1][1]

と表せる。

上のxの値をそれぞれ求めていくプログラムなんですが、さすがに一つずつ求めて行ったのでは課題になりませんので……。↓↓↓のような感じのプログラムを作ってみたんですが、x[1]=3、x[2]=9、x[3]=-6、x[4]=-2となるはずの答えが合わなくてm(__)m
どこが間違っているんでしょうか??


862ポイント を手に入れた。

Name: にゃんこ  ..入門者(3,103ポイント)   Date: 2007/02/03(土) 03:55   No:4222     
Title: Re:ポインタについて    
すいません。プログラムは以下です。。

#include <stdio.h>

#define MYMATRIX_SIZE 5

double matrix[MYMATRIX_SIZE-1][MYMATRIX_SIZE];
double func(int i);

main()
{
int i;
double matrix[MYMATRIX_SIZE+3];

matrix[0][0] = 1;
matrix[0][1] = 1;
matrix[0][2] = 1;
matrix[0][3] = 1;
matrix[0][4] = 4;
matrix[1][0] = 0;
matrix[1][1] = 2;
matrix[1][2] = 3;
matrix[1][3] = 1;
matrix[1][4] = -2;
matrix[2][0] = 0;
matrix[2][1] = 0;
matrix[2][2] = -2;
matrix[2][3] = 4;
matrix[2][4] = 4;
matrix[3][0] = 0;
matrix[3][1] = 0;
matrix[3][2] = 0;
matrix[3][3] = 1;
matrix[3][4] = -2;

for(i=MYMATRIX_SIZE-1; i>=0; i--){
x[i] = func(i) / matrix[i][i];
}

for(i=0; i<MYMATRIX_SIZE-1; i++){
printf("%15.8g\n", x[i]);
}
}

double func(int i)
{
double result;

if(i>MYMATRIX_SIZE-1){
result = 0;
}else{
result = matrix[i][MYMATRIX_SIZE]
- matrix[i][MYMATRIX_SIZE-1] * func(i+1)
- matrix[i][MYMATRIX_SIZE-2] * func(i+2)
- matrix[i][MYMATRIX_SIZE-3] * func(i+3);
}
return result;
}


377ポイント を手に入れた。

Name: しっぽ  ..かけだし(1,267ポイント)   Date: 2007/02/03(土) 17:32   No:4229     
Title: Re:ポインタについて    
完全に間違っているところ

main関数内の
double matrix[MYMATRIX_SIZE+3];
はサイズが合っていない。

double func(int i) 内ではグローバルな
double matrix[MYMATRIX_SIZE-1][MYMATRIX_SIZE];
が使用されてしまうため、main関数内での matrix
への代入が無意味になっている。


106ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,148ポイント)   Date: 2007/02/03(土) 18:35   No:4231     
Title: Re:ポインタについて    

> x[4] = β[4]/α[4][4]
> x[3] = (β[3]-α[3][4]x[4])/α[3][3]
> x[2] = (β[2]-α[2][3]x[3]-α[2][4]x[4])/α[2][2]
> x[1] = (β[1]-α[1][2]x[2]-α[1][3]x[3]-α[1][4]x[4])/α[1][1]

このとおりコードを書いたら、次のようになりました。

#include <stdio.h>

#define SIZE (4)

int main(void)
{
double x[SIZE];
double a[SIZE][SIZE] = {
{ 1, 1, 1, 1 },
{ 0, 2, 3, 1 },
{ 0, 0, -2, 4 },
{ 0, 0, 0, 1 },
};
double b[SIZE] = { 4, -2, 4, -2 };
int i;

for (i = SIZE - 1; i >= 0; i--) {
double t;
int j;
for (t = 0, j = i + 1; j < SIZE; j++)
t += a[i][j] * x[j];
x[i] = (b[i] - t) / a[i][i];
}
for (i = 0; i < SIZE; i++)
printf("x[%d]=%f\n", i, x[i]);
return 0;
}


303ポイント を手に入れた。

Name: しっぽ  ..かけだし(2,020ポイント)   Date: 2007/02/03(土) 19:00   No:4232     
Title: Re:ポインタについて    
私もコードを投稿してみよ。
ただし前進消去とか後退代入は知らないので、目的に適合するかは分かりません。


#include <stdio.h>

#define SIZE 4

void print(double **matrix, int ny, int nx);
void lower_triangle(double **matrix, int ny, int nx);
void normalize(double **matrix, int ny, int nx);
void kronecker_delta(double **matrix, int ny, int nx);

int main(void)
{
int y;

double buff[SIZE][SIZE + 1] =
{
{ 1, 1, 1, 1, 4},
{ 2, 4, 5, 3, 6},
{-1,-3,-6, 2, 2},
{ 5, 7, 8, 7,16}
};

double *matrix[SIZE];
double *vector[SIZE];

printf("初期状態\n");
for(y = 0; y < SIZE; ++y){
matrix[y] = &buff[y][0];
vector[y] = &buff[y][SIZE];
}
print(matrix, SIZE, SIZE + 1);

printf("小行列Aが下三角行列になるよう変形する\n");
lower_triangle(matrix, SIZE, SIZE + 1);
print(matrix, SIZE, SIZE + 1);

printf("小行列Aの主対角が1になるよう変形する\n");
normalize(matrix, SIZE, SIZE + 1);
print(matrix, SIZE, SIZE + 1);

printf("小行列Aがクロネッカー・デルタになるよう変形する\n");
kronecker_delta(matrix, SIZE, SIZE + 1);
print(matrix, SIZE, SIZE + 1);

printf("解ベクトルb\n");
print(vector, SIZE, 1);

return 0;
}

void print(double **matrix, int ny, int nx)
{
int x, y;
for(y = 0; y < ny; ++y){
for(x = 0; x < nx; ++x){
printf("%6.4g ", matrix[y][x]);
}
printf("\n");
}
printf("\n");
}

void lower_triangle(double **matrix, int ny, int nx)
{
int x, y, j;
for(y = 0; y < ny - 1; ++y){
for(j = y + 1; j < ny; ++j){
double d = matrix[j][y] / matrix[y][y];
for(x = y; x < nx; ++x){
matrix[j][x] -= matrix[y][x] * d;
}
}
}
}

void normalize(double **matrix, int ny, int nx)
{
int x, y;
for(y = 0; y < ny; ++y){
double d = matrix[y][y];
for(x = 0; x < nx; ++x){
matrix[y][x] /= d;
}
}
}

void kronecker_delta(double **matrix, int ny, int nx)
{
int y;
for(y = ny - 1; y > 0; --y){
double d = matrix[y][nx - 1];
int j;
for(j = 0; j < y; ++j){
matrix[j][nx - 1] -= matrix[j][y] * d;
matrix[j][y] = 0.0;
}
}
}



753ポイント を手に入れた。

Name: にゃんこ  ..入門者(3,038ポイント)   Date: 2007/02/04(日) 01:28   No:4242     
Title: Re:ポインタについて    
boxさん、しっぽさん、ありがとうございます。
えぇと、たぶんboxさんのプログラムが一番課題の内容に近いと思うんですけど、
行列をaとbに分けていらっしゃいますが、それを分けずに一つの配列として扱い答えを出すことは可能でしょうか??


65ポイント を落としてしまった。

Name: box  ..熟練のプログラマー(44,202ポイント)   Date: 2007/02/04(日) 08:15   No:4243     
Title: Re:ポインタについて    
> 行列をaとbに分けていらっしゃいますが、それを分けずに一つの配列として扱い答えを出すことは可能でしょうか??

もちろんできます。
・aの定義を1列増やす
・bの定義を削除する
・計算式でbを使っている箇所を、aの増やした列を使うように修正する


54ポイント を手に入れた。

Name: にゃんこ  ..入門者(3,065ポイント)   Date: 2007/02/07(水) 02:39   No:4328 解決!     
Title: Re:ポインタについて    
わかりました。では、そのように変更して作ってみます(*^_^*)
本当にありがとうございました。。


27ポイント を手に入れた。



Name: umaibo  ..ぴよぴよ(933ポイント)   Date: 2007/02/06(火) 23:56   No:4321       
Title: 線形リストの課題についてお願いします    
お世話になっております
下記の課題、よろしければお願いしますl

seiseki.cを修正し、合計点が高い順に生徒の成績が表示されるようにしなさい。
ただし、出力の部分を修正せずに、新しいデータを読み込んだら新規セルを線形リストのしかるべき位置に挿入するようなコーディングとすること。

lseiseki.c は、リスト2に示すような成績に関するデータを読み込み、リスト3に示すような成績表を出力するプログラムである。


1 /* lseiseki.c 成績データを線形リストを用いて処理する */
2 #include <stdio.h>
3 #include <malloc.h>
4
5 typedef struct seiseki{ /* 成績情報セルの構造 */
6 char name[20] ; /* 氏名 */
7 int score[5] ; /* 国語・数学・社会・理科・英語の点 */
8 struct seiseki *next;
9 } SEISEKI;
10
11 int main()
12 {
13 char fname[100]; /* 入力ファイルの名前 */
14 FILE *fp; /* ファイル管理構造体のアドレス */
15
16 char name[20]; /* データ読み込み用の変数 */
17 int kokugo, sansuu, syakai, rika, eigo ;
18
19 SEISEKI *root=NULL; /* 成績リストの根を指すポインター */
20 SEISEKI *p,*q; /* 成績リスト探索用のポインター変数 */
21 SEISEKI *x ; /* 新規セルへのポインター */
22 int sum; /* 合計点 */
23 int i,j;
24
25 printf( "成績ファイルの名前を指定して下さい>" );
26 gets( fname );
27 if( (fp=fopen(fname,"r")) ==NULL){
28 printf( "成績ファイルがオープン出来ません\n" );
29 exit(-1);
30 }
31
32 /* 成績データの読み込み */
33 while( 1 ){
34 if( fscanf( fp,"%s%d%d%d%d%d",name,&kokugo,&sansuu,
35 &syakai,&rika,&eigo ) != 6 ) break;
36 x = (SEISEKI *)malloc( sizeof(SEISEKI) );
37 if( x==NULL ) {
38 printf( "メモリー不足です\n" );
39 break;
40 }
41 strcpy( x->name, name );
42 x->score[0] = kokugo; x->score[1] = sansuu;
43 x->score[2] = syakai; x->score[3] = rika; x->score[4] = eigo;
44 x->next = NULL;
45 if( root== NULL ){
46 root = x;
47 }
48 else{
49 for( p=root; p->next!= NULL; p=p->next );
50 p->next = x;
51 }
52 }
53 fclose( fp ); /* これ以降ファイルはアクセスしない */
54
55 /* 成績データの表示 */
56 printf( "氏名 国語 算数 理科 社会 英語 合計\n");
57 for( p=root; p != NULL ; p = p->next ){
58 printf( "%10s",p->name );
59 for( i=0,sum=0 ; i<5 ; i++) {
60 sum += p->score[i];
61 printf( "%4d ",p->score[i]);
62 }
63 printf( "%4d\n",sum);
64 }
65
66 /* 成績データの解放 */
67 for( p=root; p!=NULL ; ){
68 q = p->next;
69 free(p);
70 p = q;
71 }
72
73 return(0);
74 }

リスト2 seiseki.txt のリスト
katou 81 85 56 82 71
furukawa 65 73 65 83 80
shimizu 77 93 90 81 92
yamada 89 76 83 74 77
adachi 62 50 70 65 90
satou 90 85 91 92 95
doi 80 85 60 79 85
gotou 75 45 55 43 60
hasimoto 83 72 85 72 91
ueda 60 63 60 77 76
takahashi 80 100 70 85 79

リスト3 lseiseki.exe の出力の様子
氏名 国語 算数 理科 社会 英語 合計
katou 81 85 56 82 71 375
furukawa 65 73 65 83 80 366
shimizu 77 93 90 81 92 433
yamada 89 76 83 74 77 399
adachi 62 50 70 65 90 337
satou 90 85 91 92 95 453
doi 80 85 60 79 85 389
gotou 75 45 55 43 60 278
hasimoto 83 72 85 72 91 403
ueda 60 63 60 77 76 336
takahashi 80 100 70 85 79 414


933ポイント を手に入れた。


Name: box  ..熟練のプログラマー(44,920ポイント)   Date: 2007/02/07(水) 00:15   No:4322     
Title: Re:線形リストの課題についてお願いします    
> seiseki.cを修正し、合計点が高い順に生徒の成績が表示されるようにしなさい。
> ただし、出力の部分を修正せずに、新しいデータを読み込んだら新規セルを線形リストのしかるべき位置に挿入するようなコーディングとすること。

この仕様を満たすため、ご自分ではどこまで考えているかを示してください。


21ポイント を手に入れた。



Name: 大工  ..初心者(5,871ポイント)   Date: 2007/02/05(月) 22:00   No:4280       
Title: Windows環境    
たいした質問でないんですが・・・

不適切なら削除してください。

cygwinはWindows環境の人なら使っているはずなんですが・・・

フォントを変更しようとしても2種類しかないじゃないですか???(私だけかも)


フォントを変更したいんですが、情報お持ちの方いらっしゃいますか??


31ポイント を手に入れた。


Name: むつ  ..ぴよぴよ(512ポイント)   Date: 2007/02/06(火) 00:02   No:4283     
Title: Re:Windows環境    
X Window Systemを使っているのでしょうか?
つまりこういう事?
ttp://www.atmarkit.co.jp/flinux/special/cygwin2/cygwin01b.html


51ポイント を手に入れた。

Name: 大工  ..初心者(5,930ポイント)   Date: 2007/02/06(火) 00:22   No:4286     
Title: Re:Windows環境    
ん〜ちょっと違います・・・・すみません説明不足で・・

ワードでフォントを変えれるみたいにcygwinでも変えてみたいんです


59ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(960ポイント)   Date: 2007/02/06(火) 01:38   No:4292     
Title: Re:Windows環境    
コマンドプロンプトのフォントの事かなぁ。
ttp://pooh.gr.jp/item-229.html


28ポイント を手に入れた。

Name: 大工  ..初心者(6,435ポイント)   Date: 2007/02/06(火) 01:55   No:4293     
Title: Re:Windows環境    
cygwinなんです・・・・

むつ さんの方法でも変えられますか??


36ポイント を手に入れた。

Name: おためし  ..ぴよぴよ(209ポイント)   Date: 2007/02/06(火) 10:30   No:4298     
Title: Re:Windows環境    
cygwinのターミナルならckがお勧め。フォントも設定ファイルで変えられます
http://www.geocities.jp/cygwin_ck/

ほかにちょっと大きいですがpoderosaならGUIでフォント変えられます
http://ja.poderosa.org/


34ポイント を手に入れた。

Name: 大工  ..初心者(6,522ポイント)   Date: 2007/02/06(火) 10:54   No:4300     
Title: Re:Windows環境    
>/bin/ckstartup.js ファイルを作り、以下の内容を書いて保存する。

とありますが何に書くのですか?? ファイルというのはディレクトリという意味でいいですか??


41ポイント を手に入れた。

Name: おためし  ..ぴよぴよ(212ポイント)   Date: 2007/02/06(火) 16:27   No:4311     
Title: Re:Windows環境    
ファイルと言うのはファイルです。
cygwin\binにckstartup.jsを作りましょう。
解らなければ使わないのも良いと思います


3ポイント を手に入れた。

Name: 大工  ..初心者(6,616ポイント)   Date: 2007/02/06(火) 16:47   No:4312     
Title: Re:Windows環境    
いろいろインターネットを放浪してみたら Teraterm UTF8 を発見しました。

フォントも結構種類があって目的が達成できそうです。

回答してくださったみなさんありがとうございました


94ポイント を手に入れた。



Name: keichan  ..中級者(13,596ポイント)   Date: 2007/02/05(月) 13:41   No:4267       
Title: 【雑談】フレキシブル配列メンバ    
http://www.play21.jp/board/formz.cgi?action=res&resno=1319&page=&lognum=5&id=dixq&rln=1338
のスレで話題になっていた情報の詳細が別所で議論されていましたので紹介しておきます。

http://forums.belution.com/ja/cpp/000/063/47s.shtml

どうやらC89では未定義だったものがC99で採用されていたみたいです。


153ポイント を手に入れた。


Name: Hermit  ..ぴよぴよ(424ポイント)   Date: 2007/02/05(月) 18:43   No:4270     
Title: Re:【雑談】フレキシブル配列メンバ    
むかし出てきたことがありましたが、
(名前は特に無かったと思う)
ANSI 規格では明記されていませんでしたが、
FAQの様な、いろんな情報が、ANSI C89 制定後に、ANSI より出て来ている筈ですが、
そこで、このように使えるというサンプルが出たことがあるそうです。
ということで、後付ですが、ANSI C89 の定義の範囲内だったはずです。

サンプルは、
struct foo {
struct foo *next;
char str[1];
}
の、str に文字列を入れる様なかきかただったはず。
当然ですが、サイズ 0 のメンバはANSI は認めていないので、
gcc の str[0] や、bcc,cl などの str[] 形式は ANSI は認めていなかったはず。
今の C99 はどうかな?

ついでに、この手法は、ANSI 以前からあった方法だったと記憶しています。
MSC4 などのヘッダファイルの中にも有った様な気が・・・


169ポイント を手に入れた。

Name: keichan  ..中級者(13,731ポイント)   Date: 2007/02/06(火) 11:19   No:4301     
Title: Re:【雑談】フレキシブル配列メンバ    
Hermitさん、さらに突っ込んだ情報ありがとうございます。

>ということで、後付ですが、ANSI C89 の定義の範囲内だったはずです。
そうでしたか。C89の範疇に入っていたのですか。

>gcc の str[0] や、bcc,cl などの str[] 形式は ANSI は認めていなかったはず。
>今の C99 はどうかな?
JISX3010:2003(ISO/IEC9899:1999)を確認しましたが、特記事項として書いてありませんでした。


103ポイント を手に入れた。



Name: 大工  ..初心者(5,598ポイント)   Date: 2007/02/05(月) 20:08   No:4272       
Title: スタティックライブラリでのウォーニング。    
最近ライブラリの作成を勉強している大工です。

スタティックライブラリについての質問です。

コンパイルした結果が・・・

$ gcc -c func2.c
func2.c: In function `msg':
func2.c:5: warning: function returns address of local variable

です。ソースコードは以下です。

#include <stdio.h>

char *msg(){
char m[] = "This is a test.\n";
return m;
}



このワーニングの解説を宜しくお願いします。


242ポイント を手に入れた。


Name: Hermit  ..ぴよぴよ(535ポイント)   Date: 2007/02/05(月) 20:24   No:4273     
Title: Re:スタティックライブラリでのワーニング。    
Excite翻訳で翻訳すると、
"機能は局所変数のアドレスを返します。"
となりました。
msg() 中で確保された領域のアドレスですので、
msg を抜けた時点で、その領域は開放され、
他で再利用される可能性大ですので、使わない方が懸命です。


111ポイント を手に入れた。

Name: 大工  ..初心者(5,713ポイント)   Date: 2007/02/05(月) 20:32   No:4274     
Title: Re:スタティックライブラリでのワーニング。    

#include <stdio.h>

int mul(int a){
return a * a;
}

上記のソースでコンパイルした場合質問にあるようなワーニングは出なかったんですが違いは何なんですか?
アドレスを返しているという点なんでしょうか??


115ポイント を手に入れた。

Name: 大工  ..初心者(5,805ポイント)   Date: 2007/02/05(月) 20:34   No:4276     
Title: Re:スタティックライブラリでのワーニング。    
このコメントは削除して下さい。

返信ミスです


92ポイント を手に入れた。

Name: GPGA  ..上級者(18,520ポイント)   Date: 2007/02/05(月) 20:35   No:4277     
Title: Re:スタティックライブラリでのワーニング。    
>では下記のソースでコンパイルした場合質問にあるようなワーニングは出なかったんですが違いは何なんですか?
>アドレスを返しているという点なんでしょうか??
はい、その通りです。


10ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,727ポイント)   Date: 2007/02/05(月) 20:39   No:4278     
Title: Re:スタティックライブラリでのワーニング。    
> アドレスを返しているという点なんでしょうか??

どうしても配列mのアドレスを返したい場合は、
staticを付けて定義してください。


33ポイント を手に入れた。

Name: 大工  ..初心者(5,840ポイント)   Date: 2007/02/05(月) 20:42   No:4279 解決!     
Title: Re:スタティックライブラリでのワーニング。    
あぁ〜なるほど!!
開放されるんですね・・・・・

ありがとうございます

static ですか・・・今思えばそうですよね・・^^;


35ポイント を手に入れた。

Name: 大工  ..初心者(6,399ポイント)   Date: 2007/02/06(火) 00:39   No:4288     
Title: Re:スタティックライブラリでのワーニング。    
すみません・・・

実際コンパイルしてみたらまたワーニングが・・・・


#include <stdio.h>

char * _msg(){
static char _m[] = "This is an apple.";
return _m;
}


#include <stdio.h>

char * msg(){
static char m[] = "This is a test.\n";
return m;
}


#include <stdio.h>

int main (void){

char *p, *q;

p = msg();
q = _msg();

printf("p: %sq: %s\n", p, q);

return 0;
}

上から func1.c func2.c compe.c です。

cygwinでコンパイルしてみたところ
$ gcc compe.c text.lib -o file
compe.c: In function `main':
compe.c:7: warning: assignment makes pointer from integer without a cast
compe.c:8: warning: assignment makes pointer from integer without a cast
と表示されてしまいました。

func1.c func2.c compe.c を1つにまとめたtest.c をコンパイルするとワーニングもでず成功しました。

原因を教えて下さい。


469ポイント を手に入れた。

Name: 大工  ..初心者(6,445ポイント)   Date: 2007/02/06(火) 04:17   No:4295     
Title: Re:スタティックライブラリでのワーニング。    
extern char * _msg();
extern char * msg();

とプロトタイプ宣言をcompe.cにすればコンパイルできました。

別の場所で聞いてみてこの方法を教えてくれたんですが、『なぜ』という部分は教えて頂けませんでした。


どうしてプロトタイプ宣言が必要なんでしょうか?


10ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,899ポイント)   Date: 2007/02/06(火) 09:36   No:4297     
Title: Re:スタティックライブラリでのワーニング。    

> compe.c:7: warning: assignment makes pointer from integer without a cast
> compe.c:8: warning: assignment makes pointer from integer without a cast

compe.cにmsg()と_msg()のプロトタイプ宣言がない場合、
コンパイラはmsg()と_msg()の戻り値をint型とみなします。

msg()の戻り値をpに、_msg()の戻り値をqにそれぞれ代入する際、
int型をchar *型に代入しようとすることになります。
そこで、コンパイラは「左右両辺の型が異なる代入を行なおうとしていますが、
大丈夫ですか?」という意味の警告を出します。



142ポイント を手に入れた。

Name: 大工  ..初心者(6,481ポイント)   Date: 2007/02/06(火) 10:33   No:4299 解決!     
Title: Re:スタティックライブラリでのワーニング。    
戻り値がint型ですか・・・・

まったく知りませんでした・・・

ありがとうございました。


36ポイント を手に入れた。



Name: トント  ..かけだし(1,600ポイント)   Date: 2007/02/06(火) 01:19   No:4291       
Title: すみません。課題についてです    
大学の宿題で「キーボードから10個の文字列を入力させ、次に、検索する文字列を入力し、その文字列が先に入力した文字列にあるかどうか検索するプログラムを作成せよ。」という問題が出されたのですが、何度やっても同じ答えしか出てくれません(探索に失敗しました)。どこか不適切な点を教えてください。


正解の解答例                私の解答例
文字列1:Hello             文字列[0]:hello
文字列2:Apple             文字列[1]:apple
文字列3:dog              文字列[2]:dog
文字列4:cat              文字列[3]:cat
文字列5:house             文字列[4]:house
文字列6:drive             文字列[5]:drive
文字列7:year              文字列[6]:year
文字列8:child             文字列[7]:child
文字列9:animals            文字列[8]:animal
文字列10:name             文字列[9]:name

検索する文字列を入力してください:house 検索する文字列を入力してください:house

houseは5番目にあります。 探索に失敗しました。

プログラムは
#include <stdio.h>

#define NUMBER 10
#define FAILED -1
int search(int vc[],int key,int no)
{
int i=0;

vc[no]=key;

while(1){
if(vc[i]=key)
break;
i++;
}
return (i=no?FAILED:i);
}

int main(void)
{
int i,ky,idx;
int vx[NUMBER+1];

for(i=0;i<NUMBER;i++){
printf("文字列[%d]:",i);
scanf("%s",&vx[i]);
}
printf("検索する文字列を入力してください:");
scanf("%s",&ky);

idx=search(vx,ky,NUMBER);

if(idx=FAILED)
puts("\a探索に失敗しました。");
else
printf("%dは%d番目にあります。\n",ky,idx+1);
return (0);
}




557ポイント を手に入れた。


Name: box  ..熟練のプログラマー(44,757ポイント)   Date: 2007/02/06(火) 07:41   No:4296     
Title: Re:すみません。課題についてです    
とりあえず、if文とreturn文で等号を書いている箇所で、
等号の数が1個でいいかどうか調べてみてください。

それから、文字列を格納する変数がint型であることが
正しいかどうか、こちらもご確認ください。


30ポイント を手に入れた。



Name: fuguo  ..ぴよぴよ(272ポイント)   Date: 2007/02/04(日) 18:49   No:4246       
Title: こんにちはCについて質問があります    
入力した文字が数だけなら1
文字列が含まれていたら2
を返すプログラムを作りました。


//ここから//
#include<stdio.h>
#include<string.h>
#include<windows.h>
//入力するとこ//
int nrk(long *);

int main(void)
{
long motikin;
do{
printf("かずを入力してください。");
nrk(&motikin);
}while(1);
return 0;
}
//入力するとこ//
int nrk(long *kazu)
{
int i,l;
int co;
long ren;
char *kam;

*kazu=0;

gets(kam);

ren=strlen(kam);

for(i=0;i<ren;i++){
co=1;
for(l=0;l<ren-1-i;l++){
co*=10;
}
if(kam[i]-'0'<0||kam[i]-'0'>9){ 
return 2;
}
*kazu+=(kam[i]-'0')*co;
}
return 1;
}
//ここまで//

while文の1週目まではうまくいきます。2週目からは"数を入力してください。"が表示されません。
それに入力した文字が表示されます。
どなたかわかる方お願いします。



272ポイント を手に入れた。


Name: Hermit  ..ぴよぴよ(236ポイント)   Date: 2007/02/04(日) 22:11   No:4248     
Title: Re:こんにちはCについて質問があります    
とりあえず、
char *kam;
の部分は、ポインタしか確保されていないので、
どこかわからない領域に入力された文字列が確保されますので、
char kam[256];
などの様に、格納される領域を確保した書き方のほうがいいと思います。


81ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,248ポイント)   Date: 2007/02/04(日) 22:21   No:4249     
Title: Re:こんにちはCについて質問があります    

> nrk(&motikin);

nrk関数でmotikinの内容を変更していますが、
変更した内容を使っていません。
また、nrk関数の戻り値も使っていません。
そのあたりは、今後追加される予定ですか?



46ポイント を手に入れた。

Name: fuguo  ..かけだし(1,428ポイント)   Date: 2007/02/04(日) 23:23   No:4250     
Title: Re:こんにちはCについて質問があります    
boxさん はい、今後追加する予定です。

Hermitさん ありがとうございます!!配列にするとできました。
でもこのようにすることはできないんですかね?

#include <stdio.h>

int main() {
char *str = "YUKI \0 RENA \0 MIMI";
printf("%s\n%s\n%s" , str , str + 7 , str + 14);
return 0;
}

このようにしてみたら

#include<stdio.h>
#include<string.h>
//入力するとこ//
int nrk(long *);

int main(void)
{
long motikin;
do{
printf("かずを入力してください。");
nrk(&motikin);
}while(1);
return 0;
}
//入力するとこ//
int nrk(long *kazu)
{
int i,l;
int co;
long ren;
char *kam;

*kazu=0;

gets(kam);

ren=strlen(kam);

for(i=0;i<ren;i++){
co=1;
for(l=0;l<ren-1-i;l++){
co*=10;
}
if((kam+i)-'0'<0||(kam+i)-'0'>9){
return 2;
}
*kazu+=((kam+i)-'0')*co;
}
return 1;
}

こうなりました。ですが

警告 W8066 test.cpp 13: 実行されないコード(関数 main() )
エラー E2034 test.cpp 34: 'int' 型は 'char *' 型に変換できない(関数 nrk(long *) )
エラー E2087 test.cpp 37: ポインタの不正な使用(関数 nrk(long *) )
*** 2 errors in Compile ***

のようなエラーが出ます。
やはり無理でしょうか?




2倍のポイントを手に入れた! 1,156ポイント を手に入れた。

Name: バグ  ..プログラマー(26,699ポイント)   Date: 2007/02/05(月) 08:17   No:4261     
Title: Re:こんにちはCについて質問があります    
*kazu+=((kam+i)-'0')*co;

詳しくは見てないので、ざっと見ただけですが…この表記がまずそうですね。アドレスと実体がごちゃ混ぜになってます(;^_^A


2倍のポイントを手に入れた! 152ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,457ポイント)   Date: 2007/02/05(月) 09:47   No:4263     
Title: Re:こんにちはCについて質問があります    
(略)
> このようにしてみたら
(略)
> こうなりました。ですが

引用を省略した2つのコードの関係が全然わかりません。
1つ目のコードはmain関数だけから成る、2つ目のコードとは
無関係なものであるように見えます。
にもかかわらず、「こうしたらこうなった」と、
2つのコードに関係があるかのごとく書かれているのが理解できないです。


130ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(652ポイント)   Date: 2007/02/05(月) 11:58   No:4264     
Title: Re:こんにちはCについて質問があります    
逆に「どの辺りが問題だと思いますか?」と質問したら答えられるでしょうか。
恐らく問題が複雑に絡み合っている為、特定が難しくなっていると思います。

そこで、while内で入力したら表示させるだけのシンプルなプログラムを先に作りましょう。
※ヒント:while(!feof(stdin))
※gets()を使用していますが、用意したバッファサイズを超える文字列が入力された場合、
不正アドレスにアクセスする恐れがある為、fgets()やgetchar()を使用する等した方がいいと思います。

数値・文字判定は、ctype.hを調べるといいかもしれません。
※isalpha()等の引数はunsigned charかEOFとなっています。


285ポイント を手に入れた。

Name: Hermit  ..ぴよぴよ(255ポイント)   Date: 2007/02/05(月) 18:30   No:4269     
Title: Re:こんにちはCについて質問があります    
>でもこのようにすることはできないんですかね?
出来ます。が、前回の質問との関連はあまりなさそうですが・・・

>#include <stdio.h>
>int main() {
> char *str = "YUKI \0 RENA \0 MIMI";
ここの str は、プログラムコードの書き換え不能エリアにある
"YUKI \0 RENA \0 MIMI" の文字列の先頭位置のアドレスで、
str を初期化しています。

> printf("%s\n%s\n%s" , str , str + 7 , str + 14);
で、ここで、str の位置、str+7 番目の位置、str+14 番目の位置からの文字列を読み出しているだけで、
書き換えを行っていない為、問題ありません。
また、
printf("%s\n",str);
printf("%s\n"str+=7);
printf("%s\n"str+=7);
の様に、str 自体は変更可能です。

ここで、char *str ではなく、
char str[] = "YUKI \0 RENA \0 MIMI";
のように書いた場合の違いは、

ひとつに、
文字列が、書き換え可能エリアに確保されるという事。
だから、文字列の変更は可能です。
str[5] = '\t'; str[12] = '\t'; などしてみればわかるかな?

もうひとつが、
str 自体のアドレスは変更できないという事。
(str,str+7,str+14 のような書き方は出来ます。str 自体を変えていないので)

表示だけの場合は、見た目は同じですけど(^^;


19ポイント を手に入れた。

Name: ふぐお  ..かけだし(1,274ポイント)   Date: 2007/02/06(火) 00:22   No:4285 解決!     
Title: Re:こんにちはCについて質問があります    
皆さん、まことにありがとうございました。

バグさん ありがとうございます。

boxさん 僕の国語力がないばかりに、貴方をいやな思いにさせてすいませんでした。
僕が言いたかったのは printf("%s\n%s\n%s" , str , str + 7 , str + 14); のように          *kazu+=(kam[i]-'0')*co; も *kazu+=((kam+i)-'0')*co; できないかなーって思い質問させていただきました
説明不足で失礼しました。

むつサン 優しいヒントをありがとうございました。

Hermitさん いろいろ勉強になりました。ありがとうございました。



みなさんお礼に完成したプログラムで遊んでくれ

#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#include<string.h>
#include<conio.h>
#include<time.h>
#include<windows.h>

#define DAME if(hantei==2)printf("不正な文字を入力しないでください。\n\n\n");

void endk(void);
void kakehantei(int,long,long *);
void antei(int,long *);
void nyuryoku(int,long *);
int nrk(long *);
int ran(int,int);


long buf;
FILE *file;
int buf2[256];
int save;
long mend;

int main(void)
{
int ran1,ran2,saikoro,i;
int hantei;
char kekka[1];
char namev[256];
long motikin,kakekin=0
,choha=0;
file = fopen("save.dat","a+");
fread(&buf,sizeof(buf),1,file);
fclose(file);
if(buf==0){
printf("最高点なしじゃ!!\n\n");
}else{
printf("最高点%dじゃ!!",buf);
file = fopen("name.dat","a+");
fread(buf2,sizeof(buf2),1,file);
fclose(file);
for(i=0;i<256;i++){
namev[i]=buf2[i];
}
printf("%sチャンじゃ!!\n\n",namev);
}
Sleep(500);
printf("持ち金の設定を100にして、end 入力で終わると、\nセーブされます。");

nyuryoku(1,&motikin);
if(motikin==100)save=1;
while(1){
if(save==1)mend=motikin;
kakehantei(2,motikin,&kakekin);
antei(3,&choha);
printf("\n");
ran1=ran(1,6);
ran2=ran(1,6);
saikoro=(ran1+ran2)%2;
if(saikoro==1){
strcpy(kekka,"半");
}else{
strcpy(kekka,"丁");
}
printf("サイコロ1= %d\nサイコロ2 =%d\n合計 %d <%s>です。\n\n",ran1,ran2,ran1+ran2,kekka);
if(saikoro==choha){
motikin+=kakekin;
}else{
motikin-=kakekin;
if(motikin<=0){
Sleep(700);
printf("もうお金がありません。\nさよなら。");
Sleep(2000);
break;
}
}
printf("あなたの持ち金は%dです。\n\n",motikin);
}
return 0;
}


int nrk(long *kazu)
{
int i,l;
int co;
long ren;
char kam[256],end[]="end";
*kazu=0;
gets(kam);
if(strcmp(kam,end) == 0){
endk();
}

ren=strlen(kam);

for(i=0;i<ren;i++){
co=1;
for(l=0;l<ren-1-i;l++){
co*=10;
}
if(kam[i]-'0'<0||kam[i]-'0'>9){
return 2;
}
*kazu+=(kam[i]-'0')*co;
}
return 0;
}

void nyuryoku(int A,long *kazu)
{
int hantei;
do{
DAME;
switch(A){
case 1:
printf("持ち金を入力してください。-->");
break;
case 2:
printf("掛け金を入力してください。-->");
break;
case 3:
printf("\n丁=0,半=1 -->");
break;
}
hantei=nrk(kazu);
}while(hantei==2);
return;
}

int ran(int min,int max)
{
static int flag;

if (flag == 0) {
srand((unsigned int)time(NULL));
flag = 1;
}

return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}

void antei(int yu,long *kazu)
{
do{
nyuryoku(yu,kazu);
if(*kazu<0||1<*kazu){
printf("不正な文字を入力しないでください。\n\n");
}
}while(*kazu<0||1<*kazu);
return;
}

void kakehantei(int yu,long moti,long *kazu)
{
do{
if(moti<*kazu){
printf("そんなことあるか?");
}
nyuryoku(yu,kazu);
}while(moti<*kazu);
return;
}

void endk(void)
{
int ren,i;
int namex[256];
char name[256];

if(save==1){
file = fopen("save.dat","r");
fread(&buf,sizeof(buf),1,file);
fclose(file);
if(buf<mend){
file = fopen("save.dat","r+");
fwrite(&mend,sizeof(mend),1,file);
fclose(file);
printf("記録を更新しました!!\n名前をいれてね。");
gets(name);
ren=strlen(name);
for(i=0;i<=ren;i++){
namex[i]=name[i];
}
file = fopen("name.dat","w");
fwrite(namex,sizeof(namex),1,file);
fclose(file);
}
}
printf("さようならノシ");
Sleep(1300);
exit(0);
return;
}
 
 


1,274ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(543ポイント)   Date: 2007/02/06(火) 00:44   No:4289     
Title: Re:こんにちはCについて質問があります    
感想:お金がなくなるまで賭け続ける・・シビアなゲームだ。

31ポイント を手に入れた。



Name: たのもー  ..ぴよぴよ(130ポイント)   Date: 2007/02/05(月) 03:53   No:4259       
Title: 配列について    
こんばんは。お久しぶりです。
C言語を勉強していて分からないことが出てきましたので、
質問させていただきます。
char str[20] は文字(全角)が9文字しか打てないのはなぜですか?
char str[20] は、char str1〜str20 までの個数をまとめたものではないのですか?



Name: 大工  ..初心者(5,356ポイント)   Date: 2007/02/05(月) 04:13   No:4260     
Title: Re:配列について    
ASCIIはアメリカの標準の文字コードです。

ですから、日本語の場合ASCIIコードに日本語コードは含まれていなくて、日本語の漢字はchar型の1バイトでは表現できず2バイト以上を使用しています。なのでchar[20]では9文字(くらい)までなんではないでしょうか?

(このような文字をマルチバイト文字といいます。)


81ポイント を手に入れた。

Name: box  ..熟練のプログラマー(44,327ポイント)   Date: 2007/02/05(月) 09:32   No:4262     
Title: Re:配列について    
> char str[20] は文字(全角)が9文字しか打てないのはなぜですか?

str[0]〜str[19](str[1]〜str[20]じゃないですよ)の20バイトを
定義したとき、実際の文字列として有効なのは最大19バイトで、
文字列の最後には終端を示す'\0'が入ります。
最大19バイトの中には、2バイト文字は最大9文字入ります。


79ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(695ポイント)   Date: 2007/02/05(月) 12:20   No:4265     
Title: Re:配列について    
バイナリエディタというものを触ってみてはいかがでしょう。
文字コードShift_JISでは、「あ」を「82 A0」で表す事がわかると思います。


43ポイント を手に入れた。



Name: 大工  ..入門者(4,904ポイント)   Date: 2007/02/04(日) 11:38   No:4245       
Title: 共有ライブラリでのワーニング    
共有ライブラリを作成しようと思って -fPICオプションを付けてソースファイルをコンパイルしようとしたら

func1.c:1: warning: -fPIC ignored for target (all code is position independent)と表示されてしまいました。

原因は何なんでしょうか??


#include <stdio.h>

void func1 (void)
{
printf("func1\n");
}



134ポイント を手に入れた。


Name: 大工  ..初心者(5,267ポイント)   Date: 2007/02/05(月) 00:56   No:4255 解決!     
Title: Re:共有ライブラリでのエラー    
解決しました。

手持ちの本のコードがUNIXとかWindouws以外のもので書かれていたので混乱していました。

http://www.nslabs.jp/cygwin-dll.rhtml

上記のサイトで詳しく解説されています。

もしかしたら文字化けが発生するかもしれませんが重要なところはちゃんと日本語ですので、安心してください。


87ポイント を手に入れた。

Name: しっぽ  ..かけだし(2,041ポイント)   Date: 2007/02/05(月) 01:43   No:4256     
Title: Re:共有ライブラリでのエラー    
warning を「エラー」と表現しすのはまずいと思います。


21ポイント を手に入れた。

Name: 大工  ..初心者(5,275ポイント)   Date: 2007/02/05(月) 01:55   No:4258     
Title: Re:共有ライブラリでのエラー    
分かりました。

修正します


8ポイント を手に入れた。



Name: 大工  ..入門者(4,497ポイント)   Date: 2007/02/02(金) 12:04   No:4193       
Title: ポインタ〜その2    
こんにちは。

今日はちょっとした疑問を持ってきました。

#include <stdio.h>
#include <stdlib.h>

typedef struct node_tag{
int value;
struct node_tag *next;
}node_t;

void check(node_t *);
node_t * insert_node(node_t *, int );

int main (void){

node_t node1, node2, node3;
node_t fake;
node_t *head = &node1;

fake.value = -1;
fake.next = &node1;

node1.value = 1; node1.next = &node2;
node2.value = 2; node2.next = &node3;
node3.value = 3; node3.next = NULL;

insert_node(&fake, 5);

check(fake.next);

return 0;
}
void check(node_t * com){

node_t * fake;
fake = com;

do{
printf("test: %d\n", fake->value);
fake = fake->next;
}while(fake != NULL);

}
node_t * insert_node(node_t *n, int val){

node_t *new_node;

new_node = (node_t *)malloc(sizeof(node_t));

if(new_node == NULL){
fprintf(stderr, "メモリ確保失敗.");
return NULL;
}

new_node->value = val;
new_node->next = n->next;
n->next = new_node;

return new_node;
}

リストについてなんですが・・・自分で作ってみてダミーノードをfakeとして挿入してみました。
このダミーノードの実装は正解なんでしょうか??意味的に間違っていたらご指摘お願いします。
あと、insert_node関数なんですが、return new_nodeとしてもmain関数内で戻り値を受け取ってません。
でも実行可能なのはなぜなんでしょうか??もしかしたら、プログラム上で必要なければ受け取らなくてもいいんでしょうか??(または、returnを書かなくても ← void関数で使わないのは分かります)

ご協力お願いします。



379ポイント を手に入れた。


Name: GPGA  ..上級者(18,294ポイント)   Date: 2007/02/02(金) 12:28   No:4194     
Title: Re:ポインタ〜その2    
プログラムソースは<pre></pre>を使って
投稿しましょう。(<>は半角で入力)

> 今日はちょっとした疑問を持ってきました。
疑問の内容について書かれていませんが、何が疑問なのでしょう?


61ポイント を手に入れた。

Name: 大工  ..入門者(4,524ポイント)   Date: 2007/02/02(金) 12:44   No:4195     
Title: Re:ポインタ〜その2    
すみません投稿しなおしました。

疑問も足しました。

よろしくお願いします


27ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,889ポイント)   Date: 2007/02/02(金) 12:55   No:4197     
Title: Re:ポインタ〜その2    

> あと、insert_node関数なんですが、return new_nodeとしてもmain関数内で戻り値を受け取ってません。

> insert_node(&fake, 5);

書かれたとおり、insert_node関数の戻り値を使っていないです。

node = insert_node(&fake, 5);

と書けば、insert_node関数の戻り値を変数nodeに代入していることになります。



24ポイント を手に入れた。

Name: GPGA  ..上級者(18,382ポイント)   Date: 2007/02/02(金) 13:05   No:4198     
Title: Re:ポインタ〜その2    
> すみません投稿しなおしました。
> 疑問も足しました。
この手の修正の場合、最初に投稿したレスを編集して直すのではなく
新しいレスとして、下に追加するようにしましょう。

最初のレスを編集してしまうと、2番目に私が言っている内容と
そぐわなくなってしまうため、後からこのスレッドを見た人の混乱の元になります。


88ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,997ポイント)   Date: 2007/02/02(金) 13:10   No:4199     
Title: Re:ポインタ〜その2    

> node1.value = 1; node1.next = &node2;
> node2.value = 2; node2.next = &node3;
> node3.value = 3; node3.next = NULL;

せっかくinsert_node関数を作ったのに、ほとんど機能していませんね。

node1〜node3に相当する領域の割り当てやvalueメンバーへの値のセット、
他ノードとのポインタの接続なんかを行なうための関数がinsert_nodeです。

上に引用した内容は、本来insert_node関数の仕事であるべきです。



108ポイント を手に入れた。

Name: 大工  ..入門者(4,571ポイント)   Date: 2007/02/02(金) 13:18   No:4200     
Title: Re:ポインタ〜その2    
box>戻り値がなくても関数は成り立つんですね??


ダミーノードについてお尋ねしているんですが??


47ポイント を手に入れた。

Name: box  ..熟練のプログラマー(43,041ポイント)   Date: 2007/02/02(金) 13:31   No:4202     
Title: Re:ポインタ〜その2    
> ダミーノードについてお尋ねしているんですが??

ダミーノードを設けてリストを組み立てることは、
何ら問題ありません。よくあるパターンです。

今回のコードが正しいかどうかとは別の話です。


44ポイント を手に入れた。

Name: 大工  ..入門者(4,579ポイント)   Date: 2007/02/02(金) 13:34   No:4203     
Title: Re:ポインタ〜その2    
では、私のソースではダミーノードが実現できていないということでしょうか???

2倍のポイントを手に入れた! 8ポイント を手に入れた。

Name: box  ..熟練のプログラマー(43,409ポイント)   Date: 2007/02/02(金) 14:18   No:4204     
Title: Re:ポインタ〜その2    

> では、私のソースではダミーノードが実現できていないということでしょうか???

実現できているかどうかといえばできていることになるかもしれませんが、
ポインタの張り替えをmain関数で行なっているあたりはあまり美しくないです。

サンプルコードを載せてみます。他にも、いろんな方法があると思いますけれど。
なお、free_nodeは後始末用の関数です。mallocで確保した領域を開放しています。

#include <stdio.h>
#include <stdlib.h>

typedef struct node_tag {
int value;
struct node_tag *next;
} node_t;

void insert_node(node_t *node, int val);
void check(node_t *node);
void free_node(node_t *node);

int main(void)
{
node_t head;

head.next = NULL;
insert_node(&head, 5);
insert_node(&head, 1);
insert_node(&head, 2);
insert_node(&head, 3);
check(&head);
free_node(&head);
return 0;
}

void insert_node(node_t *node, int val)
{
node_t *new_node;

new_node = (node_t *) malloc(sizeof(node_t));
if (new_node == NULL) {
fprintf(stderr, "out of memory\n");
exit(1);
}

new_node->value = val;
new_node->next = NULL;
for (; node->next; node = node->next)
;
node->next = new_node;
}

void check(node_t *node)
{
for (node = node->next; node; node = node->next)
printf("value=%d\n", node->value);
}

void free_node(node_t *node)
{
node_t *p;

for (p = node; node; p = node) {
node = node->next;
free(p);
}
}


368ポイント を手に入れた。

Name: GPGA  ..上級者(18,630ポイント)   Date: 2007/02/02(金) 14:20   No:4205     
Title: Re:ポインタ〜その2    
大工さんのコードがダミーノードを実現できているかいないか、と聞かれておりますが
ダミーノード以前にノードとして成り立っていないと思います。

本来ノードは、動的確保することにより可変でのデータ追加ができ
動的確保されているからこそ、一括の解放が可能となっています。
ですので、最初の時点で

node_t node1, node2, node3;
node_t fake;
 
このように、インスタンス化してしまっている時点で、プログラムとして
よろしくありません。

まずはダミーノードのことを考えず、普通のノードの追加や削除から勉強するのが良いと思います。
以下のサイトが参考になると思われるので記載しておきます。
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds03.html

その後ダミーノードについて勉強する場合は
以下のサイトが参考になると思われるので記載しておきます。(上のサイトの続きです。)
http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds04.html


248ポイント を手に入れた。

Name: box  ..熟練のプログラマー(43,355ポイント)   Date: 2007/02/02(金) 15:18   No:4206     
Title: Re:ポインタ〜その2    
> 以下のサイトが参考になると思われるので記載しておきます。

ご紹介くださった他にも、大いに参考になる内容がありました(ds02〜ds09)。
データ構造好きの人には、たまらない内容です。
さっそく、お気に入りに追加しました。


54ポイント を落としてしまった。

Name: 大工  ..入門者(4,604ポイント)   Date: 2007/02/02(金) 21:23   No:4215     
Title: Re:ポインタ〜その2    
皆さん、ありがとうございます。頑張って勉強します。

皆さんはどの位の年齢層なんでしょうか?


25ポイント を手に入れた。

Name: バグ  ..プログラマー(26,423ポイント)   Date: 2007/02/02(金) 21:45   No:4216     
Title: Re:ポインタ〜その2    
皆さんの年令って、私も気になってました(^-^)
ちなみに私は、C言語歴10ヵ月の28才です。


32ポイント を手に入れた。

Name: GPGA  ..上級者(18,510ポイント)   Date: 2007/02/02(金) 23:58   No:4217     
Title: Re:ポインタ〜その2    
3月で23才です。

言語歴
C:4年
C++:1.5年
C#:半年くらい
Java(CLDC & MIDP):2年

スクリプトまで入れると
HPS:3ヶ月(4年前に触れた)
PHP:3ヶ月

最近ですと、仕事はJava、趣味はC++でプログラムをやっています。


120ポイント を落としてしまった。

Name: keichan  ..中級者(12,944ポイント)   Date: 2007/02/03(土) 01:23   No:4218     
Title: Re:ポインタ〜その2    
今年の1月で24になりました。

C:5年
C++:3年
C#:数週間
C++/CLI:1日
C系列以外:0日

仕事では専らC++でやってます
あとはスクリプトを少々。。
スクリプト:3ds max(3d系セットアップアプリ)専用 1年


#仕事以外でプログラムしない人なので最近危機感を感じています


100ポイント を手に入れた。

Name: バグ  ..プログラマー(26,499ポイント)   Date: 2007/02/03(土) 02:56   No:4219     
Title: Re:ポインタ〜その2    
みなさん若いですね〜(@_@;)
あ、私も一応プログラム書く仕事をやってます。
仕事ではMFCを利用する事が多いです。趣味ではコンソールアプリばかりいじってますが(苦笑)


76ポイント を手に入れた。

Name: 大工  ..入門者(4,636ポイント)   Date: 2007/02/03(土) 03:22   No:4220     
Title: Re:ポインタ〜その2    
私の年齢は・・・・
ヒミツで(笑)

C言語をやり始めたこわっぱです


32ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(183,839ポイント)   Date: 2007/02/03(土) 15:21   No:4227     
Title: Re:ポインタ〜その2    
いつも書き込みが遅くなっています管理人です・・(_ _||)

え〜と、
C言語歴は・・いつを基準にしたらいいのか・・、
実質1年半です。
C++歴3日目です・・;

年齢は22です^^

皆さんお若いですね^^
GPGAさん私と1歳しか違わないし、keichanさんは、さらに1歳の違いなのに、スキルの差が歴然・・^^;
バグさんはC言語歴に対してスキルがすごすぎですよw

私は大学の2年まではホントにどうしようもないくらいプログラムの勉強が嫌いな学生だったので、
それこそ丸投げしてでも課題出したいような人間だったのですが^^;
3年の後期にある、刺激的な授業を受けてからプログラムが大好きになりました。
OpenGLでなんちゃって人工知能なロボットを作ったんですが、何かをプログラムで作る事ってこんなにも楽しい事だとは思いませんでした^^

3年の後期にして、関数の使い方や文字列と配列の操作の仕方もわからなかった私がOpenGLでロボットを作るのはホントに大変でしたが、
毎日毎日大学に残って(7人で作るロボットなのに1人で)深夜までいつも書いてると
かなり奥深い物が出来ました^^

それからライブラリを使って何か作る事に目覚め、DXライブラリを使い始めました☆

>私の年齢は・・・・
>ヒミツで(笑)

大工さん!自分で聞いといてそれはないですよw
以前40歳でC言語歴1週間って人もいらっしゃいましたよ^^
12才の人もいらっしゃいましたし。
普段は12才から40才までの年齢層で、普通に会話する事はなかなかないですが、こういう場では普通に話せてしまいますね^^


433ポイント を手に入れた。

Name: 大工  ..入門者(4,725ポイント)   Date: 2007/02/03(土) 17:54   No:4230     
Title: Re:ポインタ〜その2    
私の年齢は・・・・19歳です(・ω・)大学1回生ですね(笑)

C言語歴は大学の後期の長さで(ぇ


プログラミングの魅力は十人十色なとこかなぁ

将来は音声認識関連の分野です


89ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(184,409ポイント)   Date: 2007/02/03(土) 19:03   No:4233     
Title: Re:ポインタ〜その2    
あら、、年齢は「↑」なので控えてらっしゃるのかと思いましたが「↓」でしたか^^;

音声認識も楽しいですね☆
私は対話するロボットも作りましたが、楽しかったですよ♪

私のように3年の後期に目覚めなくてよかったですね(T_T

無駄な時間をすごしたと後悔でいっぱいです・・。何故大学にまできて遊びほうけていたんだろう・・(泣;


95ポイント を手に入れた。

Name: 大工  ..入門者(4,770ポイント)   Date: 2007/02/03(土) 20:34   No:4237     
Title: Re:ポインタ〜その2    
私は目覚めてるんだか目覚めてないんだか(笑)

初級 中級 上級 者の境目ってなんなんでしょうね?


45ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(184,603ポイント)   Date: 2007/02/03(土) 20:58   No:4238     
Title: Re:ポインタ〜その2    
う〜ん、何なんでしょうね^^;

初級=大学の課題が解けずに試行錯誤しているレベル

中級=大学の課題レベルは全て解け、あらゆる関数、ライブラリを使えるレベル

上級=専門にしているプロ

って感じでは・・。いや、その人それぞれによって違うでしょうね^^;


113ポイント を手に入れた。

Name: keichan  ..中級者(13,048ポイント)   Date: 2007/02/05(月) 00:34   No:4251     
Title: Re:ポインタ〜その2    
私の考えでは
初心者=何がわからないのか説明できない人
中級=自分で分からない事をピンポイントで説明できる人
上級=大抵の事は自分で調べて解決できる人

という認識です。

ある程度の知識と意欲があれば何も難しいことはないと思います。


104ポイント を手に入れた。

Name: 大工  ..初心者(5,180ポイント)   Date: 2007/02/05(月) 00:48   No:4254     
Title: Re:ポインタ〜その2    
keichan さんの考えに大賛成です。

今までの考え方は(大学に入ってから思ったことなんで)

初級 = 指定された教科書を読んでコンパイルをしてみて実行できた喜びを味わって楽しいと感じる段階

中級 = コンパイルエラーが出始めて、最初は先輩に聞いていてもだんだんと慣れてきてプログラムのバグを     一人で見つけられる段階
上級 = プログラムの構想をまず考えてからプログラムを書いてそこから改善点があれば改良を加えて、安定     したプログラムを書ける段階。

こんな感じです。(初級から離れれば離れるほど楽しくなくなる、という意味ではありませんので)


276ポイント を手に入れた。



Name: 紫石  ..ぴよぴよ(39ポイント)   Date: 2007/01/21(日) 21:50   No:3801       
Title: メイク後実行の際に    
はじめまして

C言語の勉強をしていて、偶然こちらのサイトを見つけゲームを作ってみようと思いゲームプログラミングの章の
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; // DXライブラリ初期化処理 エラーが起きたら終了


LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ;


WaitKey() ; // 結果を見るためにキー待ち(『WaitKey』を使用)
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}

これをメイクしたのですが、実行しても画面が真っ暗になり、30分ほど放置してみたのですが何も変化がありません。
表示されない場合の対処法として提示してあったプログラムを実行しても変化がありませんでした。
勿論、説明通りに設定し、起動したのですが再インストールしても何も変わらず、困り果ててしまった次第です。
管理人様が作成されたリソース解説?ソフトは普通に起動できたので、スペックの問題ではないと思うのですが、どういうことでしょうか。

ものすごく初歩的なことですか、ご教授の程よろしくお願いします。


39ポイント を手に入れた。


Name: P  ..かけだし(1,105ポイント)   Date: 2007/01/21(日) 22:16   No:3803     
Title: Re:メイク後実行の際に    
まだ超初心者な僕が偉そうに回答するのもなんなのですが

char.pngという画像はちゃんと保存できていますか?
また、保存する場所を間違っていないか確認してみてください。


44ポイント を手に入れた。

Name: 紫石  ..ぴよぴよ(320ポイント)   Date: 2007/01/22(月) 06:32   No:3815     
Title: Re:メイク後実行の際に    
char.pngは思いつく限りのフォルダに入れてみました。
それに、ゲームプログラミングの館にあった
#include "DxLib.h"
char st1[]="画像の保存場所が違うか、ファイル名が違うため、表示できません。";
char st2[]="正常に認識されています。";

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 ) return -1;


if(LoadGraphScreen( 0 , 0 , "char.PNG" , TRUE ) == -1)
DrawString(50,220,st1,GetColor(255,255,255));
else
DrawString(50,220,st2,GetColor(255,255,255));


WaitKey() ;
DxLib_End() ;
return 0 ;
}

このプログラムをメイク、実行してみても真っ黒のまま何も変化がありませんでした。


281ポイント を手に入れた。

Name: P  ..かけだし(1,356ポイント)   Date: 2007/01/23(火) 19:28   No:3861     
Title: Re:メイク後実行の際に    
検索してみましたが、なんかビットカラーの問題で何も表示されないことがあるそうです。
詳しいことはよくわかりません。

すいません、役にたたなくて。


69ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(172,587ポイント)   Date: 2007/01/25(木) 05:00   No:3913     
Title: Re:メイク後実行の際に    
回答が遅くなってしまい、すみません。
とてつもなく忙しかったもので・・。

Pさん、回答ありがとうございます。

えぇと、何でコンパイルされてらっしゃいますか?
VC++でしたらあの設定でいいですが、Borlandだと少々ややこしいです。

で、設定がきちんと出来ているとして。

画像の保存はきちんとなさっているようですのでそこは出来ているとします。

ウィンドウは正常に生成されますか?ポップアップウィンドウみたいな画面は表示されますか?

解決策のためのプログラムを実行なさったようですが、

画像が認識されていない場合でも

「画像の保存場所が違うか、ファイル名が違うため、表示できません。」

は少なくとも必ず表示されるはずです。これは内部のプログラムだけによって表示できるもので、

何のファイルもなくても表示されるものですので、

これ自体が表示されないのでしたらDXライブラリ自体の設定が出来ていないという事になります。

DXライブラリは

http://homepage2.nifty.com/natupaji/DxLib/

こちらが本家ですので、どうしてもこちらで解決せず、もしも技術的な問題などが生じているようでしたらこちらにお聞き下さい。



527ポイント を手に入れた。

Name: 紫石  ..ぴよぴよ(351ポイント)   Date: 2007/02/04(日) 19:13   No:4247     
Title: Re:メイク後実行の際に    
返信が遅れて申し訳ありません。ネット環境が使用不可能でした。

管理人様、 P ..入門者さん、アドバイスどうもありがとうございます。早速試してみます。


31ポイント を手に入れた。



Name: tower  ..ぴよぴよ(256ポイント)   Date: 2007/02/03(土) 13:45   No:4223       
Title: ブロック崩しのゲームプログラミングですが    
自分では分からないので、どうか教えてください。
このサイトで言うレベル2くらいのひよっこです。Visual Studio.NET2003を使ってます。
下の一行がエラー原因で

//拡大縮小行列をtmp_scalingに格納
D3DXMatrixScaling (&tmp_scaling , 2,2,2)

errorC2664:'D3DXMatrixScaling':1番目の引数を'int *_w64'から'D3DXMATRIX*'に変換できません。
というエラーが出ます。
現在、勉強中の身ですが、ピンポイントな解答でも構いません。
よろしくお願いします。


228ポイント を落としてしまった。


Name: バグ  ..プログラマー(26,617ポイント)   Date: 2007/02/03(土) 14:31   No:4225     
Title: Re:ブロック崩しのゲームプログラミングですが    
>>D3DXMatrixScaling (&tmp_scaling , 2,2,2)errorC2664:'D3DXMatrixScaling':1番目の引数を'int *_w64'から'D3DXMATRIX*'に変換できません。

このメッセージを見る限り、D3DXMatrixScaling関数の1番目の引数の型が違うみたいですね。

tmp_scalingという変数は、D3DXMATRIX型のポインタではないですよね?変数の型を確認してみるといいかもしれません。


118ポイント を手に入れた。

Name: tower  ..ぴよぴよ(232ポイント)   Date: 2007/02/03(土) 19:24   No:4235 解決!     
Title: 感謝します。    
D3DXMATRIXで定義したらやっと解決しました。
ありがとうございます(__)
また解決できない壁にぶつかったらよろしくお願いします。


24ポイント を落としてしまった。



Name: よっこ  ..ぴよぴよ(83ポイント)   Date: 2007/01/31(水) 21:54   No:4159       
Title: 無題    
大学の課題です・・
キーボードから“stop”と入力するまで繰り返し文字列を読み込みファイルに書き込んでゆくプログラムを作りたいんですが・・・教えてください。お願いします!!!!


83ポイント を手に入れた。


Name: 管理人  ..ハッカー(182,033ポイント)   Date: 2007/02/01(木) 00:30   No:4167     
Title: Re:無題    
え〜最近いつも携帯でしかネットにつながらないので不便です(汗

課題についてですが

@ファイルオープンの仕方
Aループと条件ブレイクの仕方
B入力の読み取りの仕方
Cファイルへの書き込みの仕方

がわかればわかるはずです。
どの辺でつまってますか?



88ポイント を手に入れた。

Name: おためし  ..ぴよぴよ(175ポイント)   Date: 2007/02/01(木) 18:36   No:4182     
Title: Re:無題    
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <iterator>
template<typename I, typename O, typename P>
O copy_stop(I b, I e, O d, P p) {
while (b!= e) {
if (!p(*b)) throw "stop";
*d++ = *b++;
}
return d;
}
bool p(const std::string& s) { return s != "stop"; }
int main() {
std::istream_iterator<std::string> b(std::cin), e;
std::ofstream f("word.txt");
std::ostream_iterator<std::string> o(f, "\n");
try{ copy_stop(b, e, o, p); } catch (...){}
return 0;
}


175ポイント を手に入れた。

Name: しっぽ  ..かけだし(1,161ポイント)   Date: 2007/02/02(金) 21:19   No:4214     
Title: Re:無題    
質問がアレなんで私もSTLで書こうかと一時は思いましたが、嫌味が
過ぎるので思いとどまりました。


EXE > RECORD.TXT とりダイレクトして使用してください。


#include<stdio.h>
#include<string.h>

int main(void){

char buff[8];
const char stop_keyword[] = "stop\n";

while(fgets(buff, sizeof(buff), stdin)){

if(strcmp(buff, stop_keyword) == 0) return 0;

printf(buff);
}

return 1;
}



204ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(184,490ポイント)   Date: 2007/02/03(土) 19:05   No:4234     
Title: Re:無題    
プログラムは解決されましたでしょうか?

課題を解くとき、解らない時は、少しずつ作ってみるといいですよ^^

まず、

ファイルオープンをするだけのプログラム

文字入力を受けるだけのプログラム・・・。

と。そして最後にくっつけると作りやすいですよ☆


81ポイント を手に入れた。



Name: きの(初心者)  ..ぴよぴよ(796ポイント)   Date: 2007/01/31(水) 20:54   No:4156       
Title: Timer関数に関連して質問です;VBをCに変換してます。    
C言語初心者です。どうか力を貸してください。
質問です。わかりやすく質問のところには◆マークがあります。

今、私はVisual Basicのコードで書かれたものをC言語に直してFPGAに実装することを目指しています。

そのコード内容には、10ms単位の細かいタイマーが必要です。
Visual Basicでは、それを可能にする細かいタイマー関数があるのですが、
◆C言語のtime()関数でも同様に可能なのでしょうか?

コード内容は、大雑把に言えば、5つある電磁弁を指定した割合で1秒を時間分割して、順々にそれぞれの開閉を制御するというものです。
電磁弁にはON/OFFの信号を送ることで開閉します。

わかりやすく例をあげて説明すると、電磁弁1、2、3、4、5を、
10% 15% 20% 15% 40%(合計は必ず100%)
の濃度ファイルで一秒を分割するとすると、

順に、
0.1s 0.15s 0.20s 0.15s 0.4s と一秒経過する中でそれぞれ順に電磁弁に送られる信号のスリープ時間が決まります。

◆C言語自体で無理ならば、FPGAにタイマーをハードウェアで作ってとりつけるしかないのでしょうか??

ここで、参考までに
Visual Basicのソースコードと、time()関数を使えると想定してC言語に書き換えたコードを載せておきます。
(一部を抜いているので関数や記号の宣言などが抜けてますがそこは気にしないでください)

ダメ出しでもなんでもかまわないので意見をお願いしますm(_ _)m

********Visual Basic*************
Dim TimeBeforeProcess As Long '処理を行う前の時間
Dim WaitingTime As Long '時間調整のためのプログラムの待ち時間

For i = 0 To intOdorCount - 1
If varConcentration(i) > 0 Then
TimeBeforeProcess = timeGetTime
     /*timeGetTimeは現時刻を意味する*/
/*varConcentrationは濃度(%)(時間の割合)を表す*/
For j = 0 To intOdorCount - 1
OutBitNo = j
OutBuf = IIf(j = i, 1, 0)
If DioOutBit(lngHDrv, OutBitNo, OutBuf) <> 0 Then GoTo dbErrHandler
Next

/*制御信号をデバイスに送信する*/
If Not SendCtrlSignal Then GoTo dbErrHandler

WaitingTime = CLng(varConcentration(i) * 10) -(timeGetTime - TimeBeforeProcess)
/*濃度1%につき10msなので10をかけている*/
  /*For文に入った時刻と現時刻との誤差を引いている*/
If WaitingTime > 0 Then Call Sleep(WaitingTime)
End If
Next


IOdorGeneration_GenerateOdor = True
Exit Function

dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function


********C言語*************
(C言語に直しきれてないところもあります。そこはご教授ください。)
time_t TimeBeforeProcess; //処理を行う前の時間;
time_t WaitingTime; //時間調整のためのプログラムの待ち時間;

for(i=0;i<=intOdorCount - 1;i++){
if(varConcentration(i) > 0){
time(&TimeBeforeProcess);
/*TimeBeforeProcessに現時刻を格納?*/
for(j=0;j<=intOdorCount - 1;j++){
OutBitNo = j;
if(j=i) OutBuf=1;
else OutBuf=0;

If(DioOutBit(lngHDrv, OutBitNo, OutBuf) != 0) GoTo dbErrHandler;
/*どういじればいいのか分かりません;*/
}

/*制御信号をデバイスに送信する:/
if(Not SendCtrlSignal)GoTo dbErrHandler;

WaitingTime = CLng(varConcentration(i) * 10) - _
(timeGetTime - TimeBeforeProcess);
if(WaitingTime > 0) Call Sleep(WaitingTime);

}
}


IOdorGeneration_GenerateOdor = True
Exit Function

dbErrHandler:
IOdorGeneration_GenerateOdor = False
End Function
*****************************

◆C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?

◆なにか意見があればお願いします(><)


796ポイント を手に入れた。


Name: しっぽ  ..ぴよぴよ(761ポイント)   Date: 2007/01/31(水) 22:18   No:4160     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
> C言語にはVBのtimeGetTimeのような現時刻を表す便利なものはないですか?

timeGetTime 自体は Win32API の関数だと思うのですが。
VBコードのどこかに
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
と記述してませんか?


46ポイント を手に入れた。

Name: バグ  ..プログラマー(26,147ポイント)   Date: 2007/01/31(水) 22:27   No:4161     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
このHPのダウンロードコーナーにあるカラードロップ2のソースコードであるTIMER.cppとTIMER.hを使えば1ミリ秒単位で時間を測る事が可能です。
少し改造すれば、1マイクロ秒単位に変更も可能です。


72ポイント を落としてしまった。

Name: きの(初心者)  ..ぴよぴよ(959ポイント)   Date: 2007/01/31(水) 23:19   No:4162     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
>しっぽさん
返信ありがとうございます。
検索かけましたが、
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
のような記述は見当たりませんでした;
VBもまだまだ未熟なので解読できてない部分があるのかもしれません。
もう一度全部に目を通してみます(>_<)

>バグさん
返信ありがとうございます。
TIMER.cppとTIMER.hはダウンロードしたのですが、これを具体的にどう使えばいいかわかりませんでした。。。
力不足です…。。。すいません(;_;)


163ポイント を手に入れた。

Name: バグ  ..プログラマー(26,262ポイント)   Date: 2007/01/31(水) 23:26   No:4163     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
あ、すみません…TIMER.cppを使うよりも簡単な方法があったのを忘れてました(;^_^A

それは、Sleep関数です。windows.hをインクルードすれば使用できます。

Sleep関数は1ミリ秒単位でウエイトを掛ける事が出来る関数です。ただし、この関数で指定した時間は何もできなくなってしまいますので、時間を測りつつ何かをしたい時には向きません(;^_^A


115ポイント を手に入れた。

Name: きの(初心者)  ..かけだし(1,047ポイント)   Date: 2007/01/31(水) 23:38   No:4164     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
なるほど☆

調べてみます!


…ところで、ここまで教えていただいてなんなんですが、

FPGAでやる場合は、外部のクロックICなどを期待できない、
回路で自分でカウントしてやる必要があるのでは?

との指摘を受けたのですが、どうなんでしょう。。。(;_;)


88ポイント を手に入れた。

Name: バグ  ..プログラマー(26,268ポイント)   Date: 2007/01/31(水) 23:48   No:4165     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
FPGAというのが分からないのですが、マイコンみたいなものですか?
Sleep関数も、TIMER.cppもPCのクロックカウントを利用して時間を測っているので、PCから独立したものでは使えないと思います…すみませんm(__)m


6ポイント を手に入れた。

Name: しっぽ  ..ぴよぴよ(877ポイント)   Date: 2007/02/01(木) 01:28   No:4170     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
To バグ-san

FPGA はプログラマブルなゲートアレイ(LSI)で、デジタル回路の動作をプログラム言語で記述して、
ライターで FPGA に書き込むのだったと思います。

----

To hit-san

Visual Basicのコードで書かれたものを、FPGAに実装することはできているのでしょうか?


116ポイント を手に入れた。

Name: きの(初心者)  ..かけだし(1,324ポイント)   Date: 2007/02/01(木) 09:52   No:4172     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
FPGAへの実装はC言語でないとできないようです。

FPGAに実装するカスタマイズ可能なCPUとして、今回Niosというソフトを使います。
Altera社のNiosのホームページにTimerのデータシートを見つけました!!
これを使えばいいのではないでしょうか?

これは、1秒をセットするタイマーですけど、10ms単位でタイマーを取得するにはどう書き換えればいいんでしょう。。。f(^_^;

#include "nios.h"

int main(void)
{
int t = 0;

// Set timer for 1 second
na_timer1 ->np_timerperiodl = (short)(nasys_clock_freq & 0x0000ffff);
na_timer1 ->np_timerperiodh = (short)((nasys_clock_freq >> 16) & 0x0000ffff);

// Set timer running, looping, no interrupts
na_timer1 ->np_timercontrol = np_timercontrol_start_mask + np_timercontrol_cont_mask;

//
while(1)
{
if(na_timer1 ->np_timerstatus & np_timerstatus_to_mask)
{
printf("A Second passed! (%d) \n",t++);

// Clear the to (timeout) bit
na_timer1 -> np_timerstatus = 0; // (any value)
}
}
}


277ポイント を手に入れた。

Name: しっぽ  ..ぴよぴよ(957ポイント)   Date: 2007/02/02(金) 21:07   No:4213     
Title: Re:Timer関数に関連して質問です;VBをCに変換してます。    
> FPGAへの実装はC言語でないとできないようです。

という事は、「VBをCに変換」なる前提はボロボロですね。
私は FPGA を使ったことはないし、また Altera社のライブラリを知りません
あまりにも特殊すぎて答えられません。アニュアルやドキュメントを読んで
自力で頑張ってください。


80ポイント を手に入れた。



Name: 管理人 [URL]  ..ハッカー(183,507ポイント)   Date: 2007/02/02(金) 16:35   No:4208       
Title: 質問者さんへのお願い    
最近他人をよそおって複数の名前を使用して投稿される方がいらっしゃいます。

複数の名前を使って、いろんな課題を質問する行為はどうか止めて下さい。

いくつも課題を質問するのが気が引けてしまうという理由で行っていらっしゃるのでしょうが、回答する立場としては、

質問者さんのスキルの把握・予測をまず行って回答をします。

ですので、回答してくださる人が質問者さんのスキルの把握が出来るように統一した名前で投稿してください。

また、以前に紹介した問題と類似していたら、重複して説明することも避けられると思います。

連続投稿したからといって、責める方はいらっしゃいませんので、安心してください。

私が公の場でその方の名前を発言する事はありませんが、どうかこの事は守ってください。

(回答してくださる人には特に名前の統一はお願いしません。)

また、最近質問者さんの質問文書で

「問題○○です。教えてください」

という物が多いように思います。

・問題の中でどこがわからないのか?

・自分はどこまでわかっているのか?

・自分のスキルはどの程度なのか?

・どこを教えてほしいのか?

を明確にしてください。

質問者・回答者の意思伝達・情報交換が円滑に進む良質な掲示板であるため、お願いします。

何かご意見などありましたら返信か、個人的な問題でしたらdixqhp@gmail.comまでお願いします。


484ポイント を手に入れた。


Name: バグ  ..プログラマー(26,391ポイント)   Date: 2007/02/02(金) 17:04   No:4211     
Title: Re:質問者さんへのお願い    
個人的な意見ですが…


『自己解決しました。』


とだけ書くよりは、自分の書いたソースを掲示して、『こういう風に解決しました』というのを示してくれれば、類似した質問の無闇な増殖を防げると思います(;^_^A


76ポイント を手に入れた。



Name: ももた  ..ぴよぴよ(183ポイント)   Date: 2007/01/31(水) 23:49   No:4166       
Title: ちょっとお尋ねします。。。    
winXPでC言語のフローチャート作成ソフトはないのでしょうか?

どなたか知ってる方がおられたらサイトのアドレスでも良いので教えて頂けないでしょうか?



41ポイント を手に入れた。


Name: 管理人  ..ハッカー(182,079ポイント)   Date: 2007/02/01(木) 00:33   No:4168     
Title: Re:ちょっとお尋ねします。。。    
私はフローチャートやUMLはいつもマイクロソフト製のvisioというソフトで書いてますけどシェアソフトです。
フリーでいいのがないか今ネットにつながる環境がないので調べられません。ごめんなさい、、。


46ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(463ポイント)   Date: 2007/02/01(木) 02:00   No:4171     
Title: Re:ちょっとお尋ねします。。。    
Cのソースからフローチャートが生成されるものではないですよね。

私の低スペックPCではvisioは動作が遅いのでコチラを使っています。
また、多数の出力形式に対応しています。

【Dia for Windows】
解説:ttp://oss.moongift.jp/review/i-1431.html

【dia-setup-0.96-pre3.zip】
ttp://sourceforge.net/project/showfiles.php?group_id=16768&package_id=12881&release_id=481004

以下のランタイムが必要です。
【gtk-runtime-2.10.8-rev-a.exe】
ttp://sourceforge.net/project/showfiles.php?group_id=235&package_id=119698&release_id=482730

上記をインストールしたら、環境変数PATHに
 例);d:\GTK2\bin;
を追加設定してください。
これで、Diaを起動した時に、ライブラリが無いというエラーが消えるはずです。


220ポイント を手に入れた。

Name: ももた  ..ぴよぴよ(235ポイント)   Date: 2007/02/02(金) 13:24   No:4201 解決!     
Title: Re:ちょっとお尋ねします。。。    
色々参考になりました! 色々皆さんから聞いたサイトなどを拝見し見てみます!

どうもありがとうございました!


52ポイント を手に入れた。



Name: 女郎花  ..かけだし(1,185ポイント)   Date: 2007/02/02(金) 04:38   No:4188       
Title: 無題    
1〜4999までの整数をローマ記法に変換するプログラムを作成し、 入力した整数を変換した結果を表示し0が入力されるまで変換し続けるプログラムを作りたいのですが(実行例:1024 ===> MXXIIII

#include<stdio.h>
int main (void)
{
iny i,j,n;
char roman[7]={'M','D','C','L','X','V','I'};
int num[7]={1000,500,100,50,10,5,1};
scanf("%d"<&n);
for(i=0;n;i++);
{
for(j=0;j<n/num[i];j++)
putchar(roman[i]);
n%=num[i]
}
return 0;
}

これでやってみると1回しか変換できなくて・・・解決策としてはwhile文を使うのですかね?お願いします。



178ポイント を手に入れた。


Name: バグ  ..プログラマー(26,315ポイント)   Date: 2007/02/02(金) 07:48   No:4189     
Title: Re:無題    
自分が思いつく方法があるのならば、全て試してみるのがいいですよ。
トライ&エラーが上達の近道です。頑張って!(^-^)
考え方は間違ってないです。


47ポイント を手に入れた。

Name: at  ..ぴよぴよ(136ポイント)   Date: 2007/02/02(金) 09:36   No:4190     
Title: Re:無題    
>iny i,j,n;

int??それとも定義済みですか?

>n%=num[i]

とりあえずセミコロンが必要な気がしますね・・・


55ポイント を手に入れた。

Name:  ..初心者(8,647ポイント)   Date: 2007/02/02(金) 10:07   No:4191     
Title: Re:無題    
#include <stdio.h>

int main(void)
{
int i, j, n;
char roman[7] = {'M','D','C','L','X','V','I'};
int num[7] = {1000,500,100,50,10,5,1};

  for(;;)
  {
printf("整数入力     => ");
scanf("%d", &n);

// 0入力時終了
if(n == 0)
   return 0;

printf("ローマ記法変換後 => ");
for(i = 0; n; i++)
{
for(j = 0; j < n / num[i]; j++)
  putchar(roman[i]);
  n %= num[i];
}
printf("\n\n");
  }

return 0;
}

これで、0を入力した時に終了しますよ。

>for(i=0;n;i++);
for文にはセミコロンは必要ないです。


175ポイント を手に入れた。

Name: 女郎花  ..かけだし(1,286ポイント)   Date: 2007/02/02(金) 10:59   No:4192 解決!     
Title: Re:無題    
>>バグさん
どうもです。
回答者になれるよう精進します。

>>atさん
う・・・intでした、すみません
ミス多すぎでした、ご指摘ありがとうございます。

>>☆さん
ありがとうございます。
for文にセミコロンとか素人丸出しですね、どうもでです。


101ポイント を手に入れた。



Name: トント  ..ぴよぴよ(142ポイント)   Date: 2007/01/29(月) 09:56   No:4080       
Title: 課題ができません    
すみません。学校の課題です。

   外部から西暦、月、日を順に入力後、何日後を求めるかを問い合わせます。
   そして、入力した日付からあとに入力した日数後の年月日を計算して出力します。
   また,今回は、閏年も考慮します。
    たとえば、
    西暦:1990
    月 :6
    日 :30
    何日後:45

    結果 → 1990 年6 月 30 日から 45 日後は、1990年8月14日です。

という問題が出題されましたが6月30日が入力された場合、45日後は6月75日です。次に、6月の末日を75日から

引くと7月45日になります。つづいて、45日はまだ7月の末日よりも大きいので、7月の末日から引くと8月14日

にする方法が分かりません。どなたか教えていただけませんか?

私の途中までのプログラムは

#include <stdio.h>

int IsUruYear(int year)
{
int ret=0;

if(((year%4)==0 && (year%100)!=0) || (year%400)==0){
ret=1;
}

return ret;
}

int get_lastday(int year,int mon)
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int d;

d=days[mon-1];
if(mon==2){
if(IsUruYear(year)){
d++;
}
}
return d;
}
int IsLastDay(int year,int mon,int day)
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int ret=0;
int lastday;

lastday=days[mon-1];

if(mon==2){
if(IsUruYear(year)){
lastday++;
}
}

if(day==lastday) ret=1;

return ret;
}
void after(int num,int i)
{
while(i>num){
printf("%d",++i);
num++;
         }
}

int main(void)
{
int year,day,mon,after;
int year1,day1,mon1;

printf("year:"); scanf("%d",&year);
printf("month:"); scanf("%d",&mon);
printf("day:"); scanf("%d",&day);
printf("after:"); scanf("%d",&after);

year1=year;
mon1=mon;
day1=day;
yestarday(&year,&mon,&day);
printf("何日後:%4d/%02d/%02d\n",year,mon,day);


return 0;
}
です。よろしくお願いします。


142ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,316ポイント)   Date: 2007/01/29(月) 10:42   No:4084     
Title: Re:課題ができません    
> int get_lastday(int year,int mon)
> int IsLastDay(int year,int mon,int day)

似たようなロジックを持つこれら2つの関数の本質的な違いは何ですか?

> yestarday(&year,&mon,&day);

この関数の実体がどこにもありません。
ところで、「昨日」を求めるのではないですよね?スペルも正しくないし…。

一度きちんと設計してからコードを書くことをおすすめします。


110ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(180,907ポイント)   Date: 2007/01/29(月) 16:00   No:4091     
Title: Re:課題ができません    
う〜ん、私も処理を追っかけてみましたけど、書きたいアルゴリズムがよくわかりません;
呼んでる関数は無いし、「何日後」を計算したいプログラムのはずなのに、afterは使われていないし、
関数名と変数名がかぶってるし。

もう少し流れを確認して、書きたいアルゴリズムを一緒に書いて投稿してもらえませんか?


144ポイント を手に入れた。

Name: トント  ..ぴよぴよ(993ポイント)   Date: 2007/01/29(月) 20:36   No:4098     
Title: Re:課題ができません    
↓のプログラムは上に書いたプログラムの続きです。これは昔出された似たような問題で、入力した日の次の日を出力するようにされたものです。このプログラムを参考にして変えてみました。しかしこれを「何日後」という形で出力できません。dayにafterの値をうまく入れる方法を教えていただけませんか。


#include <stdio.h>

int IsUruYear(int year)
{
int ret=0;

if(((year%4)==0 && (year%100)!=0) || (year%400)==0){
ret=1;
}

return ret;
}

int get_lastday(int year,int mon)
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int d;

d=days[mon-1];
if(mon==2){
if(IsUruYear(year)){
d++;
}
}
return d;
}
int IsLastDay(int year,int mon,int day)
{
int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
int ret=0;
int lastday;

lastday=days[mon-1];

if(mon==2){
if(IsUruYear(year)){
lastday++;
}
}

if(day==lastday) ret=1;

return ret;
}





void tommorow(int *year,int *mon,int *day)
{
if(IsLastDay(*year,*mon,*day)){
if(*mon==12){
*mon=1;
(*year)++;
}
else{
(*mon)++;
}
*day=1;
}
else{
(*day)++;
}
}
void sum(int day2,int after2,int *sum)
{
*sum=day2+after2;
}


int main(void)
{
int year,day,mon,after;
int year1,day1,mon1,after1;
int wa=0;
int day2=0,after2=0;

printf("year:"); scanf("%d",&year);
printf("month:"); scanf("%d",&mon);
printf("day:"); scanf("%d",&day);
printf("after:"); scanf("%d",&after);
sum(day2,after2,&wa);


year1=year;
mon1=mon;
day1=day;
after1=after;

tommorow(&year1,&mon1,&day1);
printf("何日後:%4d/%02d/%02d\n",year1,mon1,day1,wa);

return 0;
}


851ポイント を手に入れた。

Name: Justy  ..熟練のプログラマー(54,180ポイント)   Date: 2007/01/29(月) 23:45   No:4099     
Title: Re:課題ができません    
しかしこれを「何日後」という形で出力できません
 効率が悪くてもいいのなら、X日後は「次の日」を求める処理をX回繰り返せばいいのでは?


70ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(103ポイント)   Date: 2007/01/30(火) 00:56   No:4100     
Title: Re:課題ができません    
■日数換算関数 int -> long
static int []=各月の3/1からの通算日数(1月と2月は前年の13月、14月とする)
何月か?
return Fairfield公式

■main
scanf
printf("%ld\n", 日数換算関数(y,m,d) - 日数換算関数(y, m, d))

うまくすると、mainと日数換算関数1個で実現できます。


101ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(181,627ポイント)   Date: 2007/01/30(火) 08:58   No:4102     
Title: Re:課題ができません    
作ってみましたけど、もっとスマートになりますよ。わかりやすく書いても20行ちょっとでかけました。
1日ずつ計算する処理だと簡単ですよ。

関数は
mainとafter_dayとでも名づけた2つの関数でよく
after_day(&year,&mon,&day,after);
で呼びましょう。
受け取った関数側では

while(after>0){

として、ループさせ、day++、after--しましょう。1日ずつ計算し、
その月のあるべき日数を超える、例えば、1月の32日になってしまったら次の月にして、日を1に戻す。
そこで同時にうるう年の判定もする。
13月になったら1月にして年を増やす。
そうやっていけば、処理の時間はかかれど(実際一瞬ですが)、簡単に実装できると思います。



233ポイント を手に入れた。

Name: トント  ..かけだし(1,043ポイント)   Date: 2007/02/01(木) 22:42   No:4185 解決!     
Title: Re:課題ができません    
返事遅れてすみませんでした。
プログラムは何とかできました。
どうもありがとうございました!


2倍のポイントを手に入れた! 50ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(182,570ポイント)   Date: 2007/02/01(木) 23:00   No:4186     
Title: Re:課題ができません    
(パソコンがネットにつながらないという状況がどんなに不便なものか・・、

(ネットに依存している状況がうかがえる今日この頃です・・;



解決されましたか、よかったです^^

一応参考にソースを紹介します。

#include <stdio.h> 


void afterday(int *year, int *mon, int *day, int after){
int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
while(after>0){
(*day)++;
after--;
if(!(*mon==2 && *day==29 && *year%4==0) && *day>month_day[*mon-1]){
(*mon)++;
if(*mon==13){
*mon=1;
(*year)++;
}
*day=1;
}
}
return;
}

int main(void){
int year,day,mon,after;
printf("年 月 日 日後\n");
scanf("%d %d %d %d",&year,&mon,&day,&after);
afterday(&year,&mon,&day,after);
printf("%d日後:%d/%d/%d\n",after,year,mon,day);
return 0;
}


413ポイント を手に入れた。



Name: 大工  ..入門者(3,912ポイント)   Date: 2007/02/01(木) 15:37   No:4176       
Title: ポインタです    
いつもお世話になっております。


またやトラブルが・・・


#include <stdio.h>

char *msg = "This is an apple.";

void exchange(char *);

int main(void){

char *mm = "This is a test.";
char *p = msg;

printf("%s\n", p);//This is an apple.
p = mm;
printf("%s\n", p);//This is a test.

exchange(p);

printf("%s\n", p);//This is an apple.になっているはず.

return 0;
}
void exchange(char *q){

q = msg;

}



関数(exchange(char *))内でmsgのアドレスをqに代入してmain関数内で"This is an apple."
と表示したいのですが結果が

This is an apple.
This is a test.
This is a test.

と表示されてしまいます.

原因はいったいなんなんでしょう??


56ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,805ポイント)   Date: 2007/02/01(木) 15:43   No:4177     
Title: Re:ポインタです    
> 原因はいったいなんなんでしょう??

現状では雲をつかむような話で、誰にも何もわかりません。
さて、どうしてかというと…。

ソースコードの提示がないからです。
ご理解いただけるでしょうか。


29ポイント を落としてしまった。

Name: 大工  ..入門者(3,933ポイント)   Date: 2007/02/01(木) 17:13   No:4178     
Title: Re:ポインタです    
失礼しました。

ソースコード載せます


21ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,865ポイント)   Date: 2007/02/01(木) 17:24   No:4179     
Title: Re:ポインタです    

> void exchange(char *q){
>
> q = msg;

書き換えたqの内容が、呼び出し元に反映されていません。
呼び出し元では
exchange(&p);
のように、pのアドレスを渡してください。
そして、exchange関数は

void exchange(char **q)
{
*q = msg;
}

としてください。

それから、お使いの環境によっては、msgとmmの定義を
ポインタではなく配列にしておかないと
プログラムが異常終了するかもしれません。
偶然にも似ている話題がありましたので、
参考になるかもしれません。
(参考URL)http://okwave.jp/qa2714684.html


60ポイント を手に入れた。

Name: 大工  ..入門者(4,103ポイント)   Date: 2007/02/01(木) 17:36   No:4180     
Title: Re:ポインタです    
exchange(p); ではpのアドレスを渡していることにはならないのでしょうか??

#include <stdio.h>

char msg[] = "This is an apple.";

void exchange(char *);

int main(void){

char mm[] = "This is a test.";
char *p = msg;


printf("%s\n", p);//This is an apple.
p = mm;
printf("%s\n", p);//This is a test.

exchange(p);

printf("%s\n", p);

return 0;
}
void exchange(char *q){

q[0] = 't';

}
では This is a test. this is a test. が変換していますし、ポインタのポインタを使っているのもなぞです。





170ポイント を手に入れた。

Name: keichan  ..中級者(12,844ポイント)   Date: 2007/02/01(木) 18:06   No:4181     
Title: Re:ポインタです    
>exchange(p); ではpのアドレスを渡していることにはならないのでしょうか??


/***********************************/
/*** case 1 ***/
/***********************************/
#include <stdio.h>

void foo_int(int a)
{
printf("%d", a);
a++;
}

int main()
{
int i = 10;
foo_int(i);
printf("%d", i);
return 0;
}

/***********************************/
/*** case 2 ***/
/***********************************/
#inclue <stdio.h>

void foo_intp(int* a)
{
printf("%p", a);
a++;
}

int main()
{
int i;
int* p = &i;
foo_intp(p);
printf("%p", p);
return 0;
}


さて、case1とcase2の実行結果はどうなるでしょうか?


400ポイント を手に入れた。

Name: 大工  ..入門者(4,118ポイント)   Date: 2007/02/01(木) 19:09   No:4183     
Title: Re:ポインタです    
自己解決しました。お騒がせしました

15ポイント を手に入れた。



Name: kazu  ..かけだし(2,312ポイント)   Date: 2007/01/27(土) 05:00   No:4005       
Title: ルーレットについて    
失礼します。わからない事があるので質問させていただきます。
以前にも同じような内容で投稿したのですが、あれから色々といじったので
新スレで投稿する事にしました。すいませんm(__)m
ルーレットの処理についてです。

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include "dossys.h"
char_far gvram;      /*画面*/
char_far r_pbmp;      /*ルーレットビットマップ*/
char_far bb;        /*バックバッファ*/
char_far kazubmp;     /*スコアビットマップ*/
int endflg=0;

/*スコア表示関数*/
void draw_number(int x,int y,int kazu)
{
    int s,i=100,cnt=0;
     for(cnt=0;cnt<3;cnt++){
       s=kazu/i;
       dg_box(bb,x+29*cnt,y,29,21,1,RGB(0,0,0));
       dg_drawbmp3(bb,x+29*cnt,y,29,21,kazubmp,s*29,0,RGB(224,224,128));
       kazu=kazu%i;
       i/=10;
     }
     return;
}

/*前準備*/
void init(void)
{
    srand(time(0));
    kazubmp=dg_loadbmp("数.bmp");      /*スコアビットマップロード*/
    r_pbmp=dg_loadbmp("rulet.bmp");     /*ルーレットビットマップロード*/
    bb=dg_createBB();
    return;
}

/*キー処理&ルーレット回る関数*/
int ki(void)
{
    int key,k,r,j;
    static int i=0;    /*一度だけiを0に*/
    if(kbhit()){
        key=getch();
        if(key==0){key=getch();}
        if(key=='e'){endflg=1;}
    }
     r=rand()%7;        /*0~6の乱数を求めてrに格納*/
     if(i>=8){i=0;}       /*iが8以上で0に戻す*/
     dg_drawbmp3(bb,0,100,100,100,r_pbmp,i*100,0,RGB(224,0,128));/*i番目の数を表示*/

     if(key=='d'){
       k=r+i;         /*dを押した時のiの数とrの値をkに格納*/
       if(k>8){
         k=k%8;       /*kが8以上なら0〜の値に変更*/
       }
       if(k==0){
         k=8;
       }
       j=i+1;         /*i+1の数をjに格納*/
       if(j>8){
         j%=8;        /*jが8以上なら0〜の値に変更*/
       }

     do{
        wait(50000000);
        dg_drawbmp3(bb,0,100,100,100,r_pbmp,j*100,0,RGB(224,0,128));  /*j番目の数を表示*/
        j++;
     }while(j<k);         /*jがkの大きさを越えるまで繰り返す*/

     draw_number(0,0,k+1);     /*kを表示*/
     return i+1;
     getch();
    }
    i++;
    return i;
}

/*後始末*/
void end(void)
{
    getch();
    dg_deletebmp(r_pbmp);
    dg_deletebmp(kazubmp);
    dg_deleteBB(bb);
}

/*メイン関数*/
main()
{
    int i,cnt=0,key,x=124,y=68;
    int rnd;
    srand(time(0));
    init();
    do{
       rnd=ki();
       draw_number(0,21,rnd);  /*iを表示*/
       dg_flip(gvram,bb);
       wait(8000000);
       ML();
    }while(!endflg);
       end();
}


少々わかりにくいかもしれませんが・・・
i番目のルーレットが順に表示され、8まで表示されたらまた1に戻り、
'd'のキーを押すとそこで一時的に処理(i)を止め、
計算で求めた数字=k番目までルーレットをゆっくり進め、
kが表示されたらそこで止まる。
・・・というプログラムにしたいのですが、
この処理では無理なようで・・・

どなたか理解できる方、アドバイスをお願いしますm(__)m


1,391ポイント を手に入れた。


Name: バグ  ..上級者(24,156ポイント)   Date: 2007/01/27(土) 17:38   No:4033     
Title: Re:ルーレットについて    
とりあえず、環境が分からないので、私のところの環境で動く簡単な物を作ってみました。ビットマップ表示はできていませんので、DrawRoulette関数の中身を書き換えてみて下さい。
参考になればよいのですが…(^_^;)
ちなみに開発環境はBCCです。


#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <windows.h>

void DrawRoulette( int );
int StopRoulette( int );

int main()
{
// 前準備
srand( ( unsigned )time( NULL ) );

// 変数準備
int i , nCount , nKey , nRnd;

nCount = rand() % 9;

while( 1 )
{
while( !kbhit() )
{
nCount = ( nCount + 1 ) % 9;
DrawRoulette( nCount );
Sleep( 50 );
}

nKey = getch();

if( nKey == 'd' || nKey == 'D' )
{
nCount = StopRoulette( nCount );
break;
}
}

printf( "\nルーレットの数値は%dです\n" , nCount );
return( 0 );
}

// ルーレットの数字を表示
void DrawRoulette( int nCount )
{
switch( nCount )
{
case 0:
printf( "0\r" );
break;

case 1:
printf( "1\r" );
break;

case 2:
printf( "2\r" );
break;

case 3:
printf( "3\r" );
break;

case 4:
printf( "4\r" );
break;

case 5:
printf( "5\r" );
break;

case 6:
printf( "6\r" );
break;

case 7:
printf( "7\r" );
break;

case 8:
printf( "8\r" );
break;

default:
break;
}
}

/* ルーレットを止める処理 */
int StopRoulette( int nCount )
{
int i , nOffset;

/* ボタンを押した後のルーレットが動く回数を決める。5〜 25回 */
nOffset = rand() % 21 + 5;

for( i = 0 ; i < nOffset ; i++ )
{
/* Waitを段々と大きくしていって、ルーレットの動きを徐々にゆっくりにする */
Sleep( 50 + i * 50 );
nCount = ( nCount + 1 ) % 9;
DrawRoulette( nCount );
}

/* 最終的なルーレットの数値を返す */
return( nCount );
}


649ポイント を手に入れた。

Name: kazu  ..かけだし(2,401ポイント)   Date: 2007/01/28(日) 20:31   No:4061     
Title: Re:ルーレットについて    
>バグさん

解答ありがとうございます。
プログラムをよく読むと、main関数内のiとnRndは
使用されていませんね。実際必要ないようですが・・
こちら側で参考にして、色々といじってみようと思います。

まだわからない事があるかもしれませんが、
その時はまたよろしくお願いしますm(__)m


89ポイント を手に入れた。

Name: バグ  ..プログラマー(25,701ポイント)   Date: 2007/01/28(日) 20:58   No:4062     
Title: Re:ルーレットについて    
>>プログラムをよく読むと、main関数内のiとnRndは使用されていませんね。

うわ、本当ですね(;^_^A
消し忘れみたいです。消しておいてください。失礼しましたm(__)m


50ポイント を手に入れた。

Name: kazu  ..かけだし(2,470ポイント)   Date: 2007/01/31(水) 20:22   No:4155 解決!     
Title: Re:ルーレットについて    
>バグさん

いえいえ。気にしないでください(^^)
おかげでルーレットも完成させることができました。
わかりやすいプログラム&助言ありがとうございましたm(__)m


69ポイント を手に入れた。



Name: sign  ..かけだし(1,303ポイント)   Date: 2007/01/30(火) 22:39   No:4133       
Title: 変数などの「記号」について    
くだらないことなのですが、変数などで使われる ptr はどういう意味なのでしょうか?
ptr は何の略記?なのでしょうか。

また、プログラミングで変数などを用いる場合に、一般的に使われる"記号"について、
どんな場合にどんな記号が適切?なのかについてご意見や参考になるウェブページなど教えていただけると幸いです。

たとえば、通常、ループには i が使われますが、「なぜ i なのか」といったことについて教えていただきたいです。
ループの変数が複数必要になった場合、i 以外には何を使うべき(どういう考えで変数を"選ぶ")かなどです…。
※ 「i1 i2 i3」や、「i j k」など考えられますが…。

一概には言えないかもしれませんが、ループに限らず一般的に用いられる変数(配列の添え字など)について、何かご意見いただければ幸いです。


250ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,569ポイント)   Date: 2007/01/30(火) 22:57   No:4136     
Title: Re:変数などの「記号」について    
> ptr は何の略記?なのでしょうか。

PoinTeR の省略形でありましょう。

> たとえば、通常、ループには i が使われますが、「なぜ i なのか」といったことについて教えていただきたいです。

Fortranという言語では、変数名の先頭がi, j, k, l, m, nのいずれかで始まる場合、
デフォルトでは整数型です。このあたりの内容が、C言語で制御変数がint型である
ループを構成する際にも慣習的に使われているのではないかと思います。あくまで私見です。

> 一概には言えないかもしれませんが、ループに限らず一般的に用いられる変数(配列の添え字など)について、何かご意見いただければ幸いです。

添字用の変数やループ制御用の変数に、あまり長い名前は付けないです。個人的には。
for (loop_counter = 0; loop_counter < 10; loop_counter++)
とか
coord[this_is_x_direction]
なんて、入力するのが煩わしいことこの上ないです。


114ポイント を手に入れた。

Name: ま〜く  ..ぴよぴよ(980ポイント)   Date: 2007/01/31(水) 00:52   No:4138     
Title: Re:変数などの「記号」について    
>添字用の変数やループ制御用の変数に、あまり長い名前は付けないです。個人的には。
>for (loop_counter = 0; loop_counter < 10; loop_counter++)
>とか
>coord[this_is_x_direction]
>なんて、入力するのが煩わしいことこの上ないです。

ぼくもです^^;
単純なループでしたら i, j, k くらいでしょうか。
それ以上ネストする場合はロジック自体の見直しをした方がいいと思うので。

あとはポインターを使ってループする時は p, q とかですかね。。
(構造体へのポインターとかはその構造体の頭文字使ったり 適当なことしてますが^^;)

STLとか使うと iterator でループするので、やっぱり i か it 見たいな感じですね。



2倍のポイントを手に入れた! 372ポイント を手に入れた。

Name: keichan  ..中級者(12,298ポイント)   Date: 2007/01/31(水) 09:41   No:4143     
Title: Re:変数などの「記号」について    
私は多少煩わしくても見て何を意味している変数なのかを書くようにしています。
ループカウンタであろうと i や j を使用することはありません。

保守の事を考えると"変数名"に意味のない名前を与えてしまうと混乱の元になりますので。


104ポイント を手に入れた。

Name: バグ  ..プログラマー(26,219ポイント)   Date: 2007/01/31(水) 10:14   No:4146     
Title: Re:変数などの「記号」について    
私の場合ループカウンター限定で、i、j、k、m、n辺りの1文字変数を利用します。l(エル)は数字の1と間違う可能性があるので使いません。

他の変数名に関しては、整数型はnを、浮動小数点型にはwを、char型にはchを、bool型にはbを、構造体にはsを、クラスにはcを頭に付けたりしてます。

これは、他人が自分のソースを見た時に少しでも分かりやすくする為だったりします。他人のソース解読ってのは、面倒ですからね〜(;´Д`)


183ポイント を手に入れた。

Name: Yuki  ..入門者(4,435ポイント)   Date: 2007/01/31(水) 11:20   No:4147     
Title: Re:変数などの「記号」について    
ハンガリアン記法、ハンガリアン命名規約とやらが存在するそうです。
変数名を見ただけで、用途だけでなく型も区別できるようにしているみたいです。
#詳細はここには載せきれないので調べてください。

自分はデバック的に使うならi、j、k等も使用しますが、最終的なソースには1文字、あるいは2文字等短い変数名は使いません。
何のカウンタに使うか等分かりやすいように命名します。(例:iItemCnt)
変数名が短いと、後で置換したいときに他のソースと干渉してしまいます。


2倍のポイントを手に入れた! 322ポイント を手に入れた。

Name: sign  ..かけだし(1,408ポイント)   Date: 2007/01/31(水) 18:37   No:4153     
Title: Re:変数などの「記号」について    
皆様ありがとうございます。

何の意味なのかを示せるような変数名を考慮するのですね。
これに関しても場合によりますが参考にさせていただきます。

l 小文字のエルの利用についても少し気になっておりました。
可読性などを考慮して、その場で判断していきたいと思います。

ハンガリアン記法の内容、実際の利用価値について調べさせていただきました。
紹介ありがとうございます。

変数名の抽出(置換)を考慮した変数名ですね。



皆様のご回答、参考になりました。
ありがとうございます。


105ポイント を手に入れた。



Name: at  ..ぴよぴよ(13ポイント)   Date: 2007/01/30(火) 22:43   No:4134       
Title: WNDCLASSでの質問・・・    
WNDCLASSでウインドウ作ってます・・・
ところが、ウインドウのアイコンがデフォルトのままどうしても変更できないです・・・
どなたかご助言をお願いします・・・m(_ _)m


13ポイント を手に入れた。


Name: ま〜く  ..ぴよぴよ(608ポイント)   Date: 2007/01/31(水) 00:45   No:4137     
Title: Re:WNDCLASSでの質問・・・    
WNDCLASS構造体のメンバhIconにアイコンのハンドルを入れてあげると変わりますよ^^


41ポイント を落としてしまった。

Name: at  ..ぴよぴよ(46ポイント)   Date: 2007/01/31(水) 08:21   No:4140     
Title: Re:WNDCLASSでの質問・・・    
ま〜くさんありがとうございます。
やってみましたが、どうもアイコンのハンドルがどういう値なのかよく分かりません。
取得する方法はありますか?


33ポイント を手に入れた。

Name: at  ..ぴよぴよ(81ポイント)   Date: 2007/01/31(水) 08:55   No:4141 解決!     
Title: Re:WNDCLASSでの質問・・・    
ちょっと調べたらLoadIcon();という項目に行き着いて自己解決しました(^^;)
ま〜くさん、ご回答ありがとうございました!


35ポイント を手に入れた。

Name: ま〜く  ..ぴよぴよ(996ポイント)   Date: 2007/01/31(水) 14:11   No:4150     
Title: Re:WNDCLASSでの質問・・・    
うまくいってよかったですね^^

16ポイント を手に入れた。



Name: よし☆かわ  ..ぴよぴよ(500ポイント)   Date: 2007/01/30(火) 21:07   No:4127       
Title: おたすけ    
100 '***********************************
110 ' 計算プログラム
120 '平均・分散・標準偏差・相関係数
150 '************************************


160 #include <stdio.h>
170 #include <math.h>
180
190 VOID MAIN()
200 {
210 FILE *fp,*fp2,*fp3;
220 int a,k;
230 double x[512],sum=0,average,s=0,dispersion,hensa,r=0,Ra,F=0,Rk[300];
240 char infile [30],outfile[30],outfile2[30];
250
260 '*ファイル名*
270 printf("計算するファイル名は??\n");
280 scanf("%s",infile);
290
300 '*ファイルを開く*
310
320 if(!(fp=fopen(infile<"r"))){
330 printf("ファイルを開く事ができません\n");
340 return ;
350 }
360
370 '*数値をファイルから読み込む*
380 a=1;
390 while(fscanf(fp,"%1f",&x[a])!=EOF){
400 a++;
410
420 }
430
440
450 fclose(fp);
460
470
480 for(a=; a<512; a++){
490 x[a]=x[a]*0.01
500 print("%f\n",x[a]);
510 }
520 '*平均*
530 for(a = 1;a < 512; a++)
540 sum += x[a];
550
560
570 average = sum / 512;
580
590 '*変動・分散・標準偏差*
600 for(a = 1; a < 512; a++)
610 s +=pow((x[a] - average), 2.0);
620
630
640 dispersion = s / (512-1);
650
660 hennsa = sqrt(dispersion);
670
680 '*中心平均粗さ*
690 for(a = 1; a < 512; a++)
700 r += sqrt (pow((x[a] - average),2.0));
710
720
730 Ra = r / 512;
740
750
760 '*相関係数*
770 for(k = 0; k < 200;k++){
780 for(a = 1; a < 512 - k ; a++){
790 F += (x[a+k] - average)*(x[a] - average);
800 Rk[k] = (F/(512-k))/(s/512);
810
820
830 }
840 F=0;
850 }
860
870 '*結果表示*
880 printf ("平均値 = %f\n",average);
890 printf ("変 動 = %f\n",s);
900 printf ("分 散 = %f\n",dispersion);
910 printf ("標準偏差 = %f\n",hennsa);
920 printf ("中心平均粗さ = %f\n",Ra);
930 for(k=0;k<200;k++){
940 printf ("相関係数(k=%d) = %f\n",k,Rk[k]);
950 }
960
970 '/*データ出力ファイル名*/
980 printf("データ出力するファイル名は?\n");
990 scanf("%s",outfile);
1000
1010 '/*ファイルへ出力*/
1020 if(!(fp2 = fopen(outfile,"w"))) {
1030 printf("ファイルをオープンできません\n");
1040 return ;
1050 }
106このプログラムを渡されたのですがファイルの入力の仕方が分かりません
だれかおたすけください


500ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,452ポイント)   Date: 2007/01/30(火) 21:35   No:4129     
Title: Re:おたすけ    
複数の掲示板からの回答を管理するのは大変でしょう。
いずれかに一本化しませんか?


43ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(177ポイント)   Date: 2007/01/30(火) 21:45   No:4130     
Title: Re:おたすけ    
実行時のパラメータの記述方法とか、データファイルの用意の仕方という事でしょうか?

27ポイント を手に入れた。

Name: asd  ..ぴよぴよ(76ポイント)   Date: 2007/01/31(水) 10:01   No:4144     
Title: Re:おたすけ    
#むつさんの投稿が質問者からのものだと勘違いして変なレスをつけてしまいました。
#申し訳ありませんです。

boxさんが仰っているのは同じ内容の質問スレッドを他の掲示板と並行して立てると、
情報共有ができず片方の掲示板で解決したのに他方の掲示板では解決したのを知らずに
ずっと未解決のまま放置されてしまうと言うことだと思います。

ちなみにこの掲示板の規約でも禁止されています。
http://dixq.net/board/board.html
>禁止行為
>・全く同じ質問をあらゆるサイトにコピーペーストして質問(マルチポスト)しないこと。

以下の掲示板と並行して進めるのはいかがかと思いますので、

・こちらで続けるか向こうで続けるかを決める
・使わないほうの掲示板へは続行する掲示板への誘導をする
・問題が解決したらマルチポストした全ての掲示板にどの様に解決したか報告する

を実践されてはいかがでしょうか。

マルチポスト先
http://www.shunzei.com/cgibin/lounge/kirifuda/wforum.cgi?mode=allread&no=351&page=0


76ポイント を手に入れた。

Name: keichan  ..中級者(12,359ポイント)   Date: 2007/01/31(水) 10:14   No:4145     
Title: Re:おたすけ    
回答者の多くは複数の掲示板を巡回しています。
どこか一箇所で質問されるのと複数の箇所で質問されるのとで回答速度に余り違いはないと思います。
(むしろ複数の箇所で質問された方がレスポンスが悪いかも)


61ポイント を手に入れた。

Name: よし☆かわ  ..ぴよぴよ(594ポイント)   Date: 2007/01/31(水) 12:22   No:4148     
Title: おたすけ    
失礼しました。他のスレに載せた物はすべて削除しました。
そのためこちらでご教授よろしくお願いします。

プログラムでわからないのは
1まず、このプログラムで間違えはありませんか?
2ファイル名のの入出力をどこに入れるか?
です。よろしくお願いします。


94ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,338ポイント)   Date: 2007/01/31(水) 12:57   No:4149     
Title: Re:おたすけ    
> 1まず、このプログラムで間違えはありませんか?

間違いがあるかないかを調べる手っ取り早い方法は、
コンパイルできる環境が近くにあればそこでコンパイルしてみることです。

コンパイル時にエラーが出れば、ソースコードに間違いのあることがわかります。

コンパイル時にエラーが出なければ、とりあえず実行ファイルは正しく作れます。
ただし、思ったとおりに動くかどうかは、まだわかりません。
どんなプログラムでも、一度でうまく動くことはそうありません。
そこで、デバッグという作業を行ない、うまく動かない箇所を修正することとなります。


231ポイント を落としてしまった。



Name: 浅香  ..ぴよぴよ(158ポイント)   Date: 2007/01/30(火) 18:35   No:4123       
Title: 月日入力/結果表示    
2006年1月1日は日曜日である。月と日を入力すると、この日をもとに曜日を出力するプログラムを作成せよ。月日の入力は「/」で区切ることにする。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
【出力例】
日付を入力してください(MM/DD):12/24
12月24日は日曜日です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
この問題についてなんですが配列を使うとは思うんですがどのようにすれば配列で○月○日は○曜日と出せれるようになるのかがわかりません
どなたかお願いします


158ポイント を手に入れた。


Name: バグ  ..プログラマー(26,019ポイント)   Date: 2007/01/30(火) 18:46   No:4124     
Title: Re:月日入力/結果表示    
文字列入力用のバッファとしては配列も必要かもしれませんが…曜日を求める為に必要かと問われたら、必要無いように思います(;^_^A

8ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,383ポイント)   Date: 2007/01/30(火) 20:39   No:4125     
Title: Re:月日入力/結果表示    
> 2006年1月1日は日曜日である。月と日を入力すると、この日をもとに曜日を出力するプログラムを作成せよ。

2006年(去年)限定版のプログラムなのですか?
こういう種類のプログラムでは、毎月の日数を管理する配列を定義するのが定石です。

去年は平年でしたので、例えば
int mdays[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
のようにしておけばよいと思います。

入力した月と日をもとに、1月1日からの通算日数を計算します。
例えば、2月3日は34日目です。
つまり、1月1日の33日後ですので、4週間(=28日)と5日後です。
よって、2月3日の曜日は、日曜日の5日後、つまり金曜日です。


50ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(150ポイント)   Date: 2007/01/30(火) 21:05   No:4126     
Title: Re:月日入力/結果表示    
もし、汎用的なプログラムをお望みなら、
先人の知恵(公式)を利用するのも一つの方法です。
プログラムの信頼性が増したり、熟練者との会話が円滑に進みます。


47ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,409ポイント)   Date: 2007/01/30(火) 21:14   No:4128     
Title: Re:月日入力/結果表示    
> 先人の知恵(公式)を利用するのも一つの方法です。

あ、そうですね。
「Zellerの公式」あたりを調べてみるとよいかもしれません。>浅香さん


26ポイント を手に入れた。

Name: バグ  ..プログラマー(26,036ポイント)   Date: 2007/01/31(水) 08:59   No:4142     
Title: Re:月日入力/結果表示    
標準関数のmktimeを利用すれば簡単なのでは?(?_?)

17ポイント を手に入れた。



Name: C初心者  ..ぴよぴよ(717ポイント)   Date: 2007/01/30(火) 21:46   No:4131       
Title: 無題    
課題でクイックソートのフローを作成しないとダメなのですが、全然できません。
どなたかよろしければ教えてください。
一様、クイックソートの意味は理解出来ています。

よろしくお願いします。


97ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,455ポイント)   Date: 2007/01/30(火) 22:07   No:4132     
Title: Re:無題    
最初からきれいなフローを書こうと思わずに、
意味を理解できているところから箇条書きやラフな図あたりを
書いてみたらどうでしょう。

# 「一応(いちおう)」っていうのが、正しい日本語です。


3ポイント を手に入れた。

Name: むつ  ..ぴよぴよ(243ポイント)   Date: 2007/01/30(火) 22:47   No:4135     
Title: Re:無題    
どのような図を習ったのでしょうか?
・フロ−チャート
・PAD図
クイックソートの場合、判定や交換が頻繁に繰り返されるので、
PAD図の方が向いているのかなと思いますが。


66ポイント を手に入れた。

Name: 管理人  ..ハッカー(181,945ポイント)   Date: 2007/01/31(水) 01:58   No:4139     
Title: Re:無題    
当HPでクイックソート解説アプリを配布していますけどそれを使っていただけたら処理の流れがわかると思います。

5ポイント を手に入れた。



Name: ワタナベ  ..ぴよぴよ(39ポイント)   Date: 2007/01/30(火) 17:42   No:4121       
Title: 構造体の課題    
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int err,cnt,ave=0,val;
FILE *fp;
char filename[FILENAME_MAX];

printf("Input filename:");
scanf("%s",filename);
printf("Prefecture Pop. Out. Ave.\n");
printf("--------------------------------------\n");

if((fp=fopen(filename,"r"))==NULL){
printf("error:fopen");
exit(EXIT_FAILURE);
}

while( fgets(filename, FILENAME_MAX, fp) != NULL ){
printf("%s",filename);
cnt++;
}

if((err=fclose(fp))==EOF){
printf("error:fclose");
exit(EXIT_FAILURE);
}

return 0;
}
構造体を使って、県名、人口、出荷額、一人当たりの出荷額を表示するプログラムを作りたいんです。構造体を使用するにはどう変えれば良いですか?
読み込みに使うファイルはpref_output.txtで内容は

                 Toukyou 2879 65523 22.76
Osaka 1951 62860 32.22
Senndai 1528 49505 32.40
Hakata 726 10034 13.17
Sapporo 613 10255 16.73


39ポイント を手に入れた。


Name: keichan  ..中級者(12,194ポイント)   Date: 2007/01/30(火) 17:50   No:4122     
Title: Re:構造体の課題    
まずは構造体を定義してみてください。

12ポイント を手に入れた。



Name: 大工  ..入門者(3,826ポイント)   Date: 2007/01/30(火) 14:06   No:4111       
Title: 無題    
お久しぶりです。


ダイクストラ法の時は大変お世話になりました.


今回は関数へのポインタです.

#include <stdio.h>
#include <string.h>

int main(void)
{
char *(*p_strcpy)(char *, char *);
char s1[10];
char s2[] = "copy";

p_strcpy = strcpy;
p_strcpy(s1, s2);

printf("%s\n", s1);

return 0;
}

test.c: In function `main':
test.c:10: warning: assignment from incompatible pointer type


と表示されこのプログラムは教科書通りに書いているのですが・・・・どう対処していいかワカリマセン・・


ご協力お願いします.

あと、自作関数を使って関数へのポインタは理解できたんですが
char *(*func) (void); と言ったchar型へのポインタを返す関数へのポインタといったポインタのポインタ(表現は不適切かも知れませんが)ではどういったことが行われているのでしょうか?(どういった働きをするのか)



323ポイント を手に入れた。


Name: box  ..熟練のプログラマー(42,296ポイント)   Date: 2007/01/30(火) 14:20   No:4112     
Title: Re:無題    

> char *(*p_strcpy)(char *, char *);

第2引数をconst char *にすればよいと思います。


お願いが2つあります。
1)新規投稿の際、内容に即した適切なタイトルを付けてください。
例:「関数へのポインタについて」

2)ソースコードを貼り付ける際、
<pre>
ソース本体
</pre>
のように前後をタグ(不等号は半角)ではさんでください。



20ポイント を落としてしまった。

Name: keichan  ..中級者(12,101ポイント)   Date: 2007/01/30(火) 15:10   No:4116     
Title: Re:無題    
>test.c:10: warning: assignment from incompatible pointer type
コンパチでない(暗黙に変換できない)ポインタの型に変換しようとして怒られています。

対処法はboxさんが仰られている方法で解決するはずです。

>char *(*func) (void); と言ったchar型へのポインタを返す関数へのポインタといったポインタのポインタ(表現は不適切かも知れませんが)ではどういったことが行われているのでしょうか?(どういった働きをするのか)
これは
char *(*p_strcpy)(char *, char *);
と同じです。(引数が違うだけ)

「char* 型の戻り値を持ち、引数がchar* 型2つを取る『関数ポインタ型』変数p_strcpy」→ char* (*p_strcpy)(char*, char*)
「char* 型の戻り値を持ち、引数を取らない『関数ポインタ型』変数func」→ char* (*func)(void)
上記違いがわかりますか?
また、戻り値・引数の個数・タイプ共に同じものでなければ関数ポインタ型変数に格納することはできません。
ですので本件の warning が発生しているわけです。


352ポイント を手に入れた。

Name: 大工  ..入門者(3,856ポイント)   Date: 2007/01/30(火) 15:19   No:4118     
Title: Re:無題    
分かりました!!!!


ご協力ありがとうございます


30ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,333ポイント)   Date: 2007/01/30(火) 15:25   No:4120     
Title: Re:無題    
> なぜconstなんでしょう?

strcpyの第2引数はコピー元の文字列を指しています。
「strcpyのロジックではコピー元の文字列の内容を変更していませんよ」
という意味をこめてconstが付いています。


37ポイント を手に入れた。



Name: ヒロ  ..かけだし(1,307ポイント)   Date: 2007/01/30(火) 12:11   No:4103       
Title: 標準入力関数の事を教えてください    
毎日質問ばっかりですみません。
gets関数のような標準入力関数で、
一定時間入力が無ければ入力待ちを解除して先に進む様な関数ありませんか?
それか無限ループ中に入力があれば抜けるような関数が必要なんですが・・・


63ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(181,853ポイント)   Date: 2007/01/30(火) 12:40   No:4106     
Title: Re:標準入力関数の事を教えてください    
リアルタイムに入力状態を監視したいのなら
処理系に依存したものを使うしか無いと思います。
MS-DOS なら getch関数です。(後のは知りません;)
getch関数でしたら
http://www.matx.org/REFS/node84.htm

この辺に参考になるサイトがあります。

しかしgetcharにしてもgetchにしても文字が入力されるまで入力待ち状態になってしまう事は避けられないので、リアルタイム入力は出来ません。
したがってこの関数だけでは時間による分岐が出来ないので
kbhitと一緒に使ってみてはどうでしょう。
この関数は入力があるかを調べる関数で、入力があったときに1を返すものです。
したがって、この関数を呼んだ返り値が1の時、getchを呼んでやればいいのではないでしょうか

while(1){
  if (kbhit()){
    c = getch();
    //cを使って処理分岐
  }
  if(規定時間以上か?)
    break;
}

こんな感じに出来るように思います。(やったことないので、想像ですが^^;)

こちらも参考に
http://www.matx.org/REFS/node109.htm


226ポイント を手に入れた。

Name: バグ  ..プログラマー(25,951ポイント)   Date: 2007/01/30(火) 12:40   No:4107     
Title: Re:標準入力関数の事を教えてください    
標準入力関数かどうかはわかりませんが、kbhit関数が使えるのではないでしょうか?
kbhit関数はキーボードの入力があった時には1を、そうでない場合は0を返す関数です。

時間を見るのは自作タイマーを作ってみてはいかがでしょう?
例えば、計測開始時間から指定した時間を過ぎたら1、時間内であれば0を返す関数とか…
仮にこの関数をMesTime()とでも名付けると…


int nKey;

while( !MesTime() )
{
if( !kbhit() )
{
continue;
}
else
{
nKey = getch();
break;
}
}



こんな感じでしょうか?


250ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(181,872ポイント)   Date: 2007/01/30(火) 12:42   No:4108     
Title: Re:標準入力関数の事を教えてください    
バグさんの方がキレイですね^^;

19ポイント を手に入れた。

Name: バグ  ..プログラマー(26,011ポイント)   Date: 2007/01/30(火) 12:43   No:4109     
Title: Re:標準入力関数の事を教えてください    
うわ、管理人さんと思いっきり被ってしまいましたね(笑)

ちなみにWindowsのコンソールアプリならば、私が作成したカラードロップ2のMAIN.cppとTIMER.cpp辺りを見てもらえれば、参考になるかもしれません…環境依存しまくりですが(苦笑)


60ポイント を手に入れた。

Name: ヒロ  ..かけだし(1,471ポイント)   Date: 2007/01/30(火) 13:46   No:4110     
Title: Re:標準入力関数の事を教えてください    
管理人さん、バグさんありがとうございました!

このプログラムをLinux上で動かさなくてはならなくて・・・
kbhit関数と同じような機能でLinuxで動く関数はありませんか?
ANSIとの互換性のある関数じゃなきゃ使えないようなんですが・・・

何度もすみません!

ちなみに管理人さんのコードも素人の私からみたら綺麗にまとめられてますよ☆


164ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(181,940ポイント)   Date: 2007/01/30(火) 14:59   No:4113     
Title: Re:標準入力関数の事を教えてください    
Linuxではやったことないのでわかりませんが

http://72.14.235.104/search?q=cache:eGlHqdmPktsJ:www.st.rim.or.jp/~phinloda/cqa/cqa9.html+C%E8%A8%80%E8%AA%9E%E3%80%80%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0%E3%80%80%E5%85%A5%E5%8A%9B&hl=ja&gl=jp&ct=clnk&cd=1

この辺参考にならないでしょうか?


68ポイント を手に入れた。

Name: keichan  ..中級者(11,749ポイント)   Date: 2007/01/30(火) 14:59   No:4114     
Title: Re:標準入力関数の事を教えてください    
>一定時間入力が無ければ入力待ちを解除して先に進む様な関数ありませんか?
C標準ライブラリにはご期待に添えるような関数はございません。

"kbhit linux"でググったらどんぴしゃな回答がありましたよ。
http://willow.mech.hirosaki-u.ac.jp/Howto/kbhit/kbhit.html
最低限ご自分で調べられる事は調べてから質問していただけるとありがたいです。


166ポイント を手に入れた。

Name: ヒロ  ..かけだし(1,397ポイント)   Date: 2007/01/30(火) 15:05   No:4115     
Title: Re:標準入力関数の事を教えてください    
keichanさんありがとうございました。

一応ググったんですけど・・・このサイトは出てこなかったです(^^;)
助かりました!ありがとうございました!

ちなみにこうゆうのはどのエンジンで検索すればいいんですかね?


74ポイント を落としてしまった。

Name: keichan  ..中級者(12,182ポイント)   Date: 2007/01/30(火) 15:12   No:4117     
Title: Re:標準入力関数の事を教えてください    
>ちなみにこうゆうのはどのエンジンで検索すればいいんですかね?
私は google でしか検索をしません。
google で発見できなければ、書籍に頼りに行きます。


81ポイント を手に入れた。

Name: ヒロ  ..かけだし(1,430ポイント)   Date: 2007/01/30(火) 15:19   No:4119 解決!     
Title: Re:標準入力関数の事を教えてください    
なるほど。
自分はyahooで検索していたせいかもしれませんね・・・
本当にありがとうございました!


33ポイント を手に入れた。



Name: さっさ  ..ぴよぴよ(81ポイント)   Date: 2007/01/26(金) 22:27   No:3997       
Title: 積分    
課題でいろいろな積分方法で面積を求めるのプログラムを作っています。
左端点則での面積を求めるプログラムを作ったのですがうまく実行できません・・・

#include<stdio.h>
#include<math.h>
#define N 100
#define xa 0.0
#define xb 1.0


double f(double);


struct XY
{
double x;
double y;
};


int main(void)
{
int i;
double S=0.0,dx,x;
dx=(xb-xa)/N;
for(i=1;i<2*N;i++)
{
S+=f(x)*dx;
x+=dx;
}
printf("I= %f\n", S);
}

double f(double x)
{
double y;
y=x*x;
return(y);
}

また、右端点則、中点則、台形則、もわかりません・・
助けてください!!


81ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(176,971ポイント)   Date: 2007/01/27(土) 03:35   No:4003     
Title: Re:積分    
単に細かく長方形を区切る方法なら簡単ですよ。

こちら、y=--x^2+25のyの正の領域を求めるプログラムです。

#include<stdio.h> 

int main(){
double x,S=0;
for(x=-5.0;x<=5.0;x+=0.01)
S+=(-x*x+25)*0.01;
return 0;
}


68ポイント を手に入れた。

Name: さっさ  ..ぴよぴよ(120ポイント)   Date: 2007/01/27(土) 22:03   No:4041     
Title: Re:積分    
課題では右端点則、中点則、台形則、左端点則のそれぞれの求め方で、
誤差を比較しなくてはいけないんです・・・


39ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(178,386ポイント)   Date: 2007/01/28(日) 01:45   No:4047     
Title: Re:積分    
↑クリックで画像拡大↑


えぇと、台形則は名前からしてだいたい想像つくんですけど、

左端点則、中点則、右端点則は、順番に画像のような考え方でいいのでしょうか?

今は、今いる地点から右に0.01ずらして長方形を作っていますから、それを左にずらすとか・・。

いやそれでは同じ計算結果になってしまう・・。

その法則の考え方を教えてもらえませんか?


139ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(178,553ポイント)   Date: 2007/01/28(日) 01:48   No:4048     
Title: Re:積分    
では、はっきりわかっている台形則から。

台形の求め方はわかりますよね?

(上底+下底) * 高さ /2

これを普通にたしていけばいいでしょう。

( f(x_n)+f(x_n+1) ) * 自分で指定した刻み幅 / 2

を刻んだ分だけ足していけばいいでしょう。

先ほどのサンプルのループの中をこのように変えるだけで出来るはずです。


167ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(178,677ポイント)   Date: 2007/01/28(日) 01:57   No:4051     
Title: Re:積分    
プログラムの最初に

#include<stdio.h>
#include<math.h>

#define PI 3.1415926
#define NUM 0.001

これを書いておいてください。
NUMは刻み幅です。PIは円周率です。mathはsin関数を求める為に必要です。

ここで、sin波のπまでの面積を求めてみましょう。
台形則で書くとこんな感じになります。

int main(){

double x,S=0.0;
for(x=0.0;x<=PI;x+=NUM)
S += (sin(x)+sin(x+NUM))*NUM/2;
}


さっき言った通りのアルゴリズムです。
難しくないですよね?
どこかわからない箇所があれば言ってください。


124ポイント を手に入れた。

Name: さっさ  ..ぴよぴよ(19ポイント)   Date: 2007/01/28(日) 23:13   No:4068     
Title: Re:積分    
返事が遅れてすいません・・・
左端点則、中点則、右端点則は画像の考え方であっています!!
台形則はわかりました!!ありがとうございます!

左端点則、中点則、右端点則は具体的にどのようなプログラムを作ればよいのですか?


101ポイント を落としてしまった。

Name: 管理人  ..ハッカー(179,599ポイント)   Date: 2007/01/29(月) 00:20   No:4074     
Title: Re:積分    
いや、画像の方法では全部同じ値になってしまうんですよ。
例えば先ほどの画像の分割した面積を左から1、2、3、とすると

全部面積は
1+2+3になってしまいます。
私の想像する方法とは違う方法で計算をするんじやないかと思いますがもし

私の理論であってるから簡単ですよ。台形の方がよっぽど難しいですし台形のプログラムが理解できたのならそれを
元に自分で考えて見てください。
たった一、二行程度の計算式ですから


20ポイント を手に入れた。

Name: さっさ  ..ぴよぴよ(44ポイント)   Date: 2007/01/30(火) 12:19   No:4105 解決!     
Title: Re:積分    
がんばってやってみます!
ありがとうございました!!


25ポイント を手に入れた。



Name: 坊主  ..ぴよぴよ(11ポイント)   Date: 2007/01/25(木) 15:16   No:3940       
Title: 課題で…。    
つぎの擬似コードを参考にして,クイックソートを実行するプログラムを作りな
さい.また,できるだけ,クイックソートが進行していく過程を分かり易く表示するよう
に各自工夫しなさい.

/* 配列a[] のp 番目からr 番目までをソートする*/
quick_sort(a, p, r) {
if (p < r) {
q = partition(a, p, r);
quick_sort(a, p, q);
quick_sort(a, q+1, r);
}
}
/* 配列a[] のp 番目からr 番目までを分割する*/
partition(a, p, r) {
x = a[p];
i = p - 1;
j = r + 1;
while(1) {
j--; i++;
while(a[j] > x) j--;
while(a[i] < x) i++;
if (i < j) {
y = a[i];
a[i] = a[j];
a[j] = y;
}
else
return j;
}
}

という課題が出ました。
掲載されていた解説アプリでクイックソートが進む工程は理解できました!!
ただ、上のように作るとなると厳しいです。
よろしくお願いします!


11ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(175,374ポイント)   Date: 2007/01/25(木) 15:57   No:3944     
Title: Re:課題で…。    
こんにちは。お書きになったプログラムは、このように書き換えると確認できますよ。

#include <stdio.h>


/* 配列a[] のp 番目からr 番目までを分割する*/
int partition(int a[],int p,int r) {
int i,j,x,y;
x = a[p];
i = p - 1;
j = r + 1;

while(1) {
j--; i++;

while(a[j] > x) j--;
while(a[i] < x) i++;

if (i < j) {
y = a[i]; a[i] = a[j]; a[j] = y;
}
else
return j;
}
}

//aをpからrまでをソート
void quick_sort(int a[],int p,int r) {
int q;
if (p < r) {
q = partition(a, p, r);
quick_sort(a, p, q);
quick_sort(a, q+1, r);
}
}

int main(){
int a[10]={7,3,5,1,2,3,9,8,7,4};
quick_sort(a,0,10-1);

for(int i=0;i<10;i++)
printf("%d ",a[i]);

return 0;
}


処理の内容は解説アプリの中でこれでもかとわかりやすく説明したつもりなのですが、
どの辺がおわかりでないでしょうか?

多分、掲示板で文字で説明するより、アプリをじっくりご覧いただいたほうがよくお分かりいただけると思います。

上記プログラムで実際に動かせますので、どのように処理がおこなわれているか目でおってみてください。


99ポイント を手に入れた。

Name: 坊主  ..ぴよぴよ(304ポイント)   Date: 2007/01/26(金) 13:26   No:3979     
Title: Re:課題で…。    
ありがとうございます。
自分が表現しにくい部分は「クイックソートが進行していく過程を分かり易く表示するよう
に各自工夫しなさい.」がわかりにくくて…。
それと申し訳ないのですが
実際にコンパイルしてみたところ下のようになりました。
qs.c(38) : error C2143: 構文エラー : ';' が '型' の前にありません。
qs.c(38) : error C2143: 構文エラー : ';' が '型' の前にありません。
qs.c(38) : error C2143: 構文エラー : ')' が '型' の前にありません。
qs.c(38) : error C2143: 構文エラー : ';' が '型' の前にありません。
qs.c(38) : error C2065: 'i' : 定義されていない識別子です。
qs.c(38) : warning C4552: '<' : 演算子にプログラム上の作用がありません。作用を持
つ演算子を使用してください
qs.c(38) : error C2059: 構文エラー : ')'
qs.c(39) : error C2146: 構文エラー : ';' が、識別子 'printf' の前に必要です。
qs.c(39) : error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなけれ
ばなりません。
qs.c(39) : error C2144: 構文エラー : '<不明>' は '<不明>' によって先行されなけれ
ばなりません。
qs.c(39) : error C2143: 構文エラー : ';' が '識別子' の前にありません。
どこを修正すれば良いでしょうか?


293ポイント を手に入れた。

Name: box  ..熟練のプログラマー(41,245ポイント)   Date: 2007/01/26(金) 13:31   No:3980     
Title: Re:課題で…。    
> どこを修正すれば良いでしょうか?

おそらく、38行目〜39行目あたりです。
具体的にどのように修正すればよいかは、
ソースコードが見えないため、残念ながらわかりません。


32ポイント を手に入れた。

Name: 管理人 [URL]  ..ハッカー(175,746ポイント)   Date: 2007/01/26(金) 15:07   No:3983     
Title: Re:課題で…。    
エラーを見る限り、簡単な間違いである可能性が高いです。
ソースを一度投稿してもらえませんか?


28ポイント を手に入れた。

Name: 坊主  ..ぴよぴよ(584ポイント)   Date: 2007/01/29(月) 10:10   No:4081     
Title: Re:課題で…。    
実際に書いていただいたソースなんですよ…

#include <stdio.h>

/* 配列a[] のp 番目からr 番目までを分割する*/
int partition(int a[],int p,int r) {
int i,j,x,y;
x = a[p];
i = p - 1;
j = r + 1;

while(1) {
j--; i++;

while(a[j] > x) j--;
while(a[i] < x) i++;

if (i < j) {
y = a[i]; a[i] = a[j]; a[j] = y;
}
else
return j;
}
}

//aをpからrまでをソート
void quick_sort(int a[],int p,int r) {
int q;
if (p < r) {
q = partition(a, p, r);
quick_sort(a, p, q);
quick_sort(a, q+1, r);
}
}

int main(){
int a[10]={7,3,5,1,2,3,9,8,7,4};
quick_sort(a,0,10-1);

for(int i=0;i<10;i++)
printf("%d ",a[i]);

return 0;
}

です。


280ポイント を手に入れた。

Name: box  ..熟練のプログラマー(42,426ポイント)   Date: 2007/01/29(月) 10:24   No:4082     
Title: Re:課題で…。    

> for(int i=0;i<10;i++)

Cでは、この書き方はできません。C++ならできます。
変数iの定義は、今回の場合、配列aの定義の直前か直後で行なってください。

なお、ソースコードを貼り付ける際は、
<pre>
ソース本体
</pre>
のように、前後をタグではさんでください。不等号は半角です。



44ポイント を手に入れた。

Name: 坊主  ..ぴよぴよ(599ポイント)   Date: 2007/01/30(火) 12:13   No:4104 解決!     
Title: Re:課題で…。    
ありがとうございます!

15ポイント を手に入れた。



Name: 佐木 [URL]  ..ぴよぴよ(474ポイント)   Date: 2007/01/29(月) 14:55   No:4087       
Title: ★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★    
★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★
HAPPY NEW YEAR!!
2007年ブルガリ腕時計推薦★!!

在庫処分価格なのでヴコーチが激安です。

★1月27日2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★
  推薦★超人気!!!★、送料無料!!

★1月10日2007年最新作ヴィトン財布新品、新素材入荷!!
  推薦★推薦★推薦★、送料無料!!

★1月18日2006年最新作ヴィトン バック、財布新品入荷!!
  皆様に感謝の気持ちを込めて、送料無料!!

★12月14 マフラー&ニット帽のクリスマス特集 、手袋、ハンドルカバー…… 大量入荷!推薦!!
  2006年最も人気がある商品
★11月28日クロエ(CHLOE)バック 再入荷!
  2006年最も人気がある商品

■HP:http://www.lvyahoo.net/
■店長:佐木
■連絡先:lvyahoo@188.com or info@lvyahoo.net



224ポイント を手に入れた。


Name: 管理人 [URL]  ..ハッカー(181,242ポイント)   Date: 2007/01/29(月) 16:05   No:4092     
Title: Re:★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★    
こ・・これは、、何?( ̄▽ ̄;)

今まで一度も広告はいらなかったんですが、機械で自動的に掲示板探して投稿しているんでしょうか?

どなたかこういう広告が入らないような設定のしかたをご存知でしたら教えてくださいm(_ _)m

投稿禁止用語を使用するという手もあると思いますが、実際何の言葉を禁止にしたらいいのかわかりません・・。

上記文章から推測すると「入荷」とか「商品」とか「送料無料」とかが広告独特の言葉のように思いますが、

「入荷」、「商品」という言葉を禁止すると、普段の会話でも使えなくなってしまうし、

唯一会話では使わないだろう「送料無料」も広告によってはないでしょう・・。

「販売」を禁止にしようかと思いきや、先ほどの投稿にはその語は含まれていないですね;

どなたか良い案お持ちでしたら教えてください(>_<


335ポイント を手に入れた。

Name: ヒロ  ..かけだし(1,221ポイント)   Date: 2007/01/29(月) 16:34   No:4095     
Title: Re:★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★    
しかもこの人初めてじゃないですよ!
ポイント数が違いますもん!
ホントに嫌ですね。。。
2chだったらめちゃくちゃ叩かれてますよ笑


65ポイント を手に入れた。

Name: Yuki  ..入門者(4,113ポイント)   Date: 2007/01/29(月) 17:03   No:4096     
Title: Re:★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★    
こちらの掲示板は管理人さんが自作されたものですか?

掲示板改造支援サイト - 迷惑な掲示板スパム・掲示板荒らし行為の完全排除を目指して -
http://swanbay-web.hp.infoseek.co.jp/about.html

等、対策案をまとめてくれているサイトがあるようです。

「掲示板 対策」でググるといろいろヒットしますよ。


62ポイント を落としてしまった。

Name: 管理人 [URL]  ..ハッカー(181,394ポイント)   Date: 2007/01/30(火) 08:31   No:4101     
Title: Re:★2007年 ROLEX -ロレックスN級最高等級時計大量入荷超人気!!!★    
>ヒロさん、
>しかもこの人初めてじゃないですよ!

いや、今回2回連続で投稿しているので、ポイントが2個分になってるんですよ。
しかし、なんとかしたいものですね・・。

>Yukiさん、
いえ、ここの掲示板は21styleさんのとこでお借りしています。
ご紹介いただいたURL、検索キーワードもチェックしておきますね。ありがとうございます。


152ポイント を手に入れた。




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +