1 :
デフォルトの名無しさん :
2006/12/02(土) 10:16:33
2げっとずざー
ズサーc⌒っ・ω・)っ
4 :
ぴゅあ :2006/12/02(土) 15:25:35
6 :
ぴゅあ :2006/12/02(土) 15:51:52
(
>>5 より)
じゃあそれも追加しといて
forの中の話だけ挙げたので
毎回ifで判定するのって無駄じゃない?
数値を繰り返し入力し、合計、平均をその都度表示する ただし、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; } ここからどうすればいいんでしょうか よろしくお願いします
#include<stdio.h> int 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; }
> printf("goukei=%d, heikin = %d\n",goukei, goukei / cnt;); > } の部分修正、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に変える としてもいいと思う
>>9 ありがとうございます
それで、教えてもらってる身でこんな事言うのは
非常にあつかましいと思うのですが、
あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので、
もし、もうちょっと簡単な方法ってありますでしょうか?
本当にすみません我侭言ってしまって・・・
大丈夫。平均値を整数で出してるから。 あと、心理学の実験によると期待されているほうが成績がよくなるらしいぞ。
>>10 すみません、リロードしてませんでした
これまた難しい方法なんですねorz
授業だとcntとか習ってないのでたぶんもっと簡単な方法でやるんだと思うんですが、
もしかしたら先生の意地の悪い宿題かもしれないです・・・
>>14 C/C++っていう言語のスレかと思ってましたorz
スレ違いすみませんでした・・・
16 :
ぴゅあ :2006/12/02(土) 16:48:01
>>11 >あんまり高度な事やっちゃうと先生に変な期待もたれそうで怖いので
>>9 (
>>10 の訂正付き)でいいんじゃないかと思いますよ
後は提出までにコードを理解しておくこと
1個穴があるだろうと思うけど
>scanf("%d",&tokuten);
の前で"tokuten = 0;"とかするのがよかったりするんじゃないのかなとか思ったりするけど
そこんところはそのまま穴にしておいてもいいんだろうけど(先生からの指摘を待つ?)
「そこは人から教わりました」(理解できてたなら)でもOKだろうと思いますよ
>>16 そうですね・・教えて頂いた方法でやってみようと思います
とても助かりました
本当にありがとうございました
cnt → kaisu cnt++ → kaisu = kaisu + 1 ってすれば初心者っぽく見えるよ。
19 :
ぴゅあ :2006/12/02(土) 17:01:43
>>17 (追記)
>数値を繰り返し入力し、合計、平均をその都度表示する
>ただし、0を入力すると終了する
という課題を満足させるなら
>>9 (+
>>10 )のコードは最低必要になるだろうし
或いはそうでないなら"解りませんでした"になるのかも
>平均を出すときにどうやって今まで入力した回数を
>指定するかがよくわかりません
の"指定"とは、外から回数を与えたりするのではなく
"平均値を求めるために必要とする回数を得るにはどうすればいいのか"
と解釈しました
>>16 ごめん、穴がどこだか俺じゃ分からない
訂正キボン
>>8 です
↓無事作る事ができました
#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;
}
たくさんの助言ありがとうございました
本当に助かりました
>>21 実に上手い
これほど初心者っぽくはなかなか作れまい
23 :
ぴゅあ :2006/12/02(土) 17:15:14
>>20 2回目以降"scanf("%d",&tokuten);"に来たときのtokutenの値って
前回入力された値が入っているじゃないですか
たぶん…
そこでEnterキーだけ押したら前の値が入力されるかも?
・・・と思ったけど"%d"によってそうはならないみたいでした
なので一応
>>16 の後半は無視かも
ただ、(追求してみないと原因は判ってないけど)
適切な数値を入力→無効な文字(英字の文字列とか)
とするとループになってしまうようですけど
ここが対処できてしまったりするのは
宿題の答えとしては理解でき過ぎになるかも
24 :
ぴゅあ :2006/12/02(土) 17:20:02
>>22 というか…
自身が示した
>>8 のコードに対して
>kaisu++;
>heikin=goukei/kaisu;
>printf("平均=%d\n",heikin);
が必要と解ったみたいなので
理解できたということだと思う
>>23 あぁ、それそれ
直接的には覚えてなかったけどscanfよりgets&atoi使った方がいいってのはそういう事だったんだな
ループ懐かしいな
#include<stdio.h> int 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; }
任意の整数の約数(ただしその整数自体は含めない)の総和を表示するプログラムってどうやるんですか?
1から順に余り求めて0なら、割った数を足す。整数自身のときはカウンタ回して飛ばす
>26 それだと0のときも合計と平均出すことになるんだけど。
#include<stdio.h> int 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; }
>27 int i, n, sum=0; for(i=0; i<n; i++) if(n%i==0) sum += i;
for(i=0; → for(i=1;
>>27 #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)))));
}
>>25 >>26 うるおぼえだけど
int a;
do { scanf("%d",&a); } while( a != 0 );
として入力が 10G みたいになるとscanfは10だけ読んで終了する.
入力バッファに G だけ残るが次のscanfはバッファにはデータがあるけど読めないものだから 0 返して終了しちゃう(バッファもクリアされない)
結果延々ループになる
scanf の後に fflush 入れてバッファクリアすればいい
でも fflush って処理依存だったような気がするけど
35 :
34 :2006/12/02(土) 18:54:36
fflushじゃなくてrewindだろ。 fflushは出力に対して使うもの。
やりたいことは、stdioバッファに蓄積された(解析できない)データを 行末まで読み飛ばすことだろ。 それなら、 scanf("%*[^\n]"); でいい。 fflush()にしろrewind()にしろ、stdinに対して使った場合の挙動は 移植性が無い。
うる覚えじゃなくてうろ覚えだっていうツッコミはナッシング?
scanf・・・ ┐(´ー`)┌
freopen(stdin でOK
ポインタはわざと意味不明なこと言ってるんですよね?
2択の日本語クイズでやってたな ナイナイの番組
vprintf関数やvsprintf関数は、例えばこれらを中に含んだ関数を作って 出力先が同じ場合に毎回指定する手間を省いたり、独自の関数名を使うことで 出力先を分かりやすくして間違いを少なくするのに利用するんでしょうか?
>>43 vprintfの存在意義を確認してるって事でおk?
45 :
43 :2006/12/02(土) 21:48:47
>>44 あ、はいそうです
って良く考えなくてもvprintfは出力先標準出力に固定されてますね…
>>43 本当に必要になるまで関数の存在意義は分からないもんさ
「2つの整数 x と y の全ての公約数を求めて配列 d に格納する関数」 を作りたいのですが、 「2つの整数 x と y の全ての公約数を求める関数」が既にある場合、 その関数を配列dに格納する関数を新しく作るのと 関数を増やさずに作り変えて配列dに入れるのとどっちが楽ですかね?
48 :
デフォルトの名無しさん :2006/12/03(日) 02:28:58
関数でsleepと言うのがあるらしいのですが、 本屋でいくつかC言語の書籍に目を通してもそれに関する記述も無く、 どういった働きなのか、どう使うのか、そもそもC言語で使用する関数なのかどうか 詳しい内容がわからず困っています、 sleepについてお願いします。
>>47 1.「二つの整数 x と y の公約数全てを含めた”配列を返す関数”」を作るといいよ
2.既に安定した状態の関数を弄るよりは、それを使った方が可読性が上がる。
より公約数を割り出す関数を利用する関数を作って配列を返すのがいい、と俺は思う。
ただ公約数って、全部求めちゃった方が楽だよな…
だから、コピって別の名前つけて弄っちゃってもいいと思うよ
>>48 システムコール
50 :
デフォルトの名無しさん :2006/12/03(日) 03:44:11
すみません。 srand(time(NULL)); 使ってて、今まではちゃんとした結果を出してくれたのですが、 今同じプログラムを作動してみると、50%ぐらいの割合で、 めちゃくちゃな結果を出します。 どうしたら良いでしょうか? srand(time(NULL)); 使ったらやばい時間なのですか?
>>50 一応キャストして(unsigned)使った方がいいけどそこはあんまり問題じゃないと思う
そんなに大きいソースじゃなければ該当のソースを貼ってみてくれ
めちゃくちゃな結果が何を意味しているのかさっぱり見当がつかん。 疑似乱数の初期化なんだから乱数列はめちゃくちゃで当たり前だが。
53 :
デフォルトの名無しさん :2006/12/03(日) 03:55:14
#include <stdio.h> #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));
54 :
デフォルトの名無しさん :2006/12/03(日) 03:56:17
} else{ //コンピュターターン 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; }
55 :
デフォルトの名無しさん :2006/12/03(日) 03:58:15
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 10-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 *** こうエラーが表示されてしまいます。 誤り箇所など、ご指摘お願い致します。 行数を見ても、何処がどう違っているか、わかりません。
エラー E2209 10-4.c 5: インクルードファイル 'janken.h' をオープンできない エラー E2209 10-4.c 6: インクルードファイル 'boardfunc.h' をオープンできない janken.hとboardfunc.hが無いから、ちゃんと読めるように同じ階層に入れてあげて
57 :
53-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 *** だけになります。
58 :
53-55 :2006/12/03(日) 04:03:47
>>56 今のところ、#include "janken.h"
#include "boardfunc.h"
はまだ書いていません。
>>58 そかそか、分かった、着眼点が違ったようでスマソ
>printf("【○×ゲーム】"\n);
""の外に\nを書いちゃだめよ
60 :
デフォルトの名無しさん :2006/12/03(日) 04:07:42
C言語の少数に関して質問があります。 小数をバイナリ化した値 "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
>>60 printf("%f\n", (double)(integ) ) ;
62 :
53-55 :2006/12/03(日) 04:12:04
できました!ありがとうございました。
63 :
デフォルトの名無しさん :2006/12/03(日) 04:12:22
>>51 137行ですが、宜しいですか?
>>52 2次元粒子のシミュレーションです。
10*10の箱に20個の粒子を少しでたらめに配置し、
時間が立った後で20個それぞれのスピードを計算する、というプログラムです。
最初は20個の粒子のスピードを1に設定してるのですが、
マクスウェルボルツマンによればそんなにスピードが速い粒子は無いはずです。
が、自分のプログラムは時たまとてつもでかいスピードの粒子が存在するのです。
>>60 中々いい事してるね
浮動小数点の由来を調べてみるといいかも
詳しくは知らんし俺の推測からだけど
小数点の部分もfloatは格納してるから、
内部をそのまま写すと小数点の部分も整数として評価されるので、おかしくなる
>>65 に追加で丸め誤算が何故起こるかとかも調べるもっと賢くなれる
>>60 printf("%f\n", *(float *)(&integ));
ちなみにdoubleは64ビット
整数と少数の違いは置いとくとしても (float)(integ)でどうして2.3が出ると思うのか? integには整数しか入らないからキャストしても小数点以下は0しか出ない。
>>68 なるほど、そんな手が
ってか普通に思いつかない俺があかんな
しかしこの用法が一体何に結びつくのだろう
71 :
デフォルトの名無しさん :2006/12/03(日) 04:30:39
すみません、C言語に於けるマクロの意味を教えて下さい 機械語に変換される前に通るのと置き換えができると 入門書には書かれていますが、いまいちイメージが掴めません ですので、何か他の物に喩えて、簡単にイメージが掴める様に 説明お願いします。
>>71 萌え画像ー>(脳内変換)ー>興奮
↑
このへん
>>71 変換される前に通る、って何?
通る=変換だと思うんだが
>>74 お前のコンパイラ系は
プリプロセスで機械語に変換しているのか・・よかったな
77 :
71 :2006/12/03(日) 05:05:00
ありがとうございます、難しいですね… マクロウィルス?とかも確かにマクロと付きますね。 なんとなーくはイメージを掴めました。 通るが変換ですた、すんまそ
78 :
ぴゅあ :2006/12/03(日) 05:22:42
>>71 他のものに例えてみるのは考えるのが面倒なのでそのまま書きますけど
>>72 が示したページにあるように「機械語に変換される前に」というより
大抵のコンパイラにはコンパイルの段階の前にプリプロセッサによる処理というものがあって
(概ね:プリプロセッサ→コンパイラ→アセンブラ→リンカ)
そのひとつのマクロ処理はソースコードから文字列(トークン)の置き換えを行うもの
(飽くまで文字列(トークン)を文字列のまま扱って置き換えする)
そうそう、エディタで言えば置換機能
その結果として出てきたソースコードがコンパイラに掛けられます
例えば(いい例書けるか自信ないけど)
#define ARRAY_SIZE (5*10)
int array[ARRAY_SIZE];
と書いておくと
int array[(5*10)];
と書いてあったものとしてコンパイラに掛けられる(これのことを"通す"と言っているのかな?)ことになります
>>72 #include,#define等はプリプロセッサディレクティブ
Cで言うところのマクロ処理については#defineディレクティブになるのでは?
これらのディレクティブ(擬似命令)を使って書いたものがマクロであるとかはまず言わないような気も…?
質問者が例を言って去った後なのが悲壮感を誘う 感動した
80 :
ぴゅあ :2006/12/03(日) 05:26:27
81 :
71 :2006/12/03(日) 05:33:49
>>78 ありがとうございます!
しかしながら本当に難しいです
特に例を書いて頂いた辺りが、もう一度頭を冷やしてから考え直しますノシ
82 :
ぴゅあ :2006/12/03(日) 05:59:56
>>81 焦らずジックリやってみることですね
>>78 に挙げた例とかは実際見てみるまでもなくそうなってるんですけど
例えばVC++なら(今持ってる最新はVC7で)プロパティページで
構成プロパティ→C/C++→プリプロセッサの"プリプロセスファイルの生成"で生成するようにすると
コンパイラに掛ける前のソースコードファイル(拡張子.iのテキストファイル)が得られるので本当にそうなるか見てみるとか
gccなら-Eオプションかな
#includeとか含まれていると見るのが大変になるので
まずは先の例だけ書いてみるとか
更に色々書き替えてみてどうなるかとか
もしかしたら実際にやってみたりする方が感触つかめたりするのかも?
邪悪なCコードとか見るとマクロの異常さがよく解る ただし間違っても自分が書くコードの参考にしないように マジで
>>63 srandがおかしいと言ってるんなら
srandを使用した最小限のプログラムを晒すべき
それでおかしくならないのなら、srand以外のバグだろ
85 :
デフォルトの名無しさん :2006/12/03(日) 09:26:17
#include <stdio.h> double 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; }
86 :
85 :2006/12/03(日) 09:26:49
int main(void){ double 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; }
87 :
85 :2006/12/03(日) 09:28:10
上のはコンパイルはできるんですが 実行しても最後に出てくる数字が0ばっかなんです 初心者なんで良くわかりません どこが悪いのか教えてください
printfの%d
89 :
85 :2006/12/03(日) 09:39:14
うはwdクス!! 俺だめじゃんwwwww
>>50 srand(time(NULL))は、rand()が返す乱数の種として、そのプログラムの実行時の時刻を使うということ。
(これをやらないと、プログラムを実行するたびに毎回同じ乱数列が生成される。)
君の環境が何かは知らないが、srandやrandにバグがあるとは思えない。
srandはその後のrandの結果に影響するだけ。randは0〜RAND_MAXの任意の値を返すだけ。
rand()が返す値が0〜RAND_MAXであることを確認できれば、
問題は君のプログラムの別の部分にあるはず。
これまで正しく動作していて、ソースを何もいじっていないのに急に動かなくなったなら、
これまでに動かしたときに生成された乱数の列が、たまたま上手く動く(ように見える)パターンだった
というだけだと思う。
ソースをさらしたとして、指摘できるのはC言語の使い方としての誤りだけだ。
そのシミュレーションのロジックが正しく実装できているかは判断しかねるから期待するな。
91 :
50 :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]; と、ループの中で宣言したら書いたらオッケーでした。(でもなんでかわからん)
>>91 srand(time(NULL));
がおかしいと思った時はsrandを用いた最小限のプログラムでテストするべき、
それで問題なければ他のところがおかしいとわかる
変数の宣言する場所で結果が変わるなら、
変数のスコープというのについて調べればいいと思うよ。
>>91 思いつくのをあげてみると、
・Nがかなり大きな値なら、スタックがあふれているのかもしれない。
大きな配列はローカル変数ではなく staticをつけて宣言するかmallocで確保すべき。
・原因は他のところにある。初期化していない領域を参照しているとか。
スタックの配置が変わってたまたま正しい結果が返ってくるようになっただけ。
ちょっとだけESP発動。
10×10の配列の部分てどうやってる?
>>91 の中には2次元配列とか、(double *)の配列がないから、
もしかしてdouble x_new[N],y_new[N]; 辺りが10×10のデータを格納するためのもの?
94 :
50 :2006/12/03(日) 11:34:03
>>94 >vの分布が右にちょっと傾いた山型でピーク時のvが1ぐらいです。
そんな説明で何をやっているのか分かるわけないだろう。
人にソースを見せるなら、せめて各関数の意味と変数の意味ぐらいコメントで書け。
お前はこんなソースを人から見せられて、何をやっているのか理解できるか?
質問をするなら、それを受け取った相手に何が伝わるかくらいの配慮はしろ。
で。
>for(i=1;i<=N;i++){
> fx[i]=0;
fx[N]で宣言したなら、f[0]〜f[N-1]のみが使える。
f[N]にはアクセスするな。
他の配列も同様。
96 :
50 :2006/12/03(日) 12:51:17
>>78 ちょっと難しく書きすぎてないか?
全然読む気が起きない
99 :
50 :2006/12/03(日) 13:59:11
>>98 なんかただ小うるさいだけなんですよね。
もう答えてもらわなくていいです。
100 :
デフォルトの名無しさん :2006/12/03(日) 14:15:41
60です。 68の方! 本当に有難うございました。 できましたよー! ポインタの型変換ではうまくいくのに どうして(float)(integ)では駄目なのかな。。
101 :
50 :2006/12/03(日) 14:21:24
102 :
50 :2006/12/03(日) 14:23:11
>>100 逆に
>>60 のようにキャストしたい数字の内部表現を知らなかったらキャストできないってことになったら不便だよね
ちなみにわかってると思うけど
1075000115 = 0x40133333
105 :
ぴゅあ :2006/12/03(日) 14:46:01
>>100 キャストとポインタがシッカリ理解できるようになれば解るようになるだろうと思います
"(float)(integ)"はintであるものを"floatに変換"している
"*(float *)(&integ)"はintの領域(4バイト)に格納されているものを"強引にfloatとして格納されたものだ"として取り出している
ということがいずれ解るようになれば
直ぐに解らなくても色々やっているうちに解る時がくるだろうと思いますよ
まだよく解らないと思ったら、これが理解できるまでここで止まってるようなことをしないで
取り敢えず先へ進んでおいて後で戻ってみるのがいいと思います
シッカリ進めていっていれば、あのときなんで解らなかったんだろうと思っている自分が居たりするだろうと思う
俺よりも知識あるんだろうし頑張ってるの分かるんだけど ぴゅあは質問者の事をあんまり考えられないんだな
107 :
ぴゅあ :2006/12/03(日) 15:04:04
>>100 補足
# "*(float *)(&integ)"は…
これはintである(intとして格納されている)ことを無視して、強引にfloatとして格納しているとしているわけで
floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
(malloc()で取ったvoid *状態からキャストしても可)
逆に元々のintであることとかを無視してしまっているので、今回の例のように明確に理由がある場合以外では滅多に使うものではないです(というより、使ってはいけません)
この悪い例としては
ポインタを使っているコードで、キャストの部分でエラー(警告)が出るからということで、闇雲にキャストしてエラーを消すということ
エラーは消えたけど、真の意味を無視しているので動くわけないです
意外とプログラマとして仕事している人の中にもポインタを理解している人が少ないチームではやってしまっているのを多く見掛けるようです
ポインタを理解した後でもいいので、気に留めておくといいと思います
108 :
50 :2006/12/03(日) 15:06:36
for(i=1;i<=N;i++)の所を for(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; に変えました、これでファイナルアンサーで良いですか?
>>108 それは知らん。お前のプログラムの仕様はお前にしか分からない。
コンパイルでエラーが無く、プログラムを実行したときに正常終了すれば
プログラムが正しく動いたといえるわけではない。
実行した結果が正しいかを確認する方法くらいは自分で考えたら?
>>107 >floatとして格納できるメモリ域さえあれば別にchar[4]だろうが、より大きいメモリ域を取るdouble等なんでもいいわけです
>(malloc()で取ったvoid *状態からキャストしても可)
アーキテクチャによっては、floatとしてアクセスする領域のアドレスがsizeof(float)の境界にあってないと
いけないということも気にしたほうがいい。
>>100 もう見てないかもしれないけど
そんなときには union 使うと便利
union{
float dat_f;
long dat_l;
}integ;
とか
>>60 ,100
ぶっちゃけ、
>>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の代わりにバイト配列使えばヨシ。
unionの使い道を始めて知った…
>>114 どっちかというと邪道な使い方ですから。
寧ろ、正道な使い方だと思う。
初心者学習のお勧めページとかないですか?
ま、↑のはunion使う一番の典型例でないことは確かかな。 といって、邪道というほどでもない。 malloc()の実装などで、境界あわせ目的でunionが使われたりする。 後は、バイト配列と整数型のunionで、バイトアクセス、ワードアクセス両方 可能にするとか。こういうコードは思いっきりエンディアン依存になるけどな。 この類は低水準のコード以外では出て来にくいのは確か。
119 :
デフォルトの名無しさん :2006/12/03(日) 21:59:12
元ネタを書いた60デス。 >(float)(integ)でどうして2.3が出ると思うのか? >integには整数しか入らないからキャストしても小数点以下は0しか出ない。 ごもっとも。あ゛〜くやしいー。完全に勘違いです。 >u.ival = ....; >printf("%f\n", u.fval); >で大丈夫。 スマート! これいいですね! ぴゅあさんはじめ丁寧な説明有難う御座いました。m(__)m お礼になぜこんな質問をしたか、を書いておきます。(読み飛ばし可) X-Planeというフライトシミュレータがありまして、そのソフトにある設定を するとUDP通信で飛行速度や、飛行している方向を他のPCに転送できる、 というマニアックな機能があります。UDPでのデータ受信は苦労の末できた のですが、それをfloatに変換するのにてこずって先の質問をさせて頂きました。 しかも送ってくるのがビッグエンディアンで、しかも少数のバイトオーダ変換 について詳しく書いてあるページを探し出せなかったのです。 本来はPerlのunpack関数で出来ると思っていたのですが、、、、あ、これはスレ違い?
>>119 バイナリ通信プロトコルなら、ASN.1みたいな規格が参考になるんじゃないかな。
ぐぐってみそ。
んでも通信っつーことなら、そのやり方はあまりよろしくない。
浮動小数点数の表現形式は思いっきりアーキテクチャ依存だから。
それと、エンディアン無視すれば、単にfloatの変数にmemcpy()って手もあるよ。
121 :
ぴゅあ :2006/12/03(日) 23:04:44
wsprintf と sprintf の違いって何なんでしょうか wsprintfだと浮動小数点が使えないんですけど、wsprintfに 何か利点があるんでしょうか 素朴な疑問です
sprintfはchar型の文字列、wsprintfはwchar_t型の文字列を扱う。 wsprintfが浮動小数点を扱えないのではなく、君のプログラムでの文字列の扱いがおかしい。 とりあえずマニュアル、規格書、ネット、何でもいいからwsprintfが何者かくらいのことは調べたのか?
>>123 嘘を教えないように。
wsprintf()はWin32API。
charではなくTCHARを扱う。仕様は標準のsprintf()のサブセットといったところで
機能が貧弱。
VC++は同じくTCHARベースの_stprintf()という関数を提供しており、これは
sprintf()と同等の機能を提供している。
wchar_t系の標準関数は、wsprintf()ではなくswprintf()ね。
wsprintf()を使うべき理由はあまり無いだろうね。強いて言えば、Cランタイムに
依存したくないといったケースかな。
>>124 wsprintf は (cdecl 呼び出しできれば) 他言語でも利用可能だね。
127 :
デフォルトの名無しさん :2006/12/04(月) 15:27:47
先日面接で仕事の内容はC言語による画像処理だと言われたのですが これは具体的にどういった作業で、どういった事を知っておくべき仕事なの でしょうか。イメージがわきません。 ご助言のほど宜しくお願い致します。
wavファイルを読み込んで、wavファイル中の音が一番強い部分の時間を 表示させるプログラムが組みたいのですが、どのようにすればいいですか? 音が強い部分をどうやって判定していいかよくわかりません。
>128 マルチすんな
>>127 仕事先に訊けよw
画像処理と言ったっていろいろあるんだし
131 :
デフォルトの名無しさん :2006/12/04(月) 15:41:06
面接受けた会社が即戦力を求めていれば 訊けば無知なやつだと思われて 落とされる可能性があると思ったのかな
132 :
127 :2006/12/04(月) 17:25:18
まさにその通り!
>>131 まさか担当の人このスレ見てたらやばいから多くは語るまいぞ。
>>132 逆に まーったく適正外の仕事を押し付けられる可能性もある ってことだぜ?
>>132 例えば、具体的なキーワードを出されて「そんなのは知りません」ってのはまずいと思うが、
「画像処理」などという抽象的な事前情報しかないのなら、
具体的にどんなことやっているのかを聞くのは悪いことではないだろう
まあ面接前に聞くなり調べるなりしろよって感じはするが
>>127 どんな会社かによって全然変わるわけだが。
フレーム間差分オブジェクト抽出とか特徴点検出とかオプティカルフローとか
そういった応用の利く基本的な技術を身に付けておく(車輪の最発明をしておく)といいよ。
再発明を一発で変換してくれないMSIMEはやっぱ糞だな。ATOK買うか・・・
137 :
127 :2006/12/04(月) 19:22:02
レスありがとうございます。 まあ業界未経験なもんで、どんな仕事でも入り込めれば儲けものと いうかww キーワードはぐぐってみます。 もう一度、面接あるのでその時は多少分かっているような 口をきくつもりです。まあ今回で落ちた可能性も大だがwww
138 :
デフォルトの名無しさん :2006/12/04(月) 19:31:50
#if defined と #if def の違いを教えてくれ。 どう使い分ければいいんだ?
140 :
デフォルトの名無しさん :2006/12/04(月) 20:10:18
VC++のMFCはVC++ExpressEditionには付いてないようですが ExpressEditionを使えるからといってVC++出来ますといって いいものでしょうか。
>>140 VC++ExpressEdition出来ますと言えばいいじゃまいか
>>140 普通にMFCやった事ありませんでおk。
もしかしてExpressEditionってSTLもないのか?
標準ライブラリはきちんとある。
> VC++出来ます 日本語でおk
>>143 じゃあいいんじゃね。
俺はMFC嫌い。
あんま技術に関係ないトークはマ板でやれよ。 ココはあくまでC言語の話をするスレだろ。
147 :
デフォルトの名無しさん :2006/12/04(月) 22:23:51
どなたかわかるかたお願いします。 const char str[]="sumple-string."; char buf[strlen(str)]; の定義があり、先頭から5バイトまでを切り出したいので strncpyで切り出すことを考えています。 strncpy(buf,str,length); しかしながら、\0が入っていないため、printfが正常に出来ません。 この場合、どのようにしてNULL文字を後部にセットすればよいでしょうか? もしくは、先頭からxbyteを切り出すのにもっと効率の良い方法がありますか? 尚、lengthにはsize_t で5になっています。 よろしくお願いします。
149 :
デフォルトの名無しさん :2006/12/04(月) 22:49:43
すみません、どうもうまくいかないです。。 str:あいうえお 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));
>>149 >char buf[bytes];
サイズが足りない
char buf[bytes+1];
>>149 あと
buf[bytes] = "\0";
¥0 はシングルで囲む
'\0'
できました! シングルクオートで囲むのがポイントだったみたいです。 ありがとうございました。
strncpy()は仕様が変態的だからなぁ。 strncpy(dst, src, n); において、 strlen(src) >= n の時、dstはヌル終端されない。 strlen(src) < n の時は、n byteまではヌルで埋められる。 よって、↑の後は、お約束として dst[n] = '\0'; とすべし。 代わりにstrncat()を使うという手もある。 dst[0] = '\0'; strncat(dst, src, n); でオッケーだ。strncat()はヌル終端を保障するし、余計なヌル埋めもしない。
154 :
デフォルトの名無しさん :2006/12/05(火) 00:13:46
>139 サンキュウ。
155 :
ぴゅあ :2006/12/05(火) 00:18:08
>>149 目的通りに解決したってことなんでしょうか…
(
>>147 より)
>先頭から5バイトまでを切り出したい
(
>>149 より)
>すみません、どうもうまくいかないです。。
は
>>147 とは別の話?
>buf:あいう len:6
>という出力を期待しているのですが、、
で、やりたいことが変わっているような気がするし・・・
全角/半角の意識とかなくてOK?
なんかやりたいことが今一つ見えない気がしたりですけど。。。
いいのかな
>147とは別の話? >やりたいことが変わっているような気がする おそらく同じ。どちらも、「先頭からnバイトを切り出して別の配列に入れたいが、最後に\0が入らない(printfが正常に働かない)」という内容。しかもstrとbufの使い方が同じ。 >全角/半角の意識とかなくてOK? 「buf:あいう len:6」とか書いてるって事は全角/半角を意識している証拠。 >なんかやりたいことが今一つ見えない気がしたりですけど 日本語で頼む。 >いいのかな いいんだよ。
多重ループの脱出にはgoto文を使うべきですか for(){ for(){ if(){ goto label; } } } label: こういうのをgoto文を使わずに簡単に書くにはどうしたらいいですか
ループだけを別の関数に閉じこめてreturnとか? ま、そこは通常gotoを使うべき珍しいケースの一つだと思うけど。
まあ設計ミスだよな。
内側のfor文が終わった直後に おんなじ条件判定かますとか。 若干もったいない気がするけど。
ifの中で条件判定を2つとも満たしちゃうとか? ちと無理やりだが。
signed char c=0x0000ff; としても printf("c = %x",c); とすると結果には"c = ffffff"と表示されます cをunsigned charで定義すればちゃんと"c = ff"となるのですが、どういう違いがあるんでしょうか?
163 :
162 :2006/12/05(火) 05:04:41
すみません、WindowsXPでVC++でコンパイルした時の結果でした
>>162 cが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に格上げになるのかは、
まあそういう規則だからと思っておけ。
詳しくは関数のプロトタイプの解説をどっかで見つけて読めばいいと思う。
165 :
162 :2006/12/05(火) 05:19:33
>>164 確かにfが二つ足りなかったです、すみません
これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか
単一の引数でも式とみなして処理しちゃうんですね
すっきり理解できました、ありがとうございます
>>165 >これがintより小さい型は演算を効率よくする為にintにキャストする、とかいうやつですか
まあその名残だ。今ではそういうルールだからとしか言えないけど。
167 :
ぴゅあ :2006/12/05(火) 07:50:16
>>157 その程度ならまだgotoを使うほどのものでもないと思う
>>159 の言っているのに近いというのか、実際に入るロジックからどう練るかによると思うけど
>>165 >166の解説はこの場合ちょっと違う。
この場合、式だからintに格上げされるのではなく、可変長引き数だからintに格上げされる。
169 :
デフォルトの名無しさん :2006/12/05(火) 10:15:35
>157 gotoを使うのがベストだと思うな。
俺もCなら教条主義的にgoto否定することはないと思うぜよ。 言語が貧弱なんだからしょうがない。 少なくとも多重ループからスマートに脱出する手段をCは提供していないし、 エラー処理もgoto使ったほうがすっきりする場合がある。
gotoについては教条的に否定すべきものではないのは同意。 同意の上で、gotoを排除するように努力はすべきだと思う。 その努力の結果、コードがわかりづらくなるのであれば、 それはあなたがまだまだ精進すべきだったか、 あるいはそこにgotoがあるべき場所だったかのどちらかだ。 なんにしろgotoを排除する努力は怠るべからず。 ただし必要とあれば堂々と使うべし。
なんで偉そうなの?w
173 :
デフォルトの名無しさん :2006/12/05(火) 13:44:56
テキストファイルをアップして質問をしたいんですけど、どうすればいいですか?
BASE64で変換してここに貼ればOK
175 :
173 :2006/12/05(火) 13:56:52
I2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8dGltZS5oPg 0KDQppbnQgbWFpbih2b2lkKQ0Kew0KICBpbnQgaSxqLHhbNF0seVs0XSxoaXQsYmxvdyxudW1iZXI7 DQogIGludCB0cmlhbHM9MDsNCg0KICBzcmFuZG9tKCh1bnNpZ25lZCl0aW1lKE5VTEwpKTsNCiAgIH doaWxlKDEpew0KICAgICBmb3IoaT0wO2k8NDtpKyspew0KICAgICAgIHhbaV09cmFuZG9tKCkgJSAx MDsNCiAgICAgfQ0KICAgICBpZih4WzBdIT14WzFdICYmIHhbMV0hPXhbMl0gJiYgeFsyXSE9eFszXS AmJiB4WzJdIT14WzBdICYmIHhbM10hPXhbMF0gJiYgeFsxXSE9eFszXSl7DQogICAgIGJyZWFrOw0K ICAgICB9DQogICB9DQoNCg0KICB3aGlsZShoaXQhPTQpew0KICAgIHByaW50ZigiQ2hvb3NlIGZvdX IgbnVtYmVycyA6Iik7DQogICAgc2NhbmYoIiVkIiwmbnVtYmVyKTsNCiAgICB5WzNdID0gIG51bWJl ciAlIDEwOw0KICAgIHlbMl0gPSAobnVtYmVyIC8gMTApICUgMTA7DQogICAgeVsxXSA9IChudW1iZX IgLyAxMDApICUgMTA7DQogICAgeVswXSA9IChudW1iZXIgLyAxMDAwKSAlIDEwOw0KICAgIA0KICAg IGhpdD0wOw0KICAgIGZvcihpPTA7aTw0O2krKyl7DQogICAgICBpZih4W2ldPT15W2ldKXsNCiAgIC AgICAgaGl0Kys7DQogICAgICB9DQogICAgfQ0KIA0KICAgIGJsb3c9MDsNCiAgICBmb3IoaT0wO2k8 NDtpKyspew0KICAgICAgZm9yKGo9MDtqPDQ7aisrKXsNCglpZihpIT1qICYmIHhbaV09PXlbal0pIH sNCgkgIGJsb3crKzsNCgl9DQogICAgICB9DQogICAgICANCiAgICB9DQogICAgdHJpYWxzKys7IA0K ICAgIHByaW50ZigiSGl0cyA6ICVkICwgQmxvd3MgOiAlZFxuIiwgaGl0LCBibG93KTsNCiAgfQ0KIC BwcmludGYoIlRyaWFscyA6JWRcbiIsdHJpYWxzKTsNCiAgIHByaW50ZigiwLWy8qTPIik7DQogIGZv cihpPTA7aTw0O2krKykNCiAgICBwcmludGYoIiVkIix4W2ldKTsNCiAgcHJpbnRmKCKkx6S3pL+ho1 xuIik7DQogIHJldHVybiAwOw0KfQ0K 上はBASE64で変換したものです。 このプログラムのアルゴリズムを説明しなければならないのですが、よく理解できません。 特に15行目が何をしているのか理解できていません。 このプログラムのアルゴリズムを説明していただけないでしょうか?
>>175 15行目は、x[0]〜x[3]に同じものが入っていないかを検査している。
互いに異なるランダムな数字(0〜9)が入っていれば次に進んでいる。
177 :
173 :2006/12/05(火) 14:44:01
>>176 様
ありがとうございます。
この部分だけがどうしても分からなかったので、
ここさえ分かれば後は大体自分でも理解できそうです。
本当にありがとうございました。
178 :
デフォルトの名無しさん :2006/12/05(火) 14:59:14
windowsのマシンからlinuxのマシンにソケット通信で データを送りたいのですができますか?
179 :
デフォルトの名無しさん :2006/12/05(火) 15:07:40
できるだろ。
181 :
162 :2006/12/05(火) 15:41:22
>>166 ,168
どうもです、色々ルールがあるんですね
182 :
178 :2006/12/05(火) 16:03:13
windows側はWinsockで、linux側はどうすれば? ちなみにwindows側から、linux側に簡単な整数のデータを送りたいのですが
BSD socket あるだろ。 ところで、両方のコードを書くのか?
184 :
178 :2006/12/05(火) 16:10:45
プログラム始めたばかりの初心者なんでよくわからないんですけど 送信側、受信側で両方のコード書かなきゃだめなんですよね?
初心者とか関係ないだろw
送信側のコードだけ書いて送信したら、あとは
>>178 の脳内で勝手に受信するのか?
Linux側にデータを送らなければいけない理由次第。
既に稼動している何かにデータを転送するつもりなら 送信側だけだし
そういうシステムを構築する って話なら Linux鯖 & Windows クライアント 両方書くことになるし
初心者に手が出せる規模でもないような気がする…
1対1接続の Windows(鯖のようなピア) ⇔ Windows(クラ) からじゃね?
C言語はできて当然の前提でネットワークは別の難しさがあるかなな
具体的に詰まってからはコッチだな
ネットワークプログラミング相談室 Port18
http://pc8.2ch.net/test/read.cgi/tech/1159692799/
187 :
178 :2006/12/05(火) 16:32:12
linuxサーバのほうで送られたデータをもとに、phpで処理する感じです ソケットしかないのかなと思ってるんですが、どうなんでしょう・・・ 初心者には難しいですかorz どうしても、学校の製作実験でwindowsからlinuxのほうに データ送るという処理をやらなければいけなくて
わからんならinetdでも使っとけよ
Linux側がPHPだと、もしかして通信はHTTPだったりしないか? プロトコルが何にせよ、Windows側はCよりもC#やJavaの方がかなり楽だ と思うよ。学校の実験関係だと言語は選べないかもしれないが。
HTTPならいくらでもサンプル転がってるだろ
Linuxの受け側がPHPってことは、Windows側のクライアントは確実にHTTP。
とすれば、Perl/Ruby/Pythonあたりのスクリプト言語を使うのが
一番手軽だと思う。JavaやC#も可。
まぁ、「整数値を一個渡したい」だけなら、一々クライアントなんぞ手書きせずに
wget
http://linux-server/foo.php?number=5 とかでいいんだが、流石にこれじゃダメだよなw
どーしてもCでHTTPクライアント書かないといけないんなら、
WinInet API使うのが比較的楽。
192 :
デフォルトの名無しさん :2006/12/05(火) 21:39:17
自作のヘッダファイル(a.h)と関数のためのファイル(b.cpp)と本体ファイル (c.cpp)をコマンドプロンプトから実行ファイルにするにはどうすればいいの でしょうか。 bcc32 a.h b.cpp c.cpp でいいんでしょうか?
194 :
デフォルトの名無しさん :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のポインタを一つずつ動かしてチェックしようにもその動かし方と比較の方法がわからなくて、、 どなたかわかる方いたら、教えてください。。
>>194 別にポインタ使わなくても
i文字目はstr[i]で表せるし、比較したいならif(str[i] == '2')でOK
196 :
も。 :2006/12/05(火) 22:11:53
『定数 \n を宣言するコードを記述して表示しなさい』とはどのようにするのですか? 教えてください!
197 :
デフォルトの名無しさん :2006/12/05(火) 22:15:48
>>192 Cコンパイラ(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がなかったら「ヘッダーファイルが見つかりません」のメッセージを
出して処理を中止する。
198 :
デフォルトの名無しさん :2006/12/05(火) 22:17:00
\nって改行を表すエスケープシーケンスだから、其の定數を宣言しろって云うのが先ず意味分からん。 \nの文字コードを表す定數って事ですかな?
>>194 この程度は手書きでいいんじゃね?
↓のような感じで。
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;
}
200 :
mo. :2006/12/05(火) 22:21:16
わかりました。ありがとうございました(^^)
201 :
194 :2006/12/05(火) 22:22:10
ありがとうございます。 int 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でこけているようなのですが、理由がわかりません。なぜなのでしょうか?…
>>198 たぶん'\n'の文字コードを数値で表示しろということなんだろうけど、
宿題スレにでも行ってもらったほうがいいと思う。
204 :
194 :2006/12/05(火) 22:24:12
>>199 ありがとうございます。
最後の*dst = 0;は、どういう動作をするのでしょうか?
206 :
デフォルトの名無しさん :2006/12/05(火) 22:24:18
wordは、char型の配列。 word[i]は、char型。 char型の変数の中身を表示する時は、printfの変換書式は%c
208 :
デフォルトの名無しさん :2006/12/05(火) 22:28:27
>>204 そうしないと、其の文字列を表示した時、
メモリ上に'\0'が見つかる迄表示し続けてしまう。
209 :
194 :2006/12/05(火) 22:29:30
わかりました。 ありがとうございました。頑張ってみます。
210 :
デフォルトの名無しさん :2006/12/05(火) 22:30:24
>>202 そう云う事ならこうなるな。
const int newline = '\n';
211 :
194 :2006/12/05(火) 23:19:15
すみません、もう一つ質問です。
>>199 さんの関数の場合、呼び出すときに
string[20]
foo(string,"0123456789")
のようにする必要がありますが、
stringの配列の量を定義することが出来ない場合(const charに来る量が不定)、どうすればよいのでしょう?
上記の関数で言えば、char stringを初期化し、dstのアドレスを取得して代入すればstringの配列の量を指定しなくても良いと考えたのですが…
>>211 char *dst;
dst = malloc(strlen(src)+1);
とでもしる。
214 :
194 :2006/12/05(火) 23:46:26
わかりました。ありがとうございました。
215 :
192 :2006/12/06(水) 07:41:30
gcc bmp.c test0.c -o test0 レス有難うございました。 ちなみに 上記のような場合、-oとは何を意味するのでしょうか。
おまえ馬鹿か? 少しはマニュアルみろよ。man gccとかさ。 あまえてんじゃねえよ。糞が。 -o: 出力ファイル名の指定
218 :
215 :2006/12/06(水) 11:35:33
厳しいお言葉でもきっちり教えて頂き有難うございました!
K&Rのfopen関数の説明ではファイルとファイルポインタを結びつける時に、空きがあるかどうかは fp->flagを参照してフラグが立っているかどうか調べているようなんですが、 最初にFILE構造体の中身は0で埋まっていることがコンパイラかOSで保証されているんでしょうか?
>>219 OSや標準ライブラリのバグを心配してますか?
>>219 そうだ、と答えれば満足するのか?
その方法は実装依存だが。
一番単純な実装だと、FILE構造体の配列はstaticに取っておく。
そして(実初期化の)staticなオブジェクトは0で初期化されるのが、
C言語の仕様だ。
実際にはそういうオブジェクトは実行ファイル中のBSSセグメントに配置され、
実行時にローダによって0埋めされたり、といったことが行われる。
222 :
219 :2006/12/06(水) 14:07:57
>>220 たまたまファイルオープンする前からフラグが立っていて困ることはないのかなと思って
そこまでは書かれていなかったので気になったんです
>>221 詳しい説明ありがとうございます、納得できました
でもまあ今時staticな配列で実装していることはないと思うけどな。
>>223 少なくともVC7.1(VS2003.NET)までは_iob[]っていうstatic配列だよ。
VC8.0はどうだか知らないが、多分同じだろう。
226 :
ぴゅあ :2006/12/06(水) 21:20:00
>>219 違うと思うので…
fp->flagのfpが指すものって誰が作ってます?
fopenがFILE構造体のポインタを返すとき
適切に設定されて渡されるのではないのかな
>>226 えーと。
>>219 が言ってるのは、fopen()時に、FILE構造体配列の中の空きスロットを
探す処理のことだろ。
開きスロットかどうかを判断するのにflagメンバが非ゼロかどうかで判断している
ので、どっかで配列全体の少なくともflagメンバは、ゼロに初期化されていなければ
ならないという話。
228 :
219 :2006/12/06(水) 22:08:58
229 :
ぴゅあ :2006/12/06(水) 23:36:03
>>227-228 ライブラリの中の話ってことね
ならば、実装依存と言えば実装依存ですけど
初期化されてないと困るのはライブラリなので
保証されてるということを信じていいのでは?
実際何処がやっているかはライブラリと一緒に付いてくるスタートアップコードでしょう
(ライブラリに必要な初期化を行う)
>>221 とかが言っている辺りは例えOSがそれをやってくれていてもライブラリがやってくれていると思いますよ
(スタートアップのソースコードを見てみればいい)
問題集Wikiみたいなのなかったっけ?
231 :
デフォルトの名無しさん :2006/12/07(木) 00:04:47
質問です。総合開発環境(BCデベロッパー)からボタン一つのメイクで 作られた実行ファイルは問題なく正常動作するのですが、コマンドプロンプト から bcc32 4char.cpp という形で作られた実行ファイルは正常動作して くれません。 一体何が原因なのでしょうか。
232 :
デフォルトの名無しさん :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
そんなんで分かるわけがない
>>232 正常動作してる
警告は問題ない
実際exeが作成されているはず
「エラー」ならコンパイル失敗
235 :
デフォルトの名無しさん :2006/12/07(木) 00:15:10
#include <stdio.h> #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" "フォルダに置いてください。");
236 :
231 :2006/12/07(木) 00:16:24
printf("対象のファイル名を入力してください\n" "---> "); scanf("%s",fname); if((fp=fopen(fname,"r"))==NULL) puts("読出しオープン失敗"); else{ puts("ファイル内容表示"); while((ch=fgetc(fp)) !=EOF){ chx[i++]=ch; putchar(ch); } } fclose(fp);
237 :
デフォルトの名無しさん :2006/12/07(木) 00:17:07
for(i=0;i<MAX;i++) if(!(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'; } } }
238 :
デフォルトの名無しさん :2006/12/07(木) 00:17:43
chy[xxx]='\0'; putchar('\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("書き込みオープン失敗");
239 :
デフォルトの名無しさん :2006/12/07(木) 00:19:00
else{ for(i=0; chy[i]!='\0' ;i++){ fputc(chy[i],fp); putchar(chy[i]); } fclose(fp); } puts("処理は成功しました。"); scanf("%d",&i); getchar(); return 0; }
240 :
231 :2006/12/07(木) 00:24:37
アップローダーの使い方が分からず申し訳ありません。 ボタン一つのメイクで作った実行ファイルからは"処理は成功しました" の部分まで行くのですが、コマンドプロンプトで作ったものは "数字と空白のみのはず"のところまでしか行かず、途中で 終了してしまいます。
241 :
231 :2006/12/07(木) 00:36:10
四つ連続している数字のみを残すようにファイルを 書き換える処理です。 三つ連続数字や英文字などは削除します。 コマンドプロンプトで作られた実行ファイルではファイルの内容は まったく変化しません。
>>231 indentぐちゃぐちゃだな……
ちゃんと読んでないが、
>>237 の先頭のforループによって、chx[]の中身は'0'〜'9'か' 'のみになっており、
\0は含まれない状態になっている。
にもかかわらず、
>>237 の9行目のwhileループは、chx[]が\0で終端されていることを期待している
だろ。これではループが正常に終了しない。実際にはchx[]から続くアドレスを
読み続けて、たまたま'\0'があった地点で終了するわけだが、バグだな。
IDEでコンパイルした時は、最適化オプション等の差で、「たまたま」上手く
動いているように見えただけだろう。
>for(i=0;i<MAX;i++) > if(!(chx[i] >='0'&& chx[i] <='9')) > chx[i]=' '; これってMAXまでだから0クリアしたところもスペースに置きかえられてるよね それなのに >while(chx[i] != '\0'){ こんな条件にしてるのが問題では
244 :
デフォルトの名無しさん :2006/12/07(木) 03:12:19
#include <stdio.h> #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
245 :
224 :2006/12/07(木) 03:12:56
/*ボードを表示する関数*/ void 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"); } }
246 :
224 :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行目の ) がわかりません 付いてるはずなのですが、エラーを起こしてしまいます。 ご指摘お願いします。
247 :
最初からになります :2006/12/07(木) 04:26:34
include <stdio.h> #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
248 :
最初からになります :2006/12/07(木) 04:28:02
/*ボードを表示する関数*/ void 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"); } }
249 :
最初からになります :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; }
250 :
最初からになります :2006/12/07(木) 04:29:52
/*コンピュターの選択した位置にマークする関数*/ void 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;}
251 :
最初からになります :2006/12/07(木) 04:30:46
//横方向 for(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; } }
252 :
最初からになります :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;}
253 :
最初からになります :2006/12/07(木) 04:42:26
//斜めチェック if(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; }
254 :
最初からになります :2006/12/07(木) 04:43:55
警告 W8019 boardfunc.c 81: コードは効果を持たない(関数 writeCompMark ) 警告 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 これらが、どうしても、解決しないので誤り箇所を指摘お願いします。 長々、すんまそ。これらを数時間もかけて書きました。
255 :
ぴゅあ :2006/12/07(木) 08:01:03
>>254 長々お疲れさま(貼り付けただけ?)ですけど
81,95,112,127行がどれかをしてしてくれた方がありがたい気がするなぁ。。。
2つは確かに指摘されてる通りのものがあるだけど
あと2つは見つけられない。。。
>コードは効果を持たない
>board[j-1][b-1] == m_maru;
は何をしたいと考えたコード?
>81,95,112,127行がどれかをしてしてくれた方がありがたい気がするなぁ。。。 してしてくれた >2つは確かに指摘されてる通りのものがあるだけど あるだけど 日本語でどうぞ。
257 :
231 :2006/12/07(木) 11:00:08
レスくだすった方、誠にありがとうございました。 これは自力ではとても解決できない問題でした。 サンキュウベルマッチです。
258 :
デフォルトの名無しさん :2006/12/07(木) 14:33:36
1. 二つの文字列s1,s2 をキーボードから入力し,それぞれの文字列の長さ(NULL 文字は含まな い)を画面表示し,さらに文字列s1 の後ろに文字列s2 を連結して画面表示するプログラムを 作成しなさい.ただし,文字列s1 と文字列s2 を連結したものを一度文字列s1 に格納してから 表示を行うこと.また,strlen(),strcat()等の関数を使ってはならない. 提出物: プログラム,実行結果(3 回分以上) 2. 以下の処理を行うプログラムを作成しなさい.ただし,文字列s,t の要素数は50 とすること. strlen(),strcmp()等の関数を使ってはならない. (1) キーボードから文字列を入力し,文字列s に格納する. (2) 文字列sを逆順に並べ替えたものを文字列t に格納する. (3) 文字列sと文字列t が同一であるかどうかを比較し,その結果を画面表示する. 提出物: プログラム,実行結果(3 回分以上)
何回目だこの問題
>>258 if文の中に記号をごちゃごちゃ入れられると見づらいので
よっぽどな事が無い限りは、適当な変数に値を入れ
それで比較してくれると可読性が良いので助かる。
double *a, *b; と double* a,b; の違いを教えてください。
>>262 前者は、b の型は double*
後者は、b の型は double
264 :
ど初心者 :2006/12/07(木) 16:34:49
スレ違いかもだけど、どこで聞いて良いか分からないので、ここで質問させていただきます。 見やすい仕様書の書き方(見やすい例があると嬉しいです)や読み方、見やすいフローチャートの書き方(見やすい例があると嬉しいです)、 入門書理解し終えた人向けへの演習(言語はC)が豊富なサイト等、ご存じの方いらっしゃったら、教えてください。 レベル的には: 紙媒体は入門書なんとか読破、 ポインタ本読破しましたが、ちゃんと理解できてないので四苦八苦しながら演習中、 アルゴリズムの本を、考えた人の頭の良さに脱帽しながら四苦八苦しながら一つずつ理解しようと読み途中 な感じです。 紙媒体は高いので、今月はもう買えないですが、「これは読んどけ!!」的なものも有りましたら、お教え戴ければ幸いです。
266 :
264 :2006/12/07(木) 16:59:02
>>265 UML初耳です。帰ったら調べてみます。
仕様書サイトも、ありがとうございます。
助かりました。
268 :
デフォルトの名無しさん :2006/12/07(木) 21:47:18
270 :
デフォルトの名無しさん :2006/12/07(木) 23:08:47
ソースの編集に秀丸エディタ使ってるんだけど、 みんなはどんなの使ってるの?
文字列を入力して、その中に0-9と特定の許可する文字以外が入力されたら弾きたい場合、 単純に許可してる文字か聞いていっちゃえば良いの? isdigitとif使うとかそんな方法しか思い浮かばない・・・(´・ω・`)
273 :
デフォルトの名無しさん :2006/12/07(木) 23:58:25
>>272 単純に許可してる文字か聞いていっちゃえば良いです
特定の許可する文字の種類、数によって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)
stdarg.hを使って、 可変個の引数をさらに次の関数へ渡すことはできますか? 例えば、hogeという関数を作ったとして、 int hoge(const char *format, ...) { int ret = sscanf(format, ...); // hogeの可変個引数をで、sscanfに渡したい // 何か他の処理 return ret; } のようにしたいんです。 man stdargしても分かりませんでした。 sscanfした後に、得られた変数がおかしくないかどうかのcheckをしたいのですが、 それが何度も何度も出てくるのでこういう関数が必要です。
277 :
264 :2006/12/08(金) 01:46:46
264です。
>>265 W3C仕様書は、まるで理解できませんでしたorz
いつか理解できるようになるよう、努力してみます。
UML、大変役に立つ言語(?)のようですね。
色々調べて、勉強してみます。
改めて、ありがとうございました。
278 :
最初からになります :2006/12/08(金) 02:06:01
>>255 //横方向
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;
すみません。これ自体、意味がわからなく自分でも考えてます。
アルゴリズムを考えるのが非常に苦労してます。 応用が利かないっていう感じです。 コレはよいよ、と言う本ありますか?〜の絵本シリーズでしょうか。
280 :
最初からになります=278 :2006/12/08(金) 02:25:31
//横方向 for(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; } }
281 :
最初からになります=278 :2006/12/08(金) 02:26:10
//斜め player = 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; }
282 :
最初からになります=278 :2006/12/08(金) 02:26:58
//プレイヤーのリーチがなかつたのでランダムにマークする for(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
行列
ma[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 変数を増やさずにやることはできないでしょうか?
>283 無理だと思うよ
285 :
283 :2006/12/08(金) 16:55:36
>>284 お返事ありがとうございます。
ムリですか〜
286 :
デフォルトの名無しさん :2006/12/08(金) 17:15:05
#include<stdio.h> intmain(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型じゃないみたいだし。
>>286 > printf("%f¥n",10.0%3.0);
こいつが変。浮動小数点を割った余りって何? って話だ。
>>286 %は整数同士で計算するもの
浮動小数点ならfmodとかいうのがあった気がする
289 :
286 :2006/12/08(金) 17:21:53
>>287 >>288 ああ〜。納得しました。
確かに余りは整数にならないと変ですよね。
ありがとうございました。
typedef struct _tag{ typedef struct _tag2{ int x; int y; }TAG2; TAG2 rc1; typedef struct _tag3{ int xx; int yy; }TAG3; TAG3 rc2; }TAG; このような記述は好ましくないでしょうか?
>>290 識別子名さえ何とかすれば特に問題なしと思われ
292 :
デフォルトの名無しさん :2006/12/09(土) 00:30:39
たとえば 42.30000→42.3 といったように小数0以下を表示しない方法ってありますか?
>>290 少なくともほかでも使うヘッダファイルではやめたほうがいいと思う。
その書き方だとC++ではCと違う扱いになるから。
>>292 自分で削ってやるしかない。こんなの書いてみたがいかがか。
#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;
}
>>294 このスレでそんな高度な要求すると思うのか?
>>292 というわけで、"%.1f"や"%.3g"を試してみたまえ。
296 :
デフォルトの名無しさん :2006/12/09(土) 04:45:28
#include <stdio.h> #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));
297 :
デフォルトの名無しさん :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 が参照) どうか、ご助言お願いいたします。
帰れ。
writwCompMarkという関数は一体どこにあるのかな?
300 :
290 :2006/12/09(土) 10:55:18
>>291 識別子名了解しました。
>>293 違う扱いとはどのようなことでしょうか?
また、上記と同じような意味合いを持つコードを簡潔に
書けるのであればご教授いただきたい。
290のコードだと、TAGの外で構造体TAG2を単独で使いたい場合、 Cでは単に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;
302 :
290 :2006/12/09(土) 18:22:17
100桁1000桁と変数が扱える範囲を超えても 演算結果が算出出来るようなプログラムを作りたいんですが、 どこかにこの手の解説って無いでしょうか(´・ω・`)
>>303 1000桁の変数?
πでも計算するのか
関数内で構造体配列を参照するにはどうすればいいでしょうか? 構造体配列は 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)で試してみたんですが駄目です。
>>306 なにをしたいのかよくわからんけど、
p_A->c[0]
とか
(*p_A).c[0]
で参照できると思うけど。ちなみにどちらも同じ意味。
念のためにきくけどp_Aとかp_Bは実体をさしているんだろうな?
309 :
306 :2006/12/09(土) 23:54:36
スイマセン、実体ってどういうことですか? 初心者なもので申し訳ないです。
p_Aとかはポインタ型であくまで「2D型の何かを指すもの」でしかない。 その何かが何処かに存在していなければならない。 (staticでない)変数を定義しただけだとその値は不定だというのは知ってるよね。 ポインタもそれは同じ。どこを指しているのか不定。 もしかすると非常に重要なデータのアドレスを指しているかもしれないし、 あるいは次に実行しようとしているコードのアドレスを指しているかもしれない。 なんにしろ、ポインタは初期化しないとならない。 たとえば初期化はこういう風にやる。 2D *p_A; 2D A; p_A = &A; Aは2D型の実体としてコンパイラによって領域が確保される。 &Aはそのアドレスだ。
311 :
306 :2006/12/10(日) 00:58:44
2D *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(&A->c[0],&B->c[0])でしょうか?
うーん、微妙にいろんなところが間違っている。全部書き直すと、 2D *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); かな。
313 :
306 :2006/12/10(日) 01:26:02
わかりました、ちょっと試して頑張ってみます。 本当にありがとうございます。
まずさ、なぜわざわざポインタ使ってるの?
316 :
ぴゅあ :2006/12/10(日) 10:46:22
>>314 コピーを渡したいのではないからじゃないの?
うっわだめだこりゃ
318 :
デフォルトの名無しさん :2006/12/10(日) 13:14:26
>>314-317 の流れがわからない。
ソートでもしたいんじゃないの?
関数内で書き換えさせたいなら、参照渡ししかないと思ってるんだけど…違うのかな?
319 :
317 :2006/12/10(日) 13:22:27
え、なんで俺まで?
320 :
デフォルトの名無しさん :2006/12/10(日) 13:24:26
317さんのレスは316さんへのじゃなかったのか 勘違いスマソ
リンク先を全く見ずにstaticでも使ったら?と答えてみる
static int i=0にしたら上手くいきました。 ただ、enum_multi_perm関数が全て完了してまた使う場合、i=0はどこに入れればよいでしょうか?
スイマセン、 >ただ、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のデータは別のものへ変えて、この関数を使いたいもので・・・。
strchr等で、検索文字を"0では無い文字"といったような指定の仕方は出来ないのでしょうか?
>>324 iはどこからきたの?naの話ではなかったの?
>>325 そんな関数あったかなぁ
C++ならstd::stringが使えるけど
>324 最後に関数を抜けるときにi=0入れたら?
329 :
ぴゅあ :2006/12/10(日) 15:02:08
>317さんのレスは316さんへのじゃなかったのか
え!?そうなの?
>>318 そういったところも含められるかも
とかもありとかでだろうと思うけど
たぶん
>>314 はそういうこととかはあるのか?とか
聞きたかったんだろうと思う
ジョークプログラムなのですが、デスクトップにdummy.txtを出力する物を作りました。 ただ、実行してみたところで分かったのですが、生成される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; }
>何かおかしな点 知識もないのにジョークプログラムを作ろうなんて考えるあんたの頭
"w"を"a"に変えてコンパイルしてみましたが、やはりdummy.txt一つしか出力されませんでした。。。 もう少し教えていただけないでしょうか?
同じ名前のファイルは一つしか作れないだろ。
>>327 strcspn()の間違いじゃないか?
>>336 「0ではない文字を探す」だから、strspn()でいいんじゃないの?
>>327 は、引数の順序を間違えた。
strspn(str, "0") こうだね。
自作のCプログラムの実行速度を計るのに困ってます。 二通りの方法で実装された、等しい結果を吐く二者に 優劣をつけたいんですが、time()を使った自作の計測器だと 値が細かく(e-300以上)比較になりません。 何かいいアイディアはないでしょうか?
そんなものの実行速度を測る必要があるのか? まあとりあえず消費したクロック数にすればいいと思うよ rdtscとかでググってみそ
レスさんくすです。 ググって使えそうなものに辿り着きました。 ありがとうございました。
>>339 CLOCKS_PER_SECで割るの忘れてました…
こんなんにレスさせてすいませんでした…
吊ってきます…
342 :
デフォルトの名無しさん :2006/12/11(月) 18:27:39
質問です。C言語で負の十進数を二進数に変換して表示させるには どういう風にすればよいのでしょうか。 例えば-10を負の二進数に変換するなどです。 ご回答いただけると助かります。
>>342 標準関数には無いのでそういう処理を自分で作る。
「ソース書いてクレクレ」なら宿題スレへ。
344 :
デフォルトの名無しさん :2006/12/11(月) 20:13:52
構造体を作る時にアライメントは8バイトバウンダリとすることと の指定があるのですが、これはいったいどういう意味なのでしょうか。 スレ違いならすみません。
346 :
344 :2006/12/11(月) 20:56:52
有難うございます。そこをちょっと読んでみます。
347 :
デフォルトの名無しさん :2006/12/11(月) 21:02:54
×WORKER_INFO JIGYOU1[3],JIGYOU2[3],JIGYOU3[3]; ×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"}}; 初期化は定義時に行う
349 :
347 :2006/12/11(月) 21:28:24
>>348 そうなるんですか。全然わかりませんでした。
有難うございます。助かりました。
>>347 =349
C/C++では「代入」と「初期化」ってのが構文的に別物なンですよ。
そのように覚えてください。
int a[] = { 0, 1, 2 }; みたいに、宣言と値の設定を同時に行うのが「初期化」
a = 2; みたいに、そうでないのは「代入」
>>348 みたいに構造体や配列の初期設定を行うのは「初期化」でのみ許される
構文で、「代入」では出来ないンです。
N88以外いこもプログラムしたことない俺は何から始めたらいいか教えてください;;
352 :
デフォルトの名無しさん :2006/12/11(月) 22:14:32
kukuには 「2つのintを引数に取り、intを返す関数」と 「int型の整数」と 「int型の整数」の 3つの引数を渡さないといけない
>>352 >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 ) );
}
356 :
352 :2006/12/11(月) 22:29:20
九々の加算と乗算を表示するプログラムを作成しなさい。 1) メイン関数 2) 2値の加算関数 3) 2値の乗算関数 4) 九々の加算と乗算を表示する関数 【関数インターフェース】 intsum ( int x1, int x2 ) ;/* 加算関数 (関数値:計算結果) */ intmul (int x1, int x2 ) ;/* 乗算関数 (関数値:計算結果 */ /* 九々の加算と乗算を表示する関数 */ voidkuku ( int calc( int, int ) ) ; このような形の課題です。この関数を使う必要あるのかと悪戦苦闘しています 宿題スレじゃなくてすみません。
357 :
352 :2006/12/11(月) 22:33:14
とりあえずなんとか解決させました。 レスくれた方々、有難うございます!!!
>>356 関数ポインタ入れんのか
void kuku( int x , int y , int (*calc)( int , int )){
printf("%d\n",calc(x,y));
}
これじゃダメか?
なんとか解決させました=お友達に教えてもらいました
ワーオー
361 :
デフォルトの名無しさん :2006/12/11(月) 23:24:13
変数valueの12ビット目〜15ビット目(4ビット)をチェック(ビットテスト)して、 ゼロであれば上位2バイトに1を代入、ゼロ以外であれば、2を代入する文を示しなさい。 (32bitのデータです) この処理をビットフィールドでするにはどうすれば良いでしょうか。 ご教授いただけませんか。
363 :
352 :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; }
>>363 多分想定されてたのはこんなプログラムだと思われ
#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, "*");
}
>>363 >>364 外部からスマソ
それだと選択画面がないんじゃない?
だからたぶんcaseが入るとは思うんだが漏れのない頭じゃ無理す
367 :
364 :2006/12/11(月) 23:44:44
>>366 選択画面てナニ?
意味わがんね。
そんな仕様あった?
368 :
366 :2006/12/12(火) 00:02:49
なんか書き込めない
369 :
366 :2006/12/12(火) 00:07:47
演算の種別を選択後、実数の四則演算の計算式を入力して結果を表示するプログラムを作成。 問題の問はコンパイルしてから実行すると6−3のような画面にならないとだめってことじゃないのか?
>>369 アンカーぐらい付けろ
誰に言ってんだ?
371 :
366 :2006/12/12(火) 00:48:53
372 :
366 :2006/12/12(火) 00:49:32
>>352 が示してる仕様は
>>356 だろ。
「6-3のような画面」云々なんて言われても知らんよ。
つーかアンタ誰って感じ。
実況とかでよく見る2chのスレのIDの出現回数をカウントするプログラムを作っています Janeのログだと、ID有りの板の書き込みのテンプレートは一行ごとに 名前<>メル欄<>日付 ID:xxxxxxxxx<>本文(<>スレタイ) となっていますが、名前やメル欄、本文やスレタイにID:xxxxxxxxxがある場合にも 確実にそのレス番で書き込んだ人のIDを選別するにはどうすればいいでしょうか? そうそう出現することはないと開き直れば、strchr()やstrstrでも十分なのですが…
376 :
247-253 :2006/12/12(火) 01:57:44
度々、質問で申し訳ありません。 その都度は自分でも混乱していたので、巧く質問ができませんでした。 なので、再度質問に答えて戴ければ幸いです。 例えば、この中のソースではよく >>board[j-1][b-1] ようなものが出てきますが この-1 とは配列からの-1で宜しいのでしょうか? 或るいわ ○×の 1 で - は移動の - なのでしょうか?
>376 配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。 それを修正するために-1してるわけ。 forで配列を回すときは0からの方がいいと思うけどね。
379 :
173 :2006/12/12(火) 13:53:56
突然で申し訳ありませんが、 y[3] = number % 10; y[2] = (number / 10) % 10; y[1] = (number / 100) % 10; y[0] = (number / 1000) % 10; の(number / 1000) % 10;が何をしているのか分かりません。 どなたか教えていただけないでしょうか?
>>379 1000で割ってから、10で割った余りを計算
y[1]までわかって、y[0]だけわからない理由が謎
numberを1000で割って(余りは捨てて) その商を10で割った余りを求める。
382 :
379 :2006/12/12(火) 14:01:25
>>380 様
y[2] = (number / 10) % 10;
y[1] = (number / 100) % 10;
y[0] = (number / 1000) % 10;
の3つが分からなかったのですが、代表でy[0]を書いたのです。
ありがとうございました。
y[3]にはnumberの一の位 y[2]にはnumberの十の位 y[1]にはnumberの百の位 y[0]にはnumberの千の位 の数字が入る
384 :
379 :2006/12/12(火) 14:07:45
385 :
デフォルトの名無しさん :2006/12/12(火) 14:28:32
なぜC++言語はC言語ではないの?
386 :
デフォルトの名無しさん :2006/12/12(火) 14:32:34
違う言語だから ラテン語ベースの違う言語は、何故ラテン語じゃないの?と聞いてるようなもんだ 歴史や名前や成立過程気にしなきゃ、似た部分がある違う言語ってだけ
387 :
名前 :2006/12/12(火) 15:32:45
コンパイルって何
389 :
デフォルトの名無しさん :2006/12/12(火) 19:14:29
数列{1/(n*n)}の (1) n=1からnterm迄の和を求めよ という問題で ちょっと作ったのですが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); }
391 :
389 :2006/12/12(火) 19:27:23
i=1 にしましたがやはりInfintyでした なんでだろう・・・
infinityにはならんと思うがs+=(double)1/(i*i)でないと除算は整数でしか行われない。
393 :
389 :2006/12/12(火) 19:44:55
#include<stdio.h> main() { 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 と出ました・・・
>393 それちゃんとコピペできてる? printfに"が足りてないみたいだけど。
どこの糞コンパイラだそれ。 試しにやってみたら動いたぞ。VS.NET2003で。
396 :
389 :2006/12/12(火) 19:56:21
”を足したら動きました。 ありがとうございました。 もしよければあと1つ教えてくれないでしょうか 上の問題の続きなのですが (2)ntermからn=1迄の和を求めることを考える。 なんですけど、上のをどういじればいいのでしょうか。
ntermって何?
398 :
389 :2006/12/12(火) 20:02:18
すいません 入力としてこれから計算する和の項数がntermでした
i=n; s=0.0; while (i>0){ s+=1.0/(i*i); --i; } ループを逆から回すってこと?
400 :
389 :2006/12/12(火) 20:13:49
はい
401 :
389 :2006/12/12(火) 20:28:12
たびたびすいません。 399のを参照に該当部分を変えたところ Nに何を入れてもSが1.000・・・ となってしまいます。 なぜでしょうか?
403 :
389 :2006/12/12(火) 20:36:32
#include<stdio.h> main() { 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); } これです
(double)がないから
と思ったけど1.0だから違うか
407 :
389 :2006/12/12(火) 20:51:51
あれ、さっきまで1.000だったのに・・・ これでできました。 みなさん本当にありがとうございました。
ちょっとまて。 コンパイラ名を教えろ。
409 :
389 :2006/12/12(火) 20:54:24
gccです。
410 :
247-253 :2006/12/12(火) 21:00:51
>>378 ご返答、ありがとうございます。
>>>配列の添え字は0から要素数-1までだけど、そのプログラムはforをi=1から回してるからずれる。
それを修正するために-1してるわけ。
自分なりの解釈なのですが、これは [] の中は0から始まり・・・
参照などする時に1から数えて余るのと、ほぼ意味は同じでしょうか?
>>要素数-1
これが、難しいのですが、今上で述べた事でしょうか?
じゃあ操作に間違いがあったのかな? コンパイル前に変更したソースを保存してなかったとか? よくわからんけどお疲れ。
>>410 a[5]だったらa[0]〜a[4]まで使える
それさえ知っていれば自ずと全てがわかるはず
413 :
389 :2006/12/12(火) 21:08:00
2つの違い(1からnとnから1) がわかりました。 どうやら操作を間違っていたようです^^ どうもありがとうございました。
414 :
247-253 :2006/12/12(火) 21:28:14
>>412 5で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とか意味が全くわかりません
ご助言、お願い致します。
416 :
247-253 :2006/12/12(火) 21:48:39
>>415 ありがとうございます。
本にはこれらの事が一切触れられていなかったので
わかりませんでした。
'0'を引いたり'a'を引けばいいよ。 int i = str[1] - '0'; int j = str[0] - 'a'; これだと見やすいし数字覚えなくてもいいし。
418 :
247-253 :2006/12/12(火) 22:32:39
>>417 int i = str[1] - '0';
int j = str[0] - 'a';
は、
>>414 と同じ事なのでしょうか?
>>246 の
int 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
420 :
418 :2006/12/13(水) 00:56:42
ありがとうございます!しっくり来ました! こう考えた方が原理の方も理解し易いです。
421 :
デフォルトの名無しさん :2006/12/13(水) 04:37:21
Cやろうとおもう
文字を16進数に直して配列に格納するにはどうすれば良いでしょうか?
16進数ってのは表記上の問題だから、文字列にするということだな。 charの配列に格納すると解釈していいんだよな。ならばsprintfを使う。 char buf[16]; sprintf(buf, "%x", 'a'); とかやればbufに文字aの16進表記("61")が格納される。
間違ってもitoaなんて使うなよ!使うなよ!
425 :
qqqq :2006/12/13(水) 10:52:33
アルファベットのAからZまでの文字列に対して, 実行例のように表示できるプログラムをポインタを 用いて作成,確認せよ. 参考:参考書「基礎C言語」p.115
426 :
qqqq :2006/12/13(水) 10:55:15
abcde bcde cde de e
427 :
qqqq :2006/12/13(水) 10:56:21
お願いします。
428 :
デフォルトの名無しさん :2006/12/13(水) 10:59:18
int a=2,b=5; double d; d=a/b; みたいにするdが0になっちゃうんですが、直し方を教えて下さい。
429 :
992 :2006/12/13(水) 11:00:11
double a = 2.0,b = 5.0; double d; d = a/b;
>>429 a,bのint型は変えられないんですが、どうしたらいいでしょうか?
dは0.2みたいな値になることが多いので、int型だと0になってこまります
432 :
qqqq :2006/12/13(水) 11:07:48
わかりました。
433 :
429 :2006/12/13(水) 11:08:28
intは整数型だから割り算すると小数以下は切り捨て。 d=a/b;// 2/5 = 0.4 -> 0が代入される aとbをintのままにしたければ代入してdouble型にしてから演算。 d = a;// 2を代入(自動でdouble型の2.0に変換) d /= b;// 2.0/5 = 0.4 が代入される
436 :
429 :2006/12/13(水) 13:23:51
>>435 >>434 の言うキャストは調べた?
aをdoubleの2.0に変換(キャスト)してからbで割る
d = (double)a/b;
ちなみに double/int は double/double に自動で変換される。
(double)2/5 -> 2.0/5 -> 2.0/5.0 てな具合。
この辺は大事な基礎だからがんばれ。
437 :
デフォルトの名無しさん :2006/12/13(水) 13:39:46
質問です。補数の意味とはなんでしょうか。
利点 基数の補数を負の数の表記法として採用すると、最上位桁からの桁上がり(オーバーフロー)を無視すれば、通常の加算処理で負の数の加算(つまり正の数の減算)が行えることになる。 この利点のため、2の補数は多くのコンピュータで負の数の内部表現に採用されている。
439 :
デフォルトの名無しさん :2006/12/13(水) 14:29:19
441 :
437 :2006/12/13(水) 14:36:06
>>438 そういう意味でしたか。
ご解答有難うございます!!!
443 :
439 :2006/12/13(水) 14:46:05
え、ほんとですか。自分のIDE環境(BCデベロッパー)では 出来るんですが、、、。でも値は全然変わらなくて 初期設定どおりに値が表示されてしまいますTT
>>443 たぶんエンディアンを理解していない
リトルエンディアンとビッグエンディアンについて調べてみた方がいい
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));
引数使った関数の中で使った関数に、最初の引数をそのまま渡す事できますか? つまり、 void nantoka1(double hikisu); void nantoka2(double hikisu); main(){ double hikisu; ...... nantoka1(hikisu); } void nantoka1(double hikisu){ ..... void nantoka2(double hikisu); }
>>445 できるけど書き方が違う。
関数を呼び出すときは型は指定しない。
void nantoka1(double hikisu){
.....
nantoka2(hikisu);
}
447 :
439 :2006/12/13(水) 15:28:05
メモリ上の配置を確認したら構造体は意図した通りの順番 なのですがnValueに関してはff0f ffffとなっています。これは、、、 バイトとしては逆の順番で、そのバイトの中での4ピットについても 逆の順番で格納されているということなのでしょうか。nValueはffff 0fff と意図していたのですが。
450 :
439 :2006/12/13(水) 15:58:49
すみません、上位から数えて12〜15ビット目で、変更するのは上位2ビット です。
451 :
デフォルトの名無しさん :2006/12/13(水) 16:14:48
マスク処理の易しいサイト教えてください
453 :
439 :2006/12/13(水) 16:19:03
間違えました2バイトです。
>>453 上位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;
ではないかい?
>>454 #pragma pack(push, 1)をincludeの下にでも書いておいて
BCCでは動くはず
VCだとどうだったかな
456 :
453 :2006/12/13(水) 17:05:51
>>454 ありがとうございます。また間違えました。下から数えて12〜15bit
でした。0xffffffffだと0x0002ffffになって、0xffff0fffだと0x00010fff
の形になります。
>>456 しっかりしてくれよ、無駄に苦労したじゃねーか
でもそうなると話は簡単だ
上の方のエンディアンの話を理解していれば構造体を少し書き換えるだけで動くはず
条件判定の中でも乗算してるからそれもカウントしてるのかな?
460 :
458 :2006/12/13(水) 18:31:46
アッー! 確かに最後の表示は"乗除"を行った回数ですね。 第四版まではなんとか理解できたけど第五版は理解するのに時間かかりそうです。。。 ありがとうございます。
2個の値を返す関数ってつくれますか?
>>463 同時に返すんじゃなくて、
for文の中にif文があってそのなかで1つを返して、
for文終了後にもう一つ返したいんですが、if文のなかで値を返すとそこで処理が終わってしまうんで、困ってます
>>465 マルチスレッドというのがわからないですが、ある条件の時のfor文のiの値と
for文の中で加算していったsumの値をmain関数で使いたいんですが
>>464 for( i=0 ; i< 100 ; i++ )
{
if( 条件) return 戻り値1 …@
}
return 戻り値2 …A
@で戻すとAが戻せない
@で戻した後Aも戻したい
ということか?
>>468 提案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が入った構造体を返す
>>469 構造体を返そうとすると互換でない型変換ってなってコンパイルできません・・・・
char str[]="9104021385231"; char 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
途中で送信しちゃいましたorz それまでは 5231 2138 1040 という風にコピーされています。
>>471 上のソース(?)をそのまま使っちゃダメだぞ
型宣言
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;
}
のようにしたか?
>472 9だけだコピーされたから1040が9040になったんじゃないの?
476 :
458 :2006/12/13(水) 21:16:44
>>461 柴田望洋の参考書で素数を表示するプログラムがだんだん難しくなっていくんです。
最初は乗除する回数が78022回で77423、38678、14622、
そしてさっきの第五版では3774回まで乗除する回数が減っていくんですけど
ギリギリ理解してる程度なので第五版を理解するのを頑張ってます。
>>475 理解しました。
コピーって9\0じゃ無かったんですねorz
>>478 じゃアドレスわたす
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;
}
>>479 関数の型structにしたらできました
rand関数で発生させる数の上界は% 100 +1とかできるのはわかるんですが下界はどうやってきめますか?
487 :
デフォルトの名無しさん :2006/12/14(木) 11:31:44
突然すみません カーソルハンドルの HCURSOR GetCursor(VOID); を C言語で書きたいのですが、まったく書き方が分りません。 どなたか、教えてください。 初心者です。
488 :
デフォルトの名無しさん :2006/12/14(木) 12:52:26
文字コードを繋げるにはどうすれば良いでしょうか? 例えば0x01と0x02を繋げて0x12にするといった感じです 具体的には、2つの領域をもつ文字型配列があって、中には1と2が格納されています。 この文字数値をコードとみなして連結するという処理です。 それぞれから'0'を引き、1の方を4ビット左シフトして双方を足せば良いのかなと思ったのですがうまくいかないので違うのでしょう。 どうすればよいのか途方に暮れています。 どなたかお力添えお願い致します。
>>488 うまくいかないというならソースを見せろ
あと文字の1は'1'と書いた方がよい。
携帯からなので書き間違い等あるかもしれませんが・・・ #lnclude<stdio.h> maln() { char b, a[2]={'1','2'}; b=(a[0]-'0')<<4; b+=a[1]-'0'; printf("%c",b); }
すみません、書き忘れです・・・ この方法で4バイト文字を表現するのが目的なので実際は4つの領域の配列に入った数字を二つずつまとめてコードにしたいのです。 例えば(コードは適当です) a['1','2','3','4']; これを b[0x01,0x02,0x03,0x04]; このようにするのが最終的な目的です。
>>490 どういう結果を期待しているんだ?
'1'=0x31, '2'=0x32
printf("%x",b);
と確認したら0x12になるよ
おっとリロードしてなかった。まだよくわからない。
>>491 をみると
for(i=0;i<4;i++)
b[i] = a[i]-'0';
こうしたいように思える
度々申し訳ない、間違いがたくさんありました。 4バイト文字ではなく2バイト文字ですね。 それから、先に書いたb配列は間違いで、こちらが正しいです。 1と2と3と4が格納されたa配列から、以下のようなb配列を最終的には用意したいのです。 b[0x12,0x34]; a配列の先頭から2つずつ、'0'を引いて合体させて1つの16進コードを作ってb配列に格納するのが目的です。
>>494 それなら
>>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';
}
>>487 HCURSOR型がwindows.hで定義されてるから、C言語の呼び出し規約に従って
書けばOKじゃないんでしょうか?
>>496 マルチして回答貰ってるみたいだからレス返ってこないかと
498 :
496 :2006/12/15(金) 00:20:34
ふぁあああああああっく!
499 :
デフォルトの名無しさん :2006/12/15(金) 07:38:16
UNIX環境での質問です。 ccコマンドで複数ソースファイルをコンパイルした後に オブジェクトファイルをリンクさせて実行ファイルを作るときに リンカーは何を参照して、(incluleしていない)別のソースファイルから作成したオブジェクトファイルを紐付けているのですか? 関数名? だとしたら全く他のアプリで同じ関数名を使用していたらどうなるのですか? よろしくお願いします。
500 :
デフォルトの名無しさん :2006/12/15(金) 07:41:58
捕捉です。 オブジェクトファイルはアーカイブにまとめて入れています。
>>499 何と何を紐付けるはなしかな?
リンカーがやることは、
・与えられたオブジェクトファイルをくっつける
・それでもまだ未定義なシンボルがあれば、そのシンボルを持つ
オブジェクトをライブラリからひっぱってきてくっつける
「他のアプリ」とやらが出てくる余地はないと思うですよ。
502 :
デフォルトの名無しさん :2006/12/15(金) 11:03:36
質問です。オプションで-lを使用したいのですが、プログラムにはどのような記述をしたらいいのでしょうか?
504 :
デフォルトの名無しさん :2006/12/15(金) 12:24:06
「token1<TAB>token2<TAB>token3<TAB>token4<TAB>........token6」 と、6つの単語がタブで分けられているテキストファイルを読み込み、 char* []の形で単語を順に代入していくプログラムを作りたいのですが、どうすればいいのでしょうか
506 :
デフォルトの名無しさん :2006/12/15(金) 13:49:05
>501 レスありがとうございます 具体的に述べると aaa1.o …main bbb1.o …main アーカイブのライブラリに aaa2.o …sub bbb2.o …sub が入っているとします。 aaa1.oとアーカイブからaaaという実行ファイルを作りたいときに aaa1.cから呼び出している関数と同名の関数が aaa2.c内でもbbb2.c内でも定義されていたらリンカーはアーカイブ内のどちらを参照するのでしょうか?
見つけた順
>>506 ふつうは、同じシンボルを提供している複数のオブジェクトを一つのラ
イブラリに入れたりしない。リンカーはライブラリ内で最初に見付けた
オブジェクトを採用するだけでしょう。
509 :
デフォルトの名無しさん :2006/12/15(金) 15:18:12
>506 >507 ありがとうございます なるほど。やっぱり一緒にしないですよね… 助かりましたー
複数ファイルからなる数千行規模のプログラムの作り方を学びたいんですけどどうしたらいいですか
もっと小規模なプログラムなら作れると言うのであれば、後は経験あるのみ。
機能を関数に分割するときにどういう観点から分割を行うべきなのかとか プログラムにある機能を追加するときにどういう設計にしておと容易に追加しやすくなるのかとか プログラムの一部を変更したときに他の変更箇所をできるだけ少なくするにはどうしたらいいのかとか いうことを学びたいんですどうしたらいいですか
>>512 とりあえず何か作ってみる
完成
もう一度作りなおす
完成
もう一度作りなおす
完成
…
の繰り返しでおk
515 :
デフォルトの名無しさん :2006/12/15(金) 22:40:19
scanfって入力を待ってくれないんですか? 前回入力した値を保持してスルーしてしまうんですが。 yes,noを入力してループから抜け出すかどうか判断するプログラムを書こうとしてます。
516 :
デフォルトの名無しさん :2006/12/15(金) 22:45:13
早く返事くれー!
1. 入力書式がバッファの内容と合わない 2. バッファの中身をそのままにしてscanfから呼出元へ戻る 3. その後さらにscanfを呼ぶと、残っているバッファから再び読み込もうとする 4. 1へ戻る。
519 :
デフォルトの名無しさん :2006/12/15(金) 22:53:35
>>517 >>518 変数が数字だと上手くいくようです。yやnと言うような文字変数では上記のような
症状が出ます。なぜでしょうか?
>>519 入力文字列にスペースが含まれているとか
書式指定子の使い方を間違えてるとか?
なにはともあれ まずはソースを!
525 :
デフォルトの名無しさん :2006/12/15(金) 23:07:21
>>520 char 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型だと上手く行きます。
>>525 y\n を入力
↓
yを読みこむ
↓
\nを読みこむ
↓
終了
>>525 こんな感じに変更してみては?
#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;
}
528 :
デフォルトの名無しさん :2006/12/15(金) 23:25:28
529 :
デフォルトの名無しさん :2006/12/15(金) 23:30:10
>>526 失礼しました。その理屈で当たってます。
[ch!='n'にするとループが抜けないんですが]と言う意味です。
530 :
デフォルトの名無しさん :2006/12/15(金) 23:33:06
>>527 配列を用いるのはなぜでしょうか?
とりあえず変更してトライしてみます。
ヒープソートの命令実行回数で、500、1000、…でずっと同じ値になってしまうんですが、どこがいけないかみてください。 #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); };
/*ファイルをオープン*/ void 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++; }; };
533 :
デフォルトの名無しさん :2006/12/15(金) 23:36:35
void DownHeap(int leaf, int root){ int 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++; };
/*表示*/ void Print(char *sm){ int i; int an; /*char型をint型に変換*/ an=atoi(sm); for(i=0; i<an; i++){ printf("%d\n", length[i]); }; }; 以上です。 ソートの部分がおかしいと思うのですが、よくわかりません。 おねがいします。
536 :
デフォルトの名無しさん :2006/12/15(金) 23:45:43
>>527 %1sってどんな意味があるのでしょうか?
ちなみに自分が逆の立場なら教えませんがW
538 :
デフォルトの名無しさん :2006/12/15(金) 23:57:43
540 :
デフォルトの名無しさん :2006/12/16(土) 00:08:26
>>539 了解。これから頑張って勉強して行きます。
皆さんありがとうね
541 :
デフォルトの名無しさん :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);} } }
そっすね
>541 n=0の位置 n=n+iじゃなくてn=n+1 j<=i-1じゃなくてj<=i
544 :
デフォルトの名無しさん :2006/12/16(土) 01:43:25
>>541 色々突っ込み所はあるが…
まず、1は含めちゃ駄目だ。
それと、キャストについての話はおいとくとして、%演算子って知ってる?
それ使うと楽だよ。
545 :
デフォルトの名無しさん :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だけを使っていい方法はないですか
for(j=1;j<=i;j++) →or(j=1,n=0;j<=i;j++){ nで割り切れる数を数えてるんだろ? だったら数が変わるごとに0に戻してやらなきゃ
>>541 その素数判定アルゴリズムがわからん。
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);
}
nって約数の数? 約数の数が2だったら素数ってことかな。 1とその数自身で割った場合だけインクリメントすれば2になる。
#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++){ 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){ ってするのが普通。 %は剰余演算子って言って余りを求めるから割り切れるかどうか判定するときには便利。
551 :
デフォルトの名無しさん :2006/12/16(土) 02:30:59
ありがとうございます。わかりました。 printf("%d\n",j);→printf("%d\n",i);とnの位置 の間違えでした。
a[1]++; a[3]++; a[5]++; a[]という配列があって↑のように1、3、5だけ+1したい時、 もっと簡単に記述する方法はありますか?
i=0からとして (*(a+1+i*2))++とでもしてまわせばいいのではないか
ループ変数自体を奇数で回したほうがイイ
そう書いたら分かりやすくなっちゃうじゃないか
a[i<<2&1]++;
&でいいのか?
演算子の優先順位に注意
a[(i<<1)+1]++;
そこでわざわざシフト演算子を使う辺りが馬鹿すぎる。
だなw
というか間違いじゃね? でもまあたぶんネタだろうな というわけでひっかかっちゃったおw
>>560 ならおk。優先順位はシフト>ANDだし、
i<<1の最下位ビットは0だから1とANDを取れば+1と同じになる。
まあコンパイラの最適化の方が賢かろう。
といったわけで次の質問どうぞ。
>>568 いや、1とANDをとると常に0になると思うんだ。
ORかXORでないと
次 の 質 問 ど う ぞ
では質問です。 ビット演算子を使って奇数を生成する方法を教えてください。
|1
575 :
デフォルトの名無しさん :2006/12/17(日) 00:58:51
資格のセキュアドは10ヵ月あれば独学で取れますか?
>>575 その10ヶ月間をどう使うかによるだろうけど、真面目に勉強するなら十分すぎる時間じゃないか?
577 :
576 :2006/12/17(日) 01:21:11
おっとすまん、すれ違いだったorz
578 :
デフォルトの名無しさん :2006/12/17(日) 01:43:23
サンクス 独学で真面目に努力するつもりです。 難易度的には如何でしょうか?すれ違いですた、すんまそ。
(√(1+x)-1)÷√(1+x) , (x≒0) ↑これを桁落ちしないように計算するにはどうしたらいいのでしょうか? 教えてください。おねがいします。
なるべく絶対値の近い値どうしで計算して頑張る
581 :
579 :2006/12/17(日) 13:24:04
色々計算式を変形したけどうまくいきません・・・ 変形するだけではだめなのでしょうか・・・?
分子を100^2倍とかして後で割るのはダメ?
CでやるよりC++でSTL使ってやった方が早いような つーかFortranの分野じゃね?
584 :
579 :2006/12/17(日) 13:55:37
C言語の課題でこの問題がでたんです。
そもそも正しい答えがわからないので答えを確かめたいのですが、
ウィンドウズの電卓では桁落ちしない正しい答えがでてるのでしょうか?
>>582 その方法を使わせてもらいます。有難うございます!
>>579 普通に分子の有理化をしろということではないのか。
√(1 + x) - 1 = x / (√(1 + x) + 1)から、
(√(1 + x) - 1) / √(1 + x) = x / (1 + x + √(1 + x))
シフト演算子って実際は結構使うの?
>>586 用途は限られるが使う場面はそれなりにある。
少なくともビットフィールドほどには要らない子ではない。
588 :
デフォルトの名無しさん :2006/12/17(日) 17:56:45
ある数値を渡されると、その数値の 2 乗を求め、 その値を return する関数 pow を作る。 main 関数において、1 から 10 までの数値の 2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。 この上のソースコード教えてください。;;;
589 :
デフォルトの名無しさん :2006/12/17(日) 17:57:37
ある数値を渡されると、その数値の 2 乗を求め、 その値を return する関数 pow を作る。 main 関数において、1 から 10 までの数値の 2 乗を pow 関数を呼び出して求め、それぞれの値とその合計を表示する。 この上のソースコード教えてください。;;;
宿題スレにいきな。
入門スレとはいえこれはひどい
datファイルを読み込むにはどうすればいいのですか?
>>592 fopen, fclose, fread, fscanf, fgets, fseek
これらの関数の使い方を調べて、自分に必要そうなものを選んで使って。
594 :
デフォルトの名無しさん :2006/12/17(日) 19:54:50
C++なんですが、coutで2350000と表示したいんですが、 どうしても2.35e+06と表示されるんですが、どうしたらいいでしょうか?
>594 つ スレタイ
596 :
デフォルトの名無しさん :2006/12/17(日) 21:24:42
初心者です。 教えてください 番号 国語 数学 英語 合計 1 2 : : : : : : : : 2次元配列で合計を出して、合計の降順にテーブルを並び替える方法を教えてください。
598 :
123 :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と表示されています。
>>598 それの前の章で
> エスケープ・シーケンスを受けたときMS-DOSが処理してくれる
ってある通り、MS-DOSではないXPでは処理してくれない
600 :
123 :2006/12/17(日) 23:33:47
599さんありがとうございます。 コンソール画面が出てるのでこれがMS-DOSだと思ってました。 XPは違うんですね。 関連してもう1つ聞きたいのですが、 どうやればエスケープシーケンスのように、 短いコードで文字色を変えたりできますか? windows.hのSetConsoleTextAttributeなどを使って、 文字色を変えることには成功しているのですが、 コード量が多いため大変です。 エスケープシーケンスのように短く済ませる方法はありませんか? (SetConsoleTextAttributeをマクロで短くするしかない?)
自分で、エスケープシーケンスを認識してWindows APIの関数呼出を行う アプリケーションなりライブラリなりを書けばいいんだよ。
>>598 一番楽なのはcygwin入れてgcc使うことかな
603 :
123 :2006/12/18(月) 00:17:51
601さん、602さん、ありがとうございます。 ここからは自分で進んでいけそうです。 ありがとうございました。
604 :
デフォルトの名無しさん :2006/12/18(月) 14:49:31
main() { doublea[4][4]; // sub(a) ; 'double [4][4]' から 'double ** ' に変換できません。 sub((double**)a) ;とエラー出たので、こうしてみたらコンパイルできた。 void sub(double **a) { } これは正しいですか?
正しくない。 Tの配列型を実引数に受け取れるのは、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) { }
606 :
デフォルトの名無しさん :2006/12/18(月) 15:03:13
fseek(in, 0L, SEEK_END); 0Lってどういう意味でしょうか?ゼロですか?
Lはlong型を表す接尾辞
608 :
デフォルトの名無しさん :2006/12/18(月) 15:10:51
test
609 :
デフォルトの名無しさん :2006/12/18(月) 15:11:52
>>607 long 0
これと等価と考えていいでしょうか?
610 :
デフォルトの名無しさん :2006/12/18(月) 15:42:58
>605 サンキュウ。
611 :
デフォルトの名無しさん :2006/12/18(月) 15:47:39
数当てゲーム プレーヤーが入力した数と正解を比べて表示しろ @正解:正解ですと表示し終了 A不正解:大きいです。か、小さいです。をし表示を繰り返す 正解は0〜9までの整数一桁 整数には乱数生成を利用しゲーム毎に正解が変化するように お願いします。どう打てばいいですか?ソースを教えて下さい
613 :
デフォルトの名無しさん :2006/12/18(月) 16:11:07
ツカエネー
自分でソース書く練習も兼ねて
>>611 を書いてみた。
宿題スレに貼ってくる。
615 :
デフォルトの名無しさん :2006/12/18(月) 17:04:07
関数へのポインタってどう使うのか分かりません。 int 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(...); } こんな書き方してますが、これを関数を要素にもつ配列と定義できないでしょうか? またこのとき関数に値を渡す方法が分からないのですがどなたか教えてくださいませ。
typedef で一旦抽象化してしまえば気が楽になれる typedef 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; }
617 :
デフォルトの名無しさん :2006/12/18(月) 17:16:47
さっすが先輩・・・!
618 :
デフォルトの名無しさん :2006/12/18(月) 17:25:41
今、ファイルの入出力の勉強してるんですが・・・ この先、シリアルポートを使ってハードウェアを動かす為には どのくらい掛かるでしょうか?時間的に。
その勉強が終わればすぐにできるでしょう。
620 :
デフォルトの名無しさん :2006/12/18(月) 17:55:57
diffと正反対に二つのファイルで一致する行だけ表示するにはどうすれば良いでしょう?
>>620 diffを作るとの同じぐらい面倒な処理が必要で、期待される結果もアル
ゴリズムも一意に決まらない。
623 :
デフォルトの名無しさん :2006/12/18(月) 18:42:45
間接参照のレベル という語の意味がわかりません 教えてください
>>620 diffの出力を使って加工する。
diff -D NAME(または--ifdef=NAME)した出力から #else /* NAME */を削って
cpp -D NAMEすればいいんだが、
cのソースとかだと#includeとかが処理されちゃうんで工夫して。
626 :
デフォルトの名無しさん :2006/12/18(月) 19:40:21
>>624 ポインタとかじゃない、とシッタカぶってみる。
大体、型が合わない場合にエラーが出るね、とシッタカぶってみる。
main(int argc,char *argv[]){} このコードを引数なしで実行した時、argv[1][0]に'\0'が格納される事は保障されますか?
即レスありがとうございます 三項演算子でも使うかね・・・
<<627 というか、引数なしならargv[0]までしかないわけで、 argv[1]なんて参照したらやばくないか?
system()関数で実行した結果、コンソールに表示される内容を取得したいのですが、 どうすればいいですか? Linuxです。 具体的には、pidofで返されるpidを取得したいです。
strtokを使って2次元配列の文字列を","で分解してるのですが 文字列(moji[X][Y])の1行目は、strtok(*moji, ",")で一度抜き出した後 NULLを使って全て摘出出来たのですが、2行目以降(moji[X+1][Y])は 何を対象にstrtokを用いたら良いですか?間接参照じゃ上手くいかなくて・・・
>>632 system()ではなくpopen()を使いなされ
635 :
デフォルトの名無しさん :2006/12/19(火) 06:16:19
スレ違いかもしれませんが教えてください。 ソースみたいなものを出力したいのですが、インデントを入れる際 printf("\t"); でタブを出力したら半角8文字分開くのを4文字分にしたいのですが 方法が分かりません。 こういう時ってどうするのが一般的なんでしょうか?
それはCの問題じゃない。タブをどう解釈するかはCの問題ではない。
639 :
632 :2006/12/19(火) 08:41:31
>>634 おはようございます。
恥ずかしながらマニュアルを読んでもよく分からないので
帰宅したら書いて試してみます。
ありがとうございました!
FILE * fp = popen("/bin/ls", "r"); char buf[100]; while (fgets(buf, sizeof(buf), fp)) { printf("%s", buf); } pclose(fp);
独習C終わったら次何すればいいでしょうか?
CUIの電卓作ってみろ
それは難しそうです><
schemeパーサにチャレンジ
646 :
HELP :2006/12/19(火) 20:24:43
すまん、 core 解析してたら、この記述にぶちあたってしまた、 俺も、こんな記述したことないから C++ の拡張 にでもあるかな? とオモって、調べたがわからなかった。。。 たぶん、core の 最初のトリガは int func( int im char * cp) { char cData[i]; で、 cData に 文字 iバイト転送 & ヌルバイト を書いて その NULLバイト が cData[i+1] を壊し、それが めぐりめぐって core となったようなかんじなのだが そもそも auto 変数のサイズを 動的に 変数で指定OK?????????
Uzeeeeeeeeeeeeeeeeeee!!
小学生みたいな日本語だな C99で可能だけど
650 :
HELP :2006/12/19(火) 20:29:02
そう、ちょっと今 おおあせり中、、、 そうなんだ、これ C99でおkなんだ とりあえず Thanks,Thanks,Thanks,Thanks,
母国語で書いたほうがまだ通じるんじゃね?
>>650 無理して日本語で書いてるのか?余計わかんねーよ。
英語でおk。
653 :
632 :2006/12/20(水) 00:28:41
>>642 #include <stdio.h>
main(){return system("perl -ne 'print eval($_).qq(\n)'");}
独学でCを学ぶのに 一番いい参考書は 何がお勧めですか? 教えて下さいm(_ _)m
C実践プログラミングは素晴らしい どんな本にも書いてあるようなCの文法的なことだけでなく プログラミングスタイルやコメントの付け方デバッガの使い方 makefileの作り方まで書かれている。 この本で学べば天才ハッカーになれること間違いなし今すぐ10冊程注文しなさい
おまえは岩谷宏か
>>655 ネットで十分じゃないのか?
ネットで独学しながら、アマゾンのコメントを参考にたまに本屋で立ち読みして
良書、悪書もわかってくるよ
入門用サイトも10個以上はあるし、自分が読んでみて、理解しやすいサイトをメインに
わからない考え方、使い方は他の入門用サイトで補いながら勉強するぐらいで十分だよ
あと日本語だけに限定しないで、翻訳サイトを駆使して英語のサイトも考慮入れれば
解決できない問題はないと思う
659 :
デフォルトの名無しさん :2006/12/21(木) 05:33:23
>>655 http://wisdom.sakura.ne.jp/で基本身に付く あとは、本も買ったけど、入門書なら技術評論社の「c言語入門本物志向が身に付く」
ってのが、入門書としては良いできと思う。技術評論社の本はあんまりはずれない。
あと、K&Rは、持ってないと馬鹿にされるが、もう今じゃ、別に持っててももって無くても
どっちでも良い。
まぁ、何にしても、ソースを書きまくるしか身にはつかんね。
俺も、結局どうやって身に付いていったのか自分でもわからん。
だから、これっていう本も知らん。
660 :
デフォルトの名無しさん :2006/12/21(木) 11:59:13
K&Rって、今はANSI C準拠に改訂されてるの?
661 :
デフォルトの名無しさん :2006/12/21(木) 12:29:56
Cの課題で商品の品名、価格、数量、代価(価格*数量)、総計を
計算するプログラムを作っているのですが、表示がズレてうまくいきません。
分からないなりにTabやらで色々試してみたのですがやはりダメな様です。
入門者な上に計画的に作ってないので変数など分かりにくいかもしれませんが、
私が書いたプログラムは以下
ttp://up.spawn.jp/file/up59981.txt 最後の表?というか一覧がズレずにきれいに表示される様にするにはどんな工夫が必要なのでしょうか?
加えて入力の終了条件も苦し紛れに数量0にしましたが、
よくありそうなqの入力で終了という様にした場合は
if(a[i].hinmei == 'q')
とかではおかしいでしょうか?さっき試した時にはよく分からないエラーが出たのですが
構文的におかしいという事ですかね・・・
どなたかアドバイスお願いします。
>>661 文字列(%s)も長さ指定できる。%10s とか、 %-10sとか
そしてタブは使わずに数えて入れればそろうべ
>>661 >if(a[i].hinmei == 'q')
if( strcmpi(a[i].hinmei,"p") == 0) か if(strcmp(a[i].hinmei,"p")==0)
>>663 p と q 間違えた
if( strcmpi(a[i].hinmei,"q") == 0) か if(strcmp(a[i].hinmei,"q")==0)
665 :
664 :2006/12/21(木) 13:19:12
666 :
デフォルトの名無しさん :2006/12/21(木) 15:11:36
何らかの値を返すサブルーチンを作成する時に 引数でデータ格納先アドレスをもらいそこに格納する方法と、 returnで値を返す方法とありますが、 みなさんはどのように使い分けていますか?
returnで値を返す方法で済むときはreturnで値を返す
簡単な値だったり比較目的だったりするなら代入で 代入するのが大変そうなデータだったりするなら参照で
669 :
デフォルトの名無しさん :2006/12/21(木) 15:25:05
複数の値を返す必要があるときはアドレスをもらうってことですかね。
特に使い道は無いのですが 「オン状態の最上位ビットを探しそこ以下をオンにする」という一つ式を書くとすると どういうのがあるのだろうかと気になって考えています。 一応自分はこう作ってみましたが、他にはどのようなものがあるでしょうか。 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 冗長すぎますね…
即席だから何か問題があるかも試練が
b=0x80;
for(i=0;i<8;i++){
if((a&b)!=0)break;
b
>>1 ;
}
for(;i<8;i++){
a|=b;
}
ぅぁ、早速問題発見
b
>>1 ;
を
b>>=1;
に
「オン状態の最上位ビットを探し」と「そこ以下をオンにする」を分けただけ
ビット演算は使い方違うかもしれないけど、流れを汲んでもらえれば
for (b = 1; a > b; b<<=1) ; b -= 1;
>>671 8bit程度であれば、テーブルを用意しておくのがベターかも。
*pointer++だと、 (*pointer)++と*(pointer++)のどっちになりましたっけ?
679 :
678 :2006/12/21(木) 19:29:59
じゃなくてポインタの参照先がインクリメントされるんじゃなくて ポインタの先が参照されたあとポインタがインクリメントされる。
びっくりしたぁ
681 :
デフォルトの名無しさん :2006/12/21(木) 21:16:06
Cで電卓作ってたんだけど、()のなかにまた()がある場合の書き方がわからずに挫折してしまいました。 再帰でやろうとしてたんですがうまくいかず。 実際のところはどういったアルゴリズムで動いてるんですか?
再帰
(・3・) エェー 再帰って・・・w
>>681 後置記法(または逆ポーランド記法)、スタックでぐぐれお
文字列で後の方から'('を探して、その直後にある')'を探す。 これが後の方にある項で最も内側にある括弧部分。 ループでできると思う。
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお 最低で250万までなら余裕で出せるお 肛○のなかに発射してしばらく挿入したままで余韻を味わって 最後に中に放尿して引き抜いたそれをあかねたんの口できれいに 掃除して貰いたいお・・・はあ・・・。
いや、再帰でいいから。
誤爆か。 おかしい人かと思った。
俺の教科書はsetjmpを駆使したりして電卓ってた
ちなみにオーム社の本 続版では消えてんのかな
誤爆でもおかしい人であることにかわりはなく…
どのぼるじょあか分からないけど この板内ならコピペとして使えるな
>最低で250万までなら余裕で出せるお 日本語変だな 最低で 〜までなら 余裕で 結局250万は上限なのか下限なのか
OSがLinuxでエディタがemacsでコンパイラがgccなんですが ディレクトリにある画像ファイルを出力するプログラムはどう書けばいいのでしょうか 簡単そうなのに調べても全然見つかりませぬ
250万までなら余裕だけどそれ以下に減額されると厳しいらしい
画像ファイルの定義を述べよ。 出力するとは具体的に何をすることか説明せよ。
strtolってエラーの場合は0を返すけど 本当に0が入力された場合とエラーの場合ってどうやって見分けるの?
errno
>>697 xpeintというもので描いた画像です
その画像を他のテキストファイルに書き込んで、
そのテキストファイルを開いて出力したいです
ありがとう ググってみた こんな変数があったんですね
702 :
デフォルトの名無しさん :2006/12/21(木) 22:18:33
>>671 とりあえず8bit決めうち
a |= a
>>1 ;
a |= a
>>2 ;
a |= a
>>4 ;
bit演算の基礎テクニックだから覚えておくと役に立つかもよ
最上位ビット以下をすべて1にする別の式を思いついた
a|a
>>1 |a
>>2 |a
>>3 ...
これだけでわかる人も多いでしょうが一応…
aが10100の場合
10100
1010
101
10
1
0
...
を論理積するので最上位ビットがシフトダウンして一つずつ当てはまっていきます
被った…
>704 大丈夫、君の方が効率悪いから被ってない。
しかもORは論理和だが ・・・まあ誰しも疲れている日があるさ
void func(int n){ printf("%02d",n); } int main(){ func(2); } これのコードを実行すると02と表示されるじゃないですか ここで表示されている文字列と同一の(変数は変数として受け取る)文字列を作成するマクロ関数ってできますか? #define FUNC(n) #n ここまでは書けたんですけど、0で埋める処理のやり方がよくわかりません 教えてください
#define FUNC(n) printf("%02d",n)
710 :
デフォルトの名無しさん :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というシステムコールが使えそうなんですが… 以上二点、教えてください。お願いします。
>>710 大間違い。2行目のstr="foo";で、メモリリークしてる。
mallocで確保したポインタが失われている。
さらに、文字列リテラルのアドレスに対して、
reallocしたら、そりゃあ何が起こるかわからない。
SEGVも当然。
>>710 質問2に答えてなかったな。
通常reallocを使うのがいいと思う。
sbrkはシステムコールというだけあって、移植性が低い。
どうせsbrkを下請けに使うんだからmalloc系を使うべし。
>>711 即レスありがとうございます!
質問1について:strcpyしないとだめですよね…忘れてました
しょうもない質問してすいませんでした
質問2について:やっぱりreallocですか。
プログラム中で一番最初にmallocで得たポインタを
reallocし続けると、同じ先頭番地から
どんどんヒープが伸びていく
(つまりreallocしても全く同じポインタが返される)
と思っていたのですが、試してみるとそうでもありませんでした。
というわけでreallocするとメモリのフラグメンテーションが
起こりまくるのではないかと思っていたのですが
しょうがないですね…
ありがとうございました。
>>713 ちょっと厄介だが、realloc()でサイズを増やすときにちまちま増やさずに多めに増やすといい。
C++のvectorの戦略も参考になるかもしれない。
質問です。 とある関数Aで文字列定数のアドレスをポインタAに代入した後、 他の関数BやCでポインタAを参照した場合、文字列定数のアドレスが 有効だということは保障されていますか?
>>715 // こういう使い方?
static inline const char * func() {return "ABC";}
void someFunc()
{
printf("%s\n", func());
}
// 全く問題ない。
717 :
715 :2006/12/22(金) 01:24:50
>>716 そんな感じです。
有難うございました。
718 :
デフォルトの名無しさん :2006/12/22(金) 02:59:28
ハッシュ関数の意味は違う喩えを使って簡単に教えてください 人間のウンチでしょうか?
>>709 説明のしかたが悪かったですね
「表示される文字列と同等の文字列」へのポインタがほしかったんです
お手数をかけてしまって申し訳ないのですが、なにとぞ
すいません教えてください いきなりですが学校の課題で年賀状のあたり番号をチェックするという プログラムを作っています。 そこで当選番号の数字を数字を入力するという作業が必要になるのでそのプログラムを 作成しようとしているのですが作れませんOTL 具体的に言うと 1等は6桁の数字なんですが文字も打てるようになってしまっています 文字を打つとはじくようにしたいです。 あと6桁という限定が上手くいかないですOTL 5桁でも通過してしまうし・・・・
723 :
721 :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; }
if(i==0 && tousen[i]<=999999 && tousen[i]>=100000) と書いた方が分かりやすい 上限と加減の間に別の差し込んで、わざととしか思えない
ctype.hのisalphaで文字型にアルファベットが入ってるかわかるから、 forでも使って全部チェックしてみたら〜?
726 :
721 :2006/12/22(金) 10:26:18
isdigitだとダメっぽいですか? isalphaだとうまく書けません・・・
こんな単純なのにアドバイスしようがない。 どうやってるのか書いてくれれば指摘できるが・・・
>scanf("%ld",&tousen[i]); この時点でisdigitなんかは意味ないわけだが
>>727 scanfの%ldで読み込んでるところに文字列が入力されると
文字列は読み込まれずそのままバッファに残ってしまう。
次のscanfの呼び出しの時も残った文字列バッファを読み込もうとしてエラーを起こすから
半永久的な無限ループを起こす。(scanfが糞だと言われる所以の1つ)
文字列の入力をはじきたいならscanfの返り値を読んでちゃんと読み込めてなかったら
バッファ内のデータをいったん全部読み飛ばす(scanf("%s",tmp)とかで)か、
scanfの入力を一度%sで読み込んで、文字列がすべて数値列ならatoiで数値に変換するとかすればいい。
730 :
721 :2006/12/22(金) 11:52:37
なかなか上手く出来ないですね・・・
だから、こうしたくてこういうコードを書いてみましたがこうなってしまって 期待通り動きません、とか書けよ。
お前の頭の中だけな… ここに出てるヒントで俺なら作れる けど宿題スレじゃないんで教えてあげない 悔しかったら自分で調べろ
IOバッファを理解させた方が早そう
マルチ先はどこ?
738 :
721 :2006/12/22(金) 12:32:20
>>733 ありがとうございます
そちらに質問を書き込みます
ほかの皆様
おさわがせしてすいませんでした
>>740 プッ…
>>719 マクロにしてポインタを返すのか…
でも文字列を格納するバッファはどうする?
たとえばあらかじめ出力先のバッファを静的に確保しておいて使用するとか…
char macro_str[MACRO_STR_MAXSIZE];
#define FUNC(n) (sprintf(macro_str,"%02d",n),macro_str)
思いついたのはこれかな
struct_tag の_tagとアンダースコアを使う技法を何と呼ぶのでしょうか。 うーん…思い出せない…
プログラマーってオナニーすんの?
誰が得するんだよそのレスは
グラマ女が悦ぶ
746 :
デフォルトの名無しさん :2006/12/22(金) 23:59:55
女プログラマー 略してグラメス
747 :
デフォルトの名無しさん :2006/12/23(土) 01:20:40
メスグラマ
未だにC言語を使ってるなんて、 なんて気の毒な環境なんだろう・・・ C++でさえお断りなのに・・・・
749 :
デフォルトの名無しさん :2006/12/23(土) 01:32:39
JAVAとか言い出しそう
751 :
デフォルトの名無しさん :2006/12/23(土) 02:25:52
VBとかw
折角だから俺はRubyを選ぶぜ
PEヘッダからバイナリエディタでゴリゴリ書いてます
ゴリゴリってレベルじゃねーぞ!
C言語使わなきゃならないようなシーンて何があるの?
>>721 #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;
}
>>708 sprintf(format,"%%%0dd",2);
printf(format,1);
printf("%0*d", 2, 1);
761 :
デフォルトの名無しさん :2006/12/23(土) 20:12:52
関数は一画面に収まるぐらいの行数で、とか聞きますが 1ファイルあたりの行数というのはどのくらいが限界だと思われますか? 長すぎるとお目当ての関数を探すのがめんどくさいし ファイルを分割しすぎると、それはそれでめんどくさいです
>>761 関数を探し出すのに困るほど長くなく、分割するのに困るほど短くないくらい。
私の場合は500行を越えるとそわそわし始めて、1000行を越える辺りまでには強行している。
勿論、まとまりがいい場合には300行だろうが100行だろうが迷わず打ち止めにする。
763 :
デフォルトの名無しさん :2006/12/23(土) 21:39:38
stat関数をつかってディレクトリの存在チェックをしたいのですが、 うまくいきません struct stat st; if(stat( "/tmp/フォルダ名", &st) == 0 ){ switch (st.st_mode & S_IFMT) { case S_IFDIR: // ディレクトリ有り break; } }else{ // ディレクトリなし } どこが悪いのでしょうか?
>>763 S_IFDIR以外のビットが立ってたら判定できない。
if (st.st_mode & S_IFDIR) ...
とかで、判定するとか。
>>761 Cではファイルスコープ以外にモジュール性を表現する手段が無いので
行数だけで機械的に判断するのはどうかな。
1ファイル内に収めてるうちはstaticで済むものを
分割によってグローバルにしてしまうのも、どうか、というわけだ。
まぁそんでも、あまりにデカくなると考え物ではあるがな。
>>761 > 関数は一画面に収まるぐらいの行数で、とか聞きますが
そんなの本気にすんなよ。
>>766 ぶーーーーーー
1つの関数が馬鹿でかい糞プログラムを書く香具師メッケ
>>767 ぶーーーーーー
関数を分割し過ぎて階層が深すぎる糞プログラムを書く香具師メッケ
コードコンプリートって本に載ってたIBMの調査だと、200行以下のサブルーチンでは、 行数が少ないほど、一行あたりのエラー数が多いという結果になったらしい。 つまり200行の関数ひとつより、20行の関数10個のほうが不具合が多いということ。 だいたい「画面に収まる行数」って、環境でぜんぜんちがってくるじゃん。
770 :
デフォルトの名無しさん :2006/12/23(土) 22:59:25
>>764 あ、なるほど
そういうことですか〜
ありがとうございます。
なわけねーだろ 関数の行数が多い=その関数でやりたい処理がわかりにくい=問題点を見つけにくい=バグが多い っていうか、未だにC言語を使っている香具師と生産性の話をすること自体がナンセンスかw
>>769 画面に収まるっていうのは、初学者に
巨大な関数は書くなって言いたいだけで、
本気で一画面に納めろと言っているわけでは
ないと思う。
>>772 じゃ、単純に「巨大な関数書くな」って言えばいいのに。
目安が無いとどれくらいが巨大なのかわかりにくいだろ。
いや、「1画面に納めろ」というのは指標として正しい 関数の処理が一望できるようなサイズの方が、問題点を見つけやすいからね 1画面でなくてもせいぜい3画面までだろうな ココで逝ってる画面サイズは、個々の開発環境の画面サイズと思ってもらっていいと思うぞ
単に「画面に収まる行数で」って言い方でも、その通りに受け取るやつがいそう。
それでいいと思うけど・・・
どんなにでかくても200行も一度の表示できるようなディスプレイで開発することはあるまい
779 :
デフォルトの名無しさん :2006/12/23(土) 23:15:03
じゃあ200行未満っていえばいいじゃん 調査で分かったんしょ? むしろひとつのサブルーチンで200行もかけない人は、 関数を作る目的意識が低くて200行まで書けなかったり、脳内整理が下手だったり 単に実力のない人なんではないかな だからがんばって200行はかけるようにしようぜ
>>778 いや、昔「プリンタで60行だせるから、60行以内で」とか言ってるやつを見たことあるから、
一ページ240行だせるから、240行とか言うやついるかもよ。
781 :
762 :2006/12/23(土) 23:29:44
確かに行数なんて恣意的なものなんだから何行までって線引きはおかしいと思うよ。 まぁ、私は自分の限界知っているから200行の関数なんて書かないけれど、 長大な関数を作りたがる香具師は大抵それを全部把握しきれないことにも気付かないから問題なんだけどね。 実際に2000行ものmain()を書く香具師の例だけれど、ローカル変数を全部関数の先頭で宣言しているから 未使用変数は山のようにあるし同じ変数の使い回しはあるし、悉くバグの温床になっている。 仮令(99以前の)Cでもブロック内で変数を宣言すれば未だ見通しがよくなるというのにね。 要は、自分のキャパに合わせて関数を作れ。 自分のキャパが判らないなら取り敢えず、目の前の画面内に関数の主要部が収まるように作れ。 って話じゃないの。
>>779 w
200行もかけないんじゃなくて、書かないんだよw
でも確かにC言語で関数のネストが深くなるのはあまり見やすいとはいえないけどな
バグの少ないプログラムを書きたかったらC言語のような言語は使わないほうが良いということだなw
>>780 未だにコードを印刷してチェックするような原始人を基準にされても困るよねw
>>781 作ってるプログラムが、個人の趣味のプログラムならそれでも良いけど
仕事で作ってるプログラムなら自分の基準で作るのはよろしくないだろう
プログラムは作った人以外もメンテナンスできなければならない
よく、「あのプログラムは誰それが作ったから、その人がいないとメンテできない」
なんて状況があるが、それは好ましくない状況だから、何らかの
基準を設けることは必要だろう
>>779 >むしろひとつのサブルーチンで200行もかけない人は、
>単に実力のない人なんではないかな
いや、実力のないやつがでかい関数を書いてる。
(数百行とか数千行とか、そういう単位で)
コードコンプリートだと
>>769 のことを書いたあとに、行数じゃなくて別の尺度で、
サブルーチンの複雑さをとらえよう、みたいなことが書いてあったな。
プログラムを複雑にするのは、if文やfor文などの ブロックのネストの深さと大きさだな
行数オンリーで会話が進んでるけど コメントの質は無視してないよな
>>769 でかい関数の作者は馬鹿の比率が低いからじゃないの
789 :
デフォルトの名無しさん :2006/12/24(日) 00:21:45
VC2005を使用中で、 UNICODEを使用した状況で、__FILE__ , __DATE__などを使いたいと思っています。 マクロ定義で #define CONV2WIDE(X) (L ## X ) と定義して、 int main() { wchar_t test[] = CONV2WIDE( __FILE__ ); return 0; } としても、マクロ展開後のソースは L__FILE__ となっており、 __FILE__が展開されていませんでした。 仮に、__FILE__ではなく、 "hoge" としてみると正常にLサフィックスが付いて 正常コンパイル出来ました。 __FILE__でもうまく展開できる方法って無いでしょうか? マクロ中で扱いたいので、変換関数とかは呼びたくないのです。
関数を作る前に仕様書がきちんとしてるから、関数をデカくしても大丈夫 調査対象となってるのはアマグラマではない事を理解しとかないと
>>789 これでおk
#define CONV2WIDE(X) _CONV2WIDE(X)
#define _CONV2WIDE(X) (L ## X )
参考までに、DirectX付属のサンプルだと100〜150行の関数がざらにある もちろん20行ぐらいの関数がほとんどだけども
>>791 ぉぉ。
2段構えでやることでうまくできました。さんくす!
しかし、__FILE__などが置き換えられるタイミングの問題でこうしないとダメなのでしょうか?
この手の二段展開マクロは過去との互換性から仕方ないっちゃ仕方ないけどなんとかならんかなぁ。
>>787 コメントの質も重要だが、ダラダラと長い関数はそれだけで読解性が悪いので
幾らコメントが充実してても肝心なコードを把握しにくくなるから意味が無い。
>>790 仕様書がそのままコードになるならそれでも良いが、
問題は仕様書どおりに出来てるかどうかの検証がしにくいって事。
少なくとも、でかい関数を作るやつはプロじゃない
関数の大きさが、その人の質とは限らん 100%否定されたらそうとしか答えられん… でかい関数を作る奴はプロでないやつばかりだ、とかなら分かる 意図して少しサイズの膨れた関数を作る事も システマチックになりすぎると、肝心の中身がな…
ではプロ意識が低いと言い換えようかw
それだな
人それぞれだと思うがなぁ… 200行程度でぐだぐだ言ってたら2万行のソースとか書けないべ
どっちにしろ長くやってりゃ2万行のソースを書くことは出来るだろうが、 バグの発生率やメンテナンスコストはまるで違うものになるだろうね
必要な処理だけを関数にすればいいだけの話だと思うが というよりその関数に必要な処理だけを書くのがいいだろう 結果的に大きなサイズになってもそれが必要ならいいと思うし 本来少ない行数ですむものをだらだら書くのはダメだろう 可読性やメンテナンス、汎用性を考えれば…
ポインタに関する質問です。 #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でコンパイルしました。
>>803 演算子の優先順位の問題
(*pa)++;
が御希望か?
main(){ int a[2]={0},*pa; ←この時点でa[1]にpaの中身を代入してるからだろ? しかもその時点ではpaにはまだa[1]のアドレスは入ってないし。
806 :
803 :2006/12/24(日) 01:50:29
>>804 *はポインタ'演算子'でしたね。
ありがとうございました。解決しました。
>>805 言ってる事がよくわからないんですが、
*pa++がどうして足されないのか知りたかっただけです。
808 :
805 :2006/12/24(日) 01:59:21
気にしないで なんか勘違いしてたw
コンパイルに時間がかかるコードって、例えばどんなものがありますか? コードの量じゃなくて内容的なものでお願いします
マクロを駆使すればコンパイル(というよりプリプロセス)に時間がかかるようにできると思う。
int operate(int a,int opr,int b){ return a opr b; } int main(){ operate(4+6); } これができないことはわかるんですが、これでやろうとしているような 「関数に演算子を渡す」 ということはできますか? とりあえず文字コードを渡して内部で switch-case で場合分けして凌いでいるんですが、どうにも見栄えが悪くて
int plus(int lhs, int rhs) { return lhs + rhs; } int minus(int lhs, int rhs) { return lhs - rhs; } とこういう感じに1つ1つ関数にしていくくらいしかないと思う。 C++なら、こういう関数が予めある程度標準ライブラリで用意されているし、 ほかにも色々技巧を駆使してやる方法もあるのだが。
>>811 #define operate(a, opr, b) ((a)opr(b))
>>812 ありがとうございます
やっぱり冗長な表現になってしまうんですね
>>813 最初はそれも考えたんですが実際に使用しようと考えている場所では計算が多く、
1行にすると横に200文字近く伸びてしまうんです
それで関数に演算子を渡せないかな、と
C++になら演算子オーバーロードがあるけど… ここはC限定スレだし。 そのためだけにC++にするわけにもいかんのだろう。
char *p; p=getenv("QUERY_STRING"); で取得したpをパースする関数のサンプルを探しています。 &と=の部分に\0を入れる方法のものです。 よろしくお願いします。
よろしくオナガイシマス 一つの関数からの型の違う戻り値を(charとintのような感じで) 取得する事は出来るのでしょうか? fooはchar型、hogeはint型の戻り値 return(foo, hoge) こんなことは出来ないので、このような場合のテクニックを教えてください。
型が違うと長さも違うから、その辺を解決したうえで void* で受け取ってはどうか
って複数受けたいってことか? 構造体使ったら
結局ポインタ変数って変数のスコープを広げるだけでグローバル変数使用の弊害と同じことが 起こるわけだし、グローバル変数の使用を極力避けるのと同様にポインタ変数の使用も極力 避けるべきだと兄の長男の友達の妹が言ってた
>>818 です
早速のアドバイスありがとうございます
>>819 さんの方法は関数を呼出す方と呼出される方が同じポインタを参照して
渡す方法と理解していいですか?
>>820 さんの方法ですが、忘れてました構造体で戻り値を受ければいいと言う事でOK?
>>818 struts FooHoge{
char foo;
int hogel
>>818 struct funcReturnValue {
char foo;
int hoge;
};
struct funcReturnValue func()
{
struct funcReturnValue ret = {'a', 818};
return ret;
}
>>817 環境変数はいいとして、"&と=の部分"とはなんぞや。
例えば環境変数LANGを取得するにはgetenv("LANG")とするわけだが、
その場合は"ja"へのポインタが得られるからパースもへったくれもないのだが。
>>817 パースして\0をいれるというと、strtok() のことか?
もしそうなら、strtok でググればサンプルくらいあると思う
>>826 これってまずいんじゃね?
構造体retはスタックに取られるから、リターンしたらretの領域は保証されないんじゃね?
>>828 もらった側もコピーして受け取るからかまわんだろ
>>829 大丈夫、C89以前の糞コンパイラでもない限りちゃんとコピーされる。
まずいのはretのアドレスを返したとき。
>>818 です
年賀状作ってる間に有意義なご回答ありがとうさんです
>>826 さん
struct funcReturnValue ret = {'a', 818};
こんな書き方もあるんですね初めて見ました
勉強になります。
普通の構造体の初期化にしか見えないが。 何か特別な点でもあるのか?
835 :
sage :2006/12/24(日) 19:05:00
WinXP SP2,VC++6.0(_UNICODE指定) GetUserNameを使って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(); } }
UNICODEは定義したか? <windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
837 :
835 :2006/12/24(日) 19:10:04
間違えた。 あげてすいません。
>>836 UNICODEを定義したのは、プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
><windows.h>以下などWindows APIのヘッダは_UNICODEではなく、UNICODEが定義されているかを見る。
これは、どこを見ればよいの?
839 :
デフォルトの名無しさん :2006/12/24(日) 19:31:20
C言語はじめてみたいと思っていますが、 CとC++ってどちらを選んでよいのかわからないのですが、 どういった違いがあるのでしょうか。
C言語をはじめたいのならCじゃない?
841 :
デフォルトの名無しさん :2006/12/24(日) 20:31:49
C言語かC++をはじめてみたいと思っていますが、 CとC++ってどちらを選んでよいのかわからないのですが、 どういった違いがあるのでしょうか。
C言語をはじめたいのならCじゃない?
C#(ry
>>838 > プロジェクトの設定のプリプロセッサの定義で「_UNICODE」と指定しただけ。
ならそこにUNICODEも書き加えろ。
そもそももしVisual C++の話なら、プロジェクトの設定の全般に文字セットの指定があるから、
そっちで選択するのが確実。
>>844 コンパイルうまく出来た。実行もできた。
ありがとう。
Obj(中略)C
scanfで指定したファイル(○○.cファイル)を (○○.html)に直すのにはどうすればよくて?
>>847 ファイル名を変換するだけ?
それとも html フォーマットに変換するの?
>>848 言葉足らずだった。
○○.cファイルを"r"で読み込まして、
そのファイルの内容ばーと、コピーするところまでは完成してるけど、
そのコピーしたものを、こんどは"w"モードで
新規ファイル(○○.html)をつくりたいわけです。
#include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int 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;}
>>851 エスパー回答 コピペしてみてちょ
WriteFP = fopen(○○○, "w"); ←ここの指定の方法がわかりません
↓
{
char *ext;
strcpy(Wfname, Rfname);
ext=strrchr(Wfname, '.');
if(ext!=NULL) strcpy(ext, ".html");
else strcat(Wfname, ".html");
}
WriteFP = fopen(Wfname, "w");
>>852 WriteFP = fopen("test.html", "w"); ←ここの指定の方法がわかりません
これでいいのでFA?
>>852 おお、動きました。 ありがとうございます
まだまだ<string.h>の勉強が足りないかも
>>853 したい事は、同じファイル名がよかったんです
856 :
852 :2006/12/25(月) 00:10:45
やった!エスパー回答成功!
さすがです〜(><)
数字だけを並べたファイルを読み込んでから、 読み込んだ数字の最大値と平均値を求めて出力したいんだけど 最大値ってどうやって計算すればいいでしょうか? if(*fp >= max_num) { max_num = *fp; } これを使うといけないらしいのですが
859 :
858 :2006/12/25(月) 01:53:47
int max_num; FILE *fp; と上の方で宣言してあるので片方だけがintなのが原因かな と自分では思っています。 いろいろ試したけど解決できてないので、アドバイス下さい
>数字だけを並べたファイルを読み込んでから 君はファイルから数字を読み込むことはできるの?
861 :
858 :2006/12/25(月) 03:30:22
txtファイルから読み込んで 平均値だけを出力させることはできました。
maxnum = *fp; で読み込むことができたのかw
863 :
858 :2006/12/25(月) 03:49:33
>>862 それ無しで><
それ入れるとエラーが出ますが、平均値や合計の計算などはできるので
問題は 最大値 の出し方なのですが
>>863 1.最初に読み込んだ値をmax_numに入れる
2.その後読み込んだ値を一つ一つmax_numと比較し、より大きければmax_numに代入
3.数字を全部読み終えたら、最大値がmax_numに入っている
もし最初に読み込んだ値を、という特別な処理が面倒であれば、 max_numにINT_MINを入れておく。<limits.h>をインクルード。
char *hoge[] = { "あいうえお" ,"かきくけこ" ,"さしすせそ" ,"たちつてと" ,"なにぬねの" }; これってどういう意味ですか?char型の配列を各々指しているポインタ配列?
char *hoge; の集合体
868 :
858 :2006/12/25(月) 13:15:17
>>864 それは
>>858 でやったような
if(*fp >= max_num)
{
max_num = *fp;
}
ではないのでしょうか?
とりあえず平均値のソースうp
870 :
858 :2006/12/25(月) 14:01:13
>>869 int 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;
}
max_numは初期化済みとして if(val >= max_num) { max_num = val; } ではだめということなの?
>>870 fopen() やってないが、ただの書き忘れか?
>>858 どこをどうやったらmaxnum に * fpを代入すると言う発想が出てくるのか是非教えていただきたい。
874 :
858 :2006/12/25(月) 14:46:48
>>872 書き忘れです。
if((fp=fopen("indata.txt","r"))==NULL)
{
printf("ファイルが見つかりません。---indata.txt\n");
exit(EXIT_FAILURE);
}
>>873 教えてもらいにきたのに教えないといけないなんて><
875 :
858 :2006/12/25(月) 14:50:34
>>871 前それやった記憶があるんだけどもう1回試してきます。
初期化してなかったかもしれない。
876 :
858 :2006/12/25(月) 16:04:56
>>871 すんません、余裕で出来ました。
ありがとうございます。
ファイル削除はどうやったらいいんですか? 処理中にtemp.datでも一時的に作って、 処理が終わればそれを削除したいんだけど。
>>877 C言語標準の方法ではファイルの削除はできないから、
あなたの環境が分かれば教えられるかも。
一応そういう目的にはremove()が使える筈なんだが。
>>877 Unix-likeなOSなら、正しいやり方は以下のような感じ。
fp = fopen("temp.dat", "w+");
remove("temp.dat");
:
fclose(fp);
オープンファイルの削除が出来ないOSでは、remove()はfclose()の
後に持ってくるしかないが、その場合、プロセスが途中でコケたりした
場合に、temp.datが残る可能性がある。
C的にはこっちのほうが良くね。 fp = tmpfile(); : fclose(fp);
異常終了したときには、残された一時ファイルの内容を見て 途中から処理を再開する可能性も考えられる
ファイルオープンしてその中身をある文字列に書き換えたら削除してくれるようにしてくれればいいじゃない
(・3・) エェー 最近ここをのぞくようになったけど
ぬるい質問には元気よく回答(でもレスの終わりには何故か嫌味もw)
して質問に関係ないレスをして馬鹿でも知ってる知識自慢をしてるけど
ちょっと手間な質問には嫌味や煽りばっかりで
回答できてないのが気になるお
このスレの回答者は頭悪いのが多いお、というわけで質問者は
こちらに質問をなげるようにしてください
ぼるじょあがC/C++の宿題を片づけますYO! 67代目
http://pc8.2ch.net/test/read.cgi/tech/1165718021/ 優しいぼるじょあと名無しさんがきみたちの質問に答えるお
宣伝うざい
>>885 事実。このスレッドに次スレッドは不要。
宣伝うざいに、事実、てか… もう少し接続詞の勉強しな
いやそれは接続詞ではないと思うぞ。
"事実。"の前に接続詞を入れないと意味が通らないから勉強しろってことだろ、何の不思議もないと思うが… そもそも引きずることなのか
くだらない質問ですみませんm(_ _)m C言語を1から勉強したいのですが お勧めの本はありますか? なんか書店にはいろいろな本がありすぎて どれを選んだらいいか分からなくて 初心者でも 独学で分かりやすい本って 何かありますか? くだらない質問でほんとすいませんm(_ _)m
やさしいC
猫Cとか
894 :
デフォルトの名無しさん :2006/12/27(水) 00:04:28
アンダースコアをつける技法についてしつもゎした者ですが、解決しました プレフィックスでした。 もし回答者がいたらありがとうございました。 携帯からなので確認が大変なので…
よく読んだらプレフィックスじゃないかも… すみません、もう少し調べてみます
やっぱ やさしいCが一番分かりやすいのかぁ
C実践プログラミングが一番素晴らしい どんな本にも書いてあるようなCの文法的なことだけでなく プログラミングスタイルやコメントの付け方デバッガの使い方 makefileの作り方まで書かれている。 この本で学べば天才ハッカーになれること間違いない今すぐ10冊程注文しなさい
今までJavaばっかりやってきたんですが、 仕事でCをいじることになりました。 関数レベルの単体テストってCだとどうやるのが一般的なんでしょうか? (つーか内部関数の単体検証は無理?) 職場の皆さんはそもそもNUnitの類での単体テストと言う文化が無いようで プリント文見たりとかデバッガで止めて確認して完了とかで戦慄を覚えました・・・
900 :
n :2006/12/27(水) 02:55:52
C言語の問題点を教えていただけませんか?
・宣言まわりの文法がクソ ・配列とポインタの妙な互換性 ・構造化された例外処理がない
902 :
N :2006/12/27(水) 03:07:31
>>901 の方ありがとうございます。
解決法とかありますか?
>>899 C++でさえなくCか。ご愁傷様。
ま、テストファーストなんてのはCが流行ってた頃よりずっと後に出てきた
文化だからなー。
C++用だが、CppUnitの使用を検討してみては?
>>902 前2者の解決法はない。仮に解決したとすると、それはCではない何か別のものになってしまう。
最後のやつは言語仕様に後付けできるから、やろうと思えばできるだろうけど、
ISOに提案して規格になって実装が出てきて、とうまくいったとしても
10年以上かかるんじゃないかな。
905 :
n :2006/12/27(水) 03:40:53
>>904 ありがとうございます。もう一つお聞きしたいのですが、オブジェクト指向とはどうゆう意味なんでしょうか?
>>905 それは難しい問題だ。というか簡単に一言で述べることはちょっとできない。
一般的にオブジェクト指向言語が備えている、備えているべきといわれる機能は
・多態
・継承
・カプセル化
だ。それぞれの意味はぐぐってみてほしいけど、
たぶんちんぷんかんぷんじゃないかという気がするし、
だいたいスレ違いだw
おれ自身は多態さえあればオブジェクト指向と呼んで差し支えないとは
思っているが、これに異を唱える人は多いと思う。
簡潔に述べるのなら以上のようになるんだけど、
こんな答で納得してもらえるとはちょっと思えないなw
オブジェクト指向はオブジェクト化による(ry 哲学とか入ってくるからなぁ 門外漢だろ、普通のプログラマは
908 :
n :2006/12/27(水) 04:13:00
>>906 色々親切にありがとうございます。
確かに今の僕ではよく解りません(TT)もう少し調べてみたいと思います。
コーディングする対象をひとつのオブジェクト(物体)と見なして それを固有情報(メンバ変数)と付属関数(メソッド)で表現する手法 と思ってる。俺は。
910 :
デフォルトの名無しさん :2006/12/27(水) 12:31:24
英語の文法S+V+O、命令形だとV+Oだ これをひっくり返してO+V これがオブジェクト指向だと思っているよ、俺は
911 :
デフォルトの名無しさん :2006/12/27(水) 12:54:35
O(オブジェクト)をV(動詞)の前にもってくることで VをOの内在・従属させることができるし(カプセル化) Oがシンプルになる(多態)
C実践プログラミングは 初心者にも分かりやすいですかね? 超初心者なんですが...
そのオープンソースプログラムのライセンス読め
>>913 オープンソースといっても君がしたいことの可・不可が一律に決まってるわけじゃないよ。
せめてプログラム名とかライセンス名は書こうね。
>>912 C言語によるプログラミング基礎編とC言語によるプログラミング応用編がお勧め
宣伝くさくなるから出版社は控えるけど、ちょっと品揃えのある書店に行けば楽に見つけられると思う。
基礎編は注訳をとにかく読みまくる事が大事。
分からない事は、そういう事なんだと理解する事も大事。
配列とかどうしても理屈が分からなければ人に聞く事。
分かるまで聞く事も大事。
”人に”聞いてね、ネットじゃなくて。
黒板やホワイトボードなんかがあるところで尋ねるのがベスト。
無ければ紙と鉛筆は忘れずに。
後はやる気があれば何でもできる。
30歳超えてたらしんどいと思うけど、できるだけ右脳を活用してあげて。
どっかにソケット通信のサンプルおいてあるとこない?
C実践プログラミングが最強、なんといってもオライリーだし オライリーの本を買っとけば間違いない今すぐ10冊程注文しなさい
>>913 オープンソースといってもライセンスが沢山ある。
代表的なもののうちの一つに GPL v2 があるが、これの場合はユーザの側の
改変再配布の自由を妨げることを禁じており、コンパイル済みバイナリを
受け取った人はそのソースも受け取る権利が発生する(ソースを受け取る
ことを妨げてはいけない)。また再配布の際は同じ GPL v2 のライセンスで
配布しなければならない。結果としてソースを隠して独占する行為は不可能に
なる。またその結果 GPL のソフトウェアのみを販売する行為もほぼ不可能に
なるのだが、これは特に禁じられてはいない。(Linux ディストリビューションの
RedHat などは一見これができているように見えるかも知れないが、あれは
ソフトそのもので金を取っているのではなくてサポートで金を取っている)。
スマソ 今txtファイルから、 p = fgets(buff, 256, fp); と 順に上から一行ずつ読み込ませて、処理を行っています。 で、そこの読み込んだ一行の中に "ABCDEFGHIJKLMN"という文字列があったとして、 そこの"FGHIJ"という部分を、"GHFJI"と置換をしたいのですが、 それがさっぱり分からないので、誰か助けてください。
>>920 strstrで検索して文字間でスワップかけるだけ?
置換前後で文字列数が同じなら自身書き換えでいけるだろうけど
置換前後での文字列数が異なる場合はバッファわけないと無理だよな。
>>920 の例はたまたま 検索文字数=置き換え文字数なので
置換操作前後で文字列数かわらないけど
>>921 ごめんなさい、スワップをかけるだけじゃないです。
"あかさたな"という文字列が゙あったらなら
全部"はまやらわ"に置換してみたいのです。
一応自分が考えたのは、一文字ずつ読み込む方法で
"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);
}
以下省略で、頭悪い方法です。
>>916 本に関しては人によるので否定しないがも肯定もしない。
人に学ぶのが一番なのは同意。
教えて君にならない程度に聞きまくるのがいい。
必死に学んでれば、無碍に断れもしないだろうし。
>>923 >>921 と
>>922 が言っていること理解しちょる?
というより「〜みたいな」とか「〜だとしたら」という微妙な表現しかないのは・・・
もういいや
926 :
デフォルトの名無しさん :2006/12/27(水) 20:52:46
>>920 の仕様のソースを書いてみた
#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;
}
}
>>923 基本的に文字列Aを表示するが、Aの中に文字列Bが存在したらその部分を文字列Cに置き換える
こういうことだよな?
仮にそうだとして、文字列Cは任意の文字列?それとも何か変換規則がある?
>>926 strpbrk()じゃなくてstrstr()じゃないか?
これだと*GetWord が"G"とかの時も変換しようとするはず
C言語によるプログラミング も C実践プログラミング も 超初心者にはレベル高過ぎませんかねぇ... そんなことはないですかね? C言語によるプログラミング は コロナ社のやつですか?
ファイル名に変数入れたいんですがどのようにかけばいいのでしょうか? fp = fopen("C:Proguram File\\○○.txt","a"); 丸のところに変数を入れたいんです
sprintf 使おう
(・3・) エェー 相変わらずお薦めの本とかCとC++の特徴に関する質問とか 超簡単で手間のかからない質問には 回答者の諸君も長文で返して元気だね こいしらの実践レベルが疑わしいお
っていうかスレタイ見れ
つまり、回答者にとって入門編なんだな。
>>934 無理無理、だって言ってることに内容がほとんどないもの。
「CとC++」を置き換えればどこに持って行ったって一見煽りになるだろ。
PerlとかPythonとかMySQLとかVCとか漢字書き取りとかwinnyとかなんとか。
どれを入れても通じるだろ。その程度の意味しか持たない。
実にワイルドカードでマヌケな煽りなわけです。
>>929 パソコン初めて3、4ヶ月ぐらいの時に友達に勧められたんで読み始めた。
その前に2ヶ月目ぐらいの時にもっとレベルが低い、
ソフトバンクパブリッシュ?とかのCビギナー読んで入出力程度までは扱えるようにした。
C言語によるプログラミング読んでも理屈なんてわからんしUNIXのシステムコール使う部分とか読み飛ばした。
世の中にはこういうのも分かる天才もいるんだろう、とか思いつつな…
2千とか3千とか安い安い
一つの本でマスターしようとは思わずに
俺みたいに驚くほど簡単な本から初めてみな。
でもおまい実は玄人?
本の話題なら書籍スレ行った方がいいぞ テンプレでも見てこい
940 :
デフォルトの名無しさん :2006/12/28(木) 11:09:41
こんな感じですがバスエラーになってgdbでも追いきれません。 何が悪いのか教えてください。よろしくお願いします。 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); }
何がしたいのか教えてください。よろしくお願いします。
942 :
デフォルトの名無しさん :2006/12/28(木) 12:23:38
秘密鍵暗号で秘密鍵と平文を巨大整数としてファイルから読み込んで 四則演算でアフィン暗号を作る練習をしてます。 今ひとつGMPライブラリの使い方がわからず、ファイルからNバイト整数 を読み込むという部分もこれでいいのかわかりません。 今の時点では暗号文が2倍になってしまいますが、下位ビットを反転させて 上位ビットにXORしてから更に秘密鍵でXORした後でS-BOXのような非線形 変換を行えば普通の秘密鍵暗号と同じ仕組みになるはずですが、算術誤り 訂正符号を使っているのでエラーが発生しても訂正できるというのが メリットです。
943 :
デフォルトの名無しさん :2006/12/28(木) 12:40:49
暗号化:C=(P*M+R1)^R2 復号化: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 となることを期待しているんですがあってますでしょうか?
>>940 どこまで正常に進んでいるか fprintf() なりでログ出すと良いと思うヨ。
多分 mpz_xxx の使い方が、想定している作法と異なるんじゃないかな
よくわからないのに改良案があるなんてまるで卒論研究みたいだな
>>940 バスエラーってのはデータアラインメントが合ってない時のエラー
long 型なら 4byte 境界に合わせるとか、
short 型なら 2byte 境界に合わせるとかしないといけない。
無理矢理にキャストしてる部分があるのかもしれない。
例
char data[10];
long *ptr;
ptr=&data[2];
*ptr=1234; ← 4byte境界でないのでここでバスエラー
%-10sてのはどんな感じに出力するん?
文字列を左詰めで10文字
>>937 煽りと言うより事実のような希ガス
デヴィ夫人みたいに朝ズバッと言うタイプなんやね
レベルの高いレスきぼん
951 :
デフォルトの名無しさん :2006/12/28(木) 19:30:54
古い規格の話って、初心者に良いとは思えないがな。 K&Rの、何がレベルが高いんだ? 著者のスキルは高いとは思うが、昔の規格や昔の仕様語るのは、ただの懐かし話。
K&Rが書いたプログラミング言語Cの今の版はANSI C準拠のはず。
質問があるまでだまっとれ
初めまして。よろしくお願いします。 K&Rの演習5-10「コマンド行からの逆ポーランド式を計算するプログラムexprを書け。 各演算子あるいは被演算数は引数として分離されているものとする。例えば expr 2 3 4 + * なら,2×(3+4)を計算するようにせよ」の問題の「*」文字の 取り扱いについて教えてください。 「アンサーブック」のプログラムで試してみましたところ, コマンド引数にワイルドカードの「*」が含まれているためか, 「\*」のようにエスケープしないと不定値として取り扱われてしまいます。 問題の条件は,「例えば expr 2 3 4 + * なら,2×(3+4)を 計算するようにせよ」なので,このコマンド引数の形式を忠実に守ろうと した場合,どのような変更が必要になってくるのでしょうか。 ワイルドカードやエスケープシーケンスは,シェルでの評価に依存する可能性もあるかなあと 今のところ考えているのですが,そうだとすると,環境依存(処理系依存?)ということに なってくるのでしょうか。
956 :
952 :2006/12/28(木) 21:56:37
>>955 「外側でどうやって 2 3 4 + * の列を用意するかは様々」の一言で片付いてしまうわけだが
シェルを変えてみればわくるかもよ
959 :
955 :2006/12/28(木) 22:49:18
>>957 レスありがとうございます。
同じ処理内容(逆ポーランド計算機)に対する引数を
ファイルにしておいた列からパイプで受け取ったり,
実行後に標準入力から受け取ったりする方法は,
K&Rではその該当演習問題の少し前のところ(邦訳で92ページ付近)で取り扱っています。
その流れからして,演習5-10ではコマンド引数を取り扱うことに
焦点が当てられていると思うのです。
コマンド引数としての「*」を,エスケープシーケンスを使わずに
不定値としてではなく,うまく受け取る方法があるものかなあという意味合いの質問です。
よろしくお願いします。
""で囲め、 man すれ
961 :
955 :2006/12/28(木) 22:53:40
>>958 Visual Studio 2005コマンドプロンプトでcl使ってコンパイルして
やってみたところ,「*」がそのまま適切に受理されました。
ありがとうございます。
(やっぱり,何とか依存というやつなのかなあ...)
962 :
デフォルトの名無しさん :2006/12/28(木) 22:57:52
ポインタで少数を間接参照するにはどうすればいいですか?
963 :
955 :2006/12/28(木) 23:01:45
>>960 それも手,,,と思ったりもするのですが,
やっぱり前述の問題の条件からはずれてくるような気がして。
(気分の問題かもしれませんが)
ちなみに,「アンサーブック」の解答例のルーチンですと,”op1 op2 op3”のような囲みで
複数の引数を与えると,きちんと複数個の引数には分けてくれませぬ。。。
””囲みで与えることを考えるのであれば,
「アンサーブック」よりもうちょっと手の込んだルーチンを書かねばならぬような感じが
いたします。
いみわかんね
>>955 シェルの多くは * を合致するファイル名に展開する
シェルのオプションで * をファイル名に展開する機能を抑制するか、
エスケープシーケンスなどを使うことでシェルがファイル名に展開しないように指示する必要がある。
また、コンパイラによっては引数として * を受け取るとスタートアップルーチン内でファイル名に展開して、
main(int argc, char **argv) の引数として渡すものもある
967 :
962 :2006/12/28(木) 23:12:45
失礼いたしました・・ キーボードから入力した整数と少数をプラスした結果をポインタによる 間接参照をしようして入力、乗算、表示部分すべてでポインタを用いる プログラムを作ろうと思うのですが 少数をポインタに代入する方法がわかりません
>>940 人に質問したいのに、どうして
その質問に関わる一番肝心な部分を省略するのかなぁ・・・
そういえば、このスレにソースコードを貼り付ける奴って、
いつもそんな感じだな。
必ずといっていいほど、一番肝心な部分が「省略」されている。
>>967 中途半端に専門用語が混ざるとわけわからん文章になる典型
それと小数、な
彼はポインタの意味がわかっちょらんのだろ
>>967 少数とはなにかって辺りから説明してくれたまえ。
972 :
962 :2006/12/28(木) 23:26:52
>>中途半端に専門用語が混ざるとわけわからん文章になる典型 課題プリントの文章ちょこっと削ったらこんな文章になりました。 >>少数とはなにかって辺りから説明してくれたまえ 少数じゃなくて小数でした
973 :
955 :2006/12/28(木) 23:30:01
>>966 ということは,やっぱりコンパイラやシェルの影響をかぶってしまう訳ですね。
「シェルのオプションで * をファイル名に展開する機能を抑制」できることは
初めて知りました。ありがとうございます。
>>972 意味が分からんが言いたいことはこんな感じ?
***************************
キーボードから入力した整数と少数を加算した結果を出力する.
で、入力、乗算、表示部分すべてでポインタを行うプログラムを作りたい
しかし小数をポインタに代入する方法がわかりません
***************************
で、聞くけどまずポインタが何かは分かってるのか?
>入力、乗算、表示部分すべてでポインタを行う
この部分がどうしたいのかがよくわからん
それぞれを関数として実装して値はポインタ渡しってことか?
975 :
974 :2006/12/28(木) 23:39:44
976 :
962 :2006/12/28(木) 23:51:00
レスありがとうございます。 ポインタの理解度は初心者程度です。 小数をポインタに代入する方法が分かりません。(まさにその通りです 先生が作った課題プリントですので推測で述べさせていただくと ポインタとは別の変数を用意してそこに小数を代入し、 その変数をポインタに代入してポインタから代入、乗算、表示をする という意味だと思います。ちなみに、関数はつかわなくておkです。
文字列を一文字だけ書き換えたいのですが ポインタを用いずに、配列で char month[] = "January"; month[4] = 'E'; とすれば正常に動くのですが ポインタを用いて char *month = "January"; *(month+4) = 'E'; とするとエラーがでてしまいます。やっていることは同じだと思うのですが、 配列だけの場合とどう違うのでしょうか?
>>977 書き換えてはいけない領域を書き換えようとしたのが原因と思われる。
次のようにすればおk
char buf[]="January";
char *month;
month=buf;
*(month+4)='E';
979 :
974 :2006/12/29(金) 00:00:42
980 :
977 :2006/12/29(金) 00:07:29
>>978 うまくいきました。ありがとうございます!
>>952 (・3・) エェー おまい馬鹿じゃないかお? まさかそんなことを言って
回答者やってるんじゃないだろうな、それともただの通りすがりの入門者かお?
982 :
962 :2006/12/29(金) 00:12:20
>>979 ありがとうございます!
すいませんポインタはint型じゃないと宣言できないと思い込んでいました(汗
丸投げするつもりはなかったのですが、とりあえずポインタに小数を
代入する方法を教えてもらいたくて・・・
ちなみに原文ですが僕がアップした内容とたいして変わりません
キーボードから入力した整数と小数(それぞれ一つずつ)を加算した結果を
表示するプログラムを、ポインタによる間接参照を用いて、作成せよ
(入力、数値変換、表示部分すべてでポインタを用いる)
なにはともあれありがとうございました!
983 :
974 :2006/12/29(金) 00:16:51
>>981 オマエのスレ見たけどえらそーなこと言うほど回答してないな
しかも変態だし…
686 名前:ぼるじょあ ◆yBEncckFOU [sage] 投稿日:2006/12/21(木) 21:30:41
(・3・) エェー 大沢あかねたんととアナ○セックスしたいなあ・・・切実だお
最低で250万までなら余裕で出せるお
肛○のなかに発射してしばらく挿入したままで余韻を味わって
最後に中に放尿して引き抜いたそれをあかねたんの口できれいに
掃除して貰いたいお・・・はあ・・・。
986 :
974 :2006/12/29(金) 00:31:45
>>982 じゃあこんな感じかな?
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);
>>981 (・з・) エェー
なんで馬鹿と思ったか書かなきゃ訳わからないお
988 :
962 :2006/12/29(金) 01:00:02
>>986 回答まで教えて頂いてありがとうございます!
次スレはどこですか?
>>987 友達いないと構ってもらうためにこんなに必死になれるんだね
元になる数『n個』から『m個』取り出す時の 組み合わせをだすプログラムなんですが、 自分で階乗も使ってつくってみましたが おかしい結果になってしまいました。 ヒントをくれませんか? #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)); } 続きます・・
上の続きです。 int 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)); }
993 :
デフォルトの名無しさん :2006/12/29(金) 01:54:44
なにこのスレ文字化けだらけじゃん
>>991 ヒント:
#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;
}
あらあら
おやおや
1000ごっと
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。