C言語なら俺に聞け(入門篇) Part 5
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/12/02(土) 10:16:33・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。
前スレ
C言語なら俺に聞け(入門篇) Part 4
http://pc8.2ch.net/test/read.cgi/tech/1162999861/l50
過去スレ
Part 1 http://pc8.2ch.net/test/read.cgi/tech/1146700389/
Part 2 http://pc8.2ch.net/test/read.cgi/tech/1153818463/
Part 3 http://pc8.2ch.net/test/read.cgi/tech/1160682950/
関連スレ
C/C++の宿題を片付けます 77代目
http://pc8.2ch.net/test/read.cgi/tech/1164079451/l50
くだすれC言語(初心者用)
http://pc8.2ch.net/test/read.cgi/tech/1153542424/l50
【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 130
http://pc8.2ch.net/test/read.cgi/tech/1159613789/l50
【初心者歓迎】C/C++室 Ver.33【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1164376287/l50
0002デフォルトの名無しさん
2006/12/02(土) 10:25:470003デフォルトの名無しさん
2006/12/02(土) 13:06:060004ぴゅあ
2006/12/02(土) 15:25:35http://pc8.2ch.net/test/read.cgi/tech/1162999861/987-988
好みと言ってしまえば好みでもあるのだろうし
レスするまでのものでもないと思うけど
for (i = 0; i < 15; i++) {
if (i > 0)
fputc('\t',output2);
fprintf(output2, "%d", bin[i]);
}
とかの方がやりたいことがスッキリ読めるような気もする…
0005デフォルトの名無しさん
2006/12/02(土) 15:30:03最後に改行打たないとだめらしいお
0006ぴゅあ
2006/12/02(土) 15:51:52じゃあそれも追加しといて
forの中の話だけ挙げたので
0007デフォルトの名無しさん
2006/12/02(土) 16:03:040008デフォルトの名無しさん
2006/12/02(土) 16:24:59ただし、0を入力すると終了する
っていうプログラムを作りたいんですけど
0を入力すると終了ってとこはわかるのですが、
平均を出すときにどうやって今まで入力した回数を
指定するかがよくわかりません
#include<stdio.h>
int main(void){
int goukei=0;
int tokuten;
scanf("%d",&tokuten);
while(tokuten!=0){
goukei=goukei+tokuten;
printf("goukei=%d\n",goukei);
scanf("%d",&tokuten);
}
return 0;
}
ここからどうすればいいんでしょうか
よろしくお願いします
0009デフォルトの名無しさん
2006/12/02(土) 16:30:44int main(void)
{
int goukei;
int tokuten;
int cnt; // ここ追加、カウンターを追加
goukei = tokuten = cnt = 0;
do {
scanf("%d",&tokuten);
if (!tokuten) break;
goukei += tokuten; // 追加の場合これでおk
cnt++;
printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;);
}
return 0;
}
0010デフォルトの名無しさん
2006/12/02(土) 16:35:33> }
の部分修正、whileつけて
printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;);
}while (1);
またはdo〜whileの部分を
scanf ("%d", &tokuten);
for (cnt = 1; tokuten; cnt++)
{
goukei += tokuten;
printf ("合計=%d, 平均=%d\n", goukei, goukei / cnt);
}
でもいいと思うよ
数字を入力する部分を
char str[64]; // 文字入力を数字に変える
gets (str); // 文字入力を受け付ける
tokuten = atoi (str); // ここで文字列をintに変える
としてもいいと思う
0011デフォルトの名無しさん
2006/12/02(土) 16:36:49ありがとうございます
それで、教えてもらってる身でこんな事言うのは
非常にあつかましいと思うのですが、
あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので、
もし、もうちょっと簡単な方法ってありますでしょうか?
本当にすみません我侭言ってしまって・・・
0012デフォルトの名無しさん
2006/12/02(土) 16:39:41あと、心理学の実験によると期待されているほうが成績がよくなるらしいぞ。
0013デフォルトの名無しさん
2006/12/02(土) 16:40:00すみません、リロードしてませんでした
これまた難しい方法なんですねorz
授業だとcntとか習ってないのでたぶんもっと簡単な方法でやるんだと思うんですが、
もしかしたら先生の意地の悪い宿題かもしれないです・・・
0014デフォルトの名無しさん
2006/12/02(土) 16:43:15スレ違い
C/C++の宿題を片付けます 77代目
http://pc8.2ch.net/test/read.cgi/tech/1164079451/
入力を文字列でして、数字に変える方法は便利、というかエラーになりにくい。
俺も良く分からんがバッファに関して優しいのかな。
表面上は些細な違いだが、内部の事を考えると高度な違いになるんで、
これやらなければ目をつけられる事無いでしょ
cntはcount(カウント)で良く略字として使われてる
なので、この部分を初心者っぽく"kaunto"とすればバレないぜ
0015デフォルトの名無しさん
2006/12/02(土) 16:46:20C/C++っていう言語のスレかと思ってましたorz
スレ違いすみませんでした・・・
0016ぴゅあ
2006/12/02(土) 16:48:01>あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので
>>9(>>10の訂正付き)でいいんじゃないかと思いますよ
後は提出までにコードを理解しておくこと
1個穴があるだろうと思うけど
>scanf("%d",&tokuten);
の前で"tokuten = 0;"とかするのがよかったりするんじゃないのかなとか思ったりするけど
そこんところはそのまま穴にしておいてもいいんだろうけど(先生からの指摘を待つ?)
「そこは人から教わりました」(理解できてたなら)でもOKだろうと思いますよ
0017デフォルトの名無しさん
2006/12/02(土) 16:51:53そうですね・・教えて頂いた方法でやってみようと思います
とても助かりました
本当にありがとうございました
0018デフォルトの名無しさん
2006/12/02(土) 16:53:34cnt++ → kaisu = kaisu + 1
ってすれば初心者っぽく見えるよ。
0019ぴゅあ
2006/12/02(土) 17:01:43>数値を繰り返し入力し、合計、平均をその都度表示する
>ただし、0を入力すると終了する
という課題を満足させるなら
>>9(+>>10)のコードは最低必要になるだろうし
或いはそうでないなら"解りませんでした"になるのかも
>平均を出すときにどうやって今まで入力した回数を
>指定するかがよくわかりません
の"指定"とは、外から回数を与えたりするのではなく
"平均値を求めるために必要とする回数を得るにはどうすればいいのか"
と解釈しました
0020デフォルトの名無しさん
2006/12/02(土) 17:02:09ごめん、穴がどこだか俺じゃ分からない
訂正キボン
0021デフォルトの名無しさん
2006/12/02(土) 17:10:23↓無事作る事ができました
#include<stdio.h>
int main(void){
int goukei=0,heikin=0;
int a,kaisu=0;
scanf("%d",&a);
while(a!=0){
goukei+=a;
printf("合計=%d\n",goukei);
kaisu++;
heikin=goukei/kaisu;
printf("平均=%d\n",heikin);
scanf("%d",&a);
}
return 0;
}
たくさんの助言ありがとうございました
本当に助かりました
0022デフォルトの名無しさん
2006/12/02(土) 17:12:00実に上手い
これほど初心者っぽくはなかなか作れまい
0023ぴゅあ
2006/12/02(土) 17:15:142回目以降"scanf("%d",&tokuten);"に来たときのtokutenの値って
前回入力された値が入っているじゃないですか
たぶん…
そこでEnterキーだけ押したら前の値が入力されるかも?
・・・と思ったけど"%d"によってそうはならないみたいでした
なので一応>>16の後半は無視かも
ただ、(追求してみないと原因は判ってないけど)
適切な数値を入力→無効な文字(英字の文字列とか)
とするとループになってしまうようですけど
ここが対処できてしまったりするのは
宿題の答えとしては理解でき過ぎになるかも
0024ぴゅあ
2006/12/02(土) 17:20:02というか…
自身が示した>>8のコードに対して
>kaisu++;
>heikin=goukei/kaisu;
>printf("平均=%d\n",heikin);
が必要と解ったみたいなので
理解できたということだと思う
0025デフォルトの名無しさん
2006/12/02(土) 17:20:07あぁ、それそれ
直接的には覚えてなかったけどscanfよりgets&atoi使った方がいいってのはそういう事だったんだな
ループ懐かしいな
0026デフォルトの名無しさん
2006/12/02(土) 17:23:40int main(void)
{
int goukei = 0,heikin;
int a=1,kaisu;
for(kaisu=1;a!=0;kaisu++)
{
printf("数値を入力してください。\n>");
scanf("%d",&a);
goukei+=a;
heikin=goukei/kaisu;
printf("合計=%d\t平均=%d\n",goukei,heikin);
}
return 0;
}
0027デフォルトの名無しさん
2006/12/02(土) 17:31:340028デフォルトの名無しさん
2006/12/02(土) 17:35:400029デフォルトの名無しさん
2006/12/02(土) 17:51:37それだと0のときも合計と平均出すことになるんだけど。
0030デフォルトの名無しさん
2006/12/02(土) 17:54:47int main(void)
{
int goukei = 0,heikin;
int a=0,kaisu;
for(kaisu=1;;kaisu++)
{
printf("数値を入力してください。\n>");
scanf("%d",&a);
if(a==0) break;
goukei+=a;
heikin=goukei/kaisu;
printf("合計=%d\t平均=%d\n",goukei,heikin);
}
return 0;
}
0031デフォルトの名無しさん
2006/12/02(土) 17:57:24int i, n, sum=0;
for(i=0; i<n; i++) if(n%i==0) sum += i;
0032デフォルトの名無しさん
2006/12/02(土) 17:58:120033デフォルトの名無しさん
2006/12/02(土) 18:09:56#include <stdio.h>
int add(int a, int b){return a+b;}
int mod(int a, int b){return a%b;}
int func(int n, int d){
if(!d)return 0;
return add(mod(n,d)?0:d,func(n,d-1));
}
int funct(int n){return func(n,n-1)}
int main(void)
{
return printf("%d\n", funct(atoi(gets(malloc(256)))));
}
0034デフォルトの名無しさん
2006/12/02(土) 18:53:45うるおぼえだけど
int a;
do { scanf("%d",&a); } while( a != 0 );
として入力が 10G みたいになるとscanfは10だけ読んで終了する.
入力バッファに G だけ残るが次のscanfはバッファにはデータがあるけど読めないものだから 0 返して終了しちゃう(バッファもクリアされない)
結果延々ループになる
scanf の後に fflush 入れてバッファクリアすればいい
でも fflush って処理依存だったような気がするけど
0036デフォルトの名無しさん
2006/12/02(土) 19:03:09fflushは出力に対して使うもの。
0037デフォルトの名無しさん
2006/12/02(土) 19:15:45行末まで読み飛ばすことだろ。
それなら、
scanf("%*[^\n]");
でいい。
fflush()にしろrewind()にしろ、stdinに対して使った場合の挙動は
移植性が無い。
0038デフォルトの名無しさん
2006/12/02(土) 19:21:090039デフォルトの名無しさん
2006/12/02(土) 19:23:51┐(´ー`)┌
0040デフォルトの名無しさん
2006/12/02(土) 19:29:500041デフォルトの名無しさん
2006/12/02(土) 19:42:290042デフォルトの名無しさん
2006/12/02(土) 19:43:29ナイナイの番組
0043デフォルトの名無しさん
2006/12/02(土) 21:35:54出力先が同じ場合に毎回指定する手間を省いたり、独自の関数名を使うことで
出力先を分かりやすくして間違いを少なくするのに利用するんでしょうか?
0044デフォルトの名無しさん
2006/12/02(土) 21:43:40vprintfの存在意義を確認してるって事でおk?
0046デフォルトの名無しさん
2006/12/03(日) 02:23:52本当に必要になるまで関数の存在意義は分からないもんさ
0047デフォルトの名無しさん
2006/12/03(日) 02:27:48を作りたいのですが、
「2つの整数 x と y の全ての公約数を求める関数」が既にある場合、
その関数を配列dに格納する関数を新しく作るのと
関数を増やさずに作り変えて配列dに入れるのとどっちが楽ですかね?
0048デフォルトの名無しさん
2006/12/03(日) 02:28:58本屋でいくつかC言語の書籍に目を通してもそれに関する記述も無く、
どういった働きなのか、どう使うのか、そもそもC言語で使用する関数なのかどうか
詳しい内容がわからず困っています、
sleepについてお願いします。
0049デフォルトの名無しさん
2006/12/03(日) 02:39:511.「二つの整数 x と y の公約数全てを含めた”配列を返す関数”」を作るといいよ
2.既に安定した状態の関数を弄るよりは、それを使った方が可読性が上がる。
より公約数を割り出す関数を利用する関数を作って配列を返すのがいい、と俺は思う。
ただ公約数って、全部求めちゃった方が楽だよな…
だから、コピって別の名前つけて弄っちゃってもいいと思うよ
>>48
システムコール
0050デフォルトの名無しさん
2006/12/03(日) 03:44:11srand(time(NULL));
使ってて、今まではちゃんとした結果を出してくれたのですが、
今同じプログラムを作動してみると、50%ぐらいの割合で、
めちゃくちゃな結果を出します。
どうしたら良いでしょうか?
srand(time(NULL)); 使ったらやばい時間なのですか?
0051デフォルトの名無しさん
2006/12/03(日) 03:49:01一応キャストして(unsigned)使った方がいいけどそこはあんまり問題じゃないと思う
そんなに大きいソースじゃなければ該当のソースを貼ってみてくれ
0052デフォルトの名無しさん
2006/12/03(日) 03:54:37疑似乱数の初期化なんだから乱数列はめちゃくちゃで当たり前だが。
0053デフォルトの名無しさん
2006/12/03(日) 03:55:14#include <time.h>
#include <stdlib.h>
#include "janken.h"
#include "boardfunc.h"
extern int p_i,p_j;//直前にマークしたx,y座標
//○×ゲーム
main(){
int p_turn;//プレイヤーのターンの時は1
char p_get[10]; //プレイヤーの入力値
int r;//プレイヤーが揃ったか否かを判定結果
srand(time(NULL));
printf("【○×ゲーム】"\n);
do{p_turn = janken();} while(p_turn < 0);
if(p_turn){writeBoard();}
for(;; p_turn = !p_turn){
if(p_turn){ //プレイヤーターン
do{
printf("場所を指定して下さい(例:a2) > ");
scanf("%s",&p_get);
}
while(!writeMark(p_get));
0054デフォルトの名無しさん
2006/12/03(日) 03:56:17else{ //コンピュターターン
writeCompMark();
printf("コンピュターは・・・ %c%d\n",p_j+96,p_i);
}
writeBoard();
r = judge();
if(r != 0){break;}
}
printf("\n==========ゲーム終了=========\n);
if(r == -1){printf("\あいこですn");}
else{
if(p_turn{printf("プレイヤーの勝ち!\n");}
else{printf("プレイヤーの負け!\n");}
}
return 0;
}
0055デフォルトの名無しさん
2006/12/03(日) 03:58:1510-4.c:
エラー E2209 10-4.c 5: インクルードファイル 'janken.h' をオープンできない
エラー E2209 10-4.c 6: インクルードファイル 'boardfunc.h' をオープンできない
エラー E2206 10-4.c 18: 不正な文字 '\' (0x5c)(関数 main )
エラー E2121 10-4.c 18: 関数呼び出しに ) がない(関数 main )
警告 W8065 10-4.c 19: プロトタイプ宣言のない関数 'janken' の呼び出し(関数 main )
警告 W8065 10-4.c 20: プロトタイプ宣言のない関数 'writeBoard' の呼び出し(関数 ma
in )
警告 W8065 10-4.c 28: プロトタイプ宣言のない関数 'writeMark' の呼び出し(関数 mai
n )
警告 W8065 10-4.c 32: プロトタイプ宣言のない関数 'writeCompMark' の呼び出し(関数
main )
警告 W8065 10-4.c 36: プロトタイプ宣言のない関数 'writeBoard' の呼び出し(関数 ma
in )
警告 W8065 10-4.c 37: プロトタイプ宣言のない関数 'judge' の呼び出し(関数 main )
エラー E2380 10-4.c 41: 文字列または文字定数が閉じていない(関数 main )
エラー E2121 10-4.c 42: 関数呼び出しに ) がない(関数 main )
警告 W8070 10-4.c 49: 関数は値を返すべき(関数 main )
*** 6 errors in Compile ***
こうエラーが表示されてしまいます。
誤り箇所など、ご指摘お願い致します。
行数を見ても、何処がどう違っているか、わかりません。
0056デフォルトの名無しさん
2006/12/03(日) 04:00:24エラー E2209 10-4.c 6: インクルードファイル 'boardfunc.h' をオープンできない
janken.hとboardfunc.hが無いから、ちゃんと読めるように同じ階層に入れてあげて
005753-55
2006/12/03(日) 04:02:02訂正箇所が
エラー E2206 10-4.c 18: 不正な文字 '\' (0x5c)(関数 main )
エラー E2121 10-4.c 18: 関数呼び出しに ) がない(関数 main )
エラー E2380 10-4.c 41: 文字列または文字定数が閉じていない(関数 main )
エラー E2121 10-4.c 42: 関数呼び出しに ) がない(関数 main )
警告 W8070 10-4.c 49: 関数は値を返すべき(関数 main )
*** 6 errors in Compile ***
だけになります。
005853-55
2006/12/03(日) 04:03:47今のところ、#include "janken.h"
#include "boardfunc.h"
はまだ書いていません。
0059デフォルトの名無しさん
2006/12/03(日) 04:04:41そかそか、分かった、着眼点が違ったようでスマソ
>printf("【○×ゲーム】"\n);
""の外に\nを書いちゃだめよ
0060デフォルトの名無しさん
2006/12/03(日) 04:07:42小数をバイナリ化した値 "0x40133333" (10進で2.3)
をunsigned intに代入して次のようにして、2.3と表示
されるのを期待しています。
#include<stdio.h>
int main(void){
unsigned int integ = 0x40133333;
printf("%f\n", (float)(integ) ) ;
}
としたのですが、結果はとんでもない値(1075000115.00000)に
なってしまいます。どうしてでしょう??
もともとはバイトオーダの変換をしていてうまくいかず調べ始めたのですが、
ここに行き着いてしまいました。。。orz
0061デフォルトの名無しさん
2006/12/03(日) 04:09:25printf("%f\n", (double)(integ) ) ;
006253-55
2006/12/03(日) 04:12:040063デフォルトの名無しさん
2006/12/03(日) 04:12:22137行ですが、宜しいですか?
>>52
2次元粒子のシミュレーションです。
10*10の箱に20個の粒子を少しでたらめに配置し、
時間が立った後で20個それぞれのスピードを計算する、というプログラムです。
最初は20個の粒子のスピードを1に設定してるのですが、
マクスウェルボルツマンによればそんなにスピードが速い粒子は無いはずです。
が、自分のプログラムは時たまとてつもでかいスピードの粒子が存在するのです。
0064デフォルトの名無しさん
2006/12/03(日) 04:13:34それはプログラムがバグっています。
0065デフォルトの名無しさん
2006/12/03(日) 04:15:02中々いい事してるね
浮動小数点の由来を調べてみるといいかも
詳しくは知らんし俺の推測からだけど
小数点の部分もfloatは格納してるから、
内部をそのまま写すと小数点の部分も整数として評価されるので、おかしくなる
0066デフォルトの名無しさん
2006/12/03(日) 04:16:510067デフォルトの名無しさん
2006/12/03(日) 04:18:380068デフォルトの名無しさん
2006/12/03(日) 04:22:44printf("%f\n", *(float *)(&integ));
ちなみにdoubleは64ビット
0069デフォルトの名無しさん
2006/12/03(日) 04:23:24(float)(integ)でどうして2.3が出ると思うのか?
integには整数しか入らないからキャストしても小数点以下は0しか出ない。
0070デフォルトの名無しさん
2006/12/03(日) 04:28:19なるほど、そんな手が
ってか普通に思いつかない俺があかんな
しかしこの用法が一体何に結びつくのだろう
0071デフォルトの名無しさん
2006/12/03(日) 04:30:39機械語に変換される前に通るのと置き換えができると
入門書には書かれていますが、いまいちイメージが掴めません
ですので、何か他の物に喩えて、簡単にイメージが掴める様に
説明お願いします。
0072デフォルトの名無しさん
2006/12/03(日) 04:41:57ここに書いてあるけど;(セミコロン)を書いてはいけないもの
ttp://www.kouno.jp/home/c_faq/c10.html
だってさ
#includeや#define
VBSみたいに特に特殊な意味合いは無いと思う、マクロウィルス?とかみたいなね
ちなみにマクロで良く出てくる((a)?(b):(c))は三項演算という
0073デフォルトの名無しさん
2006/12/03(日) 04:41:58萌え画像ー>(脳内変換)ー>興奮
↑
このへん
0074デフォルトの名無しさん
2006/12/03(日) 04:43:03変換される前に通る、って何?
通る=変換だと思うんだが
0075デフォルトの名無しさん
2006/12/03(日) 04:45:24お前のコンパイラ系は
プリプロセスで機械語に変換しているのか・・よかったな
0076デフォルトの名無しさん
2006/12/03(日) 04:47:54マクロについても書いてある
ttp://mikata.curiocube.com/hello/ch19_comment.html
007771
2006/12/03(日) 05:05:00マクロウィルス?とかも確かにマクロと付きますね。
なんとなーくはイメージを掴めました。
通るが変換ですた、すんまそ
0078ぴゅあ
2006/12/03(日) 05:22:42他のものに例えてみるのは考えるのが面倒なのでそのまま書きますけど
>>72が示したページにあるように「機械語に変換される前に」というより
大抵のコンパイラにはコンパイルの段階の前にプリプロセッサによる処理というものがあって
(概ね:プリプロセッサ→コンパイラ→アセンブラ→リンカ)
そのひとつのマクロ処理はソースコードから文字列(トークン)の置き換えを行うもの
(飽くまで文字列(トークン)を文字列のまま扱って置き換えする)
そうそう、エディタで言えば置換機能
その結果として出てきたソースコードがコンパイラに掛けられます
例えば(いい例書けるか自信ないけど)
#define ARRAY_SIZE (5*10)
int array[ARRAY_SIZE];
と書いておくと
int array[(5*10)];
と書いてあったものとしてコンパイラに掛けられる(これのことを"通す"と言っているのかな?)ことになります
>>72
#include,#define等はプリプロセッサディレクティブ
Cで言うところのマクロ処理については#defineディレクティブになるのでは?
これらのディレクティブ(擬似命令)を使って書いたものがマクロであるとかはまず言わないような気も…?
0079デフォルトの名無しさん
2006/12/03(日) 05:25:21感動した
0080ぴゅあ
2006/12/03(日) 05:26:27ついでにもうちょっと知ってみる材料として
「マクロ #define」辺りでググッてみるとか
取り敢えず最初の方に出てきたりした
http://wisdom.sakura.ne.jp/programming/c/c40.html
http://www.geocities.jp/ky_webid/c/039.html
辺りでも見てみるとかいいかも
008171
2006/12/03(日) 05:33:49ありがとうございます!
しかしながら本当に難しいです
特に例を書いて頂いた辺りが、もう一度頭を冷やしてから考え直しますノシ
0082ぴゅあ
2006/12/03(日) 05:59:56焦らずジックリやってみることですね
>>78に挙げた例とかは実際見てみるまでもなくそうなってるんですけど
例えばVC++なら(今持ってる最新はVC7で)プロパティページで
構成プロパティ→C/C++→プリプロセッサの"プリプロセスファイルの生成"で生成するようにすると
コンパイラに掛ける前のソースコードファイル(拡張子.iのテキストファイル)が得られるので本当にそうなるか見てみるとか
gccなら-Eオプションかな
#includeとか含まれていると見るのが大変になるので
まずは先の例だけ書いてみるとか
更に色々書き替えてみてどうなるかとか
もしかしたら実際にやってみたりする方が感触つかめたりするのかも?
0083デフォルトの名無しさん
2006/12/03(日) 07:41:05ただし間違っても自分が書くコードの参考にしないように
マジで
0084デフォルトの名無しさん
2006/12/03(日) 08:45:03srandがおかしいと言ってるんなら
srandを使用した最小限のプログラムを晒すべき
それでおかしくならないのなら、srand以外のバグだろ
0085デフォルトの名無しさん
2006/12/03(日) 09:26:17double carnell(double a,double b,double *c,double *d,double *e,double *f){
double bak1;
bak1 = a;
a += b;
*c = a;
a = bak1;
a -= b;
*d = a;
a = bak1;
a *= b;
*e = a;
a = bak1;
a /= b;
*f = a;
return 0;
}
008685
2006/12/03(日) 09:26:49double c,d,e,f;
double b[2];
c = d = e = f = 0;
printf("数値入力");
scanf("%lf",&b[0]);
printf("数値入力");
scanf("%lf",&b[1]);
carnell(b[0],b[1],&c,&d,&e,&f);
printf("和:%d\n",c);
printf("差:%d\n",d);
printf("積:%d\n",e);
printf("商:%d\n",f);
return 0;
}
008785
2006/12/03(日) 09:28:10実行しても最後に出てくる数字が0ばっかなんです
初心者なんで良くわかりません
どこが悪いのか教えてください
0088デフォルトの名無しさん
2006/12/03(日) 09:35:57008985
2006/12/03(日) 09:39:14俺だめじゃんwwwww
0090デフォルトの名無しさん
2006/12/03(日) 10:18:08srand(time(NULL))は、rand()が返す乱数の種として、そのプログラムの実行時の時刻を使うということ。
(これをやらないと、プログラムを実行するたびに毎回同じ乱数列が生成される。)
君の環境が何かは知らないが、srandやrandにバグがあるとは思えない。
srandはその後のrandの結果に影響するだけ。randは0〜RAND_MAXの任意の値を返すだけ。
rand()が返す値が0〜RAND_MAXであることを確認できれば、
問題は君のプログラムの別の部分にあるはず。
これまで正しく動作していて、ソースを何もいじっていないのに急に動かなくなったなら、
これまでに動かしたときに生成された乱数の列が、たまたま上手く動く(ように見える)パターンだった
というだけだと思う。
ソースをさらしたとして、指摘できるのはC言語の使い方としての誤りだけだ。
そのシミュレーションのロジックが正しく実装できているかは判断しかねるから期待するな。
009150
2006/12/03(日) 10:45:48やっぱり、プログラム事態おかしかったみたいです。部分、
int i,j;
double dx,dy,r_ij,f_ij,fx[N],fy[N];
double x_new[N],y_new[N];
double t=0;
while(t<T_MAX){
t=t+dt;
と書いてあったのを
double t=0;
while(t<T_MAX){
t=t+dt;
int i,j;
double dx,dy,r_ij,f_ij,fx[N],fy[N];
double x_new[N],y_new[N];
と、ループの中で宣言したら書いたらオッケーでした。(でもなんでかわからん)
0092デフォルトの名無しさん
2006/12/03(日) 10:53:00srand(time(NULL));
がおかしいと思った時はsrandを用いた最小限のプログラムでテストするべき、
それで問題なければ他のところがおかしいとわかる
変数の宣言する場所で結果が変わるなら、
変数のスコープというのについて調べればいいと思うよ。
0093デフォルトの名無しさん
2006/12/03(日) 11:02:07思いつくのをあげてみると、
・Nがかなり大きな値なら、スタックがあふれているのかもしれない。
大きな配列はローカル変数ではなく staticをつけて宣言するかmallocで確保すべき。
・原因は他のところにある。初期化していない領域を参照しているとか。
スタックの配置が変わってたまたま正しい結果が返ってくるようになっただけ。
ちょっとだけESP発動。
10×10の配列の部分てどうやってる?
>>91の中には2次元配列とか、(double *)の配列がないから、
もしかしてdouble x_new[N],y_new[N]; 辺りが10×10のデータを格納するためのもの?
009450
2006/12/03(日) 11:34:03vの分布が右にちょっと傾いた山型でピーク時のvが1ぐらいです。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3073.c
0095デフォルトの名無しさん
2006/12/03(日) 12:08:36>vの分布が右にちょっと傾いた山型でピーク時のvが1ぐらいです。
そんな説明で何をやっているのか分かるわけないだろう。
人にソースを見せるなら、せめて各関数の意味と変数の意味ぐらいコメントで書け。
お前はこんなソースを人から見せられて、何をやっているのか理解できるか?
質問をするなら、それを受け取った相手に何が伝わるかくらいの配慮はしろ。
で。
>for(i=1;i<=N;i++){
> fx[i]=0;
fx[N]で宣言したなら、f[0]〜f[N-1]のみが使える。
f[N]にはアクセスするな。
他の配列も同様。
009650
2006/12/03(日) 12:51:17下のはコメント付けました。
でも日本語だと文字化けしちゃったので、英語です。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3075.c
0097デフォルトの名無しさん
2006/12/03(日) 13:19:12ちょっと難しく書きすぎてないか?
全然読む気が起きない
0098デフォルトの名無しさん
2006/12/03(日) 13:20:29>>95はシカトか
009950
2006/12/03(日) 13:59:11なんかただ小うるさいだけなんですよね。
もう答えてもらわなくていいです。
0100デフォルトの名無しさん
2006/12/03(日) 14:15:4168の方! 本当に有難うございました。
できましたよー!
ポインタの型変換ではうまくいくのに
どうして(float)(integ)では駄目なのかな。。
0103デフォルトの名無しさん
2006/12/03(日) 14:28:53昇華してWin32まで使うようになる頃になるぐらいになれば理由は分かる
すれ立てるまでもない質問はここで 第79刷
http://pc8.2ch.net/test/read.cgi/tech/1160751859/598,611
これがどうして複製できるのか理解できたら、おまいの疑問に思ってることも解決するだろう
0104デフォルトの名無しさん
2006/12/03(日) 14:33:30逆に>>60のようにキャストしたい数字の内部表現を知らなかったらキャストできないってことになったら不便だよね
ちなみにわかってると思うけど
1075000115 = 0x40133333
0105ぴゅあ
2006/12/03(日) 14:46:01キャストとポインタがシッカリ理解できるようになれば解るようになるだろうと思います
"(float)(integ)"はintであるものを"floatに変換"している
"*(float *)(&integ)"はintの領域(4バイト)に格納されているものを"強引にfloatとして格納されたものだ"として取り出している
ということがいずれ解るようになれば
直ぐに解らなくても色々やっているうちに解る時がくるだろうと思いますよ
まだよく解らないと思ったら、これが理解できるまでここで止まってるようなことをしないで
取り敢えず先へ進んでおいて後で戻ってみるのがいいと思います
シッカリ進めていっていれば、あのときなんで解らなかったんだろうと思っている自分が居たりするだろうと思う
0106デフォルトの名無しさん
2006/12/03(日) 14:50:22ぴゅあは質問者の事をあんまり考えられないんだな
0107ぴゅあ
2006/12/03(日) 15:04:04補足
# "*(float *)(&integ)"は…
これはintである(intとして格納されている)ことを無視して、強引にfloatとして格納しているとしているわけで
floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
(malloc()で取ったvoid *状態からキャストしても可)
逆に元々のintであることとかを無視してしまっているので、今回の例のように明確に理由がある場合以外では滅多に使うものではないです(というより、使ってはいけません)
この悪い例としては
ポインタを使っているコードで、キャストの部分でエラー(警告)が出るからということで、闇雲にキャストしてエラーを消すということ
エラーは消えたけど、真の意味を無視しているので動くわけないです
意外とプログラマとして仕事している人の中にもポインタを理解している人が少ないチームではやってしまっているのを多く見掛けるようです
ポインタを理解した後でもいいので、気に留めておくといいと思います
010850
2006/12/03(日) 15:06:36for(i=0;i<N;i++)に変え、
gx[i]=((i-1)/5)*2+2;
gy[i]=((i-1)/1)*2+1 - ((i-1)/5)*10;
の所を
gx[i]=(i/5)*2 + 2;
gy[i]=i*2+1 - (i/5)*10;
に変えました、これでファイナルアンサーで良いですか?
0109デフォルトの名無しさん
2006/12/03(日) 15:19:31それは知らん。お前のプログラムの仕様はお前にしか分からない。
コンパイルでエラーが無く、プログラムを実行したときに正常終了すれば
プログラムが正しく動いたといえるわけではない。
実行した結果が正しいかを確認する方法くらいは自分で考えたら?
0110デフォルトの名無しさん
2006/12/03(日) 15:21:47>floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
>(malloc()で取ったvoid *状態からキャストしても可)
アーキテクチャによっては、floatとしてアクセスする領域のアドレスがsizeof(float)の境界にあってないと
いけないということも気にしたほうがいい。
0111デフォルトの名無しさん
2006/12/03(日) 16:08:02何歳だよ…
少しは日本語勉強してくれ
0112デフォルトの名無しさん
2006/12/03(日) 17:11:28もう見てないかもしれないけど
そんなときには union 使うと便利
union{
float dat_f;
long dat_l;
}integ;
とか
0113デフォルトの名無しさん
2006/12/03(日) 17:21:49ぶっちゃけ、>>110にもあるように、アーキテクチャによっては境界に沿ってない
floatアクセスするとバスエラーになったりするので、こういう目的には
union使うとよろし。
ま、そもそもsizeof(int) != sizeof(float)なら論外なコードなわけだから
その辺突っ込んでも仕方が無い気はするが。
sizeof(int) == sizeof(float)なら、
union U { int ival; float fval; };
とでもしておいて、
u.ival = ....;
printf("%f\n", u.fval);
で大丈夫。
sizeof(int) != sizeof(float)なら、
union U { char bval[sizeof float]; float fval; }
とでもして、intの代わりにバイト配列使えばヨシ。
0114デフォルトの名無しさん
2006/12/03(日) 18:00:090115デフォルトの名無しさん
2006/12/03(日) 18:27:08どっちかというと邪道な使い方ですから。
0116デフォルトの名無しさん
2006/12/03(日) 18:38:030117デフォルトの名無しさん
2006/12/03(日) 19:51:560118デフォルトの名無しさん
2006/12/03(日) 19:55:22といって、邪道というほどでもない。
malloc()の実装などで、境界あわせ目的でunionが使われたりする。
後は、バイト配列と整数型のunionで、バイトアクセス、ワードアクセス両方
可能にするとか。こういうコードは思いっきりエンディアン依存になるけどな。
この類は低水準のコード以外では出て来にくいのは確か。
0119デフォルトの名無しさん
2006/12/03(日) 21:59:12>(float)(integ)でどうして2.3が出ると思うのか?
>integには整数しか入らないからキャストしても小数点以下は0しか出ない。
ごもっとも。あ゛〜くやしいー。完全に勘違いです。
>u.ival = ....;
>printf("%f\n", u.fval);
>で大丈夫。
スマート! これいいですね!
ぴゅあさんはじめ丁寧な説明有難う御座いました。m(__)m
お礼になぜこんな質問をしたか、を書いておきます。(読み飛ばし可)
X-Planeというフライトシミュレータがありまして、そのソフトにある設定を
するとUDP通信で飛行速度や、飛行している方向を他のPCに転送できる、
というマニアックな機能があります。UDPでのデータ受信は苦労の末できた
のですが、それをfloatに変換するのにてこずって先の質問をさせて頂きました。
しかも送ってくるのがビッグエンディアンで、しかも少数のバイトオーダ変換
について詳しく書いてあるページを探し出せなかったのです。
本来はPerlのunpack関数で出来ると思っていたのですが、、、、あ、これはスレ違い?
0120デフォルトの名無しさん
2006/12/03(日) 23:03:42バイナリ通信プロトコルなら、ASN.1みたいな規格が参考になるんじゃないかな。
ぐぐってみそ。
んでも通信っつーことなら、そのやり方はあまりよろしくない。
浮動小数点数の表現形式は思いっきりアーキテクチャ依存だから。
それと、エンディアン無視すれば、単にfloatの変数にmemcpy()って手もあるよ。
0121ぴゅあ
2006/12/03(日) 23:04:44http://pc8.2ch.net/test/read.cgi/tech/1162999861/852
とかに繋がってたんでしょうか
エンディアンが違うだけでfloatで扱えると判っているという前提で
float data;
char *pdata = (char *)&data;
でもよかったかも知れませんね
機会があったらまた見てみるのもいいかも
0122デフォルトの名無しさん
2006/12/04(月) 00:34:20wsprintfだと浮動小数点が使えないんですけど、wsprintfに
何か利点があるんでしょうか
素朴な疑問です
0123デフォルトの名無しさん
2006/12/04(月) 02:26:15wsprintfが浮動小数点を扱えないのではなく、君のプログラムでの文字列の扱いがおかしい。
とりあえずマニュアル、規格書、ネット、何でもいいからwsprintfが何者かくらいのことは調べたのか?
0124デフォルトの名無しさん
2006/12/04(月) 03:30:51嘘を教えないように。
wsprintf()はWin32API。
charではなくTCHARを扱う。仕様は標準のsprintf()のサブセットといったところで
機能が貧弱。
VC++は同じくTCHARベースの_stprintf()という関数を提供しており、これは
sprintf()と同等の機能を提供している。
wchar_t系の標準関数は、wsprintf()ではなくswprintf()ね。
wsprintf()を使うべき理由はあまり無いだろうね。強いて言えば、Cランタイムに
依存したくないといったケースかな。
0125デフォルトの名無しさん
2006/12/04(月) 10:24:14wsprintf は (cdecl 呼び出しできれば) 他言語でも利用可能だね。
0126デフォルトの名無しさん
2006/12/04(月) 11:43:46調べてない男カックイイ
0127デフォルトの名無しさん
2006/12/04(月) 15:27:47これは具体的にどういった作業で、どういった事を知っておくべき仕事なの
でしょうか。イメージがわきません。
ご助言のほど宜しくお願い致します。
0128デフォルトの名無しさん
2006/12/04(月) 15:28:01表示させるプログラムが組みたいのですが、どのようにすればいいですか?
音が強い部分をどうやって判定していいかよくわかりません。
0129デフォルトの名無しさん
2006/12/04(月) 15:32:29マルチすんな
0130デフォルトの名無しさん
2006/12/04(月) 15:35:22仕事先に訊けよw
画像処理と言ったっていろいろあるんだし
0131デフォルトの名無しさん
2006/12/04(月) 15:41:06訊けば無知なやつだと思われて
落とされる可能性があると思ったのかな
0132127
2006/12/04(月) 17:25:18まさか担当の人このスレ見てたらやばいから多くは語るまいぞ。
0133デフォルトの名無しさん
2006/12/04(月) 17:32:18逆に まーったく適正外の仕事を押し付けられる可能性もある ってことだぜ?
0134デフォルトの名無しさん
2006/12/04(月) 18:20:31例えば、具体的なキーワードを出されて「そんなのは知りません」ってのはまずいと思うが、
「画像処理」などという抽象的な事前情報しかないのなら、
具体的にどんなことやっているのかを聞くのは悪いことではないだろう
まあ面接前に聞くなり調べるなりしろよって感じはするが
0135デフォルトの名無しさん
2006/12/04(月) 18:33:30どんな会社かによって全然変わるわけだが。
フレーム間差分オブジェクト抽出とか特徴点検出とかオプティカルフローとか
そういった応用の利く基本的な技術を身に付けておく(車輪の最発明をしておく)といいよ。
0136デフォルトの名無しさん
2006/12/04(月) 18:34:550137127
2006/12/04(月) 19:22:02まあ業界未経験なもんで、どんな仕事でも入り込めれば儲けものと
いうかww
キーワードはぐぐってみます。
もう一度、面接あるのでその時は多少分かっているような
口をきくつもりです。まあ今回で落ちた可能性も大だがwww
0138デフォルトの名無しさん
2006/12/04(月) 19:31:50と
#if def
の違いを教えてくれ。
どう使い分ければいいんだ?
0139デフォルトの名無しさん
2006/12/04(月) 20:02:11ttp://www.02.246.ne.jp/~torutk/cxx/preprocessor/cpp1.html
0140デフォルトの名無しさん
2006/12/04(月) 20:10:18ExpressEditionを使えるからといってVC++出来ますといって
いいものでしょうか。
0141デフォルトの名無しさん
2006/12/04(月) 20:16:23VC++ExpressEdition出来ますと言えばいいじゃまいか
0142デフォルトの名無しさん
2006/12/04(月) 20:37:55普通にMFCやった事ありませんでおk。
もしかしてExpressEditionってSTLもないのか?
0143デフォルトの名無しさん
2006/12/04(月) 20:49:260144デフォルトの名無しさん
2006/12/04(月) 20:51:18日本語でおk
0145デフォルトの名無しさん
2006/12/04(月) 21:00:25じゃあいいんじゃね。
俺はMFC嫌い。
0146デフォルトの名無しさん
2006/12/04(月) 21:04:11ココはあくまでC言語の話をするスレだろ。
0147デフォルトの名無しさん
2006/12/04(月) 22:23:51const char str[]="sumple-string.";
char buf[strlen(str)];
の定義があり、先頭から5バイトまでを切り出したいので
strncpyで切り出すことを考えています。
strncpy(buf,str,length);
しかしながら、\0が入っていないため、printfが正常に出来ません。
この場合、どのようにしてNULL文字を後部にセットすればよいでしょうか?
もしくは、先頭からxbyteを切り出すのにもっと効率の良い方法がありますか?
尚、lengthにはsize_t で5になっています。
よろしくお願いします。
0148デフォルトの名無しさん
2006/12/04(月) 22:27:18buf[5] = '\0';
0149デフォルトの名無しさん
2006/12/04(月) 22:49:43str:あいうえお len:10
buf:あいうU len:7
こんな感じになってしまいます。
buf:あいう len:6
という出力を期待しているのですが、、
const char str[]="あいうえお";
size_t bytes = 6;
printf("str:%s len:%d",str,strlen(str));
char buf[bytes];
strncpy(buf,str,bytes);
buf[bytes] = "\0";
printf("buf:%s len:%d",buf,strlen(buf));
0150デフォルトの名無しさん
2006/12/04(月) 23:03:08>char buf[bytes];
サイズが足りない
char buf[bytes+1];
0151デフォルトの名無しさん
2006/12/04(月) 23:06:38あと
buf[bytes] = "\0";
¥0 はシングルで囲む
'\0'
0152デフォルトの名無しさん
2006/12/04(月) 23:13:07シングルクオートで囲むのがポイントだったみたいです。
ありがとうございました。
0153デフォルトの名無しさん
2006/12/04(月) 23:40:59strncpy(dst, src, n);
において、
strlen(src) >= n の時、dstはヌル終端されない。
strlen(src) < n の時は、n byteまではヌルで埋められる。
よって、↑の後は、お約束として
dst[n] = '\0'; とすべし。
代わりにstrncat()を使うという手もある。
dst[0] = '\0';
strncat(dst, src, n);
でオッケーだ。strncat()はヌル終端を保障するし、余計なヌル埋めもしない。
0154デフォルトの名無しさん
2006/12/05(火) 00:13:46サンキュウ。
0155ぴゅあ
2006/12/05(火) 00:18:08目的通りに解決したってことなんでしょうか…
(>>147より)
>先頭から5バイトまでを切り出したい
(>>149より)
>すみません、どうもうまくいかないです。。
は>>147とは別の話?
>buf:あいう len:6
>という出力を期待しているのですが、、
で、やりたいことが変わっているような気がするし・・・
全角/半角の意識とかなくてOK?
なんかやりたいことが今一つ見えない気がしたりですけど。。。
いいのかな
0156デフォルトの名無しさん
2006/12/05(火) 00:43:22>やりたいことが変わっているような気がする
おそらく同じ。どちらも、「先頭からnバイトを切り出して別の配列に入れたいが、最後に\0が入らない(printfが正常に働かない)」という内容。しかもstrとbufの使い方が同じ。
>全角/半角の意識とかなくてOK?
「buf:あいう len:6」とか書いてるって事は全角/半角を意識している証拠。
>なんかやりたいことが今一つ見えない気がしたりですけど
日本語で頼む。
>いいのかな
いいんだよ。
0157デフォルトの名無しさん
2006/12/05(火) 02:28:19for(){
for(){
if(){
goto label;
}
}
}
label:
こういうのをgoto文を使わずに簡単に書くにはどうしたらいいですか
0158デフォルトの名無しさん
2006/12/05(火) 02:37:25ま、そこは通常gotoを使うべき珍しいケースの一つだと思うけど。
0159デフォルトの名無しさん
2006/12/05(火) 03:02:240160デフォルトの名無しさん
2006/12/05(火) 04:20:25おんなじ条件判定かますとか。
若干もったいない気がするけど。
0161デフォルトの名無しさん
2006/12/05(火) 04:33:35ちと無理やりだが。
0162デフォルトの名無しさん
2006/12/05(火) 04:40:35としても
printf("c = %x",c);
とすると結果には"c = ffffff"と表示されます
cをunsigned charで定義すればちゃんと"c = ff"となるのですが、どういう違いがあるんでしょうか?
0163162
2006/12/05(火) 05:04:410164デフォルトの名無しさん
2006/12/05(火) 05:11:07cがcharのときはprintfに渡すときはintに格上げされる。
0x0000ffはcharに入れたときは10進で-1だから、
intに格上げされたときの-1の値が入る。それが0xffffffffだ。
# fが2個足りないんじゃないか?
cがunsigned charのときは0x0000ffは10進で255だ。
それがintに格上げされたとして255の値が入る。
そいつは16進で0xffだ。お望みの通りの結果になる。
なぜcharやunsigned charがintに格上げになるのかは、
まあそういう規則だからと思っておけ。
詳しくは関数のプロトタイプの解説をどっかで見つけて読めばいいと思う。
0165162
2006/12/05(火) 05:19:33確かにfが二つ足りなかったです、すみません
これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか
単一の引数でも式とみなして処理しちゃうんですね
すっきり理解できました、ありがとうございます
0166デフォルトの名無しさん
2006/12/05(火) 05:24:29>これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか
まあその名残だ。今ではそういうルールだからとしか言えないけど。
0167ぴゅあ
2006/12/05(火) 07:50:16その程度ならまだgotoを使うほどのものでもないと思う
>>159の言っているのに近いというのか、実際に入るロジックからどう練るかによると思うけど
0168デフォルトの名無しさん
2006/12/05(火) 09:49:45>166の解説はこの場合ちょっと違う。
この場合、式だからintに格上げされるのではなく、可変長引き数だからintに格上げされる。
0169デフォルトの名無しさん
2006/12/05(火) 10:15:35gotoを使うのがベストだと思うな。
0170デフォルトの名無しさん
2006/12/05(火) 10:19:02言語が貧弱なんだからしょうがない。
少なくとも多重ループからスマートに脱出する手段をCは提供していないし、
エラー処理もgoto使ったほうがすっきりする場合がある。
0171デフォルトの名無しさん
2006/12/05(火) 10:43:05同意の上で、gotoを排除するように努力はすべきだと思う。
その努力の結果、コードがわかりづらくなるのであれば、
それはあなたがまだまだ精進すべきだったか、
あるいはそこにgotoがあるべき場所だったかのどちらかだ。
なんにしろgotoを排除する努力は怠るべからず。
ただし必要とあれば堂々と使うべし。
0172デフォルトの名無しさん
2006/12/05(火) 13:21:310173デフォルトの名無しさん
2006/12/05(火) 13:44:560174デフォルトの名無しさん
2006/12/05(火) 13:49:220175173
2006/12/05(火) 13:56:520KDQppbnQgbWFpbih2b2lkKQ0Kew0KICBpbnQgaSxqLHhbNF0seVs0XSxoaXQsYmxvdyxudW1iZXI7
DQogIGludCB0cmlhbHM9MDsNCg0KICBzcmFuZG9tKCh1bnNpZ25lZCl0aW1lKE5VTEwpKTsNCiAgIH
doaWxlKDEpew0KICAgICBmb3IoaT0wO2k8NDtpKyspew0KICAgICAgIHhbaV09cmFuZG9tKCkgJSAx
MDsNCiAgICAgfQ0KICAgICBpZih4WzBdIT14WzFdICYmIHhbMV0hPXhbMl0gJiYgeFsyXSE9eFszXS
AmJiB4WzJdIT14WzBdICYmIHhbM10hPXhbMF0gJiYgeFsxXSE9eFszXSl7DQogICAgIGJyZWFrOw0K
ICAgICB9DQogICB9DQoNCg0KICB3aGlsZShoaXQhPTQpew0KICAgIHByaW50ZigiQ2hvb3NlIGZvdX
IgbnVtYmVycyA6Iik7DQogICAgc2NhbmYoIiVkIiwmbnVtYmVyKTsNCiAgICB5WzNdID0gIG51bWJl
ciAlIDEwOw0KICAgIHlbMl0gPSAobnVtYmVyIC8gMTApICUgMTA7DQogICAgeVsxXSA9IChudW1iZX
IgLyAxMDApICUgMTA7DQogICAgeVswXSA9IChudW1iZXIgLyAxMDAwKSAlIDEwOw0KICAgIA0KICAg
IGhpdD0wOw0KICAgIGZvcihpPTA7aTw0O2krKyl7DQogICAgICBpZih4W2ldPT15W2ldKXsNCiAgIC
AgICAgaGl0Kys7DQogICAgICB9DQogICAgfQ0KIA0KICAgIGJsb3c9MDsNCiAgICBmb3IoaT0wO2k8
NDtpKyspew0KICAgICAgZm9yKGo9MDtqPDQ7aisrKXsNCglpZihpIT1qICYmIHhbaV09PXlbal0pIH
sNCgkgIGJsb3crKzsNCgl9DQogICAgICB9DQogICAgICANCiAgICB9DQogICAgdHJpYWxzKys7IA0K
ICAgIHByaW50ZigiSGl0cyA6ICVkICwgQmxvd3MgOiAlZFxuIiwgaGl0LCBibG93KTsNCiAgfQ0KIC
BwcmludGYoIlRyaWFscyA6JWRcbiIsdHJpYWxzKTsNCiAgIHByaW50ZigiwLWy8qTPIik7DQogIGZv
cihpPTA7aTw0O2krKykNCiAgICBwcmludGYoIiVkIix4W2ldKTsNCiAgcHJpbnRmKCKkx6S3pL+ho1
xuIik7DQogIHJldHVybiAwOw0KfQ0K
上はBASE64で変換したものです。
このプログラムのアルゴリズムを説明しなければならないのですが、よく理解できません。
特に15行目が何をしているのか理解できていません。
このプログラムのアルゴリズムを説明していただけないでしょうか?
0176デフォルトの名無しさん
2006/12/05(火) 14:31:4615行目は、x[0]〜x[3]に同じものが入っていないかを検査している。
互いに異なるランダムな数字(0〜9)が入っていれば次に進んでいる。
0177173
2006/12/05(火) 14:44:01ありがとうございます。
この部分だけがどうしても分からなかったので、
ここさえ分かれば後は大体自分でも理解できそうです。
本当にありがとうございました。
0178デフォルトの名無しさん
2006/12/05(火) 14:59:14データを送りたいのですができますか?
0179デフォルトの名無しさん
2006/12/05(火) 15:07:400180デフォルトの名無しさん
2006/12/05(火) 15:39:30ワロス
おいおい
0182178
2006/12/05(火) 16:03:13ちなみにwindows側から、linux側に簡単な整数のデータを送りたいのですが
0183デフォルトの名無しさん
2006/12/05(火) 16:04:32ところで、両方のコードを書くのか?
0184178
2006/12/05(火) 16:10:45送信側、受信側で両方のコード書かなきゃだめなんですよね?
0185デフォルトの名無しさん
2006/12/05(火) 16:14:04送信側のコードだけ書いて送信したら、あとは>>178の脳内で勝手に受信するのか?
0186デフォルトの名無しさん
2006/12/05(火) 16:18:38既に稼動している何かにデータを転送するつもりなら 送信側だけだし
そういうシステムを構築する って話なら Linux鯖 & Windows クライアント 両方書くことになるし
初心者に手が出せる規模でもないような気がする…
1対1接続の Windows(鯖のようなピア) ⇔ Windows(クラ) からじゃね?
C言語はできて当然の前提でネットワークは別の難しさがあるかなな
具体的に詰まってからはコッチだな
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/
0187178
2006/12/05(火) 16:32:12ソケットしかないのかなと思ってるんですが、どうなんでしょう・・・
初心者には難しいですかorz
どうしても、学校の製作実験でwindowsからlinuxのほうに
データ送るという処理をやらなければいけなくて
0188デフォルトの名無しさん
2006/12/05(火) 16:40:220189デフォルトの名無しさん
2006/12/05(火) 16:42:00プロトコルが何にせよ、Windows側はCよりもC#やJavaの方がかなり楽だ
と思うよ。学校の実験関係だと言語は選べないかもしれないが。
0190デフォルトの名無しさん
2006/12/05(火) 17:19:440191デフォルトの名無しさん
2006/12/05(火) 17:37:14とすれば、Perl/Ruby/Pythonあたりのスクリプト言語を使うのが
一番手軽だと思う。JavaやC#も可。
まぁ、「整数値を一個渡したい」だけなら、一々クライアントなんぞ手書きせずに
wget http://linux-server/foo.php?number=5
とかでいいんだが、流石にこれじゃダメだよなw
どーしてもCでHTTPクライアント書かないといけないんなら、
WinInet API使うのが比較的楽。
0192デフォルトの名無しさん
2006/12/05(火) 21:39:17(c.cpp)をコマンドプロンプトから実行ファイルにするにはどうすればいいの
でしょうか。
bcc32 a.h b.cpp c.cpp
でいいんでしょうか?
0193デフォルトの名無しさん
2006/12/05(火) 21:47:29includeしたものは必要ない
0194デフォルトの名無しさん
2006/12/05(火) 22:05:55文字列があり、2という文字があったら、8という文字があるまで文字を飛ばしたいと考えています。
(2,8の間と、2,8自体を含まない文字列を返したい)
char[] = "0123456789";
char2[] = "0987654321";
とあり、
charの場合は"019"
char2の場合は"09876543"
と戻して、strcpyしたいのですが、やり方がわかりません。。
strspnでCとEを見つけて、strcatしようと思ったのですが、思ったより効率が悪く、
charのポインタを一つずつ動かしてチェックしようにもその動かし方と比較の方法がわからなくて、、
どなたかわかる方いたら、教えてください。。
0195デフォルトの名無しさん
2006/12/05(火) 22:08:46別にポインタ使わなくても
i文字目はstr[i]で表せるし、比較したいならif(str[i] == '2')でOK
0196も。
2006/12/05(火) 22:11:53教えてください!
0197デフォルトの名無しさん
2006/12/05(火) 22:15:48Cコンパイラ(bcc32.exe)の内部処理
1. #XXXXXの処理
2. 構文解析
3. コード生成
4. リンケージ処理
cppファイルのなかで
#include "a.h"
と書かれていたら、コンパイラは上の1.の処理でファイルa.hを読み込み
#include "a.h"の部分にa.hの内容を展開する。
ファイルa.hの検索は次のようにして行われる。
1. 現在の作業ディレクトリのファイル.\a.hを開く。
2. 1.で.\a.hがなかったら、-Iオプションで指定したディレクトリ(IDIRとする)下の
a.hファイルを探す(IDIR\a.h)。
3. 2.でIDIR\a,hがなかったら「ヘッダーファイルが見つかりません」のメッセージを
出して処理を中止する。
0198デフォルトの名無しさん
2006/12/05(火) 22:17:00\nの文字コードを表す定數って事ですかな?
0199デフォルトの名無しさん
2006/12/05(火) 22:19:50この程度は手書きでいいんじゃね?
↓のような感じで。
void foo(char *dst, const char *src)
{
char c;
int in = 0;
while (c = *src++) {
if (c == '2') in = 1;
else if (c == '8') in = 0;
else if (!in) *dst++ = c;
}
*dst = 0;
}
0200mo.
2006/12/05(火) 22:21:160201194
2006/12/05(火) 22:22:10int main( void ){
const char word[] = "0123456789";
size_t i;
for (i=0;i < strlen(word); i++) {
printf("%s\n",word[i]);
}
return 0;
}
まずこんな感じで、比較する前に1文字ずつ出力してみようと思ったのですが、SEGVしてしまいました。。
printfでこけているようなのですが、理由がわかりません。なぜなのでしょうか?…
0202デフォルトの名無しさん
2006/12/05(火) 22:23:17たぶん'\n'の文字コードを数値で表示しろということなんだろうけど、
宿題スレにでも行ってもらったほうがいいと思う。
0203デフォルトの名無しさん
2006/12/05(火) 22:23:35%sじゃなくて%cにしる
0205デフォルトの名無しさん
2006/12/05(火) 22:24:17%s -> %c
0206デフォルトの名無しさん
2006/12/05(火) 22:24:18word[i]は、char型。
char型の変数の中身を表示する時は、printfの変換書式は%c
0207デフォルトの名無しさん
2006/12/05(火) 22:26:50文字列をヌル終端させるために必要。
0208デフォルトの名無しさん
2006/12/05(火) 22:28:27そうしないと、其の文字列を表示した時、
メモリ上に'\0'が見つかる迄表示し続けてしまう。
0209194
2006/12/05(火) 22:29:30ありがとうございました。頑張ってみます。
0210デフォルトの名無しさん
2006/12/05(火) 22:30:24そう云う事ならこうなるな。
const int newline = '\n';
0211194
2006/12/05(火) 23:19:15>>199さんの関数の場合、呼び出すときに
string[20]
foo(string,"0123456789")
のようにする必要がありますが、
stringの配列の量を定義することが出来ない場合(const charに来る量が不定)、どうすればよいのでしょう?
上記の関数で言えば、char stringを初期化し、dstのアドレスを取得して代入すればstringの配列の量を指定しなくても良いと考えたのですが…
0212デフォルトの名無しさん
2006/12/05(火) 23:28:23char *dst;
dst = malloc(strlen(src)+1);
とでもしる。
0213デフォルトの名無しさん
2006/12/05(火) 23:29:44malloc
0214194
2006/12/05(火) 23:46:260215192
2006/12/06(水) 07:41:30レス有難うございました。
ちなみに
上記のような場合、-oとは何を意味するのでしょうか。
0216デフォルトの名無しさん
2006/12/06(水) 07:56:18あまえてんじゃねえよ。糞が。
-o: 出力ファイル名の指定
0217デフォルトの名無しさん
2006/12/06(水) 07:57:26ファイル名指定
gccで検索したら一番上にくる
http://www.linux.or.jp/JM/html/GNU_gcc/man1/gcc.1.html
0218215
2006/12/06(水) 11:35:330219デフォルトの名無しさん
2006/12/06(水) 12:54:21fp->flagを参照してフラグが立っているかどうか調べているようなんですが、
最初にFILE構造体の中身は0で埋まっていることがコンパイラかOSで保証されているんでしょうか?
0220デフォルトの名無しさん
2006/12/06(水) 13:28:35OSや標準ライブラリのバグを心配してますか?
0221デフォルトの名無しさん
2006/12/06(水) 13:54:30そうだ、と答えれば満足するのか?
その方法は実装依存だが。
一番単純な実装だと、FILE構造体の配列はstaticに取っておく。
そして(実初期化の)staticなオブジェクトは0で初期化されるのが、
C言語の仕様だ。
実際にはそういうオブジェクトは実行ファイル中のBSSセグメントに配置され、
実行時にローダによって0埋めされたり、といったことが行われる。
0222219
2006/12/06(水) 14:07:57たまたまファイルオープンする前からフラグが立っていて困ることはないのかなと思って
そこまでは書かれていなかったので気になったんです
>>221
詳しい説明ありがとうございます、納得できました
0223デフォルトの名無しさん
2006/12/06(水) 15:50:320224デフォルトの名無しさん
2006/12/06(水) 16:14:25少なくともVC7.1(VS2003.NET)までは_iob[]っていうstatic配列だよ。
VC8.0はどうだか知らないが、多分同じだろう。
0225デフォルトの名無しさん
2006/12/06(水) 20:16:45上記のリングバッファのプログラムで最初のエンキューの後のデキューや先頭の表示がうまくいきません。
エンキューの関数内でキューが空の場合の処理が問題だと思うのですがよくわかりません。
どのようにすればいいのでしょうか。
どなたかご指摘よろしくお願いします。
0226ぴゅあ
2006/12/06(水) 21:20:00違うと思うので…
fp->flagのfpが指すものって誰が作ってます?
fopenがFILE構造体のポインタを返すとき
適切に設定されて渡されるのではないのかな
0227デフォルトの名無しさん
2006/12/06(水) 21:47:18えーと。
>>219が言ってるのは、fopen()時に、FILE構造体配列の中の空きスロットを
探す処理のことだろ。
開きスロットかどうかを判断するのにflagメンバが非ゼロかどうかで判断している
ので、どっかで配列全体の少なくともflagメンバは、ゼロに初期化されていなければ
ならないという話。
0229ぴゅあ
2006/12/06(水) 23:36:03ライブラリの中の話ってことね
ならば、実装依存と言えば実装依存ですけど
初期化されてないと困るのはライブラリなので
保証されてるということを信じていいのでは?
実際何処がやっているかはライブラリと一緒に付いてくるスタートアップコードでしょう
(ライブラリに必要な初期化を行う)
>>221とかが言っている辺りは例えOSがそれをやってくれていてもライブラリがやってくれていると思いますよ
(スタートアップのソースコードを見てみればいい)
0230デフォルトの名無しさん
2006/12/06(水) 23:50:540231デフォルトの名無しさん
2006/12/07(木) 00:04:47作られた実行ファイルは問題なく正常動作するのですが、コマンドプロンプト
から bcc32 4char.cpp という形で作られた実行ファイルは正常動作して
くれません。
一体何が原因なのでしょうか。
0232デフォルトの名無しさん
2006/12/07(木) 00:06:17コマンドプロンプトの表示はこんな感じです。
C:\4char>bcc32 4char.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
4char.cpp:
警告 W8004 4char.cpp 100: 'num' に代入した値は使われていない(関数 main() )
警告 W8004 4char.cpp 100: 'j' に代入した値は使われていない(関数 main() )
警告 W8004 4char.cpp 14: 'no' に代入した値は使われていない(関数 main() )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
0233デフォルトの名無しさん
2006/12/07(木) 00:10:210234デフォルトの名無しさん
2006/12/07(木) 00:10:22正常動作してる
警告は問題ない
実際exeが作成されているはず
「エラー」ならコンパイル失敗
0235デフォルトの名無しさん
2006/12/07(木) 00:15:10#define MAX 500
int main(){
FILE *fp;
int ch,chx[MAX]={0};
int i=0,j=0;
int num=0;
int no=0;
int chy[MAX]={0};
static int xxx=0;
char fname[30];
puts("4つ並んだ数字のみを抜き出します。");
puts("対象のファイルを実行ファイルと同じ\n"
"フォルダに置いてください。");
0236231
2006/12/07(木) 00:16:24"---> ");
scanf("%s",fname);
if((fp=fopen(fname,"r"))==NULL)
puts("読出しオープン失敗");
else{
puts("ファイル内容表示");
while((ch=fgetc(fp)) !=EOF){
chx[i++]=ch;
putchar(ch);
}
}
fclose(fp);
0237デフォルトの名無しさん
2006/12/07(木) 00:17:07if(!(chx[i] >='0'&& chx[i] <='9'))
chx[i]=' ';
printf("\n\n\n");
puts("数字と空白のみのはず");
for(i=0;i<MAX;i++)
putchar(chx[i]);
i=0;
while(chx[i] != '\0'){
no=0;
if(chx[i]==' ')
i++;
else{
while(chx[i]!=' '){
no++;
i++;
}
if(no==4){
for(i=i-4;chx[i]>='0'&&chx[i]<='9';i++)
chy[xxx++]=chx[i];
chy[xxx++]='\n';
}
}
}
0238デフォルトの名無しさん
2006/12/07(木) 00:17:43putchar('\n');
printf("xxxは%dです。\n",xxx);
putchar('\n');
puts("4文字の数字のみ");
putchar('\n');
for(i=0;chy[i]!='\0';i++)
putchar(chy[i]);
puts("書き込んだ筈の内容");
if((fp=fopen(fname,"w"))==NULL)
puts("書き込みオープン失敗");
0239デフォルトの名無しさん
2006/12/07(木) 00:19:00for(i=0; chy[i]!='\0' ;i++){
fputc(chy[i],fp);
putchar(chy[i]);
}
fclose(fp);
}
puts("処理は成功しました。");
scanf("%d",&i);
getchar();
return 0;
}
0240231
2006/12/07(木) 00:24:37ボタン一つのメイクで作った実行ファイルからは"処理は成功しました"
の部分まで行くのですが、コマンドプロンプトで作ったものは
"数字と空白のみのはず"のところまでしか行かず、途中で
終了してしまいます。
0241231
2006/12/07(木) 00:36:10書き換える処理です。
三つ連続数字や英文字などは削除します。
コマンドプロンプトで作られた実行ファイルではファイルの内容は
まったく変化しません。
0242デフォルトの名無しさん
2006/12/07(木) 01:04:12indentぐちゃぐちゃだな……
ちゃんと読んでないが、
>>237の先頭のforループによって、chx[]の中身は'0'〜'9'か' 'のみになっており、
\0は含まれない状態になっている。
にもかかわらず、
>>237の9行目のwhileループは、chx[]が\0で終端されていることを期待している
だろ。これではループが正常に終了しない。実際にはchx[]から続くアドレスを
読み続けて、たまたま'\0'があった地点で終了するわけだが、バグだな。
IDEでコンパイルした時は、最適化オプション等の差で、「たまたま」上手く
動いているように見えただけだろう。
0243デフォルトの名無しさん
2006/12/07(木) 01:04:53> if(!(chx[i] >='0'&& chx[i] <='9'))
> chx[i]=' ';
これってMAXまでだから0クリアしたところもスペースに置きかえられてるよね
それなのに
>while(chx[i] != '\0'){
こんな条件にしてるのが問題では
0244デフォルトの名無しさん
2006/12/07(木) 03:12:19#include <stdlib.h>
#define MTX 3/*升目の数(縦横)最大9まで*/
static int board[MTX][MTX];//ボード配列
int p_i,p_j;//直前にマークしたマスの座標x,y
extern int p_maru;//プレイヤーが〇の時は1、×の時は2
0245224
2006/12/07(木) 03:12:56void writeBoard(void){
int i,j;
int maru;//2次元配列から順に出した値を入れておく変数
printf(" ");
for(i = 1; i <= MTX; i++){
printf("[%d]",i);
}
printf("\n");
for(j = 97; j <= 97+MTX-1; j++){
printf("[%c]",j);
for(i = 1; i <= MTX; i++){
maru = board[j-1-96][i-1];
switch(maru){
case2: printf(" ×"); break;
case1: printf(" 〇"); break;
case0: printf(" "); break;
default: break;
}
}
printf("\n");
}
}
0246224
2006/12/07(木) 03:14:15引数str*プレイヤーが指定したマークの位置文字列
戻り値 r1:正常な値だったのでマーク完了
0:不正な値だったのでマークできなかった
*/
int writeMark(char str*){
int r = 1;
int i = str[1] - 48;
int j = str[0] - 96;
if((i < 1 || i > MTX) || (j < 1 || j > MTX)){r = 0;}
else{
if(board[j-1][i-1] == 0){
board[j-1][i-1] = p_maru;
p_i = i; p_j = j;
}
else{r = 0;}
}
return r;
}
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
boardfunc.c:
エラー E2293 boardfunc.c 39: ) が必要
*** 1 errors in Compile ***
と表示されてしまます、この39行目の ) がわかりません
付いてるはずなのですが、エラーを起こしてしまいます。
ご指摘お願いします。
0247最初からになります
2006/12/07(木) 04:26:34#include <stdlib.h>
#define MTX 3/*升目の数(縦横)最大9まで*/
static int board[MTX][MTX];//ボード配列
int p_i,p_j;//直前にマークしたマスの座標x,y
extern int p_maru;//プレイヤーが〇の時は1、×の時は2
0248最初からになります
2006/12/07(木) 04:28:02void writeBoard(void){
int i,j;
int maru;//2次元配列から順に出した値を入れておく変数
printf(" ");
for(i = 1; i <= MTX; i++){
printf("[%d]",i);
}
printf("\n");
for(j = 97; j <= 97+MTX-1; j++){
printf("[%c]",j);
for(i = 1; i <= MTX; i++){
maru = board[j-1-96][i-1];
switch(maru){
case2: printf(" ×"); break;
case1: printf(" 〇"); break;
case0: printf(" "); break;
default: break;
}
}
printf("\n");
}
}
0249最初からになります
2006/12/07(木) 04:28:54引数str*プレイヤーが指定したマークの位置文字列
戻り値 r1:正常な値だったのでマーク完了
0:不正な値だったのでマークできなかった
*/
int writeMark(char* str){
int r = 1;
int i = str[1] - 48;
int j = str[0] - 96;
if((i < 1 || i > MTX) || (j < 1 || j > MTX)){r = 0;}
else{
if(board[j-1][i-1] == 0){
board[j-1][i-1] = p_maru;
p_i = i; p_j = j;
}
else{r = 0;}
}
return r;
}
0250最初からになります
2006/12/07(木) 04:29:52void writeCompMark(void){
int count = 0;
int m_maru = 1;
int i,j;
int r;
int player;
int computer;
int b;
int bmtx_i[100];
int bmtx_j[100];
if(p_maru == 1){m_maru = 2;}
0251最初からになります
2006/12/07(木) 04:30:46for(j = 1; j <= MTX; j++){
//〇の数と×の数をチェック
for(i = 1, player = 0, computer = 0, b =0; i <= MTX; i++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = i;}
}
//プレイヤーがリーチだった場合阻止する
if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = b; p_j = j;
return;
}
}
//縦方向
for(i = 1; i <= MTX; i++){
for(j = 1, player = 0, computer = 0, b =0; j <= MTX; j++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = j;}
}
if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = i; p_j = b;
return;
}
}
0252最初からになります
2006/12/07(木) 04:40:59戻り値 r 1:マークが揃っているか
0:マークはまだ揃っていない
-1:全てのボードが埋まったか、まだ揃っていない
*/
int judge(void){
int i,j;
int r;
int j_maru = board[p_j-1][p_i-1]; //揃ったかどうか判定するマーク
//横方向チェック
for(i = 1, r = 1; i <= MTX; i++){
if(board[p_j-1][i-1] != j_maru){r = 0; break;}
}
if(r){return 1;}
//縦方向チェック
for(j = 1, r = 1; j <= MTX; j++){
if(board[j-1][p_i-1] != j_maru){r = 0; break;}
}
if(r){return 1;}
0253最初からになります
2006/12/07(木) 04:42:26if(p_j == p_i){
for(i = 1, r = 1; i <= MTX; i++){
if(board[i-1][i-1] != j_maru){r = 0; break;}
}
}
if(r){return 1;}
if(p_j+p_i == MTX+1){
for(i = 1, r = 1; i <= MTX; i++){
if(board[i-1][MTX-i] != j_maru){r = 0; break;}
}
}
if(r){return 1;}
//あいこ
for(j = 1, r = -1; j <= MTX; j++){
for(i = 1; i <= MTX; i++){
if(board[j-1][i-1] == 0){return 0;}
}
}
return r;
}
0254最初からになります
2006/12/07(木) 04:43:55警告 W8019 boardfunc.c 95: コードは効果を持たない(関数 writeCompMark )
警告 W8019 boardfunc.c 112: コードは効果を持たない(関数 writeCompMark )
警告 W8019 boardfunc.c 127: コードは効果を持たない(関数 writeCompMark )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
これらが、どうしても、解決しないので誤り箇所を指摘お願いします。
長々、すんまそ。これらを数時間もかけて書きました。
0255ぴゅあ
2006/12/07(木) 08:01:03長々お疲れさま(貼り付けただけ?)ですけど
81,95,112,127行がどれかをしてしてくれた方がありがたい気がするなぁ。。。
2つは確かに指摘されてる通りのものがあるだけど
あと2つは見つけられない。。。
>コードは効果を持たない
>board[j-1][b-1] == m_maru;
は何をしたいと考えたコード?
0256デフォルトの名無しさん
2006/12/07(木) 09:06:22してしてくれた
>2つは確かに指摘されてる通りのものがあるだけど
あるだけど
日本語でどうぞ。
0257231
2006/12/07(木) 11:00:08これは自力ではとても解決できない問題でした。
サンキュウベルマッチです。
0258デフォルトの名無しさん
2006/12/07(木) 14:33:36い)を画面表示し,さらに文字列s1 の後ろに文字列s2 を連結して画面表示するプログラムを
作成しなさい.ただし,文字列s1 と文字列s2 を連結したものを一度文字列s1 に格納してから
表示を行うこと.また,strlen(),strcat()等の関数を使ってはならない.
提出物: プログラム,実行結果(3 回分以上)
2. 以下の処理を行うプログラムを作成しなさい.ただし,文字列s,t の要素数は50 とすること.
strlen(),strcmp()等の関数を使ってはならない.
(1) キーボードから文字列を入力し,文字列s に格納する.
(2) 文字列sを逆順に並べ替えたものを文字列t に格納する.
(3) 文字列sと文字列t が同一であるかどうかを比較し,その結果を画面表示する.
提出物: プログラム,実行結果(3 回分以上)
0259デフォルトの名無しさん
2006/12/07(木) 14:34:330260デフォルトの名無しさん
2006/12/07(木) 14:46:11宿題は宿題スレへ。
0261デフォルトの名無しさん
2006/12/07(木) 14:57:37if文の中に記号をごちゃごちゃ入れられると見づらいので
よっぽどな事が無い限りは、適当な変数に値を入れ
それで比較してくれると可読性が良いので助かる。
0262デフォルトの名無しさん
2006/12/07(木) 15:26:11と
double* a,b;
の違いを教えてください。
0263デフォルトの名無しさん
2006/12/07(木) 15:31:26前者は、b の型は double*
後者は、b の型は double
0264ど初心者
2006/12/07(木) 16:34:49見やすい仕様書の書き方(見やすい例があると嬉しいです)や読み方、見やすいフローチャートの書き方(見やすい例があると嬉しいです)、
入門書理解し終えた人向けへの演習(言語はC)が豊富なサイト等、ご存じの方いらっしゃったら、教えてください。
レベル的には:
紙媒体は入門書なんとか読破、
ポインタ本読破しましたが、ちゃんと理解できてないので四苦八苦しながら演習中、
アルゴリズムの本を、考えた人の頭の良さに脱帽しながら四苦八苦しながら一つずつ理解しようと読み途中
な感じです。
紙媒体は高いので、今月はもう買えないですが、「これは読んどけ!!」的なものも有りましたら、お教え戴ければ幸いです。
0265デフォルトの名無しさん
2006/12/07(木) 16:44:55仕様書に関しては、W3C仕様書やRFCでも見て参考にしたら?
W3C仕様書の日本語訳は
ttp://www.w3.org/Consortium/Translation/Japanese
で見れる。
フローチャートは、はっきり言って今時使わない過去の遺物なので
UMLでも勉強しなされ。「C言語」向きではないがな。
0267デフォルトの名無しさん
2006/12/07(木) 20:12:18これでどう?
代入演算の場所だと思うけど比較演算になってた
コンパイル通しただけでコード自体のチェックはして無いよ
http://sa-wiki.com/upload/src/up0069.txt
0268デフォルトの名無しさん
2006/12/07(木) 21:47:18ごめんなさい、ちょっとテスト
0269デフォルトの名無しさん
2006/12/07(木) 21:56:32なにしたいんだ?
http://sa-wiki.com/upload/index.html
0270デフォルトの名無しさん
2006/12/07(木) 23:08:47みんなはどんなの使ってるの?
0271デフォルトの名無しさん
2006/12/07(木) 23:21:01http://pc8.2ch.net/test/read.cgi/tech/1164154920/
0272デフォルトの名無しさん
2006/12/07(木) 23:26:42単純に許可してる文字か聞いていっちゃえば良いの?
isdigitとif使うとかそんな方法しか思い浮かばない・・・(´・ω・`)
0273デフォルトの名無しさん
2006/12/07(木) 23:58:25単純に許可してる文字か聞いていっちゃえば良いです
特定の許可する文字の種類、数によってisxxxxを使うかifで比較するか
方法は異なると思うけど
ちなみに、「特定の許可する文字」ってなに?
※isxxxxはこれだけあります
isalnum 英数字 (A〜Z,a〜z,0〜9)
isdigit 10進数 (0〜9)
isxdigit 16進数 (A〜F,a〜f,0〜9)
isalpha 英字 (A〜Z,a〜z)
isupper 英大文字 (A〜Z)
islower 英小文字 (a〜z)
ispunct 記号 (!"#$%&'()*+,- /:;<=>?@^_`{|}~)
isspace スペース (0x09〜0x0D,0x20)
0274デフォルトの名無しさん
2006/12/08(金) 01:21:25可変個の引数をさらに次の関数へ渡すことはできますか?
例えば、hogeという関数を作ったとして、
int hoge(const char *format, ...)
{
int ret = sscanf(format, ...); // hogeの可変個引数をで、sscanfに渡したい
// 何か他の処理
return ret;
}
のようにしたいんです。
man stdargしても分かりませんでした。
sscanfした後に、得られた変数がおかしくないかどうかのcheckをしたいのですが、
それが何度も何度も出てくるのでこういう関数が必要です。
0275デフォルトの名無しさん
2006/12/08(金) 01:24:38っ vsscanf
0276デフォルトの名無しさん
2006/12/08(金) 01:36:40あざっす。
ttp://www.kouno.jp/home/c_faq/c15.html#5
検索を続けたらここを発見できました。
int hoge(const char* str, const char* format, ...)
{
va_list argp;
va_start(argp, format);
vsscanf(str, format, argp);
va_end(argp);
}
つか、>>274の引数が書き足りてなかったorz
0277264
2006/12/08(金) 01:46:46>>265
W3C仕様書は、まるで理解できませんでしたorz
いつか理解できるようになるよう、努力してみます。
UML、大変役に立つ言語(?)のようですね。
色々調べて、勉強してみます。
改めて、ありがとうございました。
0278最初からになります
2006/12/08(金) 02:06:01//横方向
for(j = 1; j <= MTX; j++){
//縦方向
for(i = 1; i <= MTX; i++){
//斜め
player = 0;
computer = 0;
b =0;
for(i = 1; i <= MTX; i++){ ←
player = 0;
computer = 0;
b =0;
for(j = 1; j <= MTX; j++){ ←
ここになります。
参考書の見本と比べても間違いはないはずです。
>コードは効果を持たない
>board[j-1][b-1] == m_maru;
すみません。これ自体、意味がわからなく自分でも考えてます。
0279デフォルトの名無しさん
2006/12/08(金) 02:14:51応用が利かないっていう感じです。
コレはよいよ、と言う本ありますか?〜の絵本シリーズでしょうか。
0280最初からになります=278
2006/12/08(金) 02:25:31for(j = 1; j <= MTX; j++){
//〇の数と×の数をチェック
for(i = 1, player = 0, computer = 0, b = 0; i <= MTX; i++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = i;}
}
//プレイヤーがリーチだった場合阻止する
if((player+1 == MTX) && computer == 0){
board[j-1][b-1] == m_maru;
p_i = b; p_j = j;
return;
}
}
//縦方向
for(i = 1; i <= MTX; i++){
for(j = 1, player = 0, computer = 0, b = 0; j <= MTX; j++){
if(board[j-1][i-1] == p_maru){player++;}
else if(board[j-1][i-1] == m_maru){computer++;}
else{b = j;}
}
if((player+1 == MTX) && computer == 0){
board[b-1][i-1] == m_maru;
p_i = i; p_j = b;
return;
}
}
0281最初からになります=278
2006/12/08(金) 02:26:10player = 0;
computer = 0;
b =0;
for(i = 1; i <= MTX; i++){
if(board[i-1][i-1] == p_maru){player++;}
else if(board[i-1][i-1] == m_maru){computer++;}
else{b = i;}
}
if((player+1 == MTX) && computer == 0){
board[b-1][b-1] == m_maru;
p_i = b; p_j = b;
return;
}
player = 0;
computer = 0;
b =0;
for(j = 1; j <= MTX; j++){
if(board[j-1][MTX-j] == p_maru){player++;}
else if(board[j-1][MTX-j] == m_maru){computer++;}
else{b = j;}
}
if((player+1 == MTX) && computer == 0){
board[b-1][MTX-b] == m_maru;
p_i = b; p_j = MTX-b+1;
return;
}
0282最初からになります=278
2006/12/08(金) 02:26:58for(j = 1; j <= MTX; j++){
for(i = 1; i <= MTX; i++){
if(board[j-1][i-1] == 0){
bmtx_i[count] = i;
bmtx_j[count] = j;
count++;
}
}
}
r = rand()%count;
board[bmtx_j[r]-1][bmtx_i[r]-1] = m_maru;
p_i = bmtx_i[r]; p_j = bmtx_j[r];
}
やはり、誤っている箇所を訂正しましたが
警告が出ます。。。ORZ
0283デフォルトの名無しさん
2006/12/08(金) 15:28:09ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
mb[2][3] = { {6, 3, 4}, {5, 1, 2} };
を足すという例題
http://eggrice.no.land.to/up/src/tohoh0078.txt
を改変して
行列
ma[2][3] = { {1, 2, 3}, {4, 5, 6} };
mb[3][2] = { {1, 5}, {5, 3}, {8, 1} };
をかける
という問題をやってみたんですが、
http://eggrice.no.land.to/up/src/tohoh0079.txt
変数を増やさずにやることはできないでしょうか?
0284デフォルトの名無しさん
2006/12/08(金) 16:38:27無理だと思うよ
0286デフォルトの名無しさん
2006/12/08(金) 17:15:05intmain(void)
{
printf("%f\n",10.0+3.0);
printf("%f\n",10.0-3.0);
printf("%f\n",10.0*3.0);
printf("%f\n",10.0/3.0);
printf("%f\n",10.0%3.0);
return0;
}
VC++ 2005 Express Editionでエラーが発生するのですが、エラーを検索してもよくわかりません。
error C2296: '%' : 無効です。左オペランドには型 'double' が指定されています。
printfはdouble型じゃないみたいだし。
0287デフォルトの名無しさん
2006/12/08(金) 17:17:42> printf("%f¥n",10.0%3.0);
こいつが変。浮動小数点を割った余りって何? って話だ。
0288デフォルトの名無しさん
2006/12/08(金) 17:19:37%は整数同士で計算するもの
浮動小数点ならfmodとかいうのがあった気がする
0290デフォルトの名無しさん
2006/12/08(金) 21:31:39typedef struct _tag2{
int x;
int y;
}TAG2;
TAG2 rc1;
typedef struct _tag3{
int xx;
int yy;
}TAG3;
TAG3 rc2;
}TAG;
このような記述は好ましくないでしょうか?
0291デフォルトの名無しさん
2006/12/08(金) 23:18:01識別子名さえ何とかすれば特に問題なしと思われ
0292デフォルトの名無しさん
2006/12/09(土) 00:30:3942.30000→42.3
といったように小数0以下を表示しない方法ってありますか?
0293デフォルトの名無しさん
2006/12/09(土) 00:57:39少なくともほかでも使うヘッダファイルではやめたほうがいいと思う。
その書き方だとC++ではCと違う扱いになるから。
0294デフォルトの名無しさん
2006/12/09(土) 01:12:36#include <stdio.h>
#include <string.h>
#include <ctype.h>
char *FloatToChar(char *buf, char width, double d)
{
char *base = buf, *p;
sprintf(base, "%.*f", width, d);
while(isdigit(*base))
base++;
if(*buf == '.')
base++;
p = base;
if(*base == '0')
base++;
while(*p)
p++;
while(--p >= base)
{
if(*p == '0')
*p = '\0';
else
break;
}
return buf;
}
int main(void)
{
char buf[256];
printf("%s\n", FloatToChar(buf, 10, 123.45));
return 0;
}
0295デフォルトの名無しさん
2006/12/09(土) 01:15:39このスレでそんな高度な要求すると思うのか?
>>292
というわけで、"%.1f"や"%.3g"を試してみたまえ。
0296デフォルトの名無しさん
2006/12/09(土) 04:45:28#include <time.h>
#include <stdlib.h>
#include "janken.h"
#include "boardfunc.h"
extern int p_i,p_j;//直前にマークしたx,y座標
//○×ゲーム
main(){
int p_turn;//プレイヤーのターンの時は1
char p_get[10]; //プレイヤーの入力値
int r;//プレイヤーが揃ったか否かを判定結果
srand(time(NULL));
printf("【○×ゲーム】\n");
do{p_turn = janken();} while(p_turn < 0);
if(p_turn){writeBoard();}
for(;; p_turn = !p_turn){
if(p_turn){ //プレイヤーターン
do{
printf("場所を指定して下さい(例:a2) > ");
scanf("%s",&p_get);
}
while(!writeMark(p_get));
0297デフォルトの名無しさん
2006/12/09(土) 04:47:00}
else{ //コンピュターターン
writwCompMark();
printf("コンピュターは・・・ %c%d\n",p_j+96,p_i);
}
writeBoard();
r = judge();
if(r != 0){break;}
}
printf("\n==========ゲーム終了=========\n");
if(r == -1){printf("\あいこです\n");}
else{
if(p_turn){printf("プレイヤーの勝ち!\n");}
else{printf("プレイヤーの負け!\n");}
}
return 0;
}
警告 W8065 10-4.c 32: プロトタイプ宣言のない関数 'writwCompMark' の呼び出し(関数
main )
janken.c:
boardfunc.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル '_writwCompMark' が未解決(C:\BBB\10-4.OBJ が参照)
どうか、ご助言お願いいたします。
0298デフォルトの名無しさん
2006/12/09(土) 04:54:070299デフォルトの名無しさん
2006/12/09(土) 10:29:460300290
2006/12/09(土) 10:55:18識別子名了解しました。
>>293
違う扱いとはどのようなことでしょうか?
また、上記と同じような意味合いを持つコードを簡潔に
書けるのであればご教授いただきたい。
0301デフォルトの名無しさん
2006/12/09(土) 12:41:25Cでは単にTAG2と書くが、C++ではTAG::TAG2と書くという違いが生じる(TAG3も同じ)。
その差をなくすには、構造体の宣言を外に出せば良い。こうするとC/C++で同じ扱いになる。
typedef struct _tag2 {
int x;
int y;
} TAG2;
typedef struct _tag3 {
int xx;
int yy;
} TAG3;
typedef struct _tag {
TAG2 rc1;
TAG3 rc2;
} TAG;
0303デフォルトの名無しさん
2006/12/09(土) 22:54:44演算結果が算出出来るようなプログラムを作りたいんですが、
どこかにこの手の解説って無いでしょうか(´・ω・`)
0304デフォルトの名無しさん
2006/12/09(土) 22:58:441000桁の変数?
πでも計算するのか
0305デフォルトの名無しさん
2006/12/09(土) 23:12:29多倍長整数とか多倍長演算でぐぐれ
0306デフォルトの名無しさん
2006/12/09(土) 23:38:22構造体配列は
typedef struct 2d {
double c[2];
} 2D;
として
2D *p_A; 2D *p_B;
p_A.c[0]=100; p_A.c[1]=6; p_B.c[0]=200; p_B.c[1]=8;
そして関数func内でp_A.c[0]やp_B.c[1]を扱いたいのですが
func(2D *p_A,2D *p_B)で試してみたんですが駄目です。
0307デフォルトの名無しさん
2006/12/09(土) 23:47:17p_A->c[0]
0308デフォルトの名無しさん
2006/12/09(土) 23:47:59なにをしたいのかよくわからんけど、
p_A->c[0]
とか
(*p_A).c[0]
で参照できると思うけど。ちなみにどちらも同じ意味。
念のためにきくけどp_Aとかp_Bは実体をさしているんだろうな?
0309306
2006/12/09(土) 23:54:36初心者なもので申し訳ないです。
0310デフォルトの名無しさん
2006/12/10(日) 00:14:04その何かが何処かに存在していなければならない。
(staticでない)変数を定義しただけだとその値は不定だというのは知ってるよね。
ポインタもそれは同じ。どこを指しているのか不定。
もしかすると非常に重要なデータのアドレスを指しているかもしれないし、
あるいは次に実行しようとしているコードのアドレスを指しているかもしれない。
なんにしろ、ポインタは初期化しないとならない。
たとえば初期化はこういう風にやる。
2D *p_A;
2D A;
p_A = &A;
Aは2D型の実体としてコンパイラによって領域が確保される。
&Aはそのアドレスだ。
0311306
2006/12/10(日) 00:58:442D A,B;
p_A=&A; p_B=&B;
p_A.c[0]=100; p_A.c[1]=6; p_B.c[0]=200; p_B.c[1]=8;
として
func(&A->c[0],&B->c[0])でしょうか?
0312デフォルトの名無しさん
2006/12/10(日) 01:04:082D *p_A,*p_B;
2D A,B;
p_A=&A; p_B=&B;
p_A->c[0]=100; p_A->c[1]=6; p_B->c[0]=200; p_B->c[1]=8;
func(p_A,p_B);
になる。あるいはもっと簡単に、
2D A,B;
A.c[0]=100; A.c[1]=6; B.c[0]=200; B.c[1]=8;
func(&A,&B);
かな。
0313306
2006/12/10(日) 01:26:02本当にありがとうございます。
0314デフォルトの名無しさん
2006/12/10(日) 01:33:310315デフォルトの名無しさん
2006/12/10(日) 02:22:01助かりました!
0316ぴゅあ
2006/12/10(日) 10:46:22コピーを渡したいのではないからじゃないの?
0317デフォルトの名無しさん
2006/12/10(日) 11:06:410318デフォルトの名無しさん
2006/12/10(日) 13:14:26ソートでもしたいんじゃないの?
関数内で書き換えさせたいなら、参照渡ししかないと思ってるんだけど…違うのかな?
0319317
2006/12/10(日) 13:22:270320デフォルトの名無しさん
2006/12/10(日) 13:24:26勘違いスマソ
0321デフォルトの名無しさん
2006/12/10(日) 13:26:25http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/3135.txt
出力されるnaの値を連続して++したいんですが再帰処理をしたので上手くいきません。
問題の部分とその出力ををうpしたのでお願いします。
0322デフォルトの名無しさん
2006/12/10(日) 13:58:590323デフォルトの名無しさん
2006/12/10(日) 14:20:19ただ、enum_multi_perm関数が全て完了してまた使う場合、i=0はどこに入れればよいでしょうか?
0324デフォルトの名無しさん
2006/12/10(日) 14:29:27>ただ、enum_multi_perm関数が全て完了してまた使う場合、i=0はどこに入れればよいでしょうか?
ではなく
5 5 5 5となってenum_multi_perm関数が終了したあと、またこの関数を使うときにiをまた0から始めて
0 0 0 0
range_y[0]=295.000000,prob_y[0]=1.123596e-002 0 0 0 0
range_y[0]=590.000000,prob_y[0]=1.262467e-004 0 0 0 0
range_y[0]=885.000000,prob_y[0]=1.418502e-006 0 0 0 0
range_y[0]=1180.000000,prob_y[0]=1.593823e-008 0 0 0 0
と計算したいのですが、その場合はi=0という記述をどこに入れればよいのでしょうか?
rangeとprobのデータは別のものへ変えて、この関数を使いたいもので・・・。
0325デフォルトの名無しさん
2006/12/10(日) 14:33:030326デフォルトの名無しさん
2006/12/10(日) 14:37:26iはどこからきたの?naの話ではなかったの?
>>325
そんな関数あったかなぁ
C++ならstd::stringが使えるけど
strspn("0", str)
0328デフォルトの名無しさん
2006/12/10(日) 14:57:59最後に関数を抜けるときにi=0入れたら?
0329ぴゅあ
2006/12/10(日) 15:02:08え!?そうなの?
>>318
そういったところも含められるかも
とかもありとかでだろうと思うけど
たぶん>>314はそういうこととかはあるのか?とか
聞きたかったんだろうと思う
0330デフォルトの名無しさん
2006/12/10(日) 15:02:42ただ、実行してみたところで分かったのですが、生成されるtxtはどうやら上書きされてしまうらしく、さらにログインユーザ名も取得し生成先のパスに組み込まなくてはなりません。
どうしたらよいか知恵を貸していただけませんでしょうか?
また、何かおかしな点がございましたら何なりとご指導くださいませ。。。
int main(void)
{
int i;
for(i=0;i<3;i++){
FILE *file;
file = fopen("C:\\Documents and Settings\\ユーザ名\\デスクトップ\\dummy.txt","w");
fprintf(file,"Lei incorse nella volonta malata di una certa persona, e fu installato dati terribili. \n
Sono agitato molto ed appaio e lo porta sulla Sua schiena? \n Ma sara tale uomo di agio dove? \n Puo essere all'improvviso la Sua persona imminente.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
fprintf(file,"C:Documents and Settings\\ユーザ名\\スタートメニュープログラム\\スタートアップ\\sys.exeを削除してください。問題が解決します。");
fclose(file);
}
return 0;
}
0331デフォルトの名無しさん
2006/12/10(日) 15:07:51追記したいなら"w"->"a"
0332デフォルトの名無しさん
2006/12/10(日) 15:11:38知識もないのにジョークプログラムを作ろうなんて考えるあんたの頭
0333デフォルトの名無しさん
2006/12/10(日) 15:15:46もう少し教えていただけないでしょうか?
0334デフォルトの名無しさん
2006/12/10(日) 15:22:550335デフォルトの名無しさん
2006/12/10(日) 15:25:18>332
0336デフォルトの名無しさん
2006/12/10(日) 16:22:30strcspn()の間違いじゃないか?
0337デフォルトの名無しさん
2006/12/10(日) 17:01:44「0ではない文字を探す」だから、strspn()でいいんじゃないの?
>>327は、引数の順序を間違えた。
strspn(str, "0") こうだね。
0338デフォルトの名無しさん
2006/12/11(月) 01:06:30二通りの方法で実装された、等しい結果を吐く二者に
優劣をつけたいんですが、time()を使った自作の計測器だと
値が細かく(e-300以上)比較になりません。
何かいいアイディアはないでしょうか?
0339デフォルトの名無しさん
2006/12/11(月) 01:11:37まあとりあえず消費したクロック数にすればいいと思うよ
rdtscとかでググってみそ
0340デフォルトの名無しさん
2006/12/11(月) 01:25:58ググって使えそうなものに辿り着きました。
ありがとうございました。
0342デフォルトの名無しさん
2006/12/11(月) 18:27:39どういう風にすればよいのでしょうか。
例えば-10を負の二進数に変換するなどです。
ご回答いただけると助かります。
0343デフォルトの名無しさん
2006/12/11(月) 19:06:11標準関数には無いのでそういう処理を自分で作る。
「ソース書いてクレクレ」なら宿題スレへ。
0344デフォルトの名無しさん
2006/12/11(月) 20:13:52構造体を作る時にアライメントは8バイトバウンダリとすることと
の指定があるのですが、これはいったいどういう意味なのでしょうか。
スレ違いならすみません。
0345デフォルトの名無しさん
2006/12/11(月) 20:24:04ttp://www.log10jp.com/materials/tips/ccpp1.htm
あたりでも読め。
処理系依存だが、#pragma pack(8) みたいなので指定できることが多い。
手動で詰め物をする手もあるが、あんまりお勧めはしない。
0346344
2006/12/11(月) 20:56:520347デフォルトの名無しさん
2006/12/11(月) 21:02:54この内容で式の構文エラーと出てしまい、コンパイルできません。
各構造体変数に三人分ずつ初期化したいのですが。
間違っている部分をご指摘お願い致します。
0348デフォルトの名無しさん
2006/12/11(月) 21:23:23×JIGYOU1[0]={"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"};
WORKER_INFO JIGYOU1[3]={{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"},
{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"},
{"sato",33,1973,2,14,"M",2000,4,1,"12345","98765","eigyou"}};
初期化は定義時に行う
0349347
2006/12/11(月) 21:28:24そうなるんですか。全然わかりませんでした。
有難うございます。助かりました。
0350デフォルトの名無しさん
2006/12/11(月) 21:50:52C/C++では「代入」と「初期化」ってのが構文的に別物なンですよ。
そのように覚えてください。
int a[] = { 0, 1, 2 }; みたいに、宣言と値の設定を同時に行うのが「初期化」
a = 2; みたいに、そうでないのは「代入」
>>348みたいに構造体や配列の初期設定を行うのは「初期化」でのみ許される
構文で、「代入」では出来ないンです。
0351デフォルトの名無しさん
2006/12/11(月) 22:07:380352デフォルトの名無しさん
2006/12/11(月) 22:14:32九々のプログラムなんですがうまく行きません。
関数のvoid kuku(int calc(int,int));という関数の中に
また関数が入っているようなやっかいなものを使わないといけません。
この関数は九々の加算と乗算を表示する関数です。
どうか宜しくご教授ください。
0353デフォルトの名無しさん
2006/12/11(月) 22:20:27「2つのintを引数に取り、intを返す関数」と
「int型の整数」と
「int型の整数」の
3つの引数を渡さないといけない
0354デフォルトの名無しさん
2006/12/11(月) 22:21:56>void kuku(int calc(int,int)){
> printf("%d\n",calc(int,int));
>}
なんだこれ
宣言の部分の int calc(int,int) はイランだろ
void kuku(int x , int y){
printf("%d\n",calc(x , y ) );
}
0355デフォルトの名無しさん
2006/12/11(月) 22:24:59関数ポインタを使う練習?
0356352
2006/12/11(月) 22:29:201) メイン関数
2) 2値の加算関数
3) 2値の乗算関数
4) 九々の加算と乗算を表示する関数
【関数インターフェース】
intsum ( int x1, int x2 ) ;/* 加算関数 (関数値:計算結果) */
intmul (int x1, int x2 ) ;/* 乗算関数 (関数値:計算結果 */
/* 九々の加算と乗算を表示する関数 */
voidkuku ( int calc( int, int ) ) ;
このような形の課題です。この関数を使う必要あるのかと悪戦苦闘しています
宿題スレじゃなくてすみません。
0357352
2006/12/11(月) 22:33:14レスくれた方々、有難うございます!!!
0358デフォルトの名無しさん
2006/12/11(月) 22:34:27関数ポインタ入れんのか
void kuku( int x , int y , int (*calc)( int , int )){
printf("%d\n",calc(x,y));
}
これじゃダメか?
0359デフォルトの名無しさん
2006/12/11(月) 22:35:020360デフォルトの名無しさん
2006/12/11(月) 22:35:540361デフォルトの名無しさん
2006/12/11(月) 23:24:13ゼロであれば上位2バイトに1を代入、ゼロ以外であれば、2を代入する文を示しなさい。
(32bitのデータです)
この処理をビットフィールドでするにはどうすれば良いでしょうか。
ご教授いただけませんか。
0362デフォルトの名無しさん
2006/12/11(月) 23:25:25ここのstage6-3と6-4の四則演算をするにはどうしたらいいか助言いただけないでしょうか?
0363352
2006/12/11(月) 23:26:21ちょい現状では手に負えないっぽかったのでw
#include <stdio.h>
int sum(int x1,int x2){
return (x1+x2);
}
int mul(int x1,int x2){
return (x1*x2);
}
void kuku(int x,int y){
printf("%d + %d = %d\n",x,y,sum(x,y));
printf("%d * %d = %d\n",x,y,mul(x,y));
}
int main(void){
int no1=5,no2=10;
kuku(no1,no2);
return 0;
}
0364デフォルトの名無しさん
2006/12/11(月) 23:33:22多分想定されてたのはこんなプログラムだと思われ
#include <stdio.h>
int sum(int x1, int x2) { return x1 + x2; }
int mul(int x1, int x2) { return x1 * x2; }
void kuku(int (*fn)(int, int), const char *op)
{
int i, j;
for (i = 1; i < 10; ++i)
for (j = 1; j < 10; ++j)
printf("%d %s %d = %d\n", i, op, j, (*fn)(i, j));
}
main()
{
printf("たしざん\n");
kuku(sum, "+");
printf("\nかけざん\n");
kuku(mul, "*");
}
0365デフォルトの名無しさん
2006/12/11(月) 23:36:03>>362
http://pc8.2ch.net/test/read.cgi/tech/1165190320/767
http://pc8.2ch.net/test/read.cgi/tech/1165190320/778
0366デフォルトの名無しさん
2006/12/11(月) 23:41:27>>364
外部からスマソ
それだと選択画面がないんじゃない?
だからたぶんcaseが入るとは思うんだが漏れのない頭じゃ無理す
0368366
2006/12/12(火) 00:02:490369366
2006/12/12(火) 00:07:47問題の問はコンパイルしてから実行すると6−3のような画面にならないとだめってことじゃないのか?
0370デフォルトの名無しさん
2006/12/12(火) 00:12:25アンカーぐらい付けろ
誰に言ってんだ?
0373デフォルトの名無しさん
2006/12/12(火) 00:51:01「6-3のような画面」云々なんて言われても知らんよ。
つーかアンタ誰って感じ。
0374デフォルトの名無しさん
2006/12/12(火) 01:02:27Janeのログだと、ID有りの板の書き込みのテンプレートは一行ごとに
名前<>メル欄<>日付 ID:xxxxxxxxx<>本文(<>スレタイ)
となっていますが、名前やメル欄、本文やスレタイにID:xxxxxxxxxがある場合にも
確実にそのレス番で書き込んだ人のIDを選別するにはどうすればいいでしょうか?
そうそう出現することはないと開き直れば、strchr()やstrstrでも十分なのですが…
0375デフォルトの名無しさん
2006/12/12(火) 01:29:33>>362-369
0376247-253
2006/12/12(火) 01:57:44その都度は自分でも混乱していたので、巧く質問ができませんでした。
なので、再度質問に答えて戴ければ幸いです。
例えば、この中のソースではよく
>>board[j-1][b-1] ようなものが出てきますが
この-1 とは配列からの-1で宜しいのでしょうか?
或るいわ ○×の 1 で - は移動の - なのでしょうか?
0377デフォルトの名無しさん
2006/12/12(火) 02:14:32日本語。
0378デフォルトの名無しさん
2006/12/12(火) 06:42:52配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。
それを修正するために-1してるわけ。
forで配列を回すときは0からの方がいいと思うけどね。
0379173
2006/12/12(火) 13:53:56y[3] = number % 10;
y[2] = (number / 10) % 10;
y[1] = (number / 100) % 10;
y[0] = (number / 1000) % 10;
の(number / 1000) % 10;が何をしているのか分かりません。
どなたか教えていただけないでしょうか?
0380デフォルトの名無しさん
2006/12/12(火) 13:59:381000で割ってから、10で割った余りを計算
y[1]までわかって、y[0]だけわからない理由が謎
0381デフォルトの名無しさん
2006/12/12(火) 14:00:06その商を10で割った余りを求める。
0382379
2006/12/12(火) 14:01:25y[2] = (number / 10) % 10;
y[1] = (number / 100) % 10;
y[0] = (number / 1000) % 10;
の3つが分からなかったのですが、代表でy[0]を書いたのです。
ありがとうございました。
0383デフォルトの名無しさん
2006/12/12(火) 14:02:28y[2]にはnumberの十の位
y[1]にはnumberの百の位
y[0]にはnumberの千の位
の数字が入る
0384379
2006/12/12(火) 14:07:45ありがとうございました。
0385デフォルトの名無しさん
2006/12/12(火) 14:28:320386デフォルトの名無しさん
2006/12/12(火) 14:32:34ラテン語ベースの違う言語は、何故ラテン語じゃないの?と聞いてるようなもんだ
歴史や名前や成立過程気にしなきゃ、似た部分がある違う言語ってだけ
0387名前
2006/12/12(火) 15:32:450388デフォルトの名無しさん
2006/12/12(火) 15:34:12ttp://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB
0389デフォルトの名無しさん
2006/12/12(火) 19:14:29という問題で
ちょっと作ったのですがnを何を入れてもInfintyになってしました。
どこがおかしいのでしょうか教えてください
#include<stdio.h>
main()
{
int i,n;
float s;
printf("n="); scanf("%d",&n);
i=0; s=0;
while (i<=n){
s+=1/(i*i);
++i;
}
printf(n=%d s=%f|n",n,s);
}
i=0
0391389
2006/12/12(火) 19:27:23にしましたがやはりInfintyでした
なんでだろう・・・
0393389
2006/12/12(火) 19:44:55main()
{
int i,n;
double s;
printf("n="); scanf("%d",&n);
i=1; s=0;
while (i<=n){
s+=(double)1/(i*i);
++i;
}
printf(n=%d,s=%f|n",n,s);
}
N=2を代入しようとすると
n=2 s=Inf|n
と出ました・・・
0394デフォルトの名無しさん
2006/12/12(火) 19:47:59それちゃんとコピペできてる?
printfに"が足りてないみたいだけど。
試しにやってみたら動いたぞ。VS.NET2003で。
0396389
2006/12/12(火) 19:56:21ありがとうございました。
もしよければあと1つ教えてくれないでしょうか
上の問題の続きなのですが
(2)ntermからn=1迄の和を求めることを考える。
なんですけど、上のをどういじればいいのでしょうか。
0397デフォルトの名無しさん
2006/12/12(火) 20:01:030398389
2006/12/12(火) 20:02:18入力としてこれから計算する和の項数がntermでした
0399デフォルトの名無しさん
2006/12/12(火) 20:07:31while (i>0){
s+=1.0/(i*i);
--i;
}
ループを逆から回すってこと?
0400389
2006/12/12(火) 20:13:490401389
2006/12/12(火) 20:28:12399のを参照に該当部分を変えたところ
Nに何を入れてもSが1.000・・・
となってしまいます。
なぜでしょうか?
0402デフォルトの名無しさん
2006/12/12(火) 20:33:520403389
2006/12/12(火) 20:36:32main()
{
int i,n;
double s;
printf("n="); scanf("%d",&n);
i=n; s=0.0;
while (i>0){
s+=1.0/(i*i);
--i;
}
printf("n=%d,s=%f|n",n,s);
}
これです
0404デフォルトの名無しさん
2006/12/12(火) 20:36:390405デフォルトの名無しさん
2006/12/12(火) 20:37:580406デフォルトの名無しさん
2006/12/12(火) 20:46:57gccで普通に動いたぞ。
>>395じゃないけどどこの糞コンパイラだそれ。
0407389
2006/12/12(火) 20:51:51これでできました。
みなさん本当にありがとうございました。
0408デフォルトの名無しさん
2006/12/12(火) 20:53:21コンパイラ名を教えろ。
0409389
2006/12/12(火) 20:54:240410247-253
2006/12/12(火) 21:00:51ご返答、ありがとうございます。
>>>配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。
それを修正するために-1してるわけ。
自分なりの解釈なのですが、これは [] の中は0から始まり・・・
参照などする時に1から数えて余るのと、ほぼ意味は同じでしょうか?
>>要素数-1
これが、難しいのですが、今上で述べた事でしょうか?
0411デフォルトの名無しさん
2006/12/12(火) 21:02:34コンパイル前に変更したソースを保存してなかったとか?
よくわからんけどお疲れ。
0412デフォルトの名無しさん
2006/12/12(火) 21:02:56a[5]だったらa[0]〜a[4]まで使える
それさえ知っていれば自ずと全てがわかるはず
0413389
2006/12/12(火) 21:08:00がわかりました。
どうやら操作を間違っていたようです^^
どうもありがとうございました。
0414247-253
2006/12/12(火) 21:28:145でa[0],a[1],a[2],a[3],a[4]ですね。
あと、もう一つわからないのが
>>245->>246に出てくる96や94等です。
これで、何故いきなり97や96が出てくるのかです
入門書に依れば、二次元配列のx方向、y方向それぞれの
位置に変換します。これはどちらも文字列なので、
x方向は1となっていれば数値の1としたいところですが、
文字の「1」なので数値に変換します。
y方向のa,b,c・・・・はそれぞれ数値で表せるので-96を行えば
二次元配列のy方向を表す数値1,2,3に変換できます。
ついでなので、x方向も同じ方法で直します。
文字の「1」は数値で表すと49です。
よって、-48を行えば文字「1」「2」「3」・・・数値1,2,3・・に変換できます。
と記されていますが、突然1は49とか意味が全くわかりません
ご助言、お願い致します。
0415デフォルトの名無しさん
2006/12/12(火) 21:39:54・
・
48(10進) = 30(16進) = '0'
49(10進) = 31(16進) = '1'
・
・
96(10進) = 60(16進) = 'a'
・
・
0416247-253
2006/12/12(火) 21:48:39ありがとうございます。
本にはこれらの事が一切触れられていなかったので
わかりませんでした。
0417デフォルトの名無しさん
2006/12/12(火) 21:53:34int i = str[1] - '0';
int j = str[0] - 'a';
これだと見やすいし数字覚えなくてもいいし。
0418247-253
2006/12/12(火) 22:32:39int i = str[1] - '0';
int j = str[0] - 'a';
は、>>414と同じ事なのでしょうか?
0419デフォルトの名無しさん
2006/12/12(火) 22:55:18int i = str[1] - 48;
int j = str[0] - 96;
の部分と>>417の
int i = str[1] - '0';
int j = str[0] - 'a';
は同じことです。
'0'は数値の48として、'a'は96として使えます。
printf("%c %c\n",'0','a');//0 a
printf("%c %c\n",48,96);//0 a
printf("%d %d\n",'0','a');//48 96
printf("%d %d\n",48,96);//48 96
0420418
2006/12/13(水) 00:56:42こう考えた方が原理の方も理解し易いです。
0421デフォルトの名無しさん
2006/12/13(水) 04:37:210422デフォルトの名無しさん
2006/12/13(水) 06:36:310423デフォルトの名無しさん
2006/12/13(水) 06:53:16charの配列に格納すると解釈していいんだよな。ならばsprintfを使う。
char buf[16];
sprintf(buf, "%x", 'a');
とかやればbufに文字aの16進表記("61")が格納される。
0424デフォルトの名無しさん
2006/12/13(水) 08:41:110425qqqq
2006/12/13(水) 10:52:33実行例のように表示できるプログラムをポインタを
用いて作成,確認せよ.
参考:参考書「基礎C言語」p.115
0426qqqq
2006/12/13(水) 10:55:15bcde
cde
de
e
0427qqqq
2006/12/13(水) 10:56:210428デフォルトの名無しさん
2006/12/13(水) 10:59:18double d;
d=a/b;
みたいにするdが0になっちゃうんですが、直し方を教えて下さい。
0429992
2006/12/13(水) 11:00:11double d;
d = a/b;
0430デフォルトの名無しさん
2006/12/13(水) 11:06:07宿題なら宿題スレへ
0431デフォルトの名無しさん
2006/12/13(水) 11:07:44a,bのint型は変えられないんですが、どうしたらいいでしょうか?
dは0.2みたいな値になることが多いので、int型だと0になってこまります
0432qqqq
2006/12/13(水) 11:07:480433429
2006/12/13(水) 11:08:28d=a/b;// 2/5 = 0.4 -> 0が代入される
aとbをintのままにしたければ代入してdouble型にしてから演算。
d = a;// 2を代入(自動でdouble型の2.0に変換)
d /= b;// 2.0/5 = 0.4 が代入される
0434デフォルトの名無しさん
2006/12/13(水) 11:09:52「キャスト」を調べれば幸せになれるよ
0435デフォルトの名無しさん
2006/12/13(水) 11:11:34できました
ありがとうございました。
0436429
2006/12/13(水) 13:23:51>>434の言うキャストは調べた?
aをdoubleの2.0に変換(キャスト)してからbで割る
d = (double)a/b;
ちなみに double/int は double/double に自動で変換される。
(double)2/5 -> 2.0/5 -> 2.0/5.0 てな具合。
この辺は大事な基礎だからがんばれ。
0437デフォルトの名無しさん
2006/12/13(水) 13:39:460438デフォルトの名無しさん
2006/12/13(水) 13:42:48基数の補数を負の数の表記法として採用すると、最上位桁からの桁上がり(オーバーフロー)を無視すれば、通常の加算処理で負の数の加算(つまり正の数の減算)が行えることになる。
この利点のため、2の補数は多くのコンピュータで負の数の内部表現に採用されている。
0439デフォルトの名無しさん
2006/12/13(水) 14:29:19ゼロであれば上位2バイトに1を代入、ゼロ以外であれば2を代入する式を
ビットフィールドを使って作成したいのですがうまく行きません。
おかしな点をご指摘頂ければとても有り難いです。
http://sa-wiki.com/upload/src/up0080.txt
0440デフォルトの名無しさん
2006/12/13(水) 14:33:32http://pc8.2ch.net/test/read.cgi/tech/1165190320/767
http://pc8.2ch.net/test/read.cgi/tech/1165190320/770
0441437
2006/12/13(水) 14:36:06そういう意味でしたか。
ご解答有難うございます!!!
0442デフォルトの名無しさん
2006/12/13(水) 14:37:12コンパイルが通らない
0443439
2006/12/13(水) 14:46:05出来るんですが、、、。でも値は全然変わらなくて
初期設定どおりに値が表示されてしまいますTT
0444デフォルトの名無しさん
2006/12/13(水) 14:54:46たぶんエンディアンを理解していない
リトルエンディアンとビッグエンディアンについて調べてみた方がいい
void dump(void *p, int n)
{
int i;
for(i=0;i<n;i++)
printf("%02x", *((unsigned char*)p+i));
printf("\n");
}
↑メモリ上での配置を確認できる関数。以下のように使う
dump(&nValue, sizeof(int));
dump(&xyz, sizeof(xyz));
0445デフォルトの名無しさん
2006/12/13(水) 15:17:31つまり、
void nantoka1(double hikisu);
void nantoka2(double hikisu);
main(){
double hikisu;
......
nantoka1(hikisu);
}
void nantoka1(double hikisu){
.....
void nantoka2(double hikisu);
}
0446デフォルトの名無しさん
2006/12/13(水) 15:24:02できるけど書き方が違う。
関数を呼び出すときは型は指定しない。
void nantoka1(double hikisu){
.....
nantoka2(hikisu);
}
0447439
2006/12/13(水) 15:28:05なのですがnValueに関してはff0f ffffとなっています。これは、、、
バイトとしては逆の順番で、そのバイトの中での4ピットについても
逆の順番で格納されているということなのでしょうか。nValueはffff 0fff
と意図していたのですが。
0448デフォルトの名無しさん
2006/12/13(水) 15:32:36即答ありがと
0449デフォルトの名無しさん
2006/12/13(水) 15:46:00リトルエンディアンの環境だとバイトが逆順になる
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
上に書かれている通り、
1byte(8bit)ごとの順番は逆にはならない(12 34 AB CD => CD AB 34 12)
だからソース上で0xffff0fffとしたものは、メモリ上ではff0fffffと格納される
そういえば>>439の12〜15ビット目というのが上位から数えるのか下位からなのかが書いてないからわからん
0450439
2006/12/13(水) 15:58:49です。
0451デフォルトの名無しさん
2006/12/13(水) 16:14:480452デフォルトの名無しさん
2006/12/13(水) 16:17:42変更は2バイトじゃなかった?
0453439
2006/12/13(水) 16:19:030454デフォルトの名無しさん
2006/12/13(水) 16:37:54上位12〜15bitと上位2byteは領域がかぶっているから共用体も使った
typedef struct st_hoge{
unsigned zero :8;
unsigned set :8;
union {
struct {
unsigned n4Bits : 4;
unsigned n12Bits : 12;
}foo;
unsigned short s;
}n16;
}ST_HOGE;
void Func(int *pValue)
{
ST_HOGE *p = (ST_HOGE *)pValue;
if( p->n16.foo.n4Bits ==0 )
{
p->n16.s = 1;
}
else
{
p->n16.s = 2;
}
}
あと上位12〜15bitってことは
int nValue = 0xfff0ffff;
ではないかい?
0455デフォルトの名無しさん
2006/12/13(水) 16:39:53#pragma pack(push, 1)をincludeの下にでも書いておいて
BCCでは動くはず
VCだとどうだったかな
0456453
2006/12/13(水) 17:05:51ありがとうございます。また間違えました。下から数えて12〜15bit
でした。0xffffffffだと0x0002ffffになって、0xffff0fffだと0x00010fff
の形になります。
0457デフォルトの名無しさん
2006/12/13(水) 17:20:36しっかりしてくれよ、無駄に苦労したじゃねーか
でもそうなると話は簡単だ
上の方のエンディアンの話を理解していれば構造体を少し書き換えるだけで動くはず
0458デフォルトの名無しさん
2006/12/13(水) 18:19:441000までの素数を表示するプログラムの第五版のコードを理解しようとしてるんですが、
15行目のcounter++, prime[i] * prime[i] <= no
がどういったことをするのか教えて頂けないでしょうか。
counterをインクリメントするだけの処理なんでしょうか?
0459デフォルトの名無しさん
2006/12/13(水) 18:21:390460458
2006/12/13(水) 18:31:46確かに最後の表示は"乗除"を行った回数ですね。
第四版まではなんとか理解できたけど第五版は理解するのに時間かかりそうです。。。
ありがとうございます。
0461デフォルトの名無しさん
2006/12/13(水) 19:33:07第4版とか第5版って何だ?
0462デフォルトの名無しさん
2006/12/13(水) 20:04:370463デフォルトの名無しさん
2006/12/13(水) 20:08:31戻り値に構造体使う
0464デフォルトの名無しさん
2006/12/13(水) 20:12:12同時に返すんじゃなくて、
for文の中にif文があってそのなかで1つを返して、
for文終了後にもう一つ返したいんですが、if文のなかで値を返すとそこで処理が終わってしまうんで、困ってます
0465デフォルトの名無しさん
2006/12/13(水) 20:13:12マルチスレッド?
0466デフォルトの名無しさん
2006/12/13(水) 20:17:04マルチスレッドというのがわからないですが、ある条件の時のfor文のiの値と
for文の中で加算していったsumの値をmain関数で使いたいんですが
0467デフォルトの名無しさん
2006/12/13(水) 20:17:20for( i=0 ; i< 100 ; i++ )
{
if( 条件) return 戻り値1 …�@
}
return 戻り値2 …�A
�@で戻すと�Aが戻せない
�@で戻した後�Aも戻したい
ということか?
0468デフォルトの名無しさん
2006/12/13(水) 20:18:46そのとおりです
0469デフォルトの名無しさん
2006/12/13(水) 20:22:58提案1
以下の構造体を宣言する
struct return_value
{
戻り値A;
戻り値B;
};
for( i=0 ; i< 100 ; i++ )
{
if( 条件){
return_value.戻り値A = main に返したい値A
この条件が成立したらforを終了させたいなら break をここに入れる
}
}
return_value.戻り値B = main に返したい値B
return return_value; 戻り値Aと戻り値Bが入った構造体を返す
0470デフォルトの名無しさん
2006/12/13(水) 20:32:55できそうですね。ありがとうございます
0471デフォルトの名無しさん
2006/12/13(水) 20:56:04構造体を返そうとすると互換でない型変換ってなってコンパイルできません・・・・
0472デフォルトの名無しさん
2006/12/13(水) 21:08:11char op1[100];
char *p1=str;
int i;
for(;*p1;p1++);
(中略)
printf("!!:%s\n",p1); //!!:104021385231
for(i=0;str<p1 && i<4;i++,p1--);
printf("!!:%s\n",p1); //!!:9104021385231
strncpy(op1,p1,i);
printf("!%s\t\t%d\n",op1,i); //!9040 1
p1が配列strの先頭を差すか、繰り返しが4回起こると終了。
p1が指しているアドレスからi個の文字列を、配列op1にコピー・・・のつもり。
strncpy(op1,p1,i)には"9"だけがコピーされると思っているのですが、
何故か"9040"と入ってしまいます。
1文字だけコピーしてくれない所か、
何故2番目の文字を飛ばしてしまうんでしょうか?
それまでは
52312138
1040
0473デフォルトの名無しさん
2006/12/13(水) 21:09:20それまでは
5231
2138
1040
という風にコピーされています。
0474デフォルトの名無しさん
2006/12/13(水) 21:10:27上のソース(?)をそのまま使っちゃダメだぞ
型宣言
struct return_value
{
int a;
int b;
};
ソース
int main()
{
return_value rv;
rv = func(引数)
}
return_value func(引数)
{
return_value rv;
rv.a = 10;
rv.b = 20;
return rv;
}
のようにしたか?
0475デフォルトの名無しさん
2006/12/13(水) 21:13:449だけだコピーされたから1040が9040になったんじゃないの?
0476458
2006/12/13(水) 21:16:44柴田望洋の参考書で素数を表示するプログラムがだんだん難しくなっていくんです。
最初は乗除する回数が78022回で77423、38678、14622、
そしてさっきの第五版では3774回まで乗除する回数が減っていくんですけど
ギリギリ理解してる程度なので第五版を理解するのを頑張ってます。
0477デフォルトの名無しさん
2006/12/13(水) 21:23:53理解しました。
コピーって9\0じゃ無かったんですねorz
0478デフォルトの名無しさん
2006/12/13(水) 21:25:59そうしてるんですが。エラーがでます
0479デフォルトの名無しさん
2006/12/13(水) 21:32:32じゃアドレスわたす
struct return_value
{
int a;
int b;
};
return_value func( return_value *rv )
ソース
int main()
{
return_value rv;
func(&rv);
・・・・・・
}
void func(return_value *rv)
{
rv->a = 10;
rv->b = 20;
}
0480デフォルトの名無しさん
2006/12/13(水) 23:02:59関数の型structにしたらできました
0481デフォルトの名無しさん
2006/12/13(水) 23:08:19乙サソ
0482デフォルトの名無しさん
2006/12/13(水) 23:39:370483デフォルトの名無しさん
2006/12/13(水) 23:44:15下界の分だけ上乗せすればいい
0484デフォルトの名無しさん
2006/12/14(木) 00:01:11このスレではあんたが馬鹿。
0485デフォルトの名無しさん
2006/12/14(木) 01:24:07このスレだけなのか
0486デフォルトの名無しさん
2006/12/14(木) 01:30:35C++スレならOKだから。
0487デフォルトの名無しさん
2006/12/14(木) 11:31:44カーソルハンドルの
HCURSOR GetCursor(VOID); を
C言語で書きたいのですが、まったく書き方が分りません。
どなたか、教えてください。
初心者です。
0488デフォルトの名無しさん
2006/12/14(木) 12:52:26例えば0x01と0x02を繋げて0x12にするといった感じです
具体的には、2つの領域をもつ文字型配列があって、中には1と2が格納されています。
この文字数値をコードとみなして連結するという処理です。
それぞれから'0'を引き、1の方を4ビット左シフトして双方を足せば良いのかなと思ったのですがうまくいかないので違うのでしょう。
どうすればよいのか途方に暮れています。
どなたかお力添えお願い致します。
0489デフォルトの名無しさん
2006/12/14(木) 13:04:18うまくいかないというならソースを見せろ
あと文字の1は'1'と書いた方がよい。
0490デフォルトの名無しさん
2006/12/14(木) 13:20:38#lnclude<stdio.h>
maln()
{
char b, a[2]={'1','2'};
b=(a[0]-'0')<<4;
b+=a[1]-'0';
printf("%c",b);
}
0491デフォルトの名無しさん
2006/12/14(木) 13:34:55この方法で4バイト文字を表現するのが目的なので実際は4つの領域の配列に入った数字を二つずつまとめてコードにしたいのです。
例えば(コードは適当です)
a['1','2','3','4'];
これを
b[0x01,0x02,0x03,0x04];
このようにするのが最終的な目的です。
0492デフォルトの名無しさん
2006/12/14(木) 13:36:05どういう結果を期待しているんだ?
'1'=0x31, '2'=0x32
printf("%x",b);
と確認したら0x12になるよ
0493デフォルトの名無しさん
2006/12/14(木) 13:40:12>>491をみると
for(i=0;i<4;i++)
b[i] = a[i]-'0';
こうしたいように思える
0494デフォルトの名無しさん
2006/12/14(木) 14:00:024バイト文字ではなく2バイト文字ですね。
それから、先に書いたb配列は間違いで、こちらが正しいです。
1と2と3と4が格納されたa配列から、以下のようなb配列を最終的には用意したいのです。
b[0x12,0x34];
a配列の先頭から2つずつ、'0'を引いて合体させて1つの16進コードを作ってb配列に格納するのが目的です。
0495デフォルトの名無しさん
2006/12/14(木) 14:04:55それなら>>490であってるよ。あえて書くと
char b[2], a[4]={'1','2','3','4'};
for(i=0;i<2;i++) {
b[i]=(a[2*i]-'0')<<4;
b[i]+=a[2*i+1]-'0';
}
0496デフォルトの名無しさん
2006/12/14(木) 21:23:54HCURSOR型がwindows.hで定義されてるから、C言語の呼び出し規約に従って
書けばOKじゃないんでしょうか?
0497デフォルトの名無しさん
2006/12/14(木) 22:42:40マルチして回答貰ってるみたいだからレス返ってこないかと
0498496
2006/12/15(金) 00:20:340499デフォルトの名無しさん
2006/12/15(金) 07:38:16ccコマンドで複数ソースファイルをコンパイルした後に
オブジェクトファイルをリンクさせて実行ファイルを作るときに
リンカーは何を参照して、(incluleしていない)別のソースファイルから作成したオブジェクトファイルを紐付けているのですか?
関数名?
だとしたら全く他のアプリで同じ関数名を使用していたらどうなるのですか?
よろしくお願いします。
0500デフォルトの名無しさん
2006/12/15(金) 07:41:58オブジェクトファイルはアーカイブにまとめて入れています。
0501デフォルトの名無しさん
2006/12/15(金) 10:21:14何と何を紐付けるはなしかな?
リンカーがやることは、
・与えられたオブジェクトファイルをくっつける
・それでもまだ未定義なシンボルがあれば、そのシンボルを持つ
オブジェクトをライブラリからひっぱってきてくっつける
「他のアプリ」とやらが出てくる余地はないと思うですよ。
0502デフォルトの名無しさん
2006/12/15(金) 11:03:360503デフォルトの名無しさん
2006/12/15(金) 11:15:50http://www.stackasterisk.jp/tech/program/c01_07.jsp
0504デフォルトの名無しさん
2006/12/15(金) 12:24:06と、6つの単語がタブで分けられているテキストファイルを読み込み、
char* []の形で単語を順に代入していくプログラムを作りたいのですが、どうすればいいのでしょうか
0505デフォルトの名無しさん
2006/12/15(金) 13:23:35fscanfでググれ
0506デフォルトの名無しさん
2006/12/15(金) 13:49:05レスありがとうございます
具体的に述べると
aaa1.o …main
bbb1.o …main
アーカイブのライブラリに
aaa2.o …sub
bbb2.o …sub
が入っているとします。
aaa1.oとアーカイブからaaaという実行ファイルを作りたいときに
aaa1.cから呼び出している関数と同名の関数が
aaa2.c内でもbbb2.c内でも定義されていたらリンカーはアーカイブ内のどちらを参照するのでしょうか?
0507デフォルトの名無しさん
2006/12/15(金) 13:56:390508デフォルトの名無しさん
2006/12/15(金) 14:49:29ふつうは、同じシンボルを提供している複数のオブジェクトを一つのラ
イブラリに入れたりしない。リンカーはライブラリ内で最初に見付けた
オブジェクトを採用するだけでしょう。
0509デフォルトの名無しさん
2006/12/15(金) 15:18:12>507
ありがとうございます
なるほど。やっぱり一緒にしないですよね…
助かりましたー
0510デフォルトの名無しさん
2006/12/15(金) 16:40:550511デフォルトの名無しさん
2006/12/15(金) 16:42:430512デフォルトの名無しさん
2006/12/15(金) 18:47:07プログラムにある機能を追加するときにどういう設計にしておと容易に追加しやすくなるのかとか
プログラムの一部を変更したときに他の変更箇所をできるだけ少なくするにはどうしたらいいのかとか
いうことを学びたいんですどうしたらいいですか
0513デフォルトの名無しさん
2006/12/15(金) 18:48:40経験あるのみ
0514デフォルトの名無しさん
2006/12/15(金) 18:49:43とりあえず何か作ってみる
完成
もう一度作りなおす
完成
もう一度作りなおす
完成
…
の繰り返しでおk
0515デフォルトの名無しさん
2006/12/15(金) 22:40:19前回入力した値を保持してスルーしてしまうんですが。
yes,noを入力してループから抜け出すかどうか判断するプログラムを書こうとしてます。
0516デフォルトの名無しさん
2006/12/15(金) 22:45:130517デフォルトの名無しさん
2006/12/15(金) 22:45:412. バッファの中身をそのままにしてscanfから呼出元へ戻る
3. その後さらにscanfを呼ぶと、残っているバッファから再び読み込もうとする
4. 1へ戻る。
0518デフォルトの名無しさん
2006/12/15(金) 22:45:45>>1-50の間に答えがあります
0519デフォルトの名無しさん
2006/12/15(金) 22:53:35>>518
変数が数字だと上手くいくようです。yやnと言うような文字変数では上記のような
症状が出ます。なぜでしょうか?
0520デフォルトの名無しさん
2006/12/15(金) 22:55:42うまくいかないコードを貼ってください
0521デフォルトの名無しさん
2006/12/15(金) 22:56:11入力文字列にスペースが含まれているとか
0522デフォルトの名無しさん
2006/12/15(金) 22:57:000523デフォルトの名無しさん
2006/12/15(金) 23:00:530524デフォルトの名無しさん
2006/12/15(金) 23:04:29まずはソースを!
0525デフォルトの名無しさん
2006/12/15(金) 23:07:21char ch='y';
do {
for(i=0; i<10; i++){
str_div[i]=str[k];
k++;
}
str_div[i]='\0';
printf("%s",str_div);
printf("\n続きを表示しますか?(y/n)?\n");
scanf("%c",&ch);
} while(ch=='y');
int型だと上手く行きます。
0526デフォルトの名無しさん
2006/12/15(金) 23:14:30y\n を入力
↓
yを読みこむ
↓
\nを読みこむ
↓
終了
0527デフォルトの名無しさん
2006/12/15(金) 23:23:14#include<stdio.h>
int main(void){
char ch[2]="y";
do{
printf("\nPrint next ? (y/n) :");
scanf("%1s", ch);
}while(ch[0]=='y');
return 0;
}
0528デフォルトの名無しさん
2006/12/15(金) 23:25:28ループから抜けないんですが。
0529デフォルトの名無しさん
2006/12/15(金) 23:30:10失礼しました。その理屈で当たってます。
[ch!='n'にするとループが抜けないんですが]と言う意味です。
0530デフォルトの名無しさん
2006/12/15(金) 23:33:06配列を用いるのはなぜでしょうか?
とりあえず変更してトライしてみます。
0531デフォルトの名無しさん
2006/12/15(金) 23:34:53#include<stdio.h>
#include<stdlib.h>
#define A 100000
void Open();
void Heap();
void DownHeap();
void swap();
void Print();
int length[A];
double ct;
int main(int argc, char *argv[]){
int jk;
if(argc<3){
printf("miss\n");
return(-1);
};
ct=0.0;
jk=atoi(argv[2]);
Open(argv[1]);
Heap(length, jk);
Print(argv[2]);
printf("ct = %.0f\n", ct);
return(0);
};
0532デフォルトの名無しさん
2006/12/15(金) 23:36:17void Open(char *file){
int i;
FILE *fp;
fp=fopen(file,"r");
if(fp==NULL){
printf("ファイルをオープンできない\n");
};
/*ファイルの読み込み*/
for(i=0; i<A; i++){
fscanf(fp,"%d",&length[i]);
};
/*ファイルをクローズ*/
fclose(fp);
};
/*Heap Sort*/
void Heap(int n){
int leaf, root;
leaf=n;ct++;
root=n/2;ct++;
ct++;
while(root>0){
DownHeap(leaf, root);ct++;
root--;ct++;
};
ct++;
while(leaf>0){
swap(0, leaf);ct++;
leaf--;ct++;
DownHeap(leaf, 0);ct++;
};
};
0533デフォルトの名無しさん
2006/12/15(金) 23:36:35成功しました。美しい
0534デフォルトの名無しさん
2006/12/15(金) 23:38:35int i;
i=root*2;ct++;
ct++;
while(i<=leaf){
ct++;
if(i<leaf && length[i+1]>length[i]){
i++;ct++;
};
ct++;
if(length[root]>=length[i]){
break;ct++;
};
swap(root, i);ct++;
root=i;ct++;
i=root*2;ct++;
};
};
void swap(int i, int j){
int temp;
temp=length[i];ct++;
length[i]=length[j];ct++;
length[j]=temp;ct++;
};
0535デフォルトの名無しさん
2006/12/15(金) 23:39:35void Print(char *sm){
int i;
int an;
/*char型をint型に変換*/
an=atoi(sm);
for(i=0; i<an; i++){
printf("%d\n", length[i]);
};
};
以上です。
ソートの部分がおかしいと思うのですが、よくわかりません。
おねがいします。
0536デフォルトの名無しさん
2006/12/15(金) 23:45:43%1sってどんな意味があるのでしょうか?
ちなみに自分が逆の立場なら教えませんがW
0537デフォルトの名無しさん
2006/12/15(金) 23:47:12http://www.linux.or.jp/JM/index.html
0538デフォルトの名無しさん
2006/12/15(金) 23:57:43親切なのかな?W
0539デフォルトの名無しさん
2006/12/16(土) 00:01:581文字の読み取り
0540デフォルトの名無しさん
2006/12/16(土) 00:08:26了解。これから頑張って勉強して行きます。
皆さんありがとうね
0541デフォルトの名無しさん
2006/12/16(土) 01:29:20どこがおかしいか教えていただけないでしょうか?
#include <stdio.h>
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
n=0;
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++){
for(j=1;j<=i-1;j++){
b=i/j;
if(i==b*j){
n=n+i;}
}
if(n==2){
printf("%d\n",j);}
}
}
0542デフォルトの名無しさん
2006/12/16(土) 01:36:280543デフォルトの名無しさん
2006/12/16(土) 01:43:15n=0の位置
n=n+iじゃなくてn=n+1
j<=i-1じゃなくてj<=i
0544デフォルトの名無しさん
2006/12/16(土) 01:43:25色々突っ込み所はあるが…
まず、1は含めちゃ駄目だ。
それと、キャストについての話はおいとくとして、%演算子って知ってる?
それ使うと楽だよ。
0545デフォルトの名無しさん
2006/12/16(土) 01:50:16どうしてか教えていただけませんか?
#include <stdio.h>
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
printf("整数a以下のすべての素数は\n");
n=0;
for(i=1;i<=a;i++){
for(j=1;j<=i;j++){
b=i/j;
if(i==b*j){
n=n+1;}
}
if(n==2){
printf("%d\n",j);}
}
}
C言語習い始めたばかりで、よく知らないんですが
ifとforだけを使っていい方法はないですか
0546デフォルトの名無しさん
2006/12/16(土) 01:52:49http://www.tsg.ne.jp/TT/tsg/c/mansaku/P01.html
見比べてごらん。
0547デフォルトの名無しさん
2006/12/16(土) 01:54:33nで割り切れる数を数えてるんだろ?
だったら数が変わるごとに0に戻してやらなきゃ
0548デフォルトの名無しさん
2006/12/16(土) 01:55:54その素数判定アルゴリズムがわからん。
32ビット以上の素数判定とかしないんなら
素直に2〜(判定する数-1)までのmodが
どれも0にならなきゃ素数でいいんじゃないの。こんな感じに。
#include <stdio.h>
int isprime(int s)
{
int i=2;
while(i<s){
if(!(s%i))
return 0;
i++;
}
return 1;
}
void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++)
if(isprime(i))printf("%d ",i);
}
0549デフォルトの名無しさん
2006/12/16(土) 02:10:52約数の数が2だったら素数ってことかな。
1とその数自身で割った場合だけインクリメントすれば2になる。
0550デフォルトの名無しさん
2006/12/16(土) 02:16:24void main(void)
{
int a,i,j,n;
double b;
printf("整数aを入力してください\na=");
scanf("%d",&a);
n=0;
printf("整数a以下のすべての素数は\n");
for(i=1;i<=a;i++){
n = 0;
for(j=1;j<=i;j++){
b=i/j;
if(i==b*j){
n=n+1;}
}
if(n==2){
printf("%d\n",i);}
}
}
もとのをできるだけ尊重すればこうか。
b=i/j;
if(i==b*j){
のところは
if(i%j==0){
ってするのが普通。
%は剰余演算子って言って余りを求めるから割り切れるかどうか判定するときには便利。
0551デフォルトの名無しさん
2006/12/16(土) 02:30:59printf("%d\n",j);→printf("%d\n",i);とnの位置
の間違えでした。
0552デフォルトの名無しさん
2006/12/16(土) 20:15:22a[3]++;
a[5]++;
a[]という配列があって↑のように1、3、5だけ+1したい時、
もっと簡単に記述する方法はありますか?
0553デフォルトの名無しさん
2006/12/16(土) 20:20:51(*(a+1+i*2))++とでもしてまわせばいいのではないか
0554デフォルトの名無しさん
2006/12/16(土) 20:34:341,3,5だけならそのままの方がいいだろ
奇数番目を、というなら>>553
0555デフォルトの名無しさん
2006/12/16(土) 20:37:34>>553の頭の悪い記述を直してあげると
a[i*2+1]++;
これでOK
0556デフォルトの名無しさん
2006/12/16(土) 20:38:310557デフォルトの名無しさん
2006/12/16(土) 20:38:400558デフォルトの名無しさん
2006/12/16(土) 20:39:39うん、たしかにその通りだね
0559デフォルトの名無しさん
2006/12/16(土) 20:52:110560デフォルトの名無しさん
2006/12/16(土) 20:53:54i<<1&1だよpugya-
0561もしかして釣られた?
2006/12/16(土) 20:57:570562デフォルトの名無しさん
2006/12/16(土) 21:03:010563デフォルトの名無しさん
2006/12/16(土) 21:03:51馬鹿すぎる
0564デフォルトの名無しさん
2006/12/16(土) 21:22:390565デフォルトの名無しさん
2006/12/16(土) 21:42:310566デフォルトの名無しさん
2006/12/16(土) 22:09:430567デフォルトの名無しさん
2006/12/16(土) 22:10:37でもまあたぶんネタだろうな
というわけでひっかかっちゃったおw
0568デフォルトの名無しさん
2006/12/16(土) 22:29:02i<<1の最下位ビットは0だから1とANDを取れば+1と同じになる。
まあコンパイラの最適化の方が賢かろう。
0569デフォルトの名無しさん
2006/12/16(土) 22:33:080570やっぱり釣りなのか?
2006/12/16(土) 22:33:57いや、1とANDをとると常に0になると思うんだ。
0571デフォルトの名無しさん
2006/12/16(土) 22:35:270572デフォルトの名無しさん
2006/12/16(土) 22:43:59次 の 質 問 ど う ぞ
0573デフォルトの名無しさん
2006/12/16(土) 23:15:50ビット演算子を使って奇数を生成する方法を教えてください。
0574デフォルトの名無しさん
2006/12/16(土) 23:17:070575デフォルトの名無しさん
2006/12/17(日) 00:58:510576デフォルトの名無しさん
2006/12/17(日) 01:18:33その10ヶ月間をどう使うかによるだろうけど、真面目に勉強するなら十分すぎる時間じゃないか?
0577576
2006/12/17(日) 01:21:110578デフォルトの名無しさん
2006/12/17(日) 01:43:23独学で真面目に努力するつもりです。
難易度的には如何でしょうか?すれ違いですた、すんまそ。
0579デフォルトの名無しさん
2006/12/17(日) 11:23:27↑これを桁落ちしないように計算するにはどうしたらいいのでしょうか?
教えてください。おねがいします。
0580デフォルトの名無しさん
2006/12/17(日) 12:06:080581579
2006/12/17(日) 13:24:04変形するだけではだめなのでしょうか・・・?
0582デフォルトの名無しさん
2006/12/17(日) 13:33:190583デフォルトの名無しさん
2006/12/17(日) 13:44:31つーかFortranの分野じゃね?
0584579
2006/12/17(日) 13:55:37そもそも正しい答えがわからないので答えを確かめたいのですが、
ウィンドウズの電卓では桁落ちしない正しい答えがでてるのでしょうか?
>>582
その方法を使わせてもらいます。有難うございます!
0585デフォルトの名無しさん
2006/12/17(日) 14:07:56普通に分子の有理化をしろということではないのか。
√(1 + x) - 1 = x / (√(1 + x) + 1)から、
(√(1 + x) - 1) / √(1 + x) = x / (1 + x + √(1 + x))
0586デフォルトの名無しさん
2006/12/17(日) 15:43:390587デフォルトの名無しさん
2006/12/17(日) 16:24:22用途は限られるが使う場面はそれなりにある。
少なくともビットフィールドほどには要らない子ではない。
0588デフォルトの名無しさん
2006/12/17(日) 17:56:45その値を return する関数 pow を作る。
main 関数において、1 から 10 までの数値の
2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。
この上のソースコード教えてください。;;;
0589デフォルトの名無しさん
2006/12/17(日) 17:57:37その値を return する関数 pow を作る。
main 関数において、1 から 10 までの数値の
2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。
この上のソースコード教えてください。;;;
0590デフォルトの名無しさん
2006/12/17(日) 17:59:050591デフォルトの名無しさん
2006/12/17(日) 18:36:570592デフォルトの名無しさん
2006/12/17(日) 19:15:250593デフォルトの名無しさん
2006/12/17(日) 19:19:54fopen, fclose, fread, fscanf, fgets, fseek
これらの関数の使い方を調べて、自分に必要そうなものを選んで使って。
0594デフォルトの名無しさん
2006/12/17(日) 19:54:50どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?
0595デフォルトの名無しさん
2006/12/17(日) 19:57:05つ スレタイ
0596デフォルトの名無しさん
2006/12/17(日) 21:24:42教えてください
番号 国語 数学 英語 合計
1
2
: : : :
: : : :
2次元配列で合計を出して、合計の降順にテーブルを並び替える方法を教えてください。
0597デフォルトの名無しさん
2006/12/17(日) 21:57:44>>590
0598123
2006/12/17(日) 22:31:52エスケープシーケンスを使って、コンソール画面の文字色を変えたり
したいのですが思ったように動きません。
タイプミスではないことを確認するために、
http://www.kumei.ne.jp/c_lang/intro/no_28.htm
猫でも分かる、のサンプルを入力してもダメでした。
実行環境がおかしいのだと思います。
実行時、←↓ この2つの矢印を合わせたような矢印が表示されています。
(たぶん改行を表す矢印)
どこを変更すればいいのでしょうか?
実行環境は、Visual C++で、
OSはXPで、
コンソール画面右上にはC:\WINDOWS\system32\cmd.exeと表示されています。
0599デフォルトの名無しさん
2006/12/17(日) 23:13:29それの前の章で
> エスケープ・シーケンスを受けたときMS-DOSが処理してくれる
ってある通り、MS-DOSではないXPでは処理してくれない
0600123
2006/12/17(日) 23:33:47コンソール画面が出てるのでこれがMS-DOSだと思ってました。
XPは違うんですね。
関連してもう1つ聞きたいのですが、
どうやればエスケープシーケンスのように、
短いコードで文字色を変えたりできますか?
windows.hのSetConsoleTextAttributeなどを使って、
文字色を変えることには成功しているのですが、
コード量が多いため大変です。
エスケープシーケンスのように短く済ませる方法はありませんか?
(SetConsoleTextAttributeをマクロで短くするしかない?)
0601デフォルトの名無しさん
2006/12/17(日) 23:47:43アプリケーションなりライブラリなりを書けばいいんだよ。
0602デフォルトの名無しさん
2006/12/18(月) 00:00:34一番楽なのはcygwin入れてgcc使うことかな
0603123
2006/12/18(月) 00:17:51ここからは自分で進んでいけそうです。
ありがとうございました。
0604デフォルトの名無しさん
2006/12/18(月) 14:49:31{
doublea[4][4];
// sub(a) ; 'double [4][4]' から 'double ** ' に変換できません。
sub((double**)a) ;とエラー出たので、こうしてみたらコンパイルできた。
void sub(double **a)
{
}
これは正しいですか?
0605デフォルトの名無しさん
2006/12/18(月) 14:58:12Tの配列型を実引数に受け取れるのは、Tへのポインタ型の仮引数。
その例ではTにdouble [4]が当てはまる。
typedef double hoge_t[4];
void sub(hoge_t *a);
/* double (*a)[4]と同じ(優先順位の問題で括弧が必要)。仮引数だからdouble a[][4]でも良い */
int main(void)
{
hoge_t a[4]; /* double a[4][4]; と同じ */
sub(a);
}
void sub(hoge_t *a)
{
}
0606デフォルトの名無しさん
2006/12/18(月) 15:03:130Lってどういう意味でしょうか?ゼロですか?
0607デフォルトの名無しさん
2006/12/18(月) 15:03:540608デフォルトの名無しさん
2006/12/18(月) 15:10:510609デフォルトの名無しさん
2006/12/18(月) 15:11:52long 0
これと等価と考えていいでしょうか?
0610デフォルトの名無しさん
2006/12/18(月) 15:42:58サンキュウ。
0611デフォルトの名無しさん
2006/12/18(月) 15:47:39プレーヤーが入力した数と正解を比べて表示しろ
�@正解:正解ですと表示し終了
�A不正解:大きいです。か、小さいです。をし表示を繰り返す
正解は0〜9までの整数一桁 整数には乱数生成を利用しゲーム毎に正解が変化するように
お願いします。どう打てばいいですか?ソースを教えて下さい
0612デフォルトの名無しさん
2006/12/18(月) 15:50:22丸投げなら宿題スレ行け
0613デフォルトの名無しさん
2006/12/18(月) 16:11:070614デフォルトの名無しさん
2006/12/18(月) 17:02:36宿題スレに貼ってくる。
0615デフォルトの名無しさん
2006/12/18(月) 17:04:07int gf[4]={0,1,2,3},count;
int f1(int x,int y){
int f;
f=gf[mlt(x,y)]^gf[x]^1;
if(f==0) count++;
return count;
}
int f2(int x,y){...}
int f3(int x,y){...}
...
int f100000(x,y){...}
main(){
int x,y;
for(x=0;x<4;x++){for(y=0;y<4;y++)f1(x,y)}
print("%d\n",count);
count=0;
for(...){ for(...) f2(...) }
print("%d\n",count);
}
.......
for....{ f100000 }
print(...);
}
こんな書き方してますが、これを関数を要素にもつ配列と定義できないでしょうか?
またこのとき関数に値を渡す方法が分からないのですがどなたか教えてくださいませ。
0616デフォルトの名無しさん
2006/12/18(月) 17:10:28typedef int (*MyFuncPtr_t)(int x, int y);
int main(void)
{
MyFuncPtr_t fncArray[] = { f2, f3, .... (略), ... f1000 };
int i, x, y;
/* x, y を適当に設定 */
for (i=0; i<sizeof(fncArray)/sizeof(fncArray[0]); i++)
(*fncArray[i])(x, y);
return 0;
}
0617デフォルトの名無しさん
2006/12/18(月) 17:16:470618デフォルトの名無しさん
2006/12/18(月) 17:25:41この先、シリアルポートを使ってハードウェアを動かす為には
どのくらい掛かるでしょうか?時間的に。
0619デフォルトの名無しさん
2006/12/18(月) 17:29:290620デフォルトの名無しさん
2006/12/18(月) 17:55:570621デフォルトの名無しさん
2006/12/18(月) 17:58:05strcmp
0622デフォルトの名無しさん
2006/12/18(月) 18:06:24diffを作るとの同じぐらい面倒な処理が必要で、期待される結果もアル
ゴリズムも一意に決まらない。
0623デフォルトの名無しさん
2006/12/18(月) 18:42:45どうもありがとうございます。
0624デフォルトの名無しさん
2006/12/18(月) 18:58:24教えてください
0625デフォルトの名無しさん
2006/12/18(月) 19:03:29diffの出力を使って加工する。
diff -D NAME(または--ifdef=NAME)した出力から #else /* NAME */を削って
cpp -D NAMEすればいいんだが、
cのソースとかだと#includeとかが処理されちゃうんで工夫して。
0626デフォルトの名無しさん
2006/12/18(月) 19:40:21ポインタとかじゃない、とシッタカぶってみる。
大体、型が合わない場合にエラーが出るね、とシッタカぶってみる。
0627デフォルトの名無しさん
2006/12/18(月) 20:45:48このコードを引数なしで実行した時、argv[1][0]に'\0'が格納される事は保障されますか?
0628デフォルトの名無しさん
2006/12/18(月) 20:48:06コンパイラの実装依存
0629デフォルトの名無しさん
2006/12/18(月) 20:55:56三項演算子でも使うかね・・・
0630デフォルトの名無しさん
2006/12/18(月) 21:43:13というか、引数なしならargv[0]までしかないわけで、
argv[1]なんて参照したらやばくないか?
0631デフォルトの名無しさん
2006/12/18(月) 21:54:59引数 int argc で判断してください
>>629
どちら様?
0632デフォルトの名無しさん
2006/12/18(月) 23:17:33どうすればいいですか?
Linuxです。
具体的には、pidofで返されるpidを取得したいです。
0633デフォルトの名無しさん
2006/12/19(火) 01:12:18文字列(moji[X][Y])の1行目は、strtok(*moji, ",")で一度抜き出した後
NULLを使って全て摘出出来たのですが、2行目以降(moji[X+1][Y])は
何を対象にstrtokを用いたら良いですか?間接参照じゃ上手くいかなくて・・・
0634デフォルトの名無しさん
2006/12/19(火) 04:35:55system()ではなくpopen()を使いなされ
0635デフォルトの名無しさん
2006/12/19(火) 06:16:19ソースみたいなものを出力したいのですが、インデントを入れる際
printf("\t");
でタブを出力したら半角8文字分開くのを4文字分にしたいのですが
方法が分かりません。
こういう時ってどうするのが一般的なんでしょうか?
0636デフォルトの名無しさん
2006/12/19(火) 06:31:020637デフォルトの名無しさん
2006/12/19(火) 07:48:57これを理解しないと次の授業からついてこれなくなるといわれたのですが、
何をしているのかが全くわかりません。どなたかコメントで解説つけていただけないでしょうか。
0638デフォルトの名無しさん
2006/12/19(火) 08:16:34マルチ
0639632
2006/12/19(火) 08:41:31おはようございます。
恥ずかしながらマニュアルを読んでもよく分からないので
帰宅したら書いて試してみます。
ありがとうございました!
0640デフォルトの名無しさん
2006/12/19(火) 09:56:51char buf[100];
while (fgets(buf, sizeof(buf), fp)) {
printf("%s", buf);
}
pclose(fp);
0641デフォルトの名無しさん
2006/12/19(火) 16:58:520642デフォルトの名無しさん
2006/12/19(火) 17:25:130643デフォルトの名無しさん
2006/12/19(火) 17:30:500644デフォルトの名無しさん
2006/12/19(火) 17:55:55じゃあまた読み直そう。
0645デフォルトの名無しさん
2006/12/19(火) 18:56:010646HELP
2006/12/19(火) 20:24:43core 解析してたら、この記述にぶちあたってしまた、
俺も、こんな記述したことないから C++ の拡張 にでもあるかな?
とオモって、調べたがわからなかった。。。
たぶん、core の 最初のトリガは
int func( int im char * cp)
{
char cData[i];
で、 cData に 文字 iバイト転送 & ヌルバイト を書いて
その NULLバイト が cData[i+1] を壊し、それが めぐりめぐって
core となったようなかんじなのだが
そもそも auto 変数のサイズを 動的に 変数で指定OK?????????
0647デフォルトの名無しさん
2006/12/19(火) 20:26:500648デフォルトの名無しさん
2006/12/19(火) 20:27:27C99で可能だけど
0649デフォルトの名無しさん
2006/12/19(火) 20:28:24それは何度も言った
0650HELP
2006/12/19(火) 20:29:02おおあせり中、、、
そうなんだ、これ C99でおkなんだ
とりあえず Thanks,Thanks,Thanks,Thanks,
0651デフォルトの名無しさん
2006/12/19(火) 20:34:080652デフォルトの名無しさん
2006/12/19(火) 23:01:53無理して日本語で書いてるのか?余計わかんねーよ。
英語でおk。
0654デフォルトの名無しさん
2006/12/20(水) 10:53:15#include <stdio.h>
main(){return system("perl -ne 'print eval($_).qq(\n)'");}
0655デフォルトの名無しさん
2006/12/21(木) 00:18:51一番いい参考書は 何がお勧めですか? 教えて下さいm(_ _)m
0656デフォルトの名無しさん
2006/12/21(木) 00:53:53どんな本にも書いてあるようなCの文法的なことだけでなく
プログラミングスタイルやコメントの付け方デバッガの使い方
makefileの作り方まで書かれている。
この本で学べば天才ハッカーになれること間違いなし今すぐ10冊程注文しなさい
0657デフォルトの名無しさん
2006/12/21(木) 01:01:580658デフォルトの名無しさん
2006/12/21(木) 03:07:33ネットで十分じゃないのか?
ネットで独学しながら、アマゾンのコメントを参考にたまに本屋で立ち読みして
良書、悪書もわかってくるよ
入門用サイトも10個以上はあるし、自分が読んでみて、理解しやすいサイトをメインに
わからない考え方、使い方は他の入門用サイトで補いながら勉強するぐらいで十分だよ
あと日本語だけに限定しないで、翻訳サイトを駆使して英語のサイトも考慮入れれば
解決できない問題はないと思う
0659デフォルトの名無しさん
2006/12/21(木) 05:33:23http://wisdom.sakura.ne.jp/で基本身に付く
あとは、本も買ったけど、入門書なら技術評論社の「c言語入門本物志向が身に付く」
ってのが、入門書としては良いできと思う。技術評論社の本はあんまりはずれない。
あと、K&Rは、持ってないと馬鹿にされるが、もう今じゃ、別に持っててももって無くても
どっちでも良い。
まぁ、何にしても、ソースを書きまくるしか身にはつかんね。
俺も、結局どうやって身に付いていったのか自分でもわからん。
だから、これっていう本も知らん。
0660デフォルトの名無しさん
2006/12/21(木) 11:59:130661デフォルトの名無しさん
2006/12/21(木) 12:29:56計算するプログラムを作っているのですが、表示がズレてうまくいきません。
分からないなりにTabやらで色々試してみたのですがやはりダメな様です。
入門者な上に計画的に作ってないので変数など分かりにくいかもしれませんが、
私が書いたプログラムは以下
ttp://up.spawn.jp/file/up59981.txt
最後の表?というか一覧がズレずにきれいに表示される様にするにはどんな工夫が必要なのでしょうか?
加えて入力の終了条件も苦し紛れに数量0にしましたが、
よくありそうなqの入力で終了という様にした場合は
if(a[i].hinmei == 'q')
とかではおかしいでしょうか?さっき試した時にはよく分からないエラーが出たのですが
構文的におかしいという事ですかね・・・
どなたかアドバイスお願いします。
0662デフォルトの名無しさん
2006/12/21(木) 12:49:09文字列(%s)も長さ指定できる。%10s とか、 %-10sとか
そしてタブは使わずに数えて入れればそろうべ
0663デフォルトの名無しさん
2006/12/21(木) 13:17:11>if(a[i].hinmei == 'q')
if( strcmpi(a[i].hinmei,"p") == 0) か if(strcmp(a[i].hinmei,"p")==0)
0664デフォルトの名無しさん
2006/12/21(木) 13:17:52p と q 間違えた
if( strcmpi(a[i].hinmei,"q") == 0) か if(strcmp(a[i].hinmei,"q")==0)
0666デフォルトの名無しさん
2006/12/21(木) 15:11:36引数でデータ格納先アドレスをもらいそこに格納する方法と、
returnで値を返す方法とありますが、
みなさんはどのように使い分けていますか?
0667デフォルトの名無しさん
2006/12/21(木) 15:15:350668デフォルトの名無しさん
2006/12/21(木) 15:23:14代入するのが大変そうなデータだったりするなら参照で
0669デフォルトの名無しさん
2006/12/21(木) 15:25:050670デフォルトの名無しさん
2006/12/21(木) 16:12:44うん
一つしか返せないからね
0671デフォルトの名無しさん
2006/12/21(木) 16:21:44「オン状態の最上位ビットを探しそこ以下をオンにする」という一つ式を書くとすると
どういうのがあるのだろうかと気になって考えています。
一応自分はこう作ってみましたが、他にはどのようなものがあるでしょうか。
a=0x2c; //00101100
(a&0x80==0x80)*0x80
+(a&0x80==0x80)|(a&0x40==0x40)*0x40
+(a&0x40==0x40)|(a&0x20==0x20)*0x20
+(a&0x20==0x20)|(a&0x10==0x10)*0x10
+(a&0x10==0x10)|(a&0x08==0x08)*0x08
+(a&0x08==0x08)|(a&0x04==0x04)*0x04
+(a&0x04==0x04)|(a&0x02==0x02)*0x02
+(a&0x02==0x02)|(a&0x01==0x01)*0x01;
//00111111
冗長すぎますね…
0672デフォルトの名無しさん
2006/12/21(木) 16:54:42b=0x80;
for(i=0;i<8;i++){
if((a&b)!=0)break;
b>>1;
}
for(;i<8;i++){
a|=b;
}
0673デフォルトの名無しさん
2006/12/21(木) 16:57:52b>>1;
を
b>>=1;
に
「オン状態の最上位ビットを探し」と「そこ以下をオンにする」を分けただけ
ビット演算は使い方違うかもしれないけど、流れを汲んでもらえれば
0674デフォルトの名無しさん
2006/12/21(木) 17:07:19;
b -= 1;
0675デフォルトの名無しさん
2006/12/21(木) 17:54:178bit程度であれば、テーブルを用意しておくのがベターかも。
0676デフォルトの名無しさん
2006/12/21(木) 19:19:09こういうプログラミングが楽しくなってきたらこっちにもおいで。
【高速化】ビット演算 0x02
http://pc8.2ch.net/test/read.cgi/tech/1158367586/
0677デフォルトの名無しさん
2006/12/21(木) 19:20:47(*pointer)++と*(pointer++)のどっちになりましたっけ?
0678デフォルトの名無しさん
2006/12/21(木) 19:28:36前者。
0679678
2006/12/21(木) 19:29:59ポインタの先が参照されたあとポインタがインクリメントされる。
0680デフォルトの名無しさん
2006/12/21(木) 19:43:480681デフォルトの名無しさん
2006/12/21(木) 21:16:06再帰でやろうとしてたんですがうまくいかず。
実際のところはどういったアルゴリズムで動いてるんですか?
0682デフォルトの名無しさん
2006/12/21(木) 21:18:030684デフォルトの名無しさん
2006/12/21(木) 21:28:02これが後の方にある項で最も内側にある括弧部分。
ループでできると思う。
0685デフォルトの名無しさん
2006/12/21(木) 21:29:30http://fxp.hp.infoseek.co.jp/arti/parser.html
がんばって検索すれば、こういうのがちょくちょく見つかる。
0686ぼるじょあ ◆yBEncckFOU
2006/12/21(木) 21:30:41最低で250万までなら余裕で出せるお
肛○のなかに発射してしばらく挿入したままで余韻を味わって
最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
掃除して貰いたいお・・・はあ・・・。
0687デフォルトの名無しさん
2006/12/21(木) 21:30:580689デフォルトの名無しさん
2006/12/21(木) 21:33:40おかしい人かと思った。
0690デフォルトの名無しさん
2006/12/21(木) 21:34:020691デフォルトの名無しさん
2006/12/21(木) 21:36:51続版では消えてんのかな
0692デフォルトの名無しさん
2006/12/21(木) 21:38:400693デフォルトの名無しさん
2006/12/21(木) 21:40:31この板内ならコピペとして使えるな
0694デフォルトの名無しさん
2006/12/21(木) 21:57:05日本語変だな
最低で 〜までなら 余裕で
結局250万は上限なのか下限なのか
0695デフォルトの名無しさん
2006/12/21(木) 21:57:40ディレクトリにある画像ファイルを出力するプログラムはどう書けばいいのでしょうか
簡単そうなのに調べても全然見つかりませぬ
0696デフォルトの名無しさん
2006/12/21(木) 22:00:500697デフォルトの名無しさん
2006/12/21(木) 22:02:08出力するとは具体的に何をすることか説明せよ。
0698デフォルトの名無しさん
2006/12/21(木) 22:04:59本当に0が入力された場合とエラーの場合ってどうやって見分けるの?
0699デフォルトの名無しさん
2006/12/21(木) 22:12:060700デフォルトの名無しさん
2006/12/21(木) 22:16:16xpeintというもので描いた画像です
その画像を他のテキストファイルに書き込んで、
そのテキストファイルを開いて出力したいです
0701デフォルトの名無しさん
2006/12/21(木) 22:16:37ググってみた
こんな変数があったんですね
0702デフォルトの名無しさん
2006/12/21(木) 22:18:33実に滑稽だな
ム板にきたかいがある
0703デフォルトの名無しさん
2006/12/21(木) 22:30:55とりあえず8bit決めうち
a |= a>>1;
a |= a>>2;
a |= a>>4;
bit演算の基礎テクニックだから覚えておくと役に立つかもよ
0704デフォルトの名無しさん
2006/12/21(木) 22:37:06a|a>>1|a>>2|a>>3...
これだけでわかる人も多いでしょうが一応…
aが10100の場合
10100
1010
101
10
1
0
...
を論理積するので最上位ビットがシフトダウンして一つずつ当てはまっていきます
0705デフォルトの名無しさん
2006/12/21(木) 22:38:170706デフォルトの名無しさん
2006/12/21(木) 22:49:40大丈夫、君の方が効率悪いから被ってない。
0707デフォルトの名無しさん
2006/12/21(木) 22:58:30・・・まあ誰しも疲れている日があるさ
0708デフォルトの名無しさん
2006/12/21(木) 23:29:11printf("%02d",n);
}
int main(){
func(2);
}
これのコードを実行すると02と表示されるじゃないですか
ここで表示されている文字列と同一の(変数は変数として受け取る)文字列を作成するマクロ関数ってできますか?
#define FUNC(n) #n
ここまでは書けたんですけど、0で埋める処理のやり方がよくわかりません
教えてください
0709デフォルトの名無しさん
2006/12/21(木) 23:47:560710デフォルトの名無しさん
2006/12/22(金) 00:04:43メモリ上に配列としてロードしたくてreallocを使おうと思ったのですが
(mallocしてreallocで領域を拡張しまくる)
reallocがうまく動きません
たとえば、
char *str = (char *)malloc(sizeof(char) * 8);
str = "foo";
printf("%s\n", str);
str = (char *)realloc(str, sizeof(char) * 16);
str = "foobarbaz";
printf("%s\n", str);
↓
fatalerror - called with threadlist_ix -1
Hangup
となってしまいます…gdbで調べたらSIGSEGVとかで
セグメンテーションフォールトのようです
質問1:reallocの使い方はこれで合っていますか?(環境はCygwin + gccです)
質問2:プログラムの最初において
大きさのわからないファイルを全部メモリ上にロードしておいて、
実行終了までfreeする可能性が全く無い場合、
しかもメモリ上には配列で持っておきたい場合に
reallocで領域を拡張するほかに
良い方法があればご教授いただけませんか?
以前mallocの実装を習ったときに聞いた
sbrkというシステムコールが使えそうなんですが…
以上二点、教えてください。お願いします。
0711デフォルトの名無しさん
2006/12/22(金) 00:36:12大間違い。2行目のstr="foo";で、メモリリークしてる。
mallocで確保したポインタが失われている。
さらに、文字列リテラルのアドレスに対して、
reallocしたら、そりゃあ何が起こるかわからない。
SEGVも当然。
0712デフォルトの名無しさん
2006/12/22(金) 00:37:44質問2に答えてなかったな。
通常reallocを使うのがいいと思う。
sbrkはシステムコールというだけあって、移植性が低い。
どうせsbrkを下請けに使うんだからmalloc系を使うべし。
0713デフォルトの名無しさん
2006/12/22(金) 00:53:28即レスありがとうございます!
質問1について:strcpyしないとだめですよね…忘れてました
しょうもない質問してすいませんでした
質問2について:やっぱりreallocですか。
プログラム中で一番最初にmallocで得たポインタを
reallocし続けると、同じ先頭番地から
どんどんヒープが伸びていく
(つまりreallocしても全く同じポインタが返される)
と思っていたのですが、試してみるとそうでもありませんでした。
というわけでreallocするとメモリのフラグメンテーションが
起こりまくるのではないかと思っていたのですが
しょうがないですね…
ありがとうございました。
0714デフォルトの名無しさん
2006/12/22(金) 01:09:11ちょっと厄介だが、realloc()でサイズを増やすときにちまちま増やさずに多めに増やすといい。
C++のvectorの戦略も参考になるかもしれない。
0715デフォルトの名無しさん
2006/12/22(金) 01:14:48とある関数Aで文字列定数のアドレスをポインタAに代入した後、
他の関数BやCでポインタAを参照した場合、文字列定数のアドレスが
有効だということは保障されていますか?
0716デフォルトの名無しさん
2006/12/22(金) 01:17:39// こういう使い方?
static inline const char * func() {return "ABC";}
void someFunc()
{
printf("%s\n", func());
}
// 全く問題ない。
0718デフォルトの名無しさん
2006/12/22(金) 02:59:28人間のウンチでしょうか?
0719デフォルトの名無しさん
2006/12/22(金) 08:06:07説明のしかたが悪かったですね
「表示される文字列と同等の文字列」へのポインタがほしかったんです
お手数をかけてしまって申し訳ないのですが、なにとぞ
0720デフォルトの名無しさん
2006/12/22(金) 08:26:06sprintf()って話か?
0721デフォルトの名無しさん
2006/12/22(金) 09:27:59いきなりですが学校の課題で年賀状のあたり番号をチェックするという
プログラムを作っています。
そこで当選番号の数字を数字を入力するという作業が必要になるのでそのプログラムを
作成しようとしているのですが作れませんOTL
具体的に言うと
1等は6桁の数字なんですが文字も打てるようになってしまっています
文字を打つとはじくようにしたいです。
あと6桁という限定が上手くいかないですOTL
5桁でも通過してしまうし・・・・
0722デフォルトの名無しさん
2006/12/22(金) 09:32:24宿題スレ行ってみれば?
0723721
2006/12/22(金) 09:33:42ところだけ書き出しておきますのでどこが悪いか見ていただけると幸いです
/*年賀状の当選番号を入力*/
for(i=0;i<=3;i++){
printf("%d等の年賀状当選番号を入力してください。\n",i+1);
if(i<3)
printf("%d等は%d桁です。\n",i+1,6-i);
if(i==3)
printf("4等は2桁です。\n");
while(rank==0){
scanf("%ld",&tousen[i]);
if(tousen[i]<=999999 && i==0 && tousen[i]>=100000)/*1等の当選番号を入力(*指定されるべきである*/
rank=1;
else if(tousen[i]<=99999 && i==1 && tousen[i]>=10000)/*2等の当選番号を入力*/
rank=1;
else if(tousen[i]<=9999 && i==2 && tousen[i]>=1000)/*3等の当選番号を入力*/
rank=1;
else if(tousen[i]<=99 && i==3 && tousen[i]>=10)/*4等の当選番号を入力*/
rank=1;
else
printf("桁数が違いますねぇ\n");/*桁数が違った時ははじくようにする*/
}
rank=0;
}
0724デフォルトの名無しさん
2006/12/22(金) 10:01:19と書いた方が分かりやすい
上限と加減の間に別の差し込んで、わざととしか思えない
0725デフォルトの名無しさん
2006/12/22(金) 10:05:37forでも使って全部チェックしてみたら〜?
0726721
2006/12/22(金) 10:26:18isalphaだとうまく書けません・・・
0727デフォルトの名無しさん
2006/12/22(金) 10:40:21どうやってるのか書いてくれれば指摘できるが・・・
0728デフォルトの名無しさん
2006/12/22(金) 10:54:17この時点でisdigitなんかは意味ないわけだが
0729デフォルトの名無しさん
2006/12/22(金) 10:54:40scanfの%ldで読み込んでるところに文字列が入力されると
文字列は読み込まれずそのままバッファに残ってしまう。
次のscanfの呼び出しの時も残った文字列バッファを読み込もうとしてエラーを起こすから
半永久的な無限ループを起こす。(scanfが糞だと言われる所以の1つ)
文字列の入力をはじきたいならscanfの返り値を読んでちゃんと読み込めてなかったら
バッファ内のデータをいったん全部読み飛ばす(scanf("%s",tmp)とかで)か、
scanfの入力を一度%sで読み込んで、文字列がすべて数値列ならatoiで数値に変換するとかすればいい。
0730721
2006/12/22(金) 11:52:370731デフォルトの名無しさん
2006/12/22(金) 12:06:59期待通り動きません、とか書けよ。
0732デフォルトの名無しさん
2006/12/22(金) 12:09:32ここに出てるヒントで俺なら作れる
けど宿題スレじゃないんで教えてあげない
悔しかったら自分で調べろ
0733ぼるじょあ ◆yBEncckFOU
2006/12/22(金) 12:13:34(・3・)b エェー ここにソースをうpするといいお
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
まじめに答えて欲しいときはこちらへ
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
親切な回答者がいっぱいいるお
マルチしないようにここでの質問を取り下げることをおすすめするお
0734デフォルトの名無しさん
2006/12/22(金) 12:13:430735デフォルトの名無しさん
2006/12/22(金) 12:17:220736デフォルトの名無しさん
2006/12/22(金) 12:26:060737デフォルトの名無しさん
2006/12/22(金) 12:32:01期限過ぎてるので別人かもしれないが
0740デフォルトの名無しさん
2006/12/22(金) 13:30:310741デフォルトの名無しさん
2006/12/22(金) 20:45:30プッ…
>>719
マクロにしてポインタを返すのか…
でも文字列を格納するバッファはどうする?
たとえばあらかじめ出力先のバッファを静的に確保しておいて使用するとか…
char macro_str[MACRO_STR_MAXSIZE];
#define FUNC(n) (sprintf(macro_str,"%02d",n),macro_str)
思いついたのはこれかな
0742デフォルトの名無しさん
2006/12/22(金) 23:02:33の_tagとアンダースコアを使う技法を何と呼ぶのでしょうか。
うーん…思い出せない…
0743デフォルトの名無しさん
2006/12/22(金) 23:08:060744デフォルトの名無しさん
2006/12/22(金) 23:09:280745デフォルトの名無しさん
2006/12/22(金) 23:38:240746デフォルトの名無しさん
2006/12/22(金) 23:59:55略してグラメス
0747デフォルトの名無しさん
2006/12/23(土) 01:20:400748デフォルトの名無しさん
2006/12/23(土) 01:30:29なんて気の毒な環境なんだろう・・・
C++でさえお断りなのに・・・・
0749デフォルトの名無しさん
2006/12/23(土) 01:32:39きみは何を使っているの?
0750デフォルトの名無しさん
2006/12/23(土) 01:53:370751デフォルトの名無しさん
2006/12/23(土) 02:25:520752デフォルトの名無しさん
2006/12/23(土) 03:46:440753デフォルトの名無しさん
2006/12/23(土) 06:05:570754デフォルトの名無しさん
2006/12/23(土) 07:37:330755デフォルトの名無しさん
2006/12/23(土) 10:56:300756デフォルトの名無しさん
2006/12/23(土) 11:00:22sprintf
0757デフォルトの名無しさん
2006/12/23(土) 12:27:18君にはそれを理解する必要はない。
0758デフォルトの名無しさん
2006/12/23(土) 13:50:59#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BUF_SIZE 1024
int get_digit(int digit){
char buf[BUF_SIZE];
while(1)
{
fflush(stdin);
printf("%d 桁の数値を入力して下さい :", digit);
fscanf(stdin, "%[0-9]", buf);
if(strlen(buf)==digit) break;
printf("\n再入力 ");
}
return atoi(buf);
}
int main(void){
printf("\n入力された数値は %06d です\n", get_digit(6));
return 0;
}
0759デフォルトの名無しさん
2006/12/23(土) 14:26:23sprintf(format,"%%%0dd",2);
printf(format,1);
0760デフォルトの名無しさん
2006/12/23(土) 18:25:370761デフォルトの名無しさん
2006/12/23(土) 20:12:521ファイルあたりの行数というのはどのくらいが限界だと思われますか?
長すぎるとお目当ての関数を探すのがめんどくさいし
ファイルを分割しすぎると、それはそれでめんどくさいです
0762デフォルトの名無しさん
2006/12/23(土) 20:21:30関数を探し出すのに困るほど長くなく、分割するのに困るほど短くないくらい。
私の場合は500行を越えるとそわそわし始めて、1000行を越える辺りまでには強行している。
勿論、まとまりがいい場合には300行だろうが100行だろうが迷わず打ち止めにする。
0763デフォルトの名無しさん
2006/12/23(土) 21:39:38うまくいきません
struct stat st;
if(stat( "/tmp/フォルダ名", &st) == 0 ){
switch (st.st_mode & S_IFMT) {
case S_IFDIR:
// ディレクトリ有り
break;
}
}else{
// ディレクトリなし
}
どこが悪いのでしょうか?
0764デフォルトの名無しさん
2006/12/23(土) 21:45:44S_IFDIR以外のビットが立ってたら判定できない。
if (st.st_mode & S_IFDIR) ...
とかで、判定するとか。
0765デフォルトの名無しさん
2006/12/23(土) 22:35:54Cではファイルスコープ以外にモジュール性を表現する手段が無いので
行数だけで機械的に判断するのはどうかな。
1ファイル内に収めてるうちはstaticで済むものを
分割によってグローバルにしてしまうのも、どうか、というわけだ。
まぁそんでも、あまりにデカくなると考え物ではあるがな。
0766デフォルトの名無しさん
2006/12/23(土) 22:45:53> 関数は一画面に収まるぐらいの行数で、とか聞きますが
そんなの本気にすんなよ。
0767デフォルトの名無しさん
2006/12/23(土) 22:48:16ぶーーーーーー
1つの関数が馬鹿でかい糞プログラムを書く香具師メッケ
0768デフォルトの名無しさん
2006/12/23(土) 22:53:36ぶーーーーーー
関数を分割し過ぎて階層が深すぎる糞プログラムを書く香具師メッケ
0769デフォルトの名無しさん
2006/12/23(土) 22:54:21行数が少ないほど、一行あたりのエラー数が多いという結果になったらしい。
つまり200行の関数ひとつより、20行の関数10個のほうが不具合が多いということ。
だいたい「画面に収まる行数」って、環境でぜんぜんちがってくるじゃん。
0770デフォルトの名無しさん
2006/12/23(土) 22:59:25そういうことですか〜
ありがとうございます。
0771デフォルトの名無しさん
2006/12/23(土) 23:02:50関数の行数が多い=その関数でやりたい処理がわかりにくい=問題点を見つけにくい=バグが多い
っていうか、未だにC言語を使っている香具師と生産性の話をすること自体がナンセンスかw
0772デフォルトの名無しさん
2006/12/23(土) 23:03:16画面に収まるっていうのは、初学者に
巨大な関数は書くなって言いたいだけで、
本気で一画面に納めろと言っているわけでは
ないと思う。
0773デフォルトの名無しさん
2006/12/23(土) 23:05:19じゃ、単純に「巨大な関数書くな」って言えばいいのに。
0774デフォルトの名無しさん
2006/12/23(土) 23:07:330775デフォルトの名無しさん
2006/12/23(土) 23:09:13関数の処理が一望できるようなサイズの方が、問題点を見つけやすいからね
1画面でなくてもせいぜい3画面までだろうな
ココで逝ってる画面サイズは、個々の開発環境の画面サイズと思ってもらっていいと思うぞ
0776デフォルトの名無しさん
2006/12/23(土) 23:10:220777デフォルトの名無しさん
2006/12/23(土) 23:12:160778デフォルトの名無しさん
2006/12/23(土) 23:13:440779デフォルトの名無しさん
2006/12/23(土) 23:15:03調査で分かったんしょ?
むしろひとつのサブルーチンで200行もかけない人は、
関数を作る目的意識が低くて200行まで書けなかったり、脳内整理が下手だったり
単に実力のない人なんではないかな
だからがんばって200行はかけるようにしようぜ
0780デフォルトの名無しさん
2006/12/23(土) 23:19:27いや、昔「プリンタで60行だせるから、60行以内で」とか言ってるやつを見たことあるから、
一ページ240行だせるから、240行とか言うやついるかもよ。
0781762
2006/12/23(土) 23:29:44まぁ、私は自分の限界知っているから200行の関数なんて書かないけれど、
長大な関数を作りたがる香具師は大抵それを全部把握しきれないことにも気付かないから問題なんだけどね。
実際に2000行ものmain()を書く香具師の例だけれど、ローカル変数を全部関数の先頭で宣言しているから
未使用変数は山のようにあるし同じ変数の使い回しはあるし、悉くバグの温床になっている。
仮令(99以前の)Cでもブロック内で変数を宣言すれば未だ見通しがよくなるというのにね。
要は、自分のキャパに合わせて関数を作れ。
自分のキャパが判らないなら取り敢えず、目の前の画面内に関数の主要部が収まるように作れ。
って話じゃないの。
0782デフォルトの名無しさん
2006/12/23(土) 23:29:53w
200行もかけないんじゃなくて、書かないんだよw
でも確かにC言語で関数のネストが深くなるのはあまり見やすいとはいえないけどな
バグの少ないプログラムを書きたかったらC言語のような言語は使わないほうが良いということだなw
>>780
未だにコードを印刷してチェックするような原始人を基準にされても困るよねw
0783デフォルトの名無しさん
2006/12/23(土) 23:33:36作ってるプログラムが、個人の趣味のプログラムならそれでも良いけど
仕事で作ってるプログラムなら自分の基準で作るのはよろしくないだろう
プログラムは作った人以外もメンテナンスできなければならない
よく、「あのプログラムは誰それが作ったから、その人がいないとメンテできない」
なんて状況があるが、それは好ましくない状況だから、何らかの
基準を設けることは必要だろう
0784デフォルトの名無しさん
2006/12/23(土) 23:36:54>むしろひとつのサブルーチンで200行もかけない人は、
>単に実力のない人なんではないかな
いや、実力のないやつがでかい関数を書いてる。
(数百行とか数千行とか、そういう単位で)
0785デフォルトの名無しさん
2006/12/23(土) 23:41:06サブルーチンの複雑さをとらえよう、みたいなことが書いてあったな。
0786デフォルトの名無しさん
2006/12/23(土) 23:43:59ブロックのネストの深さと大きさだな
0787デフォルトの名無しさん
2006/12/24(日) 00:11:07コメントの質は無視してないよな
0788デフォルトの名無しさん
2006/12/24(日) 00:16:56でかい関数の作者は馬鹿の比率が低いからじゃないの
0789デフォルトの名無しさん
2006/12/24(日) 00:21:45UNICODEを使用した状況で、__FILE__ , __DATE__などを使いたいと思っています。
マクロ定義で
#define CONV2WIDE(X) (L ## X )
と定義して、
int main() {
wchar_t test[] = CONV2WIDE( __FILE__ );
return 0;
}
としても、マクロ展開後のソースは L__FILE__ となっており、
__FILE__が展開されていませんでした。
仮に、__FILE__ではなく、 "hoge" としてみると正常にLサフィックスが付いて
正常コンパイル出来ました。
__FILE__でもうまく展開できる方法って無いでしょうか?
マクロ中で扱いたいので、変換関数とかは呼びたくないのです。
0790デフォルトの名無しさん
2006/12/24(日) 00:22:35調査対象となってるのはアマグラマではない事を理解しとかないと
0791デフォルトの名無しさん
2006/12/24(日) 00:25:44#define CONV2WIDE(X) _CONV2WIDE(X)
#define _CONV2WIDE(X) (L ## X )
0792デフォルトの名無しさん
2006/12/24(日) 00:31:59もちろん20行ぐらいの関数がほとんどだけども
0793デフォルトの名無しさん
2006/12/24(日) 00:33:37ぉぉ。
2段構えでやることでうまくできました。さんくす!
しかし、__FILE__などが置き換えられるタイミングの問題でこうしないとダメなのでしょうか?
0794デフォルトの名無しさん
2006/12/24(日) 00:49:07何でこうなるんだろ…
0795デフォルトの名無しさん
2006/12/24(日) 00:51:420796デフォルトの名無しさん
2006/12/24(日) 00:59:14コメントの質も重要だが、ダラダラと長い関数はそれだけで読解性が悪いので
幾らコメントが充実してても肝心なコードを把握しにくくなるから意味が無い。
>>790
仕様書がそのままコードになるならそれでも良いが、
問題は仕様書どおりに出来てるかどうかの検証がしにくいって事。
少なくとも、でかい関数を作るやつはプロじゃない
0797デフォルトの名無しさん
2006/12/24(日) 01:06:55100%否定されたらそうとしか答えられん…
でかい関数を作る奴はプロでないやつばかりだ、とかなら分かる
意図して少しサイズの膨れた関数を作る事も
システマチックになりすぎると、肝心の中身がな…
0798デフォルトの名無しさん
2006/12/24(日) 01:09:500799デフォルトの名無しさん
2006/12/24(日) 01:11:170800デフォルトの名無しさん
2006/12/24(日) 01:14:36200行程度でぐだぐだ言ってたら2万行のソースとか書けないべ
0801デフォルトの名無しさん
2006/12/24(日) 01:19:04バグの発生率やメンテナンスコストはまるで違うものになるだろうね
0802デフォルトの名無しさん
2006/12/24(日) 01:20:03というよりその関数に必要な処理だけを書くのがいいだろう
結果的に大きなサイズになってもそれが必要ならいいと思うし
本来少ない行数ですむものをだらだら書くのはダメだろう
可読性やメンテナンス、汎用性を考えれば…
0803デフォルトの名無しさん
2006/12/24(日) 01:33:21#include<stdio.h>
main(){
int a[2]={0},*pa;
pa=&a[1];
a[0]++;
*pa++;
printf("a[0]=%d,a[1]=%d\n",a[0],a[1]);
return 0;
}
実行結果(a[0]=1,a[1]=0)
とすると、a[0]が1になるのは当たり前なんですが、
何でa[1]は0になるんですか?
CPad for Borland C++Compilerでコンパイルしました。
0804デフォルトの名無しさん
2006/12/24(日) 01:36:30演算子の優先順位の問題
(*pa)++;
が御希望か?
0805デフォルトの名無しさん
2006/12/24(日) 01:43:13int a[2]={0},*pa; ←この時点でa[1]にpaの中身を代入してるからだろ?
しかもその時点ではpaにはまだa[1]のアドレスは入ってないし。
0806803
2006/12/24(日) 01:50:29*はポインタ'演算子'でしたね。
ありがとうございました。解決しました。
>>805
言ってる事がよくわからないんですが、
*pa++がどうして足されないのか知りたかっただけです。
0807デフォルトの名無しさん
2006/12/24(日) 01:52:50詳しく
0808805
2006/12/24(日) 01:59:21なんか勘違いしてたw
0809デフォルトの名無しさん
2006/12/24(日) 08:49:21コードの量じゃなくて内容的なものでお願いします
0810デフォルトの名無しさん
2006/12/24(日) 09:29:230811デフォルトの名無しさん
2006/12/24(日) 10:26:22return a opr b;
}
int main(){
operate(4+6);
}
これができないことはわかるんですが、これでやろうとしているような
「関数に演算子を渡す」
ということはできますか?
とりあえず文字コードを渡して内部で switch-case で場合分けして凌いでいるんですが、どうにも見栄えが悪くて
0812デフォルトの名無しさん
2006/12/24(日) 10:29:46return lhs + rhs;
}
int minus(int lhs, int rhs) {
return lhs - rhs;
}
とこういう感じに1つ1つ関数にしていくくらいしかないと思う。
C++なら、こういう関数が予めある程度標準ライブラリで用意されているし、
ほかにも色々技巧を駆使してやる方法もあるのだが。
0813デフォルトの名無しさん
2006/12/24(日) 10:31:42#define operate(a, opr, b) ((a)opr(b))
0814デフォルトの名無しさん
2006/12/24(日) 11:01:54ありがとうございます
やっぱり冗長な表現になってしまうんですね
>>813
最初はそれも考えたんですが実際に使用しようと考えている場所では計算が多く、
1行にすると横に200文字近く伸びてしまうんです
それで関数に演算子を渡せないかな、と
0815デフォルトの名無しさん
2006/12/24(日) 11:08:32ここはC限定スレだし。
そのためだけにC++にするわけにもいかんのだろう。
0816デフォルトの名無しさん
2006/12/24(日) 11:10:12文字列で渡して解析
0817デフォルトの名無しさん
2006/12/24(日) 11:34:30p=getenv("QUERY_STRING");
で取得したpをパースする関数のサンプルを探しています。
&と=の部分に\0を入れる方法のものです。
よろしくお願いします。
0818デフォルトの名無しさん
2006/12/24(日) 12:17:23一つの関数からの型の違う戻り値を(charとintのような感じで)
取得する事は出来るのでしょうか?
fooはchar型、hogeはint型の戻り値
return(foo, hoge)
こんなことは出来ないので、このような場合のテクニックを教えてください。
0819デフォルトの名無しさん
2006/12/24(日) 12:21:27void* で受け取ってはどうか
0820デフォルトの名無しさん
2006/12/24(日) 12:22:14構造体使ったら
0821デフォルトの名無しさん
2006/12/24(日) 12:26:42起こるわけだし、グローバル変数の使用を極力避けるのと同様にポインタ変数の使用も極力
避けるべきだと兄の長男の友達の妹が言ってた
0822デフォルトの名無しさん
2006/12/24(日) 12:30:00早速のアドバイスありがとうございます
>>819さんの方法は関数を呼出す方と呼出される方が同じポインタを参照して
渡す方法と理解していいですか?
>>820さんの方法ですが、忘れてました構造体で戻り値を受ければいいと言う事でOK?
0823デフォルトの名無しさん
2006/12/24(日) 12:31:47>>821さんのお勧めは、構造体の方がGJということですか?
0824デフォルトの名無しさん
2006/12/24(日) 12:43:16struts FooHoge{
char foo;
int hogel
0825デフォルトの名無しさん
2006/12/24(日) 13:25:55入門スレなんで難しいことよく分りません。こっちで話してください。
ttp://pc8.2ch.net/test/read.cgi/tech/1164376614/l50
0826デフォルトの名無しさん
2006/12/24(日) 14:41:37struct funcReturnValue {
char foo;
int hoge;
};
struct funcReturnValue func()
{
struct funcReturnValue ret = {'a', 818};
return ret;
}
>>817
環境変数はいいとして、"&と=の部分"とはなんぞや。
例えば環境変数LANGを取得するにはgetenv("LANG")とするわけだが、
その場合は"ja"へのポインタが得られるからパースもへったくれもないのだが。
0827デフォルトの名無しさん
2006/12/24(日) 16:06:52パースして\0をいれるというと、strtok() のことか?
もしそうなら、strtok でググればサンプルくらいあると思う
0828デフォルトの名無しさん
2006/12/24(日) 16:21:46これってまずいんじゃね?
構造体retはスタックに取られるから、リターンしたらretの領域は保証されないんじゃね?
0829デフォルトの名無しさん
2006/12/24(日) 16:24:14もらった側もコピーして受け取るからかまわんだろ
0830デフォルトの名無しさん
2006/12/24(日) 16:31:18大丈夫、C89以前の糞コンパイラでもない限りちゃんとコピーされる。
0831デフォルトの名無しさん
2006/12/24(日) 16:33:42そうでしたかw
0832デフォルトの名無しさん
2006/12/24(日) 16:43:250833デフォルトの名無しさん
2006/12/24(日) 17:14:27年賀状作ってる間に有意義なご回答ありがとうさんです
>>826さん
struct funcReturnValue ret = {'a', 818};
こんな書き方もあるんですね初めて見ました
勉強になります。
0834デフォルトの名無しさん
2006/12/24(日) 17:25:17何か特別な点でもあるのか?
0835sage
2006/12/24(日) 19:05:00GetUserNameを使ってUNICODEで現在ログインしているユーザ名を取得しようとしてるんだけど、下のソースでは「retcd = GetUserName(username,&nSize);」でコンパイルエラーになってしまう。
_MBCS指定では、正常にコンパイル及び実行できた。
どのように修正したらよいのでしょうか?
御存知の方、教えて下さい。
#include<stdio.h>
#include<tchar.h>
#include <windows.h>
main()
{
TCHAR username[20];
BOOL retcd;
DWORD nSize;
DWORD lasterr;
nSize = sizeof(username);
memset(username,0x00,sizeof(username));
retcd = GetUserName(username,&nSize);
if (retcd == 0)
{
lasterr = GetLastError();
}
}
0836デフォルトの名無しさん
2006/12/24(日) 19:08:31<windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
0837835
2006/12/24(日) 19:10:04あげてすいません。
0838デフォルトの名無しさん
2006/12/24(日) 19:14:49UNICODEを定義したのは、プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
><windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
これは、どこを見ればよいの?
0839デフォルトの名無しさん
2006/12/24(日) 19:31:20CとC++ってどちらを選んでよいのかわからないのですが、
どういった違いがあるのでしょうか。
0840デフォルトの名無しさん
2006/12/24(日) 19:58:470841デフォルトの名無しさん
2006/12/24(日) 20:31:49CとC++ってどちらを選んでよいのかわからないのですが、
どういった違いがあるのでしょうか。
0842デフォルトの名無しさん
2006/12/24(日) 21:12:530843デフォルトの名無しさん
2006/12/24(日) 21:21:090844デフォルトの名無しさん
2006/12/24(日) 21:25:15> プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
ならそこにUNICODEも書き加えろ。
そもそももしVisual C++の話なら、プロジェクトの設定の全般に文字セットの指定があるから、
そっちで選択するのが確実。
0845デフォルトの名無しさん
2006/12/24(日) 22:00:22コンパイルうまく出来た。実行もできた。
ありがとう。
0846デフォルトの名無しさん
2006/12/24(日) 22:24:050847デフォルトの名無しさん
2006/12/24(日) 23:24:58(○○.html)に直すのにはどうすればよくて?
0848デフォルトの名無しさん
2006/12/24(日) 23:27:16ファイル名を変換するだけ?
それとも html フォーマットに変換するの?
0849デフォルトの名無しさん
2006/12/24(日) 23:34:30言葉足らずだった。
○○.cファイルを"r"で読み込まして、
そのファイルの内容ばーと、コピーするところまでは完成してるけど、
そのコピーしたものを、こんどは"w"モードで
新規ファイル(○○.html)をつくりたいわけです。
0850デフォルトの名無しさん
2006/12/24(日) 23:38:02うpしる
0851デフォルトの名無しさん
2006/12/24(日) 23:45:47int main(void){
FILE *ReadFP, *WriteFP;
char Rfname[100], Wfname[100];
char buff[STR_MAX], *pp;
printf("ファイル名 : ");
gets(Rfname);
ReadFP = fopen(Rfname, "r");
if(ReadFP == NULL){
printf("ファイルの読み込みに失敗しました\n");
exit(1);
}
WriteFP = fopen(○○○, "w"); ←ここの指定の方法がわかりません
while(1){
pp = fgets(buff, STR_MAX, ReadFP);
if(pp == NULL){
break;
}
fprintf(WriteFP, "%s", buff);
}
fclose(WriteFP); fclose(ReadFP);
return 0;}
0852デフォルトの名無しさん
2006/12/24(日) 23:54:27WriteFP = fopen(○○○, "w"); ←ここの指定の方法がわかりません
↓
{
char *ext;
strcpy(Wfname, Rfname);
ext=strrchr(Wfname, '.');
if(ext!=NULL) strcpy(ext, ".html");
else strcat(Wfname, ".html");
}
WriteFP = fopen(Wfname, "w");
0853デフォルトの名無しさん
2006/12/25(月) 00:01:10WriteFP = fopen("test.html", "w"); ←ここの指定の方法がわかりません
これでいいのでFA?
0854デフォルトの名無しさん
2006/12/25(月) 00:05:01おお、動きました。 ありがとうございます
まだまだ<string.h>の勉強が足りないかも
>>853
したい事は、同じファイル名がよかったんです
0855デフォルトの名無しさん
2006/12/25(月) 00:06:23その前に日本語の勉強をしろ
0856852
2006/12/25(月) 00:10:450857デフォルトの名無しさん
2006/12/25(月) 00:17:580858デフォルトの名無しさん
2006/12/25(月) 01:51:50読み込んだ数字の最大値と平均値を求めて出力したいんだけど
最大値ってどうやって計算すればいいでしょうか?
if(*fp >= max_num)
{
max_num = *fp;
}
これを使うといけないらしいのですが
0859858
2006/12/25(月) 01:53:47FILE *fp;
と上の方で宣言してあるので片方だけがintなのが原因かな
と自分では思っています。
いろいろ試したけど解決できてないので、アドバイス下さい
0860デフォルトの名無しさん
2006/12/25(月) 03:18:11君はファイルから数字を読み込むことはできるの?
0861858
2006/12/25(月) 03:30:22平均値だけを出力させることはできました。
0862デフォルトの名無しさん
2006/12/25(月) 03:47:540864デフォルトの名無しさん
2006/12/25(月) 04:02:121.最初に読み込んだ値をmax_numに入れる
2.その後読み込んだ値を一つ一つmax_numと比較し、より大きければmax_numに代入
3.数字を全部読み終えたら、最大値がmax_numに入っている
0865デフォルトの名無しさん
2006/12/25(月) 04:03:21max_numにINT_MINを入れておく。<limits.h>をインクルード。
0866デフォルトの名無しさん
2006/12/25(月) 12:43:12"あいうえお"
,"かきくけこ"
,"さしすせそ"
,"たちつてと"
,"なにぬねの"
};
これってどういう意味ですか?char型の配列を各々指しているポインタ配列?
0867デフォルトの名無しさん
2006/12/25(月) 13:08:51の集合体
0868858
2006/12/25(月) 13:15:17それは>>858でやったような
if(*fp >= max_num)
{
max_num = *fp;
}
ではないのでしょうか?
0869デフォルトの名無しさん
2006/12/25(月) 13:20:150870858
2006/12/25(月) 14:01:13int main(void)
{
int val;
int sum=0;
int cnt;
int max_num,i;
FILE *fp;
for(cnt=0;;cnt++)
{
fscanf(fp,"%d",&val);
if(val==0)
{
break;
}
sum+=val;
}
if(cnt>0)
{
printf("平均値=%g\n",(double)sum/cnt);
}
fclose(fp);
return EXIT_SUCCESS;
}
0871デフォルトの名無しさん
2006/12/25(月) 14:11:28if(val >= max_num)
{
max_num = val;
}
ではだめということなの?
0872デフォルトの名無しさん
2006/12/25(月) 14:25:03fopen() やってないが、ただの書き忘れか?
0873デフォルトの名無しさん
2006/12/25(月) 14:43:46どこをどうやったらmaxnum に * fpを代入すると言う発想が出てくるのか是非教えていただきたい。
0874858
2006/12/25(月) 14:46:48書き忘れです。
if((fp=fopen("indata.txt","r"))==NULL)
{
printf("ファイルが見つかりません。---indata.txt\n");
exit(EXIT_FAILURE);
}
>>873
教えてもらいにきたのに教えないといけないなんて><
0877デフォルトの名無しさん
2006/12/25(月) 16:50:54処理中にtemp.datでも一時的に作って、
処理が終わればそれを削除したいんだけど。
0878デフォルトの名無しさん
2006/12/25(月) 17:45:25C言語標準の方法ではファイルの削除はできないから、
あなたの環境が分かれば教えられるかも。
0879デフォルトの名無しさん
2006/12/25(月) 17:55:280880デフォルトの名無しさん
2006/12/25(月) 21:40:09Unix-likeなOSなら、正しいやり方は以下のような感じ。
fp = fopen("temp.dat", "w+");
remove("temp.dat");
:
fclose(fp);
オープンファイルの削除が出来ないOSでは、remove()はfclose()の
後に持ってくるしかないが、その場合、プロセスが途中でコケたりした
場合に、temp.datが残る可能性がある。
0881デフォルトの名無しさん
2006/12/25(月) 21:52:44fp = tmpfile();
:
fclose(fp);
0882デフォルトの名無しさん
2006/12/25(月) 21:55:41途中から処理を再開する可能性も考えられる
0883デフォルトの名無しさん
2006/12/25(月) 22:22:030884ぼるじょあ ◆yBEncckFOU
2006/12/25(月) 23:15:55ぬるい質問には元気よく回答(でもレスの終わりには何故か嫌味もw)
して質問に関係ないレスをして馬鹿でも知ってる知識自慢をしてるけど
ちょっと手間な質問には嫌味や煽りばっかりで
回答できてないのが気になるお
このスレの回答者は頭悪いのが多いお、というわけで質問者は
こちらに質問をなげるようにしてください
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
優しいぼるじょあと名無しさんがきみたちの質問に答えるお
0885デフォルトの名無しさん
2006/12/26(火) 17:09:560886デフォルトの名無しさん
2006/12/26(火) 17:41:13事実。このスレッドに次スレッドは不要。
0887デフォルトの名無しさん
2006/12/26(火) 20:52:23もう少し接続詞の勉強しな
0888デフォルトの名無しさん
2006/12/26(火) 21:12:320889デフォルトの名無しさん
2006/12/26(火) 22:12:57日本語でおk
0890デフォルトの名無しさん
2006/12/26(火) 22:27:39そもそも引きずることなのか
0891デフォルトの名無しさん
2006/12/26(火) 22:54:00C言語を1から勉強したいのですが お勧めの本はありますか?
なんか書店にはいろいろな本がありすぎて どれを選んだらいいか分からなくて
初心者でも 独学で分かりやすい本って 何かありますか?
くだらない質問でほんとすいませんm(_ _)m
0892デフォルトの名無しさん
2006/12/26(火) 22:57:560893デフォルトの名無しさん
2006/12/26(火) 23:55:360894デフォルトの名無しさん
2006/12/27(水) 00:04:28プレフィックスでした。
もし回答者がいたらありがとうございました。
携帯からなので確認が大変なので…
0895デフォルトの名無しさん
2006/12/27(水) 00:06:48痛く…しないでね…
0896デフォルトの名無しさん
2006/12/27(水) 00:37:54すみません、もう少し調べてみます
0897デフォルトの名無しさん
2006/12/27(水) 00:39:050898デフォルトの名無しさん
2006/12/27(水) 00:41:43どんな本にも書いてあるようなCの文法的なことだけでなく
プログラミングスタイルやコメントの付け方デバッガの使い方
makefileの作り方まで書かれている。
この本で学べば天才ハッカーになれること間違いない今すぐ10冊程注文しなさい
0899デフォルトの名無しさん
2006/12/27(水) 01:06:28仕事でCをいじることになりました。
関数レベルの単体テストってCだとどうやるのが一般的なんでしょうか?
(つーか内部関数の単体検証は無理?)
職場の皆さんはそもそもNUnitの類での単体テストと言う文化が無いようで
プリント文見たりとかデバッガで止めて確認して完了とかで戦慄を覚えました・・・
0900n
2006/12/27(水) 02:55:520901デフォルトの名無しさん
2006/12/27(水) 02:58:40・配列とポインタの妙な互換性
・構造化された例外処理がない
0902N
2006/12/27(水) 03:07:31解決法とかありますか?
0903デフォルトの名無しさん
2006/12/27(水) 03:23:54C++でさえなくCか。ご愁傷様。
ま、テストファーストなんてのはCが流行ってた頃よりずっと後に出てきた
文化だからなー。
C++用だが、CppUnitの使用を検討してみては?
0904デフォルトの名無しさん
2006/12/27(水) 03:31:39前2者の解決法はない。仮に解決したとすると、それはCではない何か別のものになってしまう。
最後のやつは言語仕様に後付けできるから、やろうと思えばできるだろうけど、
ISOに提案して規格になって実装が出てきて、とうまくいったとしても
10年以上かかるんじゃないかな。
0905n
2006/12/27(水) 03:40:530906デフォルトの名無しさん
2006/12/27(水) 03:52:51それは難しい問題だ。というか簡単に一言で述べることはちょっとできない。
一般的にオブジェクト指向言語が備えている、備えているべきといわれる機能は
・多態
・継承
・カプセル化
だ。それぞれの意味はぐぐってみてほしいけど、
たぶんちんぷんかんぷんじゃないかという気がするし、
だいたいスレ違いだw
おれ自身は多態さえあればオブジェクト指向と呼んで差し支えないとは
思っているが、これに異を唱える人は多いと思う。
簡潔に述べるのなら以上のようになるんだけど、
こんな答で納得してもらえるとはちょっと思えないなw
0907デフォルトの名無しさん
2006/12/27(水) 04:11:40哲学とか入ってくるからなぁ
門外漢だろ、普通のプログラマは
0908n
2006/12/27(水) 04:13:00確かに今の僕ではよく解りません(TT)もう少し調べてみたいと思います。
0909デフォルトの名無しさん
2006/12/27(水) 07:41:16それを固有情報(メンバ変数)と付属関数(メソッド)で表現する手法
と思ってる。俺は。
0910デフォルトの名無しさん
2006/12/27(水) 12:31:24これをひっくり返してO+V
これがオブジェクト指向だと思っているよ、俺は
0911デフォルトの名無しさん
2006/12/27(水) 12:54:35VをOの内在・従属させることができるし(カプセル化)
Oがシンプルになる(多態)
0912デフォルトの名無しさん
2006/12/27(水) 12:58:42超初心者なんですが...
0913デフォルトの名無しさん
2006/12/27(水) 13:14:31再配布したりするのは著作権侵害なのでしょうか?下のサイトには違うと書いているのですが
本当の所をお教え頂きたいです。因みに私が転用したいのはC言語のものなのでここで聞かせて頂きます
http://www.orca.med.or.jp/orca/outline/opensource/img/img1.gif
0914デフォルトの名無しさん
2006/12/27(水) 13:19:040915デフォルトの名無しさん
2006/12/27(水) 13:39:26オープンソースといっても君がしたいことの可・不可が一律に決まってるわけじゃないよ。
せめてプログラム名とかライセンス名は書こうね。
0916デフォルトの名無しさん
2006/12/27(水) 14:52:59C言語によるプログラミング基礎編とC言語によるプログラミング応用編がお勧め
宣伝くさくなるから出版社は控えるけど、ちょっと品揃えのある書店に行けば楽に見つけられると思う。
基礎編は注訳をとにかく読みまくる事が大事。
分からない事は、そういう事なんだと理解する事も大事。
配列とかどうしても理屈が分からなければ人に聞く事。
分かるまで聞く事も大事。
”人に”聞いてね、ネットじゃなくて。
黒板やホワイトボードなんかがあるところで尋ねるのがベスト。
無ければ紙と鉛筆は忘れずに。
後はやる気があれば何でもできる。
30歳超えてたらしんどいと思うけど、できるだけ右脳を活用してあげて。
0917デフォルトの名無しさん
2006/12/27(水) 16:04:270918デフォルトの名無しさん
2006/12/27(水) 16:19:11オライリーの本を買っとけば間違いない今すぐ10冊程注文しなさい
0919デフォルトの名無しさん
2006/12/27(水) 17:05:14オープンソースといってもライセンスが沢山ある。
代表的なもののうちの一つに GPL v2 があるが、これの場合はユーザの側の
改変再配布の自由を妨げることを禁じており、コンパイル済みバイナリを
受け取った人はそのソースも受け取る権利が発生する(ソースを受け取る
ことを妨げてはいけない)。また再配布の際は同じ GPL v2 のライセンスで
配布しなければならない。結果としてソースを隠して独占する行為は不可能に
なる。またその結果 GPL のソフトウェアのみを販売する行為もほぼ不可能に
なるのだが、これは特に禁じられてはいない。(Linux ディストリビューションの
RedHat などは一見これができているように見えるかも知れないが、あれは
ソフトそのもので金を取っているのではなくてサポートで金を取っている)。
0920デフォルトの名無しさん
2006/12/27(水) 17:39:18順に上から一行ずつ読み込ませて、処理を行っています。
で、そこの読み込んだ一行の中に
"ABCDEFGHIJKLMN"という文字列があったとして、
そこの"FGHIJ"という部分を、"GHFJI"と置換をしたいのですが、
それがさっぱり分からないので、誰か助けてください。
0921デフォルトの名無しさん
2006/12/27(水) 17:43:26strstrで検索して文字間でスワップかけるだけ?
0922デフォルトの名無しさん
2006/12/27(水) 17:59:34置換前後での文字列数が異なる場合はバッファわけないと無理だよな。
>>920 の例はたまたま 検索文字数=置き換え文字数なので
置換操作前後で文字列数かわらないけど
0923デフォルトの名無しさん
2006/12/27(水) 19:36:38ごめんなさい、スワップをかけるだけじゃないです。
"あかさたな"という文字列が゙あったらなら
全部"はまやらわ"に置換してみたいのです。
一応自分が考えたのは、一文字ずつ読み込む方法で
"ABCD"の文字を"あいうえ"にして、完全一致でないなら
そのまま表示していくというものです。 こんな感じ↓
c = fgetc(fp);
if(c == 'A') {
c = fgetc(fp);
if(c == 'B') {
c = fgetc(fp);
if(c == 'C') {
c = fgetc(fp);
if(c == 'D') {
printf("あいうえ"); ←置換したい文字
} else {
printf("ABC%c", c);
}
} else {
printf("AB%c",c);
}
以下省略で、頭悪い方法です。
0924デフォルトの名無しさん
2006/12/27(水) 19:37:36本に関しては人によるので否定しないがも肯定もしない。
人に学ぶのが一番なのは同意。
教えて君にならない程度に聞きまくるのがいい。
必死に学んでれば、無碍に断れもしないだろうし。
0925デフォルトの名無しさん
2006/12/27(水) 19:51:48>>921と>>922が言っていること理解しちょる?
というより「〜みたいな」とか「〜だとしたら」という微妙な表現しかないのは・・・
もういいや
0926デフォルトの名無しさん
2006/12/27(水) 20:52:46#include <stdio.h>
#include <string.h>
void ReWord(char c[], const unsigned Size);
int main()
{
char Word[] = "FGHIJ";
char *GetWord,*TakeWord;
char buff[1024] = {'\0'};
while(GetWord = fgets(buff,sizeof(buff),stdin)){
TakeWord =strpbrk(GetWord, Word);
ReWord(TakeWord, strlen(Word));
}
printf(buff);
return 0;
}
void ReWord(char c[], const unsigned Size)
{
unsigned i;
unsigned size = Size -1;
char temp;
for(i=0; i <= size/2;i++){
temp = c[i];
c[i] = c[size -i];
c[size -i] = temp;
}
}
0927デフォルトの名無しさん
2006/12/27(水) 21:24:19基本的に文字列Aを表示するが、Aの中に文字列Bが存在したらその部分を文字列Cに置き換える
こういうことだよな?
仮にそうだとして、文字列Cは任意の文字列?それとも何か変換規則がある?
>>926
strpbrk()じゃなくてstrstr()じゃないか?
これだと*GetWord が"G"とかの時も変換しようとするはず
0928デフォルトの名無しさん
2006/12/27(水) 21:26:37んなもん幾らでもあるだろうが、とりあえず
故R.Stevensのページ
ttp://www.kohala.com/start/
0929デフォルトの名無しさん
2006/12/27(水) 22:01:28C実践プログラミング も 超初心者にはレベル高過ぎませんかねぇ... そんなことはないですかね?
C言語によるプログラミング は コロナ社のやつですか?
0930デフォルトの名無しさん
2006/12/27(水) 22:05:51fp = fopen("C:Proguram File\\○○.txt","a");
丸のところに変数を入れたいんです
0931デフォルトの名無しさん
2006/12/27(水) 22:12:000932ぼるじょあ ◆yBEncckFOU
2006/12/27(水) 23:12:18超簡単で手間のかからない質問には
回答者の諸君も長文で返して元気だね
こいしらの実践レベルが疑わしいお
0933デフォルトの名無しさん
2006/12/27(水) 23:55:470934デフォルトの名無しさん
2006/12/28(木) 01:08:31レベルの高いレスきぼん
0935デフォルトの名無しさん
2006/12/28(木) 01:18:560936デフォルトの名無しさん
2006/12/28(木) 01:19:14そいつには無理だ
0937デフォルトの名無しさん
2006/12/28(木) 01:41:27無理無理、だって言ってることに内容がほとんどないもの。
「CとC++」を置き換えればどこに持って行ったって一見煽りになるだろ。
PerlとかPythonとかMySQLとかVCとか漢字書き取りとかwinnyとかなんとか。
どれを入れても通じるだろ。その程度の意味しか持たない。
実にワイルドカードでマヌケな煽りなわけです。
0938デフォルトの名無しさん
2006/12/28(木) 01:42:01パソコン初めて3、4ヶ月ぐらいの時に友達に勧められたんで読み始めた。
その前に2ヶ月目ぐらいの時にもっとレベルが低い、
ソフトバンクパブリッシュ?とかのCビギナー読んで入出力程度までは扱えるようにした。
C言語によるプログラミング読んでも理屈なんてわからんしUNIXのシステムコール使う部分とか読み飛ばした。
世の中にはこういうのも分かる天才もいるんだろう、とか思いつつな…
2千とか3千とか安い安い
一つの本でマスターしようとは思わずに
俺みたいに驚くほど簡単な本から初めてみな。
でもおまい実は玄人?
0939デフォルトの名無しさん
2006/12/28(木) 01:45:29テンプレでも見てこい
0940デフォルトの名無しさん
2006/12/28(木) 11:09:41何が悪いのか教えてください。よろしくお願いします。
int main(int argc, char *argv[]){
省略
mpz_init_set_str(a,"282578800148737",10); mpz_init_set_str(b,"0",10);
mpz_init_set_str(key,"10000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000001",2);
mpz_init_set_str(k2,"100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100000000010000000001000000000100011111",2);
for(i=1;i<1000;i++){if(mpz_probab_prime_p(key,2)==2){ gmp_printf("\n%Zd\n",key); break; mpz_add_ui(key,key,1); }
fg=fopen("an.txt","wb"); gmp_randseed_ui(0,123456);
while(1){
// bc= fread(s,sizeof(unsigned char),15,f);
for(i=0;i<15;i++){ mpz_inp_str(bb,f,0); mpz_mul_ui(bb,bb,256); }
if(bc<15 && bc!=0){ for(i=bc;i<15;i++) s[i]=0; }
if(bc==15){ mpz_mul(b,key,bb); mpz_urandomb(a,0,(long unsigned int)120); mpz_urandomb(d,0,(long unsigned int)256); mpz_add(c,b,a); mpz_xor(c,c,d); mpz_out_raw(ff,c);
// fwrite(m,sizeof(unsigned int),8,ff);
mpz_xor(c,c,d); mpz_mod(d,c,key); mpz_sub(c,c,d); mpz_div(e,c,key); mpz_out_raw(fg,e);
// fwrite(k,sizeof(unsigned char),15,fg); }
/* padding
if(bc<15 && feof(f)==1){ while(1){ if(bc<15)
// ...
break; } }
*/
fclose(f); fclose(ff); fclose(fg);
}
0941デフォルトの名無しさん
2006/12/28(木) 12:13:400942デフォルトの名無しさん
2006/12/28(木) 12:23:38四則演算でアフィン暗号を作る練習をしてます。
今ひとつGMPライブラリの使い方がわからず、ファイルからNバイト整数
を読み込むという部分もこれでいいのかわかりません。
今の時点では暗号文が2倍になってしまいますが、下位ビットを反転させて
上位ビットにXORしてから更に秘密鍵でXORした後でS-BOXのような非線形
変換を行えば普通の秘密鍵暗号と同じ仕組みになるはずですが、算術誤り
訂正符号を使っているのでエラーが発生しても訂正できるというのが
メリットです。
0943デフォルトの名無しさん
2006/12/28(木) 12:40:49復号化:M=((c^R2)-(c^R2)%P)/P
key=PとR1のseed
key=key+1を素数になるまで続ける。
k2=R2のseed
bb=Mに平文120ビットを読み込む。
見つかった素数PとMをかけて、乱数R1を足してR2をXORする。
256ビット暗号文を書き込む。
こんな感じです。
改良案としては暗号文Cを分割してC(256bit)=C'=(C1'||C2')とします。
C1'^(~C2')=C"(128bit)
(C"^(~C"))=C2
C"^C2=C1
となることを期待しているんですがあってますでしょうか?
0944デフォルトの名無しさん
2006/12/28(木) 12:48:03どこまで正常に進んでいるか fprintf() なりでログ出すと良いと思うヨ。
多分 mpz_xxx の使い方が、想定している作法と異なるんじゃないかな
0945デフォルトの名無しさん
2006/12/28(木) 14:24:240946デフォルトの名無しさん
2006/12/28(木) 15:13:56バスエラーってのはデータアラインメントが合ってない時のエラー
long 型なら 4byte 境界に合わせるとか、
short 型なら 2byte 境界に合わせるとかしないといけない。
無理矢理にキャストしてる部分があるのかもしれない。
例
char data[10];
long *ptr;
ptr=&data[2];
*ptr=1234; ← 4byte境界でないのでここでバスエラー
0947デフォルトの名無しさん
2006/12/28(木) 16:07:330948デフォルトの名無しさん
2006/12/28(木) 16:13:250949デフォルトの名無しさん
2006/12/28(木) 18:57:46煽りと言うより事実のような希ガス
デヴィ夫人みたいに朝ズバッと言うタイプなんやね
0950デフォルトの名無しさん
2006/12/28(木) 19:15:000951デフォルトの名無しさん
2006/12/28(木) 19:30:54k&rの話でもしてれ
0952デフォルトの名無しさん
2006/12/28(木) 20:19:18K&Rの、何がレベルが高いんだ?
著者のスキルは高いとは思うが、昔の規格や昔の仕様語るのは、ただの懐かし話。
0953デフォルトの名無しさん
2006/12/28(木) 20:31:320954デフォルトの名無しさん
2006/12/28(木) 20:50:420955デフォルトの名無しさん
2006/12/28(木) 21:14:18K&Rの演習5-10「コマンド行からの逆ポーランド式を計算するプログラムexprを書け。
各演算子あるいは被演算数は引数として分離されているものとする。例えば
expr 2 3 4 + *
なら,2×(3+4)を計算するようにせよ」の問題の「*」文字の
取り扱いについて教えてください。
「アンサーブック」のプログラムで試してみましたところ,
コマンド引数にワイルドカードの「*」が含まれているためか,
「\*」のようにエスケープしないと不定値として取り扱われてしまいます。
問題の条件は,「例えば expr 2 3 4 + * なら,2×(3+4)を
計算するようにせよ」なので,このコマンド引数の形式を忠実に守ろうと
した場合,どのような変更が必要になってくるのでしょうか。
ワイルドカードやエスケープシーケンスは,シェルでの評価に依存する可能性もあるかなあと
今のところ考えているのですが,そうだとすると,環境依存(処理系依存?)ということに
なってくるのでしょうか。
0957デフォルトの名無しさん
2006/12/28(木) 22:21:17「外側でどうやって 2 3 4 + * の列を用意するかは様々」の一言で片付いてしまうわけだが
0958デフォルトの名無しさん
2006/12/28(木) 22:44:140959955
2006/12/28(木) 22:49:18レスありがとうございます。
同じ処理内容(逆ポーランド計算機)に対する引数を
ファイルにしておいた列からパイプで受け取ったり,
実行後に標準入力から受け取ったりする方法は,
K&Rではその該当演習問題の少し前のところ(邦訳で92ページ付近)で取り扱っています。
その流れからして,演習5-10ではコマンド引数を取り扱うことに
焦点が当てられていると思うのです。
コマンド引数としての「*」を,エスケープシーケンスを使わずに
不定値としてではなく,うまく受け取る方法があるものかなあという意味合いの質問です。
よろしくお願いします。
0960デフォルトの名無しさん
2006/12/28(木) 22:52:350961955
2006/12/28(木) 22:53:40Visual Studio 2005コマンドプロンプトでcl使ってコンパイルして
やってみたところ,「*」がそのまま適切に受理されました。
ありがとうございます。
(やっぱり,何とか依存というやつなのかなあ...)
0962デフォルトの名無しさん
2006/12/28(木) 22:57:520963955
2006/12/28(木) 23:01:45それも手,,,と思ったりもするのですが,
やっぱり前述の問題の条件からはずれてくるような気がして。
(気分の問題かもしれませんが)
ちなみに,「アンサーブック」の解答例のルーチンですと,”op1 op2 op3”のような囲みで
複数の引数を与えると,きちんと複数個の引数には分けてくれませぬ。。。
””囲みで与えることを考えるのであれば,
「アンサーブック」よりもうちょっと手の込んだルーチンを書かねばならぬような感じが
いたします。
0964デフォルトの名無しさん
2006/12/28(木) 23:03:170965デフォルトの名無しさん
2006/12/28(木) 23:03:51意味がわからん、もうちょっと具体的に
0966デフォルトの名無しさん
2006/12/28(木) 23:07:26シェルの多くは * を合致するファイル名に展開する
シェルのオプションで * をファイル名に展開する機能を抑制するか、
エスケープシーケンスなどを使うことでシェルがファイル名に展開しないように指示する必要がある。
また、コンパイラによっては引数として * を受け取るとスタートアップルーチン内でファイル名に展開して、
main(int argc, char **argv) の引数として渡すものもある
0967962
2006/12/28(木) 23:12:45キーボードから入力した整数と少数をプラスした結果をポインタによる
間接参照をしようして入力、乗算、表示部分すべてでポインタを用いる
プログラムを作ろうと思うのですが
少数をポインタに代入する方法がわかりません
0968デフォルトの名無しさん
2006/12/28(木) 23:12:58人に質問したいのに、どうして
その質問に関わる一番肝心な部分を省略するのかなぁ・・・
そういえば、このスレにソースコードを貼り付ける奴って、
いつもそんな感じだな。
必ずといっていいほど、一番肝心な部分が「省略」されている。
0969デフォルトの名無しさん
2006/12/28(木) 23:19:23中途半端に専門用語が混ざるとわけわからん文章になる典型
それと小数、な
0970デフォルトの名無しさん
2006/12/28(木) 23:20:380971デフォルトの名無しさん
2006/12/28(木) 23:20:42少数とはなにかって辺りから説明してくれたまえ。
0972962
2006/12/28(木) 23:26:52課題プリントの文章ちょこっと削ったらこんな文章になりました。
>>少数とはなにかって辺りから説明してくれたまえ
少数じゃなくて小数でした
0973955
2006/12/28(木) 23:30:01ということは,やっぱりコンパイラやシェルの影響をかぶってしまう訳ですね。
「シェルのオプションで * をファイル名に展開する機能を抑制」できることは
初めて知りました。ありがとうございます。
0974デフォルトの名無しさん
2006/12/28(木) 23:38:54意味が分からんが言いたいことはこんな感じ?
***************************
キーボードから入力した整数と少数を加算した結果を出力する.
で、入力、乗算、表示部分すべてでポインタを行うプログラムを作りたい
しかし小数をポインタに代入する方法がわかりません
***************************
で、聞くけどまずポインタが何かは分かってるのか?
>入力、乗算、表示部分すべてでポインタを行う
この部分がどうしたいのかがよくわからん
それぞれを関数として実装して値はポインタ渡しってことか?
0976962
2006/12/28(木) 23:51:00ポインタの理解度は初心者程度です。
小数をポインタに代入する方法が分かりません。(まさにその通りです
先生が作った課題プリントですので推測で述べさせていただくと
ポインタとは別の変数を用意してそこに小数を代入し、
その変数をポインタに代入してポインタから代入、乗算、表示をする
という意味だと思います。ちなみに、関数はつかわなくておkです。
0977デフォルトの名無しさん
2006/12/28(木) 23:55:27ポインタを用いずに、配列で
char month[] = "January";
month[4] = 'E';
とすれば正常に動くのですが
ポインタを用いて
char *month = "January";
*(month+4) = 'E';
とするとエラーがでてしまいます。やっていることは同じだと思うのですが、
配列だけの場合とどう違うのでしょうか?
0978デフォルトの名無しさん
2006/12/28(木) 23:58:47書き換えてはいけない領域を書き換えようとしたのが原因と思われる。
次のようにすればおk
char buf[]="January";
char *month;
month=buf;
*(month+4)='E';
0979974
2006/12/29(金) 00:00:42>先生が作った課題プリント
これをうpしろ
うp出来ないなら出来るだけ原文を…
それと宿題をマル投げならするつもりならこっちな
http://pc8.2ch.net/test/read.cgi/tech/1166969820/
ポインタってのは実体のある場所をしめすものだ
double d; ←こっちが実体
double *p; ←こっちがポインタ
p = &d; ←dのある場所の情報を p に入れる
*p と d の内容は同じものとなる
つまり*p = 1.02 とすると d も1.02になる
0981ぼるじょあ ◆yBEncckFOU
2006/12/29(金) 00:11:11(・3・) エェー おまい馬鹿じゃないかお? まさかそんなことを言って
回答者やってるんじゃないだろうな、それともただの通りすがりの入門者かお?
0982962
2006/12/29(金) 00:12:20ありがとうございます!
すいませんポインタはint型じゃないと宣言できないと思い込んでいました(汗
丸投げするつもりはなかったのですが、とりあえずポインタに小数を
代入する方法を教えてもらいたくて・・・
ちなみに原文ですが僕がアップした内容とたいして変わりません
キーボードから入力した整数と小数(それぞれ一つずつ)を加算した結果を
表示するプログラムを、ポインタによる間接参照を用いて、作成せよ
(入力、数値変換、表示部分すべてでポインタを用いる)
なにはともあれありがとうございました!
0983974
2006/12/29(金) 00:16:51オマエのスレ見たけどえらそーなこと言うほど回答してないな
しかも変態だし…
686 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
最低で250万までなら余裕で出せるお
肛○のなかに発射してしばらく挿入したままで余韻を味わって
最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
掃除して貰いたいお・・・はあ・・・。
0984ぼるじょあ ◆yBEncckFOU
2006/12/29(金) 00:23:37ここで回答するつもりはないしお
質問者はこちらへGOだお!ぼるじょあと名無しが
親切ていねいに君たちの質問に答えるお!
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/
0985デフォルトの名無しさん
2006/12/29(金) 00:24:25要するに宣伝かよw
0986974
2006/12/29(金) 00:31:45じゃあこんな感じかな?
int a,*pa;
double d,*pd;
double x,*px;
pa=&a;
pd=&d;
px=&x;
printf("整数値=");
scanf("%d",pa);
printf("実数値=");
scanf("%lf",pd);
*px = *pd + *pa;
printf("出力=%lf",*px);
0987デフォルトの名無しさん
2006/12/29(金) 00:43:26(・з・) エェー
なんで馬鹿と思ったか書かなきゃ訳わからないお
0988962
2006/12/29(金) 01:00:02回答まで教えて頂いてありがとうございます!
0989デフォルトの名無しさん
2006/12/29(金) 01:01:170990デフォルトの名無しさん
2006/12/29(金) 01:33:09友達いないと構ってもらうためにこんなに必死になれるんだね
0991デフォルトの名無しさん
2006/12/29(金) 01:43:08組み合わせをだすプログラムなんですが、
自分で階乗も使ってつくってみましたが
おかしい結果になってしまいました。
ヒントをくれませんか?
#include <stdio.h>
int kaijo(int s);
int ncm(int n,int m);
int main()
{
/*num1 = 元になる数,num2 = 取り出す数*/
/*初期化*/
int num1 = 0,num2 = 0;
/*データの取得*/
printf("n= ");
scanf("%d",&num1);
printf("m= ");
scanf("%d",&num2);
/*結果表示*/
printf("x = %d",ncm(num1,num2));
}
続きます・・
0992991 (2)
2006/12/29(金) 01:44:44int ncm(int n,int m)
{
/*元になる数nと取り出す数mが同じ場合と、取り出す数が0の場合は組み合わせは1になる*/
if(n == m || m == 0)
{
return 1;
}
else
{
return ((kaijo(n-1) * kaijo(m-1)) + (kaijo(n-1) * kaijo(m)));
}
}
よろしくお願いします!
int kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));
}
0993デフォルトの名無しさん
2006/12/29(金) 01:54:440994デフォルトの名無しさん
2006/12/29(金) 01:54:56ヒント:
#include <stdio.h>
iint kaijo(int s)
{
if(s < 0)
{
return 1;
}
else (s * kaijo(s-1));
}
int main()
{
int i;
for (i=0; i<6; i++) {
printf("%d, %d\n", i, kaijo(i));
}
return 0;
}
0995デフォルトの名無しさん
2006/12/29(金) 01:56:58ちみだけじゃまいか?
0996デフォルトの名無しさん
2006/12/29(金) 02:05:22C言語なら俺に聞け(入門篇) Part 6
http://pc8.2ch.net/test/read.cgi/tech/1167325490/
0997デフォルトの名無しさん
2006/12/29(金) 02:06:310998デフォルトの名無しさん
2006/12/29(金) 02:14:520999デフォルトの名無しさん
2006/12/29(金) 02:19:07自分の環境くらい整えとけよ
1000デフォルトの名無しさん
2006/12/29(金) 02:19:4910011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。