1 :
デフォルトの名無しさん :
2008/03/22(土) 23:36:40
過去スレ貼るのって、なんか意味あるの?
>>4 さんがこの世に存在してるのと同じくらい意味があります!!
あんまり意味なさそうだな。
じゃ意味もなく貼ってるってことで。
過去スレ見たい奴が居るからそういう人向けにはあった方が便利 不要に思う奴はスルーすればいい
#include <stdio.h> main () { int player; int i; int r; for(i = 0; i < 5; i++) { r = scanf("%d", &player); while (getchar() != '\n') {} printf("%d 回目 ", i+1); if(r) { printf("%d\n", player); } else { printf("入力エラー\n"); } } return 0; } r = scanf("%d", &player);でrにはどのような値が入るのですか? playerと全く同じ値が入るのでしょうか? if(r)というのがどのような条件なのかもよくわからないです よろしくお願いします
正しく入力を解析できた数、あるいは EOF が帰ってくる。 入力が無い場合は EOF が返される。 数値が入力されなかった場合は 0 が返される。 数値が入力されていていた場合は player にその数値が入れられ 1 が返される。
11 :
9 :2008/03/23(日) 15:56:30
>>10 教えて頂いた事を元に調べ直したら理解出来ました
ありがとうございます
windows上でBCCを使っています。 1行ずつテキストファイルを読み込んで、条件により文字列の置換を 行うプログラムを作っているのですが、fgetsの基本的なところがわか ってないもので上手く処理できずに困っています。 悩んでいる処理が while(fgets(buf,512,fin)!= NULL){ ....置換処理 fputs(buf,fout) //・・・処理しない行 という処理なのですが、出力結果をバイナリエディタで見ると改行"0D0A" の前に"0D"が入ってしまいます。 fgetsでbufに読み込んだ終端に"0D"が挿入されるから当然の動作 なのでしょうが、それを上手く削除する方法がわかりません。 それで、しかたなく今は、 fseek(fout,-3,SEEK_CUR); fprintf(fout,"\n"); なんてことをしています・・・(汗 いいやり方があれば教えて下さい。。。。
>>12 finをテキストモードでオープンすれば、改行は\nにならない?
14 :
デフォルトの名無しさん :2008/03/23(日) 16:51:05
char *p; : : p = strstr(buf, "\r\n"); if (p != NULL) strcpy(p, "\n");
プロトタイプ宣言について教えて。 int myStrlen(const char* str) { return strlen(str); } って関数があったとき、 int myStrlen(const char* str); これがプロトタイプ宣言だよね。 ANSI以前のプロトタイプ宣言が無いときは int myStrlen(); こう書いていたんだっけ? プロトタイプ宣言が無いときに、相互に呼び出される関数を どう実現していたのかが気になった。
>>15 型チェックなしだから、空き放題に呼び出せたのでは?
現在 int myStrlen(); が int myStrlen(...); の時とほぼ同じような感じで使えるから、 それと同じような感じで使われてたんじゃないかな。
18 :
12 :2008/03/23(日) 20:56:44
>>13 さん
ありがとうございます!あっさり解決しました〜
>>15 関数を呼び出す側が正しい引数を渡すものとしていた
引数について型変換が行われないのでキャストも必要だった
例として
sqrt(2);
の時
プロトタイプ宣言があれば 2 → 2.0 に変換して渡してくれるが
プロトタイプ宣言が無い場合 2 (整数)のままで渡されるので期待した返値が得られない
可変長引数関数は今でも型チェックができないので同じ問題がある
(標準関数についてだけは警告を出してくれるコンパイラもある)
printf("%f\n", 2);
printf("%f\n", 2.0);
色々とありがとう。 プロトタイプ宣言なしのコーディングなんて暫くしてなかったから、どんなものか忘れてた。 これで、新人とかに質問されてもちゃんと答えられるぜ。
ポインタのポインタについて困ってます。 メインから構造体のポインタを渡し、構造体に内容を追加して、 追加後のポインタを返してもらいたいのですがうまくいきません。 void add_line(int num,struct lines **current){ char input_line[512];struct lines *buffer_pre,*buffer_fow;int length,i; struct lines *p; p=*current; do{ gets(input_line); if((*input_line != '.')&&(*(input_line+1) != '\0')){ buffer_pre=p; //構造体の前後のポインタ取得の処理は省きました //構造体とテキストの領域をMALLOCで確保します if (buffer_pre == 0){ //リストの連結 p->next=0; p->prev=0; }else if((buffer_pre != 0)&&(buffer_fow == 0)){ p->next=0; p->prev=buffer_pre; buffer_pre->next=p; else if((buffer_pre != 0)&&(buffer_fow != 0)){ p->next=buffer_fow; p->prev=buffer_pre; buffer_pre->next=p; buffer_fow->prev=p; }; }; }while((*input_line != '.')&&(*(input_line+1) != '\0')); *current=p; return;} 何がまずいのでしょうか?
教えて char MyStrMid( char buff[], const char string[], int pos, int len ) { char *dest = buff; if ( pos < strlen(string) ){ for ( string += pos ; len > 0 ; len-- ){ if ( *string == '\0' ){ break; } *dest++ = *string++; } } *dest = '\0'; return( buff ); } っていうプログラムを教えてGooで見つけました。 MIDができる関数なんだけど、 const char stringで宣言しているのに *string++ しているので、stringの中身を変更しないで この関数を使いたいんだけど、どうしたらいいんでしょう?
>>22 なぜ中身が変更されていると思ったのでしょう?
*dest++ = *string++; は *dest = *string; dest++; string++; とほぼ同じ動作。 string の中身は変わらないっつーか、 変わってたら string は const だからエラー出る。
>>23 ,
>>24 ありがとうございます。
>>23 なぜ中身が変更されているかは、*string++をしているからですよね
>>24 *string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
応用として、変数を増やすことなく、この関数を使用できないでしょうか?
>>25 中身は変更されないので確認してねって事です
>>21 ・ gets より fgets を使う。
・ input_line[0] == '\0' の時に最初の条件式ではマズい。
そもそも意図通りの条件なのかも怪しい。
・ *(input_line+1) とか読みにくい。input_line[1] にしてくれ。
・ 省略するより、省略なしでアップローダーにうpしてくれ。
・ 同じ条件式を二度も書くのは無駄。
無限ループにして if(! (条件)) { break; } した方がすっきりする。
・ 双方向リストはリングリストの形で実装すると、途中の if-else チェインが不要になる。
・ add_line は本当に1行追加の関数にして、
add_input_lines っての作ってそこで add_line を逐次呼ぶ実装にした方がすっきりする。
変数の説明も無いし読みづらいしで
とりあえずすっきりさせてからということで。
>>25 >*string++で中身が変わってしまい、constでエラーが出ることは理解できるのですが、
だから変わらないっつーの。
>>21 ポインタを返してもらうならvoid *add_line()だろ。
>>26 中身は変わらないです。ごめんなさい。
>>28 「中身を変えようとして」エラーが出ているって認識で大丈夫ですかね?
すいません。もうちょっとがんばってみます。
ありがとう。
31 :
21 :2008/03/25(火) 20:55:53
>>27 とりあえず、ソースをあげてみました。
http://www.uploda.org/uporg1328399.txt.html まだご指摘いただいた点直してない部分がありますが、一度見ていただけないでしょうか?
入力を終了する条件式は「.」のみが入力された場合です。
構造体の中身は
struct lines{
char *word;
struct lines *next;
struct lines *prev;
};
で、テキストエディタのようなものですので、リングにしてしまうと一行目が分からなくなるかなと?
と思っったのでリング型にはしませんでした。
変数は
char input_line[512];//文字を一時的に入れる配列
struct lines *buffer_pre,*buffer_fow;//挿入部分の前後のポインタを入れておくところ
int length,i;//文字列の長さを入れるlinegth、ループ様のi
struct lines *p;/mainから受け取った構造体のアドレスを保存するとところ
です。
>>29 えっと、名前の部分は戻り値ありの場合の指定ではないのですか??
>>31 >構造体に内容を追加して、追加後のポインタを返してもらいたい
と書いてあるけど違うの?内容を追加するだけならvoidのままでいいけど。
33 :
デフォルトの名無しさん :2008/03/25(火) 21:32:17
>>32 あ、もちろん構造体に中身を追加して、その追加した部分のポインタを返してもらいたいです。
それをポインタのポインタを渡して、それに追加した部分のポインタの内容を代入して返すようにしたいです。
mainに現在の構造体のポインタの位置を表すポインタ「now」有。
nowのアドレスをポインタのポインタたるcurrentに入れてadd_lineに渡す。
add_lineの中でcurrentにそこで関数内でつくった構造体のポインタPを代入する。
呼び出す時は何行目に行を追加するかを表すnumと構造体のポインタのポインタ二つを渡して
add_line(num,now);//nowはmain中の構造体のアドレス
のようにしようと思っていました。
now=add_line(num,now);という様に関数の戻り値を使う場合のみ型を指定するのではないのでしょうか?
[a][b][c][d][e] ってあった場合、num を 1 にした際には <X> [a][b][c][d][e] ここに追加されて欲しいのか [a] <X> [b][c][d][e] ここに追加されて欲しいのか どっちなんだろう。 前者はこのリストの仕様だと面倒臭いよね。 特にリストの末尾に追加する際。
空のリストに追加する際は常にこの面倒くさい状態になるから・・・
36 :
21 :2008/03/25(火) 22:24:05
>>34 学校の課題で、特定の行の後に追加する関数と、前に追加する関数が求められていて、
この関数は後に追加のほうなので、[a] <X> [b][c][d][e]に追加したいです。
もし0行目の後に追加(一番最初に追加)の場合は特定の行の前に文章を追加する関数に
移るようにします。
>>35 リングにしてしまうと最初の行が分からなくなってしまう気がします。
その場合は構造体の中に行番号を入れるしか思いつきませんでした。
ただX行からY行をZ行の後に移動などの処理の時に困る気がするのですが・・・
>>36 ダミーのノードを1つ用意する。
ダミーノードの次のノードが最初のノードで、
ダミーノードの前のノードが最後のノード。
最初のノードの前のノードがダミーノードで、
最後のノードの次のノードがダミーノード。
ダミーノードがあると、
「〜の次に追加」 という関数にダミーノードを渡すと先頭に追加になり、
「〜の前に追加」 という関数にダミーノードを渡すと末尾に追加になる。
そして、一切の NULL チェックが不要になる(assert くらいはした方がいいと思うけど)。
38 :
21 :2008/03/25(火) 22:42:57
>>37 おぉ!なるほど!
確かに大量にあるNULLチェックが必要なくなります!
ダミーノードはmainのコマンドの入力→該当関数の動作というループが始まる前に
mainの中で用意しておけばいいんですよね?
その場合ダミーノードかどうかの判別は保持しておいたアドレスを使って
最初に戻るのなら
while(c = ダミーのアドレス){
c=c->prev;};
とすれば出来ますよね?
あと、構造体のポインタへのポインタの使い方は
引数に直接返すより戻り値から返した方が 自由度が高くてよい。
40 :
21 :2008/03/25(火) 23:07:17
>39 えと、X行からN行を入力テキストに置き換える、という関数の中で X行とN行のアドレス、それを取り出すときに使ったX行からN行の 実際の行数のintを返す関数を用意したいと思っているのですが、 やはりそれは戻り値を一つに出来るよう更に小型化するしかないのでしょうか?
複数の値を返さないといけない場合は、
値を返す用の引数を別個に用意するのが普通かな。
今の add_line の仕様だと、
struct lines * 型の戻り値を current に渡す、とかできないっしょ。
まあとりあえず、
>>21 のポインタへのポインタの使い方自体は間違ってないので、
変なのだとしたら他の所がおかしいんだと思うよ。
42 :
21 :2008/03/25(火) 23:38:34
>>41 色々教えていただいてありがとうございます!
とりあえず、
struct lines *add_line(int num,struct lines *current){
この様に戻り値を使って値を返すことにしました!
ただ、やはりポインタのポインタが疑問でして、
自分が書いたとおりであってるとすると、その前は
mainでポインタのポインタたる**pに*p=0、
構造体のアドレスはNULLということをしてるだけなのですが
この書き方がマズイのでしょうか?
あと、もう一つなのですが・・・値を返す用のの引数とは
関数の動作に必要な引数の他に、値をもらう用のポインタ変数を
用意するということでしょうか??
ああ、もうソースが消えてるわ。 main 側はまだ見てなかったわ。 main 側では struct lines *p; として add_line(num, &p); という形にすることになるはず。 >あと、もう一つなのですが・・・値を返す用のの引数とは >関数の動作に必要な引数の他に、値をもらう用のポインタ変数を >用意するということでしょうか?? そうなる。
44 :
21 :2008/03/26(水) 00:31:31
>>43 スイマセン、ソースは自動で消えてしまったみたいです・・・
main側では**pの様なものは宣言せずに、渡す時に&を使うのですね。
勉強になりました!ありがとうございました!
struct Lines; /* typedefのための前方宣言 */ typedef struct Lines Lines; typedef Lines * LinesPtr; struct Lines { char *word; LinesPtr next, prev; }; LinePtr linesGetLast(LinePtr p) { if(p){ while(p && p->next) p = p->next; } return p; } LinePtr linesGetFirst(LinePtr p) { if(p){ while(p && p->prev) p = p->prev; } return p; } LinesPtr add_line(int num, LinesPtr current) { char input_line[512]; LinesPtr temp_lines = NULL; while(fgets(input_line, sizeof(input_line), stdin) != NULL){ if(input_line[0] == '.' || input_line[0] == '\0') break; temp_lines = malloc(sizeof(Lines)); /* エラーチェック省略 */ temp_lines->prev = NULL; temp_lines->next = NULL; temp_lines->word = malloc(sizeof(char) * strlen(input_line) + 1); strcpy(temp_lines->word, input_line); if(current != NULL){ temp_lines->next = current->next; current->next = temp_lines; temp_lines->prev = current; if(temp_lines->next != NULL) temp_lines->next->prev = temp_lines; } current = temp_lines; } return temp_lines; /* 割り込み終了位置を返す */ }
46 :
45 :2008/03/26(水) 07:49:39
改行大杉長過ぎで二度怒られたわw
>>45 の続き、ってかコメント。
numの使い道が分からんかったのでやや違うかもしれんけど、
やりたいのは大体こんな感じ?(関数名はinsertとかの方が適切っぽい)
ソース見てないから断言できんけど、呼び出し元が渡すのはポインタでよさげ。
割り込み開始位置は呼び出し元の current->next を見る。
NULLで呼び出してる時は linesGetFirst(p) で。
ちなみに自分なら1つの独立した構造体を作る関数を別に作って
土台のリストと新しく作ったのを追加用関数に渡す形にするかな。
その方がどこに加えたいかの指定が楽になるし、
構造体に手を加えても作成用関数だけいじれば大体事足りるようになるので。
『ポインタのポインタ』はポインタをtypedefして独立した1つの型として見ると理解し易いかも。
>>22 気になったので書き直してみた (処理速度的には不利だけど)
char MyStrMid( char buff[], const char string[], int pos, int len )
{
for(;pos>0 && *string;pos--,string++);
sprintf(buff, "%.*s", len, string);
return buff;
}
48 :
デフォルトの名無しさん :2008/03/26(水) 18:58:32
〜なら真を返すと、どういう意味かわかりません
0以外の値。 例えば常に真を返す関数tがあったとしたら、次のコードは常にtを出力する側へ分岐する。 if (t()) { putchar('t'); } else { putchar('f'); }
>>48 man コマンドとかマニュアル、ヘルプの読み方が分からないって事か?
真=はい 偽=いいえ で覚えとけ
FIRフィルタをCで書くとどんなになりますかね?
>>52 for(i=0;i<srcsize;i++){
dest[i]=0;
for(j=0;j<fltsize && i+j<srcsize;j++){
dest[i]+=src[i+j]*flt[j];
}
}
>>52 // srcsize == fltsize == destsize (==2^x)
src_freq=fft(src, srcsize);
flt_freq=fft(flt, fltsize);
for(i=0;i<srcsize;i++) dest_freq[i]=src_freq[i]*flt_freq[i];
dest=fft(dest_freq, destsize);
入力した日は何曜日かを出したいのですが どうしても曜日がずれて一日ずれて表示されてしまいます どごが悪いのでしょう? #include<stdio.h> int main() { int iyear,imonths,iday; int sum,i; int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; char*cweek[7] = {"日","月","火","水","木","金","土"}; sum =0; printf ("input (e.g. ****/**/**)\n>>"); scanf ("%d/%d/%d",&iyear,&imonths,&iday); /*閏年の判定*/ for(i=1;i<year;i++){ if((year%4==0)&&((year%100!=0))||(year%400==0)){ sum++; i++; } year--; /*前月までの日数*/ for (i =0; i < imonths-1; i++) { sum += m_array[i]; } year++; sum=sum+day; //曜日の出力 printf("%s曜日",cweek[sum%7]); return 0; } }
読んでないけど演算結果が0==月曜日とかってことないよね?
ヒント:グレゴリオ暦で遡って行った場合、西暦1年1月1日は月曜日
>>57 #include<stdio.h>
int main() {
int year,months,day;
int sum,i;
int m_array[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char*cweek[7] = {"日","月","火","水","木","金","土"};
sum =0;
printf ("input (e.g. ****/**/**)\n>>");
scanf ("%d/%d/%d",&year,&months,&day);
/*閏年の判定*/
for(i=1;i<year;i++){
if((year%4==0)&&((year%100!=0))||(year%400==0)){
sum++;
i++;
}
year--;
/*前月までの日数*/
for (i =0; i < months-1; i++) {
sum += m_array[i];
}
year++;
sum=sum+day;
//曜日の出力
printf("%s曜日",cweek[sum%7]);
return 0;
}
}
>>60 あなたが手を加える前のプログラムに戻してみては?
>>61 それだとできないことはないんですけど
別で作ってみたいなと思いまして・・・・
>>62 まずはインデントをしっかりそろえてみ?
forがおかしなネストをしててループ変数iが破壊されてるぞ
ファイルを読み込んで、構造体に入れて、それを表示させたいのですが何故か上手くいきません。 どこを直したらいいのでしょうか? struct lines{ char *word; struct lines *next; struct lines *prev; }; void main(){ char input_line[512],file_name[100]; struct lines *buffer_pre,*buffer_fow; int length,i; struct lines *p; FILE *fp; printf("*"); gets(file_name);
if((FILE *)NULL==(fp=fopen(file_name,"r"))){ printf("can not open\n"); }; i=0; while(i=0){ fgets(input_line,513,fp); if(feof(fp)){ break; }; if(ferror(fp)){ break; }; //前後のポインタの取得 buffer_pre=p; if (buffer_pre == 0){ buffer_fow=0; }else{ buffer_fow=0; } //領域の確保 p=(struct lines *)malloc(sizeof(struct lines)); length=strlen(input_line); p->word=(char*)malloc(length+1); strcpy(p->word,input_line);
//リストの連結 if (buffer_pre == 0){ p->next=0; p->prev=0; }else if((buffer_pre != 0)&&(buffer_fow == 0)){ p->next=0; p->prev=buffer_pre; buffer_pre->next=p; }; }; fclose(fp); while(p->prev != 0){ p=p->prev; }; while(p != 0){ printf("%s\n",p->word); p=p->next; }; return;}
何がどうなってどう上手くいかないのかくらい書いてくれ。 >fgets(input_line,513,fp); なんで513なんだ?
>while(i=0){ 代入でいいのか? >}; 関係ないけど、なんですべてのスコープの後ろにセミコロンが? なんか他にもつっこみたくなる要素が満載だぞw
69 :
64 :2008/03/28(金) 02:19:59
>>68 すいません、そこは「==」でした・・・
あとスコープの外側にはセミコロンはいらないんですね・・・
>>67 説明が足りなくて申し訳ございません・・・。
まず513ですが、一行の行数の最大値が512なので、NULL文字の分も入れて513にしてみました
問題点なのですが、「//リストの連結」という部分のすぐ下で読み込んだ構造体をつないでいきます。
その段階では構造体の現在のアドレスと現在の構造体の->prevのアドレスは正しく表示されるのですが、
ループを抜けた後、構造体のアドレスを一番最初に戻すために、
while(p->prev != 0){
p=p->prev;
}
を実行しています。その途中でprevのアドレスがずれて、セグメント例外になってしまいます。
>buffer_pre=p;
>>69 ならinput_line[512]も513にしたら?
72 :
64 :2008/03/28(金) 07:31:11
>>71 あ、確かに。ありがとうございます。
>>70 pは関数が始まる時に0に初期化していて、
一列終わるごとにそのその構造体のアドレスがbufferf_preに
入るので間違っては居ない気がするのですが・・・
>>63 見直してみましたがよくわかりません
どこのfor文なのでしょうか?
>>73 あんたの節穴で見直すのではなく、インデントを揃えてみろ。
できればエディタで。
>>73 /*閏年の判定*/
for(i = 1; i < year; i++){
/*前月までの日数*/
for (i =0; i < months-1; i++) {
どっちもi使ってるだろ?後者で上書きされてるだろう?
>>72 >70で問題点が理解できないようじゃ、プログラムに向いてないだろ。
無意味で無駄な部分多すぎるし。
p == NULLで初期化してwhile(i==0)にしたら動いたけど
>>72 ,73
『間違っては居ない気がする』とかいってないで
デバッガでブレークポイント置いてステップ実行するなり
assert()とかprintf()とか入れて変数の状態を確認しようよ
見直すって眺めるのと違うんだけど
#include <stdio.h> void main() { int count; for (count = 0; count < 5; count++) { printf( "countは今%dです\n", count ); } if(count==4){printf("正解です%dです\n",count);} else{printf("残念");} } VC++2008でデバックしましたがなぜかこれが"残念"のほうが出力されます。 countは4だと思うんですがなにか間違えてますか?
>>81 forで5のprintfが実行されなくてもカウントは5になってるんですね
ありがとうございました
count++のあとcount < 5を判断する
>>82 つーか、5になったからループを抜けたんだよ。
#include<stdio.h> main(){ char a[80],b[32]; int ca(char *,char [],int *),i,n; while(1){ printf("文字\n"); scanf("%s",a); n=0; ca(a,b,&n); for(i=0;i<n;i++){ printf("%c ",b[i]); } printf("\n\n"); } } int ca(char *s,char t[],int *n){ int i; while(*s){ for(i=0;i<*n;i++) if(*s==t[i]) break; if(i>=*n){ t[i]=*s; (*n)++; } s++; } } nがどのようになっているのか理解不能です。 *n と nがどうなっているのか教えてください。
どこが分からないのか言ってくれないとどうしようもない 1行ずつ追っていって、結果を紙に書いていくんだ そうすればどこの行が分からないのかが分かる
*nとn[0]が同じだってことは判っているのだろうか。
88 :
85 :2008/03/29(土) 11:55:52
8行目でn=0となっていて、20行目の*nの値はどうなるのでしょうか?
最初は0だよもちろん。
>>88 1になったらそれ以降増えない
whileにprint分入れて*nを出力したりとかして自力で知らべられるようにした方がいいよ
デバッガというものもあるし
増えるだろw aに入った文字列を一文字づつ取り出してbに格納、 既出の文字は無視、格納した文字の総数をnに入れてく関数だよ。
93 :
85 :2008/03/29(土) 12:11:59
ごめんなさい。理解できないみたいです。 まずfor(i=0;i<*n;i++)の*nは最初は0なんですよね? だと繰り返さないような気がしてなりません。
>>93 そうです繰り返しません
そして次のif文はi が0 , *nが0なので真となり中身が実行されますが
その結果*n が1となりwhile(*s)の次の回では実行されません
そのままなにもしないままwhile文が回り続けて終了です
>>90 =95?
でたらめ書く前に実行してみたら?
a[]は入力した文字列、b[]はその文字列から重複した文字を抜いた文字列、 nはb[]の文字数になる。
99 :
85 :2008/03/29(土) 12:36:35
aaaと入力したときを考えると for文はi=0,*n=0だから繰り返さないで次のif文にいき 実行されてt[0]にaが代入され、*nの中身がプラス1されて*n=1となって、2番目のaに移る。 for文はi=0,*n=1だから一回繰り返されてif文で*s=t[0]ならbreakで打ち切りされて 次のif文でi=0,*n=1だからだめで3番目のaに移る。 見たいな感じでいいんですか?
そうだね。
101 :
85 :2008/03/29(土) 12:43:11
すみません。ちょっとだけ理解できたようです。 みなさんありがとうございます。
要するに、 forは文字(*s)がtの中で既出かどうか探している。 次のifは、既出でない場合に条件が成立し、 tに文字(*s)を追加。 *nはtに格納した文字数だよ。
春になると90みたいなキチガイが湧くんだなw
>>102 nは文字数なんですね。
あとnは*nとする必要もないですよね?
main関数内のnとca関数内の*nは別物。 できれば違う変数名にした方が混同しなくていいと思うけど。
>>105 main関数内のfor文のnはca関数内の*nの値が入るのですよね。
>>104 >あとnは*nとする必要もないですよね?
必要ないと思うならそう書き換えてコンパイルしてごらん。
yes
>>107 文字がでなくなった。
なんかもう頭がこんがらがってきた。
ポインタって難しいんですね・
>>109 難しいといわれてるが一度理解するとそうでもなく、
プログラミングする上でこの上なく便利な機能だ。
めげずに落ち着いて頑張るといいよ
プログラム書くときはなんか本とか見ながら書いてますか?
この場合型が違うのに変数名を同じnにしてるのが混乱のもとじゃね?
>>109 caの中のnは、mainの中のnを指して(ポイントして)いる。
caの中の*nという表記は、mainの中のnを読んだり書き換えたりしている。
無理に引数で渡さなくても int ca(char *s, char t[]) { int i, n = 0; while(*s) { for(i=0; i<n; i++) if(*s==t[i]) break; if(i==n) { t[i] = *s; n++; } s++; } return n; } にしてmain内でn = ca(a, b)ってすればまだ分かりやすいのに。
>>111 日本語書くときはなんか辞書とか見ながら書いてますか?
という質問と同じに聞こえる。
>>113 なるほど、わかりました。
なんとなくですが>>
>>114 たしかにそのほうがわかりやすそうです。
2chの書き込みくらいでは辞書なんて引きません。 でも、ちょっとまじめな文章を書くときには、国語辞典を引きます。
日本語に例えるのは上手くないような・・ 英語だとしっくりくる
正解はこれな 日本語しかわからないあなたがフランス語を書くときに辞書無しで書けますか?
>>111 時々リファレンスみる程度。初心者でなければコピペとかないから。
そう意味できいてるなら真面目に勉強してください。
ポインタについて質問です 整数型とint ポイント型の違いがわかりづらいのですが ポイント型はアドレスを格納できて整数型はアドレスを出力するだけですか?
>>118 そんなもんだろ。だいたいは頭に入ってるから空で書ける。
細かい仕様(引数の順番とか関数の戻り値とか)が必要になったらネットなり書籍なりで確認して書く。
>>122 変数からアドレスを求めるのはアドレス演算子&。
整数型はアドレスを出力するだけというのはなんか変だ。
>>122 int*はint型の変数のアドレスを格納する変数
int x=50;
int *xp = &x;
この時、printf("%d",*xp) と printf("%d",x) は50を表示し、
printf("%p",xp) と printf("%p",&x) はxのアドレスを表示する
>>124 アドレスを変数に格納せず&で出力ができるという感じですか?
>>125 printf("%d",*xp)が50を表示するというのが難しく感じるところです
*xpという箱は整数型で宣言されそこには&xというアドレスが代入される
となるとprintf("%d",*xp)ではアドレスが出力されると考えてしまいます。
変数はあくまでxp
なんとなくわかりました *xpはアドレスを格納する変数 だからprintf("%d",xp)だとそのままアドレスを出力 printf("%d",*xp)はわざわざ*をつけてるから逆にデータのほうを表示する
2行目の「*xp」は「xp」ね。それ以外は大体その認識でOK
そうかな、なんか危ういきがす
int *xp = &x;
これと
printf("%d", *xp);
これの「*」の意味が違うことに
>>128 は多分気付いていない。
同じ文字を逆の意味の2つの演算子に使うという、C言語の糞仕様のおかげだな。
「ポインタ宣言子」と「間接参照演算子」の違いね。
そもそも初心者に教えるときに、
int *xp = &x;
では混乱が起きる。
int *xp;
xp = &x;
上のように書いてやらないと
int *xp = &x;
↑
意味的にはここで切れていることに、初心者は気がつかない。
>>131 「int* xp」と書いた方がわかりやすいかな。
「int*」が変数の型(intへのポインタ型)、xpが変数名。
int* xp, x
>>133 C言語のダメなところだよね。「int *」が型なのに、宣言は個別に「*」を付けなきゃいけないなんて。
複数の変数を1行で宣言できることがそんなに重要なんだろうか。
int i, *p, (*f)();
136 :
122 :2008/03/30(日) 15:44:32
printf("%d",*xp)というのは間接参照演算子というポインタ変数の機能なんですね まだそれは勉強してませんでしたがおかげでわかりました ポインタの練習用プログラムを見てどう出力されるかはわかるようになってきました ありがとうございました
typedef struct { int Number; }DATA , *PDATA; int main() { DATA data; PDATA pdata; data.Number = 10; pdata = &data; printf("%d",pdata->Numer } *PDATAはポインタ型を作っているという解釈でよろしいんでしょうか? ちなみに typedef char *PCHAR;を書くと sizeof(char) == 1 sizeof(PCHAR) == 4 になってました。
>>137 そのとおり。
DATA*とPDATAが同じ。
char*とPCHARが同じ。
139 :
137 :2008/03/30(日) 20:06:28
戻り値の最上位ビットが 1 のときはAを、0 のときはBを示す関数、REABがあるのですが、 if(REAB() < 0) //Aの時 となるのは何故なんですか?
2の補数の場合はそうなる あとはぐぐればすぐ分かる
最上位ビットが1なら負の数になるんですね ありがとうございました
>>142 Cの規格上は必ずしもそうなると言う保証はない点に注意。
そもそも、「最上位ビット」に意味があるのだからきちんと最上位ビットをチェックするロジックを書くべき。
# 処理速度などを睨んで改変するのは二の次三の次。
>>143 符号つきで最上位ビットが 1 の場合は負ってのは規格で保証されてなかったっけ?
その制限の中でどういう負数表現をとるかは環境依存だけど。
>>144 REAB()の戻り値がsignedなんて、どこにも書かれていませんよ。
例えば極端な話、戻り値がcharだったらコンパイルオプションでsignedかunsignedか切り換えられるかも知れない。 だとすると、signedのときは正しく動いてunsignedのときは(エラーも起こさず)正しく動かないことになる。 >143ではないが、先ずはそれに頼らないコードを書いた方がいいとは思う。
やらない方がいい事は確かだけど、 結局規格ではどうなってるんだ?
148 :
デフォルトの名無しさん :2008/04/01(火) 08:40:35
>>144 規格で決まってるのは、符号ビットが1ビットあることだけじゃなかったっけ?
FIRフィルタのプログラムで浮動小数点演算を使わずに実装 したいのですが、普通係数hnは浮動小数点ですよね。 入力のadは24ビットで係数hnを32768倍して固定小数点にして 最後に32768で割ろうとしたのですが、hn[k] * xn[k]の部分で オーバーフローの可能性がでてきます。 回避するよいやり方はないでしょうか? #define ORDER_2 50 static double xn[ORDER+1]; long firFilter(long ad) { long yn, acc; int k; xn[0] = ad; acc = 0.0; for (k = 0; k <= ORDER; k++) /* multiply and accumulate */ acc = acc + hn[k] * xn[k]; yn = acc; for (k = ORDER; k > 0; k--) /* shift input samples */ xn[k] = xn[k-1]; return yn; /* output */ }
>>149 コンパイラによるけど long long を使うとかは?
・32768倍をやめて1024倍とか256倍とかで妥協する ・long long intを使う ・素直にfloatを使う 例えばx86でSSE2が使えるなら、巧く書けばベクタ化できるから下手すりゃ整数で小細工するより速いよ。
dest.txtの内容 [abcdefgabcdefg] HANDLE hFile; BOOL bVal; DWORD numOFRead; hFile = CreateFile("dest.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,0); DWORD dwSize = GetFileSize(hFile,NULL); char *file_buffer = (char *)calloc(dwSize+1,sizeof(char)); if(file_buffer == NULL){ return -1; } bVal = ReadFile(hFile,file_buffer,dwSize,&numOFRead,0); if(bVal == 0){ return -1; } CloseHandle(hFile); dest.txtの中のfgという文字列をajkoに置き換えてファイル生成したいんですが、 どうすれば出来ますか?
system("sed -e 's/fg/ajko/g' dest.txt > foo")
apple test hello と言うテキストを String[ ][ ] の様な2次元配列で読み込みたい場合、 Stringの確保はどのようにすればよいのでしょうか?
Stringって何よ? ここはCのスレだけど、C++かC#かJavaか何かと間違ってやしませんか?
char String[][]の積もりだろ。
>>154 文字列長に制限があってよければ、例えば
char String[][10] = {"apple", "test", "hello", };
可変長にしたいとか、そもそも文字列も可変個数だと言うのなら、ポインタのポインタを使うことになる。
まぁ、入門サイトでも探してくれ。それで判らなければ出直してくれて構わんから。
159 :
デフォルトの名無しさん :2008/04/01(火) 19:53:37
Stringは型の名前にあるからねえ
俺は文字列変数名にstrやsを使う
>>159 sedプログラムに3つの引数-eと's/fg/ajko/g'とdest.txt を渡して呼び出す
sedプログラムが標準出力したメッセージはfooというファイルに書き込む
かな?
sedの質問があれば正規表現スレでどうぞ
161 :
デフォルトの名無しさん :2008/04/01(火) 20:45:25
すみません。 私Windowsです。
私はIRIXです
Windows でも Cygwin とかある
曖昧な質問で悪いのですが、 picをはんだして、モーターとリモコンに繋げなければなりません。 そういった用途のc言語プログラムというのはどこで拾えばよいのでしょうか?
宿題なら先生、仕事なら先輩。
167 :
デフォルトの名無しさん :2008/04/02(水) 20:52:03
>165 自分の文章を読み直してみろ その文章で何を言ってるか理解できるか?
>>167 きっとロボット制御して半田付けするってことだ
で、ロボット制御するためのc言語プログラムというのを探している
>>165 導線と半田を用意して、こてで溶着すればいいんじゃない?
位置独立コードの事かと思ったよ。
171 :
デフォルトの名無しさん :2008/04/02(水) 23:09:20
Cである一定のstate数ループさせる方法ってあるんけ?
state数って何よ、asm("NOP") * nってこと?
173 :
fxで裁判中。教えて :2008/04/03(木) 08:28:12
すげえバカだw そういやこの筆者と似たようなことぬかしてたヤツが宿題スレでボコボコにされてたな。
あちこち同じリンク張るな。いい加減うっとおしい。
全く無知な人間が C言語をマスターするにはどれくらいの時間がかかりますか?
>>177 物覚えの良い人ならそれだけ早いだろうし
やる気によっても左右される
マスターがどれくらいの事を言ってるのかもわからない
僕もマスターしたという基準がよく分からないのですが C言語の試験とか資格ってのはあるんですか?
聞いたことないし、あったとしても役立たないものであることは確かだな。 著名なプログラマが資格を持っているなんて話、聞いたことがない。
最低限の足切くらいはできるんじゃないか? Fizz-Buzz みたいにw 使えないやつが暗記してくるのは見破れないけど 暗記すらできないやつなら落とすことができる 使えるやつは暗記する必要もない、と
そのレベルのcの資格なら存在しているな
>>177 参考書と問題集何冊か買って受験勉強並みに真剣に勉強すれば3ヶ月くらいで
1000行程度のフリーソフトが作れるくらいにはなる。マスターとは程遠いけどね…
うちは1プロジェクト数万行レベルの組み込みCなんだが、全く無知の人間がきたとして 作業要員に換算できるレベルに1〜3か月ってとこかな? PCに慣れているかどうかでかなり変わるとは思うが。
185 :
デフォルトの名無しさん :2008/04/04(金) 17:44:31
コンパイラの使い方がわかりません。 例えばtest.cppをVC++でコンパイルするとして cl.exe D:/test.cpp と実行してもコンパイルは出来るのですが、 どこにプログラムが作られているのかわかりません。 プログラムの保存先はどのように指定すればよいのでしょうか?
cl.exe /help と実行すれば、指定できるオプションの一覧が出る
>>185 カレントディレクトリに実行ファイルができているんじゃないかな。
#include <stdio.h> int main(void) { char str[2]; scanf("%s",str); printf("%c %c\n",str[0],str[1]); return 0; } これをVC++で実行しました。 EOSを考慮して01という2桁の入力をすると結果は0 1と正常な結果なんですが なぜかデバックエラーがでてしまいます。 なにが問題なんでしょうか
char str[3];
191 :
188 :2008/04/04(金) 22:57:33
0から始まるから[0]と[1]に文字が入って[2]に\0が入るんじゃないんですか?
char str[2]; これだと二文字分の領域しか確保した事にならない [0] = '0'; [1] = '1'; [2] = '\0'; の3Byte必要
>>191 str[2]を使うなら、char str[3];で定義しないとダメ。
添え字が0から始まる事と、配列の要素数は別 char str[0]; と書いても1文字分確保されるわけじゃない
195 :
188 :2008/04/04(金) 23:13:06
今char str[0];で宣言してみたらサイズが0の宣言は無効とでました。 なるほど、てことはchar str[1];だと1文字が入るサイズってなわけですね。 皆さまありがとうございました。
>.188 慣れてしまえば、なんでもないことなんだが。 Cの初心者が最初につまずく問題であることは確か。 1.文字列を格納する文字配列は、文字列の最後の\0分も含めて確保しなければならない。 2.配列を定義するときの添え字(char str[3]の3)は、配列要素の数であり、どこまで使うかではない。
追加 3.Cの配列の添え字は0オリジンである。
すみませんCの質問とは若干異なるかもしれませんが 「JmEditor2」を使用していて下パネルで 『cファイルをコンパイルして作ったexe』を実行したときに [scanf]などの入力を必要とする操作部分が実行できません 解決策を知っている方がいればお願いします コマンドプロンプトから同じexeファイルを実行したところ問題なく動きました
JmEditor2のヘルプには入力できるって書いてあるんですか? それと若干じゃなくて大幅にスレ違いです。
いいえ、スレ違いではありません。鼬害です。
>>198 「ツール」メニューの「コマンド実行」を使う。
下パネルから実行したとき、子プロセスの標準出力がうまく表示されない。
プロセスが終了するまで、子プロセスの標準出力の内容が表示されないようになっている。
そして板違いの指摘の後にレスする馬鹿。
>>201 ありがとうございます。
>>他
すみませんね、住人さん。自治会お疲れ様です。
#include <stdio.h> main() { char ss[80]; gets(ss); puts(ss); } 文字を80文字以上入力しても、全ての文字が表示されるんですか 何故80文字以上gets()で読み込んでputs()で表示する事ができるのでしょうか
ss のサイズが 80 までなんて gets は全く知らないから メモリを破壊してどんどん文字を保存していってしまう。 非常に危険。 gets は使っちゃダメ。代わりに fgets を使うべし。
オーバーフローした場合の動作は未定義だから。
207 :
204 :2008/04/06(日) 02:01:05
なるほど!理解できました ありがとうございます。
208 :
デフォルトの名無しさん :2008/04/07(月) 10:07:03
任意のURLからファイルをダウンロードしてくるプログラムを作ったのですが、(マルチスレッド+Winsock) 一回のダウンロードごとにメモリ使用量が5〜30KBずつ増えていきます。 動的な確保は行っておらず、 何故増えていくのかがわかりません。 この場合の考えられる原因を教えて頂きたいです。
動的な確保を行っているから。mallocだけが動的確保じゃない。APIの呼び出しも動的確保になる場合がある。
Release〜しないといけない所を忘れてるとか。
211 :
デフォルトの名無しさん :2008/04/07(月) 15:08:26
なるほど…盲点でした。 もう一つお伺いしたいのですが、 グローバル変数はあまり使わないほうがいい、 という事を聞いたので URL名 SERVER名 PATH名 ディレクトリパス を保つ構造体をmain内で宣言したのですが、 自作関数の引数をあちこち増やさなければいけなくなりまして… これってまずいですか? 一般的に言われる汎用な関数とはどんな関数なのですか?
よくわからないけど通りすがりにレスすると その構造体というかメンバ変数を持つクラスで管理すればいいんじゃないの?
C++じゃなくてCだから困ってるんじゃ
214 :
デフォルトの名無しさん :2008/04/07(月) 16:16:50
はい。Cです。
>>211 プログラムの性質も作りも判らないからなんともいえないけれど、main()から構造体のポインタを順次下請け関数に渡すだけでしょ。
最下層にまで届ける必要はないはずだし、普通はあんまり問題にならないと思うけど。
216 :
デフォルトの名無しさん :2008/04/07(月) 16:25:50
>>215 main内で構造体を宣言することって
よくあることなんですかね?
あ、Cのスレだった・・・すまん 多用しなければグローバル変数にした方が色々と便利&バグを生まない事もあるよ その構造体1つだけとかならグローバルにしちゃうのがいいと思う
>>216 OKだよ。
構造体のポインタをがんがん渡していけばいい。
複雑になったら、そのとき単純にする方法を悩めばいい勉強になる。
全てのグローバル変数を、実体名"Global"で構造体にまとめると、 Global.totalとか、Global.countとか一目瞭然で便利。 って、物の本に書いてあった。一理あると思った。
そんな方法があったか 接頭句を「g_」にするより分かりやすいな
>>220 カテゴリー別に分けて構造体にして、わかりやすい名前をつければ尚良い。
グローバル変数依存からの脱却の第一歩だ。
223 :
デフォルトの名無しさん :2008/04/07(月) 20:20:03
C言語を作れて表示できる無料のソフトはないですか?
224 :
デフォルトの名無しさん :2008/04/07(月) 20:20:44
C言語を作るとな?
>>223 cygwin とgcc
visualstudio
bcc
好きなのを選べ
おすすめはしないが
LSI Cというのもある
227 :
デフォルトの名無しさん :2008/04/07(月) 21:24:45
>223 読み直してみろ 「C言語をつくれて」 これおかしいだろ C言語という言語をつくるのか? 人にまともな説明すらできないやつはプログラム組むの無理だからあきらめろ
入門編なんだから大目にみてやれよ そこまで攻撃する意図がわからんよ
逆に、 このくらいエスパーできないやつはここで教えるの無理だからあきらめろ とも言える
230 :
デフォルトの名無しさん :2008/04/07(月) 23:33:14
初心者です。意味がわからないかも知れませんが質問させてください。 配列なんですがaの添字に代入されてる数字をそれぞれbに該当するところに 転送する場合どうなりなすか? 例でいうとaの0番目にある3をbの3に入れるということです a[0]=3 b[0]=0 a[1]=4 b[1]=1 a[2]=0 b[2]=2 a[3]=5 b[3]=3 a[4]=1 b[4]=5
for(i = 0; i > MAX; i++) b[a[i]] = a[i];
mixiに、タブは機種依存文字と言い張る基地外が現れる。
233 :
231 :2008/04/07(月) 23:37:50
不等号逆だった
a[0]〜a[4]とb[0]〜b[4] の全部の例を書いてみてくれ
235 :
230 :2008/04/07(月) 23:49:03
すいません訂正です。 a[0]=3 b[0]=0 a[1]=4 b[1]=1 a[2]=0 b[2]=2 a[3]=2 b[3]=3 a[4]=1 b[4]=4 を a[0]=3→b[3]=3 a[1]=4→b[4]=4 a[2]=0→b[0]=0 a[3]=2→b[2]=2 a[4]=1→b[1]=1 に同じ番号のところに転送するにはどうするかという意味です
>>230 やっぱり言っている意味がわからん。
>例でいうとaの0番目にある3をbの3に入れるということです
b[3] = a[0];
ということだよね?と考えると、一瞬
>>231 (不等号を逆にして)でいい気がするが、
a[3] はどうするの?
>>235 結局は
b[i]=i;
になるんじゃないの?
>>235 「転送する」の意味がわからん。
b[0]〜b[4]には元々値が入ってるんでしょ?
並びを
b[3]=3
b[4]=4
b[0]=0
b[2]=2
b[1]=1
としたって、配列の中身は
b[0]=0
b[1]=1
b[2]=2
b[3]=3
b[4]=4
と変わらないよ?
239 :
230 :2008/04/08(火) 00:01:45
ん〜なんと説明していいか…如何せん素人なもんで aの0にある数字3をbの同じ3番目に当てはめる? にはどうするかってことです。 同じくaの1にある数字4をbの4に当てはめるってことです あの聞いといてなんですけど意味不だったらスルーしてください
素人とかの問題じゃないんだけどな 1回自分で全部代入してみてbの中身全部表示してみると分かると思うけど b[0] = 0 b[1] = 1 b[2] = 2... となるだけ
>>239 結局
>>231 や
>>237 でいいような気がするが。
あと
>>235 が「配列bの添字の順番を換えたい」と言っているように思えるので、
一応、それは無理だと言っておく。
そもそも添字というのは「i番目」というような順番を示すものなので、
変更は不可能だ。
わかってるってんだったら、失礼。
b[0] = A, b[1] = B, b[2] = C とあったものを、 a[0] = 1, b[1] = A a[1] = 2, b[2] = B a[2] = 0, b[0] = C == b[0] = C, b[1] = A, b[2] = B にしたいってことかしらん? aの中身をbの添字にした時、正しい文字が現れるようにしたい、みたいな。
>>230 代入は上書きコピーのこと。転送とまちがえてはいけない。
>>230 何が目的なのかも書き込んだほうがいいんじゃない?
あんたのコード例から目的が推察できないのでみんな
首ひねってるんだと思うよ。
#include <stdio.h> int main(void) { int n1, n2; int per; puts("二つの整数を入力してください。"); printf("整数 A:"); scanf("%d",&n1); printf("整数 B:"); scanf("%d",&n2); per = n1 / n2 * 100; printf("Aの値はBの%d%%です。\n",per); return (0); } 実行結果を 2つの整数を入力してください。 整数A:50 整数B:100 Aの値はBの50%です。 と、したいのですが↑のプログラムじゃ動いてくれません;; 「Aの値はB の0%です。」 となってしまいます;; 何故でしょうか?
intは整数型だよ
50/100 = 0 0*100 = 0
249 :
デフォルトの名無しさん :2008/04/08(火) 18:38:07
>>246 整数型の計算は、コンピュータでは1より小さい結果になると
答えがゼロになるんだよ。なぜかといわれても、そういうもの
だと思ってくれ。
回避する方法は色々あるが、とりあえず
per = n1 * 100 / n2;
にしたらいい。理由は自分で考えてね。
250 :
デフォルトの名無しさん :2008/04/08(火) 19:45:39
ファイルを読み込み解析したいのですが、 char *buf = FileRead(file_path); ↓ Kaiseki(buf); free(buf); または Kaiseki(file_path); にするか悩んでいます。 FileRead関数内で動的にメモリを確保して 確保した領域をKaiseki関数に渡し解析するか、 Kaiseki関数内にファイルへのパスを渡して 読み込み、解析をKaiseki関数内で行うか、 どちらが良いと思われますか?
inspect関数かinvestigation関数でやるのがいいと思うよ マジレスすると場合によるからどっちともいえない
252 :
デフォルトの名無しさん :2008/04/08(火) 20:21:43
5P3 順列の総数を求めるプログラムを教えてください 考えすぎて頭が痛くナリマスタ よろしくオナガイシマス
254 :
デフォルトの名無しさん :2008/04/08(火) 21:09:06
>>253 オーバーフローとか一切考えなければ
5!を3!で割るだけじゃんww
なにが分からないの?w
>>253 ほらよ。
#include <stdio.h>
#include <math.h>
double npm(int n, int m) {return tgamma(n + 1) / tgamma(n - m + 1);}
int main(int argc, char ** argv)
{
printf("%g\n", npm(5, 3));
return 0;
}
257 :
246 :2008/04/08(火) 22:30:13
258 :
デフォルトの名無しさん :2008/04/08(火) 22:31:58
T lPr(T l,T r){T r=1;for( T i=r+1; i<l; i++){ r *= i; } return r;}
バグがあるな。
>>256 そのままコンパイルすると
error C3861: 'tgamma': 識別子が見つかりませんでした
なのですが?
まともなCコンパイラを使ってください。
5! / 3! って結局 5 * 4 だろ? 一旦階乗求めるよりh(ry
hの続きは何だよ
// オーバーフローしにくいように書いてみた #include <stdio.h> #include <stdlib.h> int gcd(int a, int b){ int c; while((c=a%b)) a=b, b=c; return b; } int mPn(int m, int n){ int t, u=1, l=1; if(m<1 || n<1 || m<n) return 0; if(m-n<n) n=m-n; for(;n>0;n--,m--){ l*=n; t=gcd(u, l); l/=t;u/=t; t=gcd(m, l); l/=t;u*=m/t; // printf("m=%d n=%d [%d / %d]\n", m, n, u, l); } return u/l; } int main(int argc, char *argv[]){ int m, n; if(argc!=3) return 1; m=atoi(argv[1]); n=atoi(argv[2]); printf("%dP%d=%d\n", m, n, mPn(m, n)); return 0; }
267 :
デフォルトの名無しさん :2008/04/09(水) 21:42:27
定番のhello worldがなぜか実行されない。。。 #include <studio.h> int main(void) { printf("hello, world\n"); return 0; } エラーE2209 sample.c 2: インクルードファイル 'studio.h'をオープンできない 警告 W8065 sample.c 6: プロトタイプ宣言のない関数 'printf'の呼び出し(関数 main) *** 1 errors in Compile *** と、何度試行を繰り返してもなります; このエラーをどう訂正していいのかわからない超初心者です。 設定などもチャート通り何度もやり直しましたが、上手くいきません。 よろしくお願いします。
studio......
standard I/Oな
エラーで気付や
あるあるww
272 :
デフォルトの名無しさん :2008/04/09(水) 22:03:37
DWORD gdw1; DWORD gdw2; gdw1 = timeGetTime(); //処理 gdw2 = (timeGetTime()-gdw1); printf("%d",gdw1); としても毎回計測するごとに処理時間が増えているのですが、 何故なのでしょうか?
質問の意味がよく分からんが purintfにgdw2を渡すべきなんじゃない?
gdw2を表示したいんじゃないの?
>>275 「次の配列」が何を指しているのか判りませんが、一文字ずつ入力してチェックするのは標準入力では無理があるかと。
普通に1行入力してから、解析する方がたぶんましです。
>>275 A
....
break;
}
}
if((cnt <= 0) && ((c == '-') || (c == '\n'))) {
printf("エラーメッセージ");
exit(1);
}
if(x == 1){
.....
>>275 >また、こうすればもっと判りやすくできるなどあったら教えて欲しいです;
うまく関数化しよう。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int absolute(int n1, int n2) { return n1>n2 ? n1-n2 : n2-n1; }
void check(const char* s)
{
int i;
for(i=0; s[i]; i++) {
if( !isdigit(s[i]) && s[i]!='-' ) { puts("不正な文字"); exit(EXIT_FAILURE); }
}
if(!s[0] || strcmp(s, "-")==0) { puts("数値ではない"); exit(EXIT_FAILURE); }
}
int input(void)
{
char str[100];
scanf("%99s", str); check(str); str[ str[0]=='-' ? 9 : 8 ] = 0; return atoi(str);
}
int main(void)
{
int a, b;
printf("数値a="); a=input();
printf("数値b="); b=input();
printf("%dと%dの差の絶対値は%d\n", a, b, absolute(a,b));
return 0;
}
int input(int *p){ char str[100], *pstr=str; int value, index=0, sign=1; if(scanf("%99s", pstr)!=1){ puts("入力エラー"); return 0; } if(sscanf(pstr, "%d%n", &value, &index)>=1 && pstr[index]=='\0'){ if(*pstr=='-') sign=-1,pstr++; sscanf(pstr, "%8d", &value); if(p) *p=sign*value; return 1; } printf("不正な文字 %s\n", &pstr[index]); return 0; }
280 :
275 :2008/04/09(水) 23:49:48
>>276 様
a[0],a[1]でa[0]の入力をすると、a[0]の上限をこえたとき(cnt以上)に、
そのままa[1]の中身まで入力されてしまうってことですね;
>>277 様
break;のとこもexit(1);にし、int exit(int);を入れてみたところ、
そこはかとなくAの部分はできました。ありがとうございますー。
281 :
281 :2008/04/10(木) 14:58:40
史上稀に見る課題の丸投げ具合ですね
自分でわかろうと努力をするつもりはないわけか 課題の言葉の意味もわかってなさそうだ
284 :
デフォルトの名無しさん :2008/04/10(木) 16:17:51
>>283 社会に出れば、問題を解決する方法論を持っていればそれが能力と
みなされる。
たとえその方法論が丸無げであってもな。
その友達に聞け
AもBもやったことない俺に、Cなんて聞くんじゃねぇ〜ぞゴルァ! C言語ならおk
287 :
デフォルトの名無しさん :2008/04/10(木) 18:57:28
Cとかまだやってんのwだっさw
スタックが32バイトしか取れないからしょうがないのだ。
簡単なリモコン作る程度なら多いくらいだ
漢字は2バイト以上で表現しているのだゾ。 漢字コードでググルのだ。
>>291 突っ込みどころ満載だな。
・komoji, omojiは配列にする必要がない。const char * komoji = "abcde...z"でいい。
・bについては、要素数を固定値で持つな。ましてそれを変数に代入するな。
・forの条件もおかしい。このまま直すならa < bではなくa <= bだが、そもそもここはkomoji[a] != '\0'にすべきだ。
・strcpy(), strcat()を並べて使うくらいならsprintf()でも使え。この場合、sprintf(newfilename, "h_%s", filename)でいい。
・fgetc()の戻り値をcharで受けてはいけない。fgetc()の仕様を確認すればわかるが、intで受けるべきだ。
・cも要らない。小文字と判断したときにfputc()するのではなく、その場はchを書き換えておくだけでいい。
・>292も書いているが、Windowsで普通に扱う文字コードでは漢字コードの一部が英小文字に一致してしまう。
真面目に対処すると意外に面倒だから、他の問題を全てクリアしてから改めて挑戦しろ。
>>293 その本はゴミだ。いや、作者がゴミそのものだ。
>>291 >293を見て気付いた点をもう一つ追加。
・小文字と判断したら、forからは脱出しておけ。
・gets()は使うな。fgets(filename, sizeof(filename), stdin)にしておけばいい。
296 :
293 :2008/04/11(金) 13:29:55
>>295 まあまあ、せっかくソースをさらして質問している(質問作法としては最上です。)のだから、
まずい点をことさらに列挙するのはどうでしょうか。
それはそうと、
fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
> その本はゴミだ。いや、作者がゴミそのものだ。
netnews の時代からいろいろいわれていたようですけど、
具体的にどこが悪いんでしょうか。おしえていただけるとうれしいです。
まあ環境依存だよな 漢字というか多バイトコードが何なのかによって変わっちゃうから
298 :
291 :2008/04/11(金) 13:36:57
いえいえ、具体的に間違いをあげて頂きとても助かりました! 今からお二人のアドバイスを参考にやってみます!
入門で作るプログラムとしてはASCII以外を考慮するのはハードル高すぎると思うよ
300 :
295 :2008/04/11(金) 13:39:07
>>296 もうかなり前だから何を以ってゴミと判断したかは忘れたが、
当時本人にも直接メールして本の不備を詳細に指摘したことがある。
言い訳だけが返ってきた。
それはそうと。
>fgets() の第一引数はファイル名ではなくて、バッファなんですけど。
もとのソースを見たか?
> gets(filename);
これ以上必要もない恥の上塗りはやめておけ。
>まずい点をことさらに列挙するのはどうでしょうか。
真摯に聞く態度を示す質問者だからこそ、列挙した。
つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
301 :
291 :2008/04/11(金) 13:41:58
環境依存ですかー やっぱり初心者がやるにはちょっと面倒なモノだったようですね 皆さんの言ってることがある程度理解出来たら自己満足したいと思いますw
302 :
293 :2008/04/11(金) 13:43:00
>>296 あっ失礼、filename というのは、提示されたプログラムの変数をさしていたんですね。
もうしわけない。
303 :
293 :2008/04/11(金) 13:47:03
>>300 そうですね。gets() はまずいですね。
提示されたプログラムでは、128 文字以上入力されるとおかしくなってしまいます。
> 真摯に聞く態度を示す質問者だからこそ、列挙した。
> つーか、「まずい」と認識しつつ指摘しない方が不親切だろ。
たしかに。
EUCだと3バイトとかあったっけ?
305 :
295 :2008/04/11(金) 14:03:04
>>304 入門の域を超えるから自分で調べてくれ。
と、それでは不親切なので、Asciiと共存できる文字コードを簡単に。
# つーか詳しくないので間違っていたら失敬。
・シフトJIS、SJIS、CP932、MS漢字など
Windowを中心に広く使われる。基本的に漢字などは2バイトで表現できるが、
2バイト目のコードがAscii文字の領域に重なるために何かと厄介。
特に、大文字小文字変換やディレクトリの区切り(\)のためにバグが出た商品も多々ある。
・(狭義の)EUC、EUC-JP
一部のUnixなどで使われる。狭義のEUCでは基本的に漢字は2バイトだが、
(所謂)半角カナも2バイトになってしまう罠。広義のEUCはEUC-KRなどの日本以外のものも含む。
・UTF-8、(狭義の)Unicode
最近のLinuxやMac(これも実はUnix系)などで一句使われる。基本的に漢字などは3バイトになる。
厳密に解釈しだすと切りがないので省略。UTF-8以外のUnicodeとは表現方法が随分異なる。
・ISO-2022-JP、(狭義の)JIS
メールなど、7ビット通信環境でも使えることを前提とした環境で使われる。
漢字などはasciiと同じような範囲を使うので単純にチェックすることは不可能。
asciiとの境界にEsc符号列を用いることで状態を切り替えるので、手間さえ掛ければ勿論チェック可能。
但し、改行前後でAsciiに戻さないといけないなど制約が多いので、内部コードとして使うことはお勧めできない。
306 :
293 :2008/04/11(金) 14:08:01
>>305 補足。
>>293 ではシフトJIS(MS漢字コード)の古い時代のものを仮定しています。
>>293 で作成・検証に使用したコンパイラは、まさにシフトJIS には対応していない
ので、提示されたプログラムにある日本語メッセージは、なくなく削除しました。
>>306 cygwinなら、gccのオプションに--input-charset=cp932 --exec-charset=cp932を書くといいかも。
応用で、EUCで書かれたソースをcygwin用にコンパイルすることもできますぜ。
>>307 感謝です。gnu の libiconv/iconv_open() の指定方法でいけばいいんですね。
またひとつ賢くなりました。
>>287 Aどころか女と付き合ったこともないお前が言うと笑えるw
ワシのCは108手までまであるぞ
本当に初歩的な事ですみません… C#ってなに?
プログラム言語
そのプログラムの中のたとえばどのようなものか教えていただけたらありがたい。
日本語でおk
自然言語に日本語、英語、フランス語と色々あるように、 プログラムを記述するのに使う言語も色々ある。 その1つがC#。もちろんCも1つの言語だ。
Cよりはjavaに近い言語ってよく言われてるね まぁC#とか触ったこともないけどなw
JAVAっぽいC++
マイクロソフトのマイクロソフトによるマイクロソフトのために作られた言語
J++の焼き直し言語がC#
どの言語だろうと、基本的な部分は共通しているし 実装されている、出来ることを知ることの方が重要。 あとは、用意されているライブラリをきちっと使えれば、どの言語だろうと関係ねぇ 限定した言語でしか通用しないような奴は、どこへ行っても使い物にならない。 とりあえず、コンピュータの仕組みを知ることが出来たんで、大学に通っておいて正解だったぜ。
と、突然どうした。。。
322 :
デフォルトの名無しさん :2008/04/12(土) 14:15:56
簡単な文字出力のプログラムを作ったとして、 それをチャット上などで動作させることはできないのですか? コマンドプロンプトの中でしか出力できないのですが
>>322 チャット上に文字出力するプログラム作ればいいじゃん
325 :
デフォルトの名無しさん :2008/04/12(土) 14:36:31
>>324 出力先をコマンドプロンプトじゃなくて、チャット上にするやり方が分からない
本にもそういうの載ってないんだが
すべてが独学だから聞く人もいないし・・
>>322 そのチャットソフトが外部プログラムを呼び出すようにできていれば、可能かもしれない。
# まぁ無理だ。
327 :
デフォルトの名無しさん :2008/04/12(土) 14:40:46
>>326 そうなんですか?teacupチャットだけど
ホットコーヒーのやつでは出来てたような。。。
とりあえず外部プログラムを呼び出すようにできてるかも分からないので、もちと勉強してきます!
ありがとうございました!
328 :
デフォルトの名無しさん :2008/04/12(土) 21:26:46
名古屋近辺の専門学校でC言語学びたいと思うんだけど、どこがあるか紹介して。 または2チャンネルのスレッドでそういうスレがあったらきぼん。
>>328 大学へGO!
やっぱり基礎が大事だから
C言語で操っている、操作させている、制御しているコンピュータの基本的な仕組み そして極め付けが、君が日ごろ見ている文字、絵、動画、音声、それらはすべて ある法則に則って記録された数値データ、その数値データを人間で言う動物細胞 物質の原子レベルまで追求して話をすると、0と1の組み合わせ、すなわちバイナリーデータとは 0と1、あるかないか、磁石で言う+と-、電気信号でそれらを管理、制御しているのさ。 ほら、いつもニヤニヤしながら見ているエロ画像、それがだんだん・・・ただの色の集まり、 その色は0と1の組み合わせで構成されているデータに見えてきただろ? PCに色や文字、音声が人間が解釈できる形で表現できる機能が実装されているから その0と1の無機質なデータがエロ画像に見えるのさ。グロだろうと。
人間なんて所詮炭素と水なのさ という話と同等のどうでもいい話
その通り、しかし、それを理解してそれに対して適切に制御、操作できれば 可能な範囲内で様々なことが出来るようになる。だから基本に戻れと。 ただ・・・人間も、いくら美人だろうとイケメソだろうが、所詮最後は朽ち果てて この世から存在すらなくなってしまうのさ。ほら、躊躇してねーで、とっとと 好きなプログラムを作れ。そしてエロ画像で好きなだけはぁはぁしてろ、な?
>>332 生きた証をどう残すかだな。子孫か、グレートコードか。
なんで択一なんだよ 両方ゲットせいよ
もちろん両方残せるのが一番良い。
おまえら何の話してるんだよ
自分も可能な範囲で子供を作れるのさ、作られるものは 遺伝子レベルでのことになるが。
338 :
デフォルトの名無しさん :2008/04/13(日) 14:32:55
returnとか戻り値とかどういうときにどう使うんですか? 詳しくかつ解りやすく教えてください
自作した関数は式の中で使えるんだよ。
int main()
int sankaku(int teihen, int tkasa) { return teihen * takasa / 2; } int main() { printf("%d", sankaku(10, 50)); return 0; }
342 :
デフォルトの名無しさん :2008/04/14(月) 18:18:42
343 :
デフォルトの名無しさん :2008/04/14(月) 21:33:40
どんどん流れてくるデータ列を、指定された割合で「バランスよく」 間引く方法で悩んでいます。 割合を%で指定された場合に、データ処理時に以下のようにしたのですが int a = (clock() % 100) + 1; if(a > DROPRATE) { ; } これだと50%を指定したときに(0がFALSEで1がTRUEだとして) 000000111111000000111111 という感じに並んでしまい、 010101010101.... とはなってくれません。 出来るだけきれいに固まりが出来ないように間引くのには、通常どんな方法を とればよいのでしょうか?
>>342 先ず、get_data()を改修してみよう。
fscanf()の使い方はそのままで、そこで得たbest, yearなどを格納できるように構造体配列を用意するのを忘れずに。
それができたら、テキストエディタで現在のkiroku.txtを編集してダミーデータを作ってそれを喰わせてみよう。
ここまでできれば、後はput_data()を改修して、記録の取り扱いのロジックを書けばいい。
要は、1件扱うのも10件扱うのも同じこと。
fscanf()とfprintf()で作っているのなら別途fread(), fwrite()が必要になるなんてことはない。
>>343 なんで clock なんか使ってるの?
rand 使えば?
346 :
デフォルトの名無しさん :2008/04/14(月) 21:44:43
いえ、randomで書いて、やっぱり固まり部分が出きるので きれいにならぶ規則性がほしいな、と思っているのですが・・・ 三角関数とか使うのは嫌だし・・・
>>343 clock() に DROPRATE を掛ければ委員ジャマイカ?
>>346 バケツ変数みたいなものを用意して、毎回通過時にDROPRATEずつバケツに足していくとか。
勿論、バケツが一杯になったら空にすればいい。
Ex.
static unsigned bucket = 0;
bucket += DROPRATE;
if (bucket >= 100) {
bucket = 0;
flag = true;
} else {
flag = false;
}
データ列の速度が1じゃないとだめか。 こうか? a = (a+DROPRATE) % 100; if(a > DROPRATE) { ; }
リサンプルにおけるエイリアシング現象じゃないの。
>>346 なるほど。規則的にしたいのか。
a 中に b 個 1 が規則的に出てきて欲しいのであれば、
void ab(int a, int b) {
for (int i = 0; i < a * b; i += b) {
printf("%d", (i % a < b));
}
printf("\n");
}
とかどうよ。
352 :
デフォルトの名無しさん :2008/04/14(月) 22:06:05
コメントありがとうございます。
>>347 すみません。良くわかりません。
>>349 なるほど、これだと確かに固まりが分散しそうですね。やってみます。
>>343 規則的でよければブレゼンハムのアルゴリズムが使えるよ
乱数要素を混ぜるならバッファ付のディザリングみたいの使えばおk
354 :
デフォルトの名無しさん :2008/04/14(月) 22:08:24
355 :
353 :2008/04/14(月) 23:02:19
>>343 いまさらだけど…
>>351 と同じインターフェイスで
void ab_(int a, int b){ // ブレゼンハム
int i, x;
for(i=0,x=a/2;i<a;i++,x+=b+1){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}
double uniform_rand(void){return (double)rand()/(RAND_MAX+1);}
void ab__(int a, int b){ // 乱数ディザリング
int i, d;
for(i=0;i<a;i++){
d=0;
if(uniform_rand()*(a-i)<b) d=1,b--;
printf("%d", d);
}
printf("\n");
}
356 :
デフォルトの名無しさん :2008/04/14(月) 23:52:21
>>355 ありがとうございます。参考になります。
皆さんへ
結局、
>>351 さんのループ部分をばらした関数を作って使いました。
どうもありがとうございました。
>>353 347=349だけど参考になった。
ブレゼンハムのアルゴリズムっていうのか。
358 :
353 :2008/04/15(火) 14:25:42
>>357 参考にするなら訂正しておくよ orz
void ab_(int a, int b){ // ブレゼンハム
int i, x;
for(i=0,x=(a+b)/2;i<a;i++,x+=b){
printf("%d", (x>=a));
if(x>=a) x-=a;
}
printf("\n");
}
宿題スレ池
361 :
278 :2008/04/16(水) 00:14:15
362 :
359 :2008/04/16(水) 00:21:36
>>361 様
すみません、わざわざありがとうございます;
363 :
デフォルトの名無しさん :2008/04/16(水) 00:55:50
質問お願いします。 #include <stdio.h> int main(void) { int x[80],y[80]; int a=-400,b=-400,lp,c=0; for(lp=0;lp<40;lp++){ x[c]=a;y[c++]=b; x[c]=a;y[c++]=-b; a+=20; } for(lp=0;lp<80;lp++){ printf("x[%d]=%d y[%d]=%d\n",lp,x[lp],lp,y[lp]); } system("PAUSE"); return 0; } 上のプログラムで、ループを使って配列変数に値を代入する部分で、 最初のループでyに値を代入する時、y[c++]にbの値を代入するようになってますが、この時cに+1されているはずなのになぜy[0]の部分にbが代入されるのでしょうか? 一応、線を引くための座標を代入させるのが目的なので、y[0]に代入されて正解なのですが、どうしても気になったので質問させていただきました。分かりづらい説明かもしれませんがどうかお願いします。
>質問お願いします。 日本語でおk c++ は cの値を取り出して使った後で、 cの値が+1 となる つまり上記のy[c++]=bは c=0であれば y[0]にbを代入した後に、c=1 となる おk?
>>363 x[c]=a;
y[c++]=b;
これの前中後それぞれに、cの値を表示するprintf文入れりゃわかるよ。
y[c++] = b だと y[c]←b の後に cを1加算 つまり y[0] == b y[++c] = b だと cを1加算した後に y[c]←b つまり y[1] == b
368 :
363 :2008/04/16(水) 01:21:50
>>364-366 ++の位置で1を加算するタイミングが変わるのですね。
理解することが出来ました。ありがとうございます。
>>359 すでに指摘されていますが、absolute() とするのならば、input() なども作るのはどうでしょう。
桁数切り取りの場合わけに苦労しているようですが、「数字部分で8桁」と考えればいいかと想います。エラー1, エラー2 の検出も簡単に記述できると思います。min, cnt, err が絡み合わないように整理したほうがいいでしょう。
9桁目以降で数字以外の文字が入力された場合は、題意としてはエラーにしたほうがいいかも?(これは仕様の読みの問題ですが。)
些細なことですが、
getchar() ( -> fgetc() ) の返り値は int です。
main の返り値は int がお約束です。
提示されたソースの手法に従うのなら、こんなのはいかが?
(確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4))
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6248.txt >>361 きれい‥‥。でも質問者は <string.h> 全般がわからなくてスルーしちゃったのかも。
エラーを数値でやるより列挙子使おうぜと言おうと思ったがまだ習ってないか。
371 :
369 :2008/04/16(水) 03:40:15
#define のかわりに列挙子を使う人もいますね。最近知りました。
質問です。 変数のみの行を記述してもコンパイルエラーにならないようですが、 ・文法上、なぜOK? ・どんな動きをする(最適化等で消されて何もしない?) void main(void) { int a; a; <- この行 }
↑ BorlandC++ 5.5 Renesas C Compiler 9 for SH でコンパイルOKでした。
・あらゆる式は;を付ければ式文として文になるから ・何もしない
例えばf(i);のように書いてあるとして、 あとから先頭の方に#define f(arg) (arg)と書けば 関数呼び出しが無かったことにできます プリプロセスの都合上必要なだけです
Cでは関数を呼ぶのも代入も式の内なので、式文が許されないとプログラム書けない。
>>376 エラーにならない理由を聞かれて規則でそう決まってるじゃ答えになりません
エラーがでない理由はエラーにしない方がよいと言語の設計者が考えたからであって
文法規則はその結果でしかないです
訊かれてるのは「文法上、なぜOK?」であって、言語設計者がどう考えたかではないし
関係ないけどmainの戻り値はintにしとけ
ちっちっち、てんで説明になってないぜ、坊や達?一度、顔を洗って出直しな。 ついでに鏡を見てごらん。そう、何かこう、プギャー!な面が映し出されているだろ? それが何だか分かるかい?そう、自分の顔さ。見事な面だろ? 人前に出た君を、周りはその顔の人だと見ているのさ。 それはさておき、a;がなぜおkかって?単項でも数式と言えるからさ。 こんなの、数学でも初歩的だよ?w
>>374-380 コンパイラ(構文解析か?)が仕様としたものが分かりました。ありがとうございます。
>>375 確かに。目にしていたはず。
>>380 "単項でも数式と言える"なるほど。 最後のwが興ざめですが。
なぁ〜〜にぃ〜〜!やっちまったな! 男は黙ってぇ〜 炭坑に入れ
しばらく平和だったのに頭おかしいのが戻ってきちまったな
平和ばっかりじゃつまらないだろ?たまにはリーチ、一発、タンヤオ、イーペーコー 七対子、対々和、三暗刻くらいは狙おうぜ?そして僕イケメン。
>>384 国士無双、四暗刻のダブル役満なみにねーよwww
国士のwktk感は異常
387 :
デフォルトの名無しさん :2008/04/16(水) 22:09:44
C言語の入門書を本屋で立ち読みしたのですが、 コンパイラとして無料で手に入るものもいくつかあがってました。 市販の処理系というのは、いずれ必要になるものなのでしょうか? それとも、無料のもので長くやっていけるもの?
無理に市販のも使わなくてもいいよ。 無料で十分。 慣れて詳しくなってからでも、有料を選ぶのは遅くないだろうしな。
389 :
359 :2008/04/16(水) 23:54:58
>>369 ありがとうございます、参考にさせていただきます。
あと、結果についてなのですが、case1のときのエラー判定が少し違ってて、
1aならエラー1、aaならエラー2、aならエラー2のように
ちょっと間違ってたようですー。
borlamd C++ compiler 5.5って、windows Vista でも動きますか?
>>390 GUIを持っているわけではなく、特殊なライブラリーもないから動くでしょう。
俺はもっぱらVisualC++2008 ExpressEditionを使っている。
392 :
デフォルトの名無しさん :2008/04/17(木) 07:16:23
まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。 あるアプリで競艇のデータを作っています。掛け金を掛け方に応じ変えています。 ■2連複=2000■3連単=3000 また投資額は(掛け方*レース数)です。 アプリ上で掛け方を入れたら自動的に投資額がでるようなのですが、式が分かりません。 自分で色々試し ■IF(方式=2連複,((レース数*2000,((レース数*3000)みたいなのを作りましたが、これだとダメでした。 宜しくお願いします。
>まず自分の質問が++なのかさえ分からないものですが宜しくお願いします。 「++」が何のことか判りませんが、Cの質問ではないようですので お使いのアプリ名でスレタイ検索してみてはいかがでしょうか。
394 :
デフォルトの名無しさん :2008/04/17(木) 08:36:04
>>393 やはりそうですか。
ありがとうございました。
>>389 それはすみません。今時間がないので、本日遅くに修正いたします。
396 :
デフォルトの名無しさん :2008/04/17(木) 15:18:29
Borland C++Compiler をダウンロードしようとしてもうまくいきません。 登録を済ませてからダウンロードボタンを押しても 「Internet Exploler ではこのページは表示できません」 と出ます。どうしてでしょう・・・
399 :
デフォルトの名無しさん :2008/04/17(木) 16:31:06
hello, world. 出たーーーーーーーーーーーーーーー これまでに要した時間3時間。 先が思いやられる
質問です。いま入門書をみてテキストのプログラムを打ちこんでいるのですが、 以下の内容だとコンパイルできません。エラーはif構文に ) がないと表示さ れてしまいます。 int a = 10 int b =20 ~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ printf("aが20 またはbが30 またはaが10でない"); if (a== 20 || b== 30 || a!== 10) { printf("条件に当てはまりました。\n"); } else { printf("条件に当てはまりません。\n"); } }
ここはあなたの日記帳ではありません
それで、ひとつひとつ調べたところ if(a == 20 || b == 30) だとコンパイルされます。他の値も調べてみたんですが、 ifに続く条件が3つになるとコンパイルできないことがわかりました。 2つまでだとコンパイルできます。 Borland C++Compilerの無料のCコンパイラを使用しているんですが これに問題があるのでしょうか?
>>400 ありがとうございます。
一度やってみます。
それで、じゃねーよw
すいません
>>402 さんでした
ご指摘ありがとうございます
やっぱり if (a== 20 || b== 30 || a!== 10)をif (a== 20 || b== 30 || a!= 10) と打ちなおしても if構文に ) がない、関数main とエラーが出てしまいます。 うーん、やっぱり駄目なのかな
そういう慌てん坊さんは、格好悪くて括弧がつかないって中学校の数学の教師が言ってた
0で割る(除算する)と「問題が発生したため...」となって強制終了されるのですが、 0で割るのをやめる以外で、エラーを回避する方法はありますか?
>>409 0で割るのをやめる。
純粋に疑問なんだが、0で割ってエラーにならないとしたらどういう結果
になるのが自然だと思うんだろう。
なぜ0で割れないのか不思議だったが考えてみれば簡単で当然だった 16を4で割るということは16を4つのグループに分けるということ どんな数字も0個のグループに分けることはできないんだから
0で割ったら0にしてほしいと思っています。 そのほうが便利だと感じます。
浮動小数点数でおk
>>400 int a
int b
の宣言文にセミコロン。
0をかけるってことは0の逆数で割るってことで、0/0で割ること。 0/0で割るのは0/0をかけるのと同じだから、0で割るのは0をかけるのと同じで0になっていい。 コンピューターだとビット演算の仕様でそういうことにはできないのかな。
>>407 黙ってソース全体をコピペするなりどこかに上げるなりしろ
>415 目をさませ あるいは寝ろ
逆数 0 でないある数 a に対して、a × b = 1 となるような数 b を a の逆数 (ぎゃくすう) といい、
なるほど、1=2という結論ですね。
>>419 それは違う。それが成り立ってしまうと、数学的帰納法で全ての数が等価になってしまう。
なにか問題が?
>>414 セミコロンをつけましたがやはりダメでした
エラーメッセージ貼れよ
#include<stdio.h> #include<math.h> int main(void) { double i,n,S; for(i=10;i<=1000000000;i*=10){ S=0.0; for(n=1;n<=i;n++){ S+=asin(n/i) /sqrt(1.0-(n/i)*(n/i)) /i; } printf("分割点%10d: %lf\n",i,S); } return 0; } domain errorが発生するんだけどどうして?
%dにdouble突っ込みゃそりゃどうなるか分からん罠。
>>425 sqrt(1.0-(n/i)*(n/i))が怪しい
1.0-(n/i)*(n/i)の計算結果が-0.0になることがあるんじゃないの?
sqrt(fabs(1.0-(n/i)*(n/i)))にしてみるとか
>/sqrt(1.0-(n/i)*(n/i))
これがまずい。
nがiのとき0で割ることになる
>>426 そこもおかしいが、domain errorとは関係ない
#include<stdio.h> #include<math.h> int main(void) { double i,n,S; for(i=10;i<=1000000000;i*=10){ S=0.0; for(n=1;n<=i;n++){ S+=asin(n/i) /sqrt(fabs(1.0-n/i*n/i)) /i; } printf("分割点%10d: %lf\n",i,S); } return 0; } やっぱりできない
i, nをintにして、(n/i)の計算を((double)n/i)にするとか doubkeを > for(i=10;i<=1000000000;i*=10){ のように計算するのは好ましくない。誤差が出てしまう。
>>415 1 / 1 = 1
1 / 0.1 = 10
1 / 0.01 = 100
1 / 0.000...001 = 100...000
1 / (10 ^ -n) = 10 ^ n
こうやって被除数を限りなく0に近づけて
1 / 0 = ∞
という考えもできる。俺が厨房のときはこれだと思っていた。
ところがこれ、負のほうから0に近づけると-∞になるから
こういう極限は存在しなかった。
>>430 でないだろ普通・・・
お前の環境doubleが何byteなんだよw
どうすれば誤差が出るのか理解せずにdoubleだと誤差が出るって覚えこんだんだろうな。
>>423 わかりました。
if (a== 20 || b== 30 || a!= 10)
↑を !a にしたらコンパイルできました。
考えてくれてありがとうございました。
436 :
423 :2008/04/17(木) 23:29:30
>>434 402,414の2つのレス分直したらコンパイル通ったぞ
どこか違うところ間違ってないか
#include<stdio.h>
int main(void)
{
int a = 10;
int b = 20;
printf("aが20 またはbが30 またはaが10でない");
if (a== 20 || b== 30 || a != 10)
{
printf("条件に当てはまりました。\n");
}
else
{
printf("条件に当てはまりません。\n");
}
return 0;
}
>>409 お使いの環境に matherr() 関数はありませんか?
>>435 >>436 考えてもらってありがとう。なんとかコンパイルできたので
また何かエラーが出たら教えてください。
>>412 算数の教科書をみなおしてみましょう。
わり算はかけ算の逆であると決めれば、わる数が 0 である場合は
「答えになることのできる数はない」
のです。
borland C++ compiler 5.5で、setbccを使って、環境変数と設定ファイルの 設定をしていたんですが、なぜか、PATHの設定が失敗してしまいます。 何がいけないんでしょうか?
じゃあ俺が失せるよ!
いやいや、ここは俺が
446 :
441 :2008/04/18(金) 00:58:28
>>442 スレ違いで、失礼いたしました。
このような質問は、どのスレッドで聞くべきなんでしょうか?
すみませんが、教えてください。
449 :
448 :2008/04/18(金) 01:01:50
33秒差で負けた・・・
>>441 >何がいけないんでしょうか?
あんたの頭。
シンボリックな定数を扱う場合、 大きくわけて#defineを使うのとenumを使うのがあるようですが、 どのように使い分ければいいのでしょうか? それとも好みの問題?
複数の定数にまとまった意味があるならenum、 整数値でないならdefine、 後はプロジェクトごとの規定による。
来週から新人研修でC言語担当になったので来てみました。 最初からじっくり読んでエスパー目指します。
456 :
デフォルトの名無しさん :2008/04/18(金) 16:30:54
>sprintf("%0.2f", 1.1) って書き方は間違いですか? 直すとしたら、 >sprintf("%.2f", 1.1) といった感じでしょうか?
>>456 直すとしたら
sprintf(buffer, "%0.2f", 1.1);
じゃないかと思った
ゼロフラグが有っても別に間違いということはないと思う
458 :
456 :2008/04/18(金) 16:37:44
了解。どうも有難う。
vs2005で featall[i*featnum[i]+p].descr = n[p].descr; とすると main.c(143) : error C2106: '=' : 左のオペランドが、左辺値になっていません。 というエラーがでます。 どうしてでしょうか。 ちなみにdescrは[128]です。
>>459 int a[10]; で
a = 5; とかできない。
ってのと同じ。
そのエラーメッセージもおかしくて、正確には「変更可能な左辺値」だけどな… 配列をまるっとコピーしたいならmemcpyかmemmoveを使え
>>461 おかしいといえばおかしいが、おかしくないといえばおかしくない。
なぜなら配列は特定の場合を除いてポインタ値(ポインタ変数ではない。つまり右辺値)に成り下がるから。
まあどうでもいいか。
>460 言われてみれば確かに… >461 おkす。やってみます。 みなさんありがとうございます。 何分Cは初めたばかりでしてちょくちょくつっかかってまして また使わせていただきます(滝汗
続きになるんですが memcpy(featall[i*featnum[i]+p].descr,n[p].descr,sizeof()); と書くことにしました。 この場合、sizeofには int[128] と入れれば 128個の配列分確保されるんでしょうか。
466 :
465 :2008/04/18(金) 18:33:49
老婆心ながら memcpy は移動元と異動先が被るような場合はうまくいかない。 bcopy (from, to, len); // memcpy(to, from, len) と引数順が違う というのもある。
printf( "%c" , 'A' ); が標準出力に文字「A」を出すという保証はないですよね? 「文字定数=>int」「int=>char」「char=>%cで出てくる文字」は全く別の変換であって、 そこらの処理系ではたまたま合ってるだけですよね 規格を読む限り
>>466 何故そこでmemmove()を薦めない。
>>466 bcopy は sun os に付属のコンパイラで使ったことがありますが、どこにでもあるのでしょうか....。
やっぱり memmove() ですか。
入力された値が3だったら、 *** -** --* といった具合(後ろで桁合わせ、-は空白)に出力されるプログラムを組みたいと思います。 #include <stdio.h> int main(void) { int num,i,j,k; scanf("%d",&num); for(i=1; i<=num; i++) { for(j=num; 0<j; j--) { printf("*"); } printf("\n"); for(k=1; k<=i; k++) { printf(" "); } } return 0; } の様に組んだのですが、実行すると *** -*** --*** となってしまいます。 *を出力する部分がうまく動いていないのだと思い、色々いじくってみたのですが、 3,2で終わってしまったり、無限ループしてしまうといった状態でどう改善させれば良いのか分かりません。 宜しくお願い致します。
-for(j=num; 0<j; j--) +for(j=num; i<=j; j--)
#include <stdio.h> int main() { int num; scanf("%d", & num); for (i = 0; i < num; ++i) { printf("%*s%.*s\n", i, "", num - i, "**********"); } return 0; }
>>471 ,
>>472 実はこれに2時間以上つっかかってました・・・(恥
これで安心して寝れます。ありがとうございました。
空白のループは*のループの前に持ってきたほうがいい
475 :
472 :2008/04/18(金) 23:11:15
case3以降の計算が滅茶苦茶になるんですが #include<stdio.h> void main() { int person;/*宿泊者の人数*/ int price; /*1人あたりの宿泊費*/ int room; /*1部屋あたりの宿泊費*/ person=3; switch(person) { case1:/*1人の時*/ price=18000; break; case2:/*2人の時*/ price=10000 break;
476のつづき case3:/*3人の時*/ price=8000 break; } room=price*person;/*1部屋あたりの宿泊料を計算*/ printf("宿泊人数%d人の時、",person); printf("1人あたりの宿泊料は%d円です。\n",price); printf("1部屋あたりの宿泊料は%dです。\n",room); }
続きは? あと × void main() { ... } ○ int main() { ... return 0; }
すれ違ってしまった・・・。 以降ってことは 4 とか入れた場合のことか? そりゃ price に何も値代入してないから無茶苦茶になるぜ。
コンパイルするとcase3以降の計算が間違ってしまいます。 それでcase2までにすると、どんな値をいれても正確に計算されるんですが 3つ以上になるとおかしくなるんです。
>>478 、479
ありがとうございます。
明日、起きたら試してみます。
いま使っているパソコンとプログラミングしているパソコンは
別にあるので夜遅く申し訳ありません。
case と数値の間にスペースがないのはコピペミスか?
>467 どう読んだか知りませんが、間違ってます。
>>481 >482が指摘したとおり、caseの後に空白がないのではないか?
他の構文ミスと違い、caseの後の空白がないこと自体は文法違反にならないからエラーにはならない。
ただのラベルになっちゃうからねぇ
default: if (person == 3) goto case3;
学習教材として、「猫でもわかるC言語プログラミング」か 「十日で覚えるC言語入門教室」のどちらを買おうか悩んでいるんですが、 経験者の方から見てどちらが使いやすいんでしょうか?」 アマゾンはいまいち頼りにならなくて・・・・
エラトステネスの篩をCで書いているんですが、 以下のプログラムをコンパイルして実行しても、数字を入力させるだけで何も起こりません。 prime[ ]が変であるのはわかるんですがどう直せばいいかわからなくて… ご教授よろしくお願いします。 #include <stdio.h> int main(void) { int i,j,num,prime[10000+1]; printf("Please input the number : "); scanf("%d",&num); for(i=2;i<=num;i++){ prime[0]=prime[1]=0; prime[i]=1; } for(i=0;i<=num;i++){ if(prime[i]){ for(j=2;(j*i)<=num;j++) prime[j*i]=0; } } for(i=0;i<=num;i++){ if (prime[i]){ printf("%d",i); } } printf("\n"); return 0; }
476ですが、
>>478 >>479 >>484 >>486 さんのいう通り試してみましたが、case3以降の計算がやはり間違えてしまいます。
もう一度、プログラムを書きなおしてみても同じ結果でした。
コンパイルになにか不具合があるのでは?と疑っています。
とりあえずcase2までは計算できるので、エラーは置いといて先のプログラムに進んでみよう
と思います。
>エラーは置いといて先のプログラムに進んでみようと思います。 やめろバカ 一足飛びに習得できるほどCはヌルい言語じゃないぞ とりあえずコンパイルしたソースをそのまま貼るんだ
>>488 ・ prime[0]=prime[1]=0; はループの外に出せ
・ 二つ目のループが何をやっているのかもう一度考えなおせ
ifに条件が足りないはず
>>476 >>477 のプログラムをコンパイルすると
person=3なので、
>>477 のcase3の値がテキスト上では計算されることになってます。
実際のコンパイルの結果は
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
宿泊人数3人の時
1人あたりの宿泊料は 2147348480 円です
1部屋あたりの宿泊料は 2147078144 円です
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
となります。(21億4千7百34万8千480円)と(21億4千7百7万8千144円)
>>492 >person=3なので、
>>477 のcase3の値がテキスト上では計算されることになってます。
いいえ。理由は>484。
494 :
488 :2008/04/19(土) 13:19:21
>>491 言う通りにしたら正常に動作しました。ありがとうございました。
あと、このプログラムだと入力値が10000をこえると正しく動かないと思うんですが、
入力値までprimeを定義するにはどうすればいいんでしょう?
primeをmallocで確保
>>493 書いたプログラムを確かめたところ、ご指摘のとおり
case 3: と空白を開ければ、指示通り正しい計算ができました。
初歩的なミスでお騒がせしてすいませんでした。
またよろしくお願いします。
ファイル中に1行ずつ下記の様なデータが入っているとします。 1行に含まれるデータの数は各行でまちまちです。 element1 element2 element3 ・・・ elementL element1 element2 element3 ・・・ elmenetM ・ ・ element1 element2 element3 ・・・ elementN このときに各elementを1つずつ、読み込むにはどの様にすればよいでしょうか? 現在、下記の様に変数を多めに取って解決しているのですが、もっとよいやり方 はありますでしょうか? while(fgets(buf, sizeof(buf), fp)!=NULL){ scan_num = sscanf(buf, "%s %s %s %s %s", element1, element2, element3, element4, element5); }
つfscanf
499 :
497 :2008/04/19(土) 14:57:05
>498 レスありがとうございます。一つ書き忘れたのですが、行を行として読み込むことが 要件としてあります。つまり、1行と2行目は別の要素として読み込みたいと考えてます。 要件漏れすいませんでした。 fscanfは考えたのですが、改行文字も空白と同様データの区切りとして読み込むと のことでしたので、1行をバッファに読み込んでから処理をしています。1行ずつ別途に 処理する方法があれば教えてください。
fgetcで改行まで読む
502 :
デフォルトの名無しさん :2008/04/19(土) 15:46:07
関数へのポインタの定義で”型名 (*ポインタ変数)(引数)”とするところを ”型名 *ポインタ変数(引数)”と、するとどうしてダメなのでしょう? お願いします。
int *kansu() は int型のポインタを返す関数と解釈される
504 :
デフォルトの名無しさん :2008/04/19(土) 15:56:26
>>503 よく分からないのですが、int *kansu()はint形のポインタを返す関数の
プロトタイプ宣言と解釈されるのですか?
そういうこと int* p; p = kansu();
506 :
デフォルトの名無しさん :2008/04/19(土) 16:06:59
typedef int kansu_t(void); kansu_t* kansu = &foo; int n = kansu(); typedef は偉大だと本気で思う。
508 :
デフォルトの名無しさん :2008/04/19(土) 17:30:27
C言語勉強中の者です。 データ管理のプログラムを作る時、各々のデータ(文字列)の配列のサイズは、 malloc()関数で決めるのが一般的なのでしょうか?
可変長の場合はね。 mallocのほか、calloc()やrealloc()でも可。
最初のうちは、#defineで最大サイズを容易に変更できるようにした固定長配列でもいいと思うけどな。 いずれにしろ、ある程度の規模になればmalloc()は必須になるから慣れておいたほうがいい。
free 忘れは大変だしな。
512 :
デフォルトの名無しさん :2008/04/19(土) 17:52:55
>>509 ,510,511
ありがとうございます。
「ある程度の規模」というのがわからないのですが、
たとえば、500個くらいのデータの各々に「メモ」配列をつける場合、
200文字までと固定してしまって、実際にはメモのない場合がほとんどだったら?
長さを固定にしたくなければ動的に確保すればいいし、 固定で十分なら固定にすればいい。
514 :
デフォルトの名無しさん :2008/04/19(土) 17:54:40
初心者はstring
C スレで何言ってんの?
516 :
デフォルトの名無しさん :2008/04/19(土) 17:57:25
mallocやfreeは上級者しか無理 stringをかなり進める
>>512 「スタック」でぐぐってみるとよし。
スタックは小さいから、そこに収まらない規模の配列は必然的にmalloc()を使うことになる。
C≠C++
519 :
512 :2008/04/19(土) 18:09:29
みなさん、ありがとうございます。 さしあたって、Cを勉強しているのですが、 stringが簡単そうですね。 C++も視野に入れて勉強していこうと思います。
520 :
デフォルトの名無しさん :2008/04/19(土) 18:13:37
string a="あいう"; a=a+"えお"; などと自動でサイズ変更してくれる。 初心者はstring
a=a+"えお"; とか書くなよ・・・。 a+="えお"; だろ。 コスト考えれ。
522 :
デフォルトの名無しさん :2008/04/19(土) 18:24:08
後ろに空きがあったら、メモリを解放せずに増やす方法ありますか? 普通に牌列としてアクセスできてです。
realloc
524 :
デフォルトの名無しさん :2008/04/19(土) 19:53:31
「キーボードより英大文字(A-Z)の文字列を変数cに入力し、それぞれの字種の出現頻度を表示するプログラムを作成せよ。 最初に配列の要素を0で初期化し、英大文字の入力はctrl+zにより終了するようにせよ。 ただし、英大文字以外が入力されたら、その文字数を変数othersでカウントして表示する事。」 という問題について考えていますが、今ここまで出来ました。 #include <stdio.h> int main(void) { int other,i,a[26]; /*変数other、制御用変数i、配列a[26]を宣言*/ for(i=0;i<26;i++) a[i]=0; /*forループで配列aの全要素初期化*/ puts("Input A-Z, end:ctrl+z"); while((i=getchar())!=EOF) if ここから、字種の出現頻度を求めるために一体どうすればいいのか分かりません…。 何かヒントを頂けないでしょうか。
A-Zの出現個数をカウントする変数(たぶん配列になるね)を作成する。 文字に応じて対応したカウンタをインクリメントしていき、終了時に頻度を出力。
宿題スレで聞けば
527 :
デフォルトの名無しさん :2008/04/19(土) 20:13:04
うおおおおおお やっとCの入門書を読み終えたのだが、 フリーソフトとかで転がってるウィンドウズのプログラムとか まだぜーんぜん無理な気がする。 だいたいそもそウィンドウの一文字も出てこないんだが、、、 コマンドプロンプトでさ、計算とかさ、文字列とかさ、 先がながーーーーーーーーーーーーい みなさんいっぱしのプログラムが作れるようになるまで どんくらいかかりました・・・?
>>527 読むだけじゃダメなんだぜ?
理解し実践して身に付けなければ次へ進むことはできない。
529 :
デフォルトの名無しさん :2008/04/19(土) 20:22:53
9歳ぐらいからコード書き始めて 初めてリリースしたのが14歳でvimのパッチ。 自分のオリジナルソースは某3Dライブラリで19の時。 お遊びで始めたsocket通信利用のP2P対戦ゲームを作成したのが20の時。 採用された企業で売れる商品に携われたのが23歳の時。 14年ぐらいかな
530 :
デフォルトの名無しさん :2008/04/19(土) 20:26:20
経験歴と実力は関係ない 駄目なやつは20年でも無理
sscanfの %n 指定子を使って文字数を取得したいのですが、意図し たとおりの動作しません。良い方法が有れば教えてください。出来 ればstrlenは使いたくない。他におかしいところが有ったら教えて 貰えるとありがたい。 ====== const char *str_src = "a\nab\nabc\nabcd"; res = sscanf(str_src, "%s%n%s%n%s%n%s%n%s%n", str_dst[0], &n[0], str_dst[1], &n[1], str_dst[2], &n[2], str_dst[3], &n[3], str_dst[4], &n[4]); for (i = 0; i < res; i++) { printf("(%2d): %s\n", n[i], str_dst[i]); } ====== 結果(意図する結果は1,2,3,4) ====== ( 1): a ( 4): ab ( 8): abc (13): abcd ======
%n は先頭からの位置であって、 前回読み出した位置からの相対位置を取得するものではない。
534 :
側近中の側近 ◆0351148456 :2008/04/19(土) 21:22:03
>>532 (っ´▽`)っ
%nは、sscanf関数の呼出しでこれまでに読み取った文字数を、その整数に書き込む。
つまり、
a・・・1文字
a\nab・・・4文字
a\nab\nabc・・・8文字
a\nab\nabc\nabcd・・・13文字
ということになる。
535 :
532 :2008/04/19(土) 21:28:43
>533 >534 早速の回答ありがとうございます。 どうさ結果からしてそうらしいとは思っていました。残念。 strlen呼ぶしか無いのかなぁ
scanf は空白読み飛ばしたりするし、 %n だけじゃ難しいね。 strlen の方が簡単だと思う。
strlenを使いたくない理由は?
538 :
532 :2008/04/19(土) 22:15:32
>537 改めて突っ込まれると特に理由は有りません(汗) 強いて言うならあまり美しくないと思ったくらい。
>>532 ptr=str_src;
for(i=0;i<5;i++){
sscanf(ptr, "%s%n", str_dst[i], &tmp);
n[i]=strlen(str_dst[i];
ptr+=tmp;
}
>>524 if(isupper(i))
a[i-'A']++;
else
other++;
('A')
while ('A') { ... }
>>507 >>507 int n = (*kansu)();
でないと、偉大さがあいまいになる気がします‥‥‥。
544 :
デフォルトの名無しさん :2008/04/20(日) 13:57:17
テキストファイルから、特定の文字列に挟まれている文字列を抽出して、 一覧表示するプログラムを作りたいのですが、 何かヒントをください!!
545 :
デフォルトの名無しさん :2008/04/20(日) 13:59:50
あとは strncpy
popen("grep 'keyWord.*keyWord' fileName", "r") # 寧ろsedか
548 :
デフォルトの名無しさん :2008/04/20(日) 21:06:28
DXライブラリを使ったゲーム作成に入りたいです 現在、BorlandC++ Compiler 5.5(コンパイラ)とCPad(エディタ)の組み合わせで使っていますが この環境でのDXライブラリを使う方法がいまいちわかりません DXライブラリの公式サイトではBCC Developerというエディタで説明を進めているのですが、CPadでは使えないのでしょうか?
使える
>>549 そうですか!
しかし使い方がわかりません
どこを設定すればいいでしょうか?
Cpadで書いてBCC Developerでコンパイルすればいいだけ
552 :
548 :2008/04/20(日) 21:59:01
質問の意味が分からない
ある値が出るまでずっと同じ動作を繰り返して、 ある値が出たら終了するようにするには、どうやるべきでしょうか?
>>554 do{x=動作;}while(x==ある値);
556 :
548 :2008/04/20(日) 22:05:04
>>553 中のファイルをどこに置けばインクルードされるのかがわからないんです・・・
557 :
554 :2008/04/20(日) 22:07:37
>>555 do whileの存在を忘れてました!試してみます
ありがとうございました!
>>555 do{x=動作;}while(x!=ある値);
だな
>>556 コンパイラから見える場所において置けよ
>>556 よく分からん
BorlandC++ Compiler 5.5のスレかDXライブラリのスレいったほうがいい
>>548 bcc32.cfg
ilink32.cfg
の中身を見てみることを勧める?
563 :
548 :2008/04/20(日) 22:26:56
>>559 .hや.libのフォルダが複数あってわかりません。。
>>561 パス追加するとインクルードはできてるようなのですがエラーも大量に出てきました。。
文字列を#defineで通し番号を付けて #define test1 "hogeA" #define test2 "hogeB" ... #define test10 "hogeJ" と定義した場合、Nを変数としてtestNを呼び出すにはどうすれば良いでしょうか。 イメージとしては配列の場合のtest[N]のようにです。
565 :
デフォルトの名無しさん :2008/04/21(月) 12:12:54
C言語でシリアル通信するとき、 プログラムではどういう設定をしたらいいんでしょうか?
const char*の配列にすればお望みの事ができるよ。 const char* test[] = { "hogeA", "hogeB", ... };
568 :
564 :2008/04/21(月) 13:07:25
>>567 完璧に思った通り動きました!!
的確な回答有難うございます。感謝します。
memmove(&feattest[0],&featall[0], struct feature); とするとコピーがなされません。どうしてでしょうか。 なお、 struct feature* featall; struct feature* feattest; struct feature { double x; double y; double a; double b; double c; } としています。
>>569 featall, feattest が指す先はどこ?
セミコロン書き忘れてるみたいだし、sizeofも単なる書き忘れ?
572 :
デフォルトの名無しさん :2008/04/21(月) 15:08:32
>>569 どうでもいいけど、構造体のコピーなら=を使えよ。
構造体の多重間接参照が出来なくて困っています・・・。 struct set{ bool range; int x; int y; bool ans; }; main(){ struct set setA[5]; struct set setB[5]; (計算略) ans=Judg(A,B); } bool Judg(struct set *setA,struct set *setB){ if((setA+((setB+i)->range))->range==true){/*問題発生っぽい箇所*/ return true; } return false; } みたいな感じなのですが、 (setA+((setB+i)->range))->range==true って参照する事は出来ないんですか??
574 :
573 :2008/04/21(月) 17:43:42
すみません bool ansの位置が間違っていました。。 main関数内で宣言しています。
setA[setB[i].range].range==true こういうことをしたいのか?
そもそもiはどこから出てきたんだろう
>>573 コンパイルエラーならエラーメッセージを貼るべし
578 :
573 :2008/04/21(月) 17:52:47
>>575 そういう事をしたいです。
>>576 実際はforループの中に入ってるんですが、
プログラムがゴッチャゴチャになっているのでかなり抜粋しています。
多重間接参照の方法が知りたいと思いまして…
>>577 コンパイルは通ります。でも値が上手く入っていないようで常に0を返してきます。。
多重間接参照の部分は合っていますか?変に回りくどく聞いて申し訳ございません。。
とりあえずmainの中でsetA[0].rangeとsetA[1].rangeの値を確認してみるべきだと思う
(setA+bool型)だけどそういうプログラムなのかな?
581 :
573 :2008/04/21(月) 18:27:07
>>579 表示させてみた所、値がおかしいです。・・・常にfalse。。
>>580 はい。そこも伝わりづらくすみません。
質問投げっぱなしで申し訳ないのですが、
>>579 さんの感じでやってみた所、原因は(計算略)の部分にありそうです。
ここに数百行詰まっていて助けを借りるのも憚られるので、自力でなんとかしてみます。
気にかけて頂きありがとうございました。。
プロトタイプ宣言についての質問です。 /* 1つめのソース */ void init(int *a, int **p); // ここに書く int main() { int a = 0, *p = NULL; init(&a, &p); printf("%d\n", *p); return 0; } void init(int *a, int **p) { *p = a; } /* 2つめのソース */ int main() { void init(int *a, int **p); // ここに書く int a = 0, *p = NULL; init(&a, &p); printf("%d\n", *p); return 0; } void init(int *a, int **p) { *p = a; } この2つはどちらも実行可能なのですが、どのように違うのでしょうか。 プロトタイプ宣言にローカルとかグローバルとかあるものなんでしょうか。 ちなみにコンパイラはgcc4.1.1です。
ぶっちゃけ、どこにあろうと原則として、上にあればおk。それに関しては init(&a, &p); の上にあればおkってことね。
584 :
初心者 :2008/04/21(月) 19:46:27
バブルソートの高速化手法について以下の用語を調べ説明せよって 問題があるんだけどう答えていいかわからない…教えてください 使う用語 亀(turtle) コムソート(comb sort)
586 :
デフォルトの名無しさん :2008/04/21(月) 21:47:01
バブルソートを高速化ってアホだな。
587 :
デフォルトの名無しさん :2008/04/21(月) 22:02:13
結局、ポインタを理解できなかった。
俺はボインタッチが(y
589 :
デフォルトの名無しさん :2008/04/21(月) 22:08:54
Main関数で5つの整数を読み込み, その5つの値の平均(double)を だすプログラムを作成 せよ. その時、5つの引数を受け取り,平 均を返す関数を呼び出し,返された平均値をmain関数 で画面出力すること
宿題スレ行け
>>589 どこからどうやって読み込むのかが不明なのでなんとも言えない
double average(double a, double b, double c, double d, double e) { return (a+b+c+d+e)/5.0; } int main() { printf("%g¥n", average( 2, 3, 4, 5, 6)); return 0; }
コマンドライン引数に指定したファイルのデータ長を取得するような 処理を作りたいのですが、上手くいきません お手数かと思いますが、どなたか教えて下さい
Cではファイルのサイズを取得する汎用なライブラリは存在しないので 環境依存の技を使う必要がある 実際にstdioライブラリで読み取ることのできるデータ数が問題なら 実際に読んでその数を数えるしかない
つ ファイルを開いたらEOFまでポインタを進めて、ファイルの先頭からの オフセット値で調べる
596 :
さなぎさん :2008/04/21(月) 23:02:30
カレンダー表示プログラムがうまくできません。 日付データを生成するプログラムは完成しました。そして 次のステップを目指していましたらとある問題に出会いました。 2009 000000000102030405060708091011121314151617181920212223242526272829303100000000000000 010203040506070809101112131415161718192021222324252627280000000000000000000000000000 010203040506070809101112131415161718192021222324252627282930310000000000000000000000 000000010203040506070809101112131415161718192021222324252627282930000000000000000000 000000000001020304050607080910111213141516171819202122232425262728293031000000000000 000102030405060708091011121314151617181920212223242526272829300000000000000000000000 000000010203040506070809101112131415161718192021222324252627282930310000000000000000 000000000000010203040506070809101112131415161718192021222324252627282930310000000000 000001020304050607080910111213141516171819202122232425262728293000000000000000000000 000000000102030405060708091011121314151617181920212223242526272829303100000000000000 010203040506070809101112131415161718192021222324252627282930000000000000000000000000 000001020304050607080910111213141516171819202122232425262728293031000000000000000000 2文字づつ読み込みまして "00"の時は全角スペースを入れます。 完成イメージとしましては 2009年カレンダー 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 というように表示させたいのですが、fgetsコマンドがうまく使えません。 どなたかご教授くださいな
>>593 1. stat(filename, &stat);
2. fp=fopen(filename,"wb");fseek(fp,0L,SEEK_END);ftell(fp);fclose(fp);
>>593 #include <stdio.h>
#include <sys/stat.h>
int main(int argc, char* argv[])
{
struct stat buf;
for(int i = 1; i < argc; i++)
{
stat(argv[i], &buf);
printf("%5ld bytes <%s>¥n", buf.st_size, argv[i]);
}
return 0;
}
>>596 sscanf(p, "%2d", &num);
p+=2;
printf("%3.0d", num);
>>596 {
char rdbuf[256];
char numb[4];
fgets(rdbuf, 256, stdin);
int year = atoi(rdbuf);
numb[2] = 0;
for(int i = 1; i < 12; i++)
{
fgets(rdbuf, 256, stdin);
for(int j = 0; j < 31; j++)
{
numb[0] = rdbuf[j*2];
numb[1] = rdbuf[j*2+1];
printf("%s", atoi(numb) ? numb : " ");
}
//... 月の表示とかは適当にどそ
>>594-595 >>597-598 レスありがとうございます
>>598 さんのソースを使って実行してみたところ、取得できました
が、ファイルサイズの取得でした
無知で申し訳ありませんがファイルサイズ=データ長という認識でいいのでしょうか?
自分で書いたんだろ どういうつもりでデータ長と書いたんだよ
>>602 すみません、気分を損ねるようなつもりは全くありませんでした
例えばstrlenを使うようなイメージでした
ファイルサイズを取得する処理はできていたのですが、データ長を取得する処理だと言われ
こちらにお邪魔した次第です。ファイルサイズとデータ長の違いがわからないのです
教えて頂いたのに本当にすみません
いや別に怒ってはいなくてさ データ長てのはファイルに何かしらの形式でデータが入ってて、 その長さとかそういう事なの?
>>604 実際にやりたかったのは指定したファイル(形式は一定でない)のデータ長を取得して
既に出来上がっている関数に飛ばすと言った処理をやりたかったのです
データ長と書いたのは恥ずかしい話なのですが関数の引数コメントに
「ファイルデータ長」と書いてあったからで、何故データ長を使用するのかわかりません
自分なりに調べてファイルサイズを取得、関数に引き渡す処理を作成したのですが
口頭で説明したところ「ファイルサイズじゃなくてデータ長」と言われ、違いがわからなかったのです
1バイト文字、2バイト文字を混ぜたようなテキストファイルを作成した時のバイト数(目算)と
単純なファイルサイズに違いがないので、何がどう違うのかすらわからなくて・・・
それでここにお邪魔したのですが、調べ方が足りなかったように思えます
自分が甘かったです。本当にすみませんでした
そいつに違いを聞けよ
607 :
582 :2008/04/22(火) 00:14:48
>>583 スタイルの違いってことなんですね。
はじめて見た形だったので
関数のスコープが変わるのかな、なんて勘違いしそうでした。
どうもありがとうございました。
あーエスパーで答えると 1レコード固定長で可変長文字列データを複数レコード格納する場合、 ファイルサイズ != データ長 となるかもしれんね
>>605 本人に聞け
わかるまで聞け
要件を徹底的に具体化するのはプログラマの基本だ
>>607 プロトタイプ宣言以前の時代から使っているロートルに多い。
あいつらは放っておくとこんなソースを書きかねない。
main()
{
double sqrt();
printf("%g\n", sqrt(.1));
}
>>611 まっとうなロートルは
sqrt(1.0);
または
sqrt((double)1);
と書く
>>612 0.1であることに注意。
>>613 一般的に、引き数リストがないものはそう呼ばないのでは?
いずれにしても「その頃からやってるロートル」なので、一応C99も「知っている」らしいよ。
>>614 引数リストのないプロトタイプ宣言はAnsi-C以前のもの
いわゆるK&RのC
そのころからやっている超ロートル
616 :
デフォルトの名無しさん :2008/04/22(火) 01:51:12
スレ違いだったらスマソ 今からC言語を勉強しようと思ってるんだが windowsとLinuxどっちでやったほうがいいの?
617 :
デフォルトの名無しさん :2008/04/22(火) 01:54:53
windows
618 :
デフォルトの名無しさん :2008/04/22(火) 01:58:58
今使ってるパソコンでやればいいだろ。
なんのためにCを勉強したいかによる 趣味なら自分のマシンに合わせればいい 職業にしようと思ってるんならまずWindowsをやり余裕があればUnix/Linux
621 :
デフォルトの名無しさん :2008/04/22(火) 02:04:05
windowsのほうが普及しているし統一されているから UNIXは派生が多いし普及がいまいち
622 :
デフォルトの名無しさん :2008/04/22(火) 02:05:46
いずれにしても標準のC/C++を勉強するなら変わりない
>>622 だよな。コンソールアプリしか作れんが。
標準を覚えたいならVCなんかは却って邪魔かも知れん。
ただし、将来Windowsアプリの仕事をしたい、
と思うなら「Cを覚える」というより「VC++を覚える」、という感覚のほうがいい。
C言語、全くわからないのでこれから勉強しようと思うのだが参考になる書物とかある? スレチだったらスマソ
K&R 独習C ダイテルのC言語プログラミング CFAQ
626 :
デフォルトの名無しさん :2008/04/22(火) 15:08:04
>LYSOZYME MKRLIKKSAIGMFAFFVVAASGPVFAAVGDQGVDWSKYNGTYGNFGYAHDKFAFSQIGGT YGGTFVDQATYETQVASAIAQGKRAHTYIWYQVGGSQEVAKAALDRYLPKIQTPKNSIVA LDYEGGASGNKQANTDAILYGMRRVKAAGYTPMYYSYKPYTLANVNYKQIIKEFPKSLWI AAYPNYEVTPVPNYSFFPSMDGISVFQFTSTYVAGGLDGNVDLTGITGNGYGKQKGQEVK PNTATPAIENGKEANEVKGNDVEVGMTVKVNFGAKNYATGETIPQWVKGQPHKIIQKNGD TVLLDGIMSWLSVHDVETIDASTSQPTTPAKSYIVKQGDTLSGIASNLGTNWQELARQNS LSNPNMIYSGQVISLTGGQSGATARTYTVQSGDNLSSIARRLGTTVQSLVSMNGISNPNL IYAGQTLNY が格納されているファイルを読み込み各文字が何%あるかを出力ファイルに書き出すプログラムをつくって
作って・・・からどうすればいいんだろう? とりあえず、作って・・・ 捨てちゃった。 total 437 A : 8.92448513% ( 39) B : 0.00000000% ( 0) (中略) Y : 6.63615561% ( 29) Z : 0.22883295% ( 1)
>>626 #include <stdio.h>
#include <string.h>
char* hoge = "LYSOZYMEMKRLIKKSAIG・・・ 〜(省略)
void main(void)
{
int slen = strlen(hoge), count[26] = {0}, ic = 0;
for (ic = 0; ic < slen; ic++){
if (hoge[ic] >= 'A' && hoge[ic] <= 'Z')
count[hoge[ic] - 'A']++;
}
for (ic = 0; ic < 26; ic++)
printf("[%c] = %.1f%%\n", 'A' + ic, count[ic] * 100.0 / slen);
}
>ファイルを読み込み 日本語が理解できない人かw
標準入力からEOFが入力出来ないって本当ですか!?
うそです
>>586 安定なソートですから、それなりに有用な場合があるのかもしれません。<バブルソートの高速化
宿題スレの隔離から出てこないで下さい><
バブルソートをどうにかしようって考えるよりも、ソートを高速化する過程に 効率の悪いバブルソートが用いられるのはよくあることだ。 そうやって、アルゴリズムを改良すると、処理時間、計算量が減って 効率が良くなるという勉強をするのさ、そういった分野の学校では。
636 :
582 :2008/04/22(火) 18:55:24
このスレ結構にぎわってるんですね。 Cしかできない俺が最近はやりのJavaScriptに劣等感を抱いているんだが、 バカにしたもんじゃないなって嬉しくなった
うわー、名前でちゃった... ...ついでに質問なんですが、 /* src1.c */ int a; // グローバル変数 int main() { int x; x = sub(a); printf("x: %d\n", x); printf("a: %p\n", &a); return 0; } /* src2.c */ int a; // グローバル変数 int sub(int n) { printf(" sub::a: %d\n", a); printf(" sub::a: %p\n", &a); return n+1; } 2つソースファイルで定義してるグローバル変数aは それぞれでメモリの割付が行われると思うのですが、 同じアドレスのもののようなんです。 ということは、extern記述子は冗長な表現ってことになってしまうんでしょうか? # externって他のソースファイルで定義してるからここでは宣言のみ、 # ですよってことだったと認識していたのですが
おいっ、ナンバーサインを全角で書くな・・・NG登録してんのにw
>>637 リンカがエラー出してない?
シンボルが重複してますよって
>>639 出ていません。
コンパイラはgccで、文法チェックが一番厳しいオプションをつけてコンパイルしても次の警告が出るだけです。
src1.c: In function 'main':
src1.c:6: 警告: implicit declaration of function 'sub'
#
>>637 のソースはちょっと編集していますので、6行目ではなくて実際は4行目ですが。(重要なことではありませんでしたね)
いかがでしょうか。
GCCのバージョンは? 古いとそういう挙動を示す。 ANSIではエラーにならなければならないが。
gcc-4.1.1です。 2007年1月5日にリリースされているみたいなので、古くはないとは思うのですが 何かバグでもあるのでしょうか...
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51) が詳細です。連レスすみません。
シンボルの重複はリンカの担当だから、ldの問題。 --allow-multiple-definitionあたりが渡ってないか?
int* TEST(int size) { int *retest = malloc(sizeof(int)*size); return retest; } int main() { int *test; test = TEST(5); ..... free(test); return 0; } こういうことをするつもりなのですが、関数TEST内でmallocしたものはfree(test)で開放できてるのでしょうか?
できるよ
647 :
645 :2008/04/22(火) 21:22:44
ありがとう
二つの整数値を読み込んでその差が10以下なら「差は10以下です。」、 差が11以上なら「差は11以上です。」と表示するプログラムを作りました。 論理OR演算子を使うとするとどのようにすればよいのでしょうか? #include <stdio.h> int main (void) { int n1, n2, sa; puts("二つの整数を入力してください。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); sa = (n1 > n2) ? n1 - n2 : n2 - n1; if( sa >= 11) puts("それらの差は11以上です。"); else puts("それらの差は10以下です。"); return 0; }
至って普通だと思うけど何で?
>>649 if(n1<n2-10 || n2+10<n1){
;
else
;
まあどのみちオーバーフロー対策してないがね
>>649 こうかな?
#include <stdio.h>
int main (void)
{
int n1, n2, sa;
puts("二つの整数を入力してください。");
printf("整数1:");
scanf("%d", &n1);
printf("整数2:");
scanf("%d", &n2);
sa = n1 - n2;
if ((sa >= 11) || (sa <= -11)) {
puts("それらの差は11以上です。");
} else {
puts("それらの差は10以下です。");
}
return 0;
}
>>649 sa = n1 - n2;
if(sa < -10 || sa > 10)
puts("...以上です。");
else
puts("...以下です。");
何かの宿題?
>>651 気を悪くしたら許してくれ。
malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
作り手の趣向だから非難してるんではないよ。
>>653 ども。リロードしてなくて私も送ってしまった。。
656 :
649 :2008/04/22(火) 22:27:01
皆様ありがとうございます。
大変参考になりました。
現在C言語の入門書を買って独習している段階でして、
本の中の演習問題が
>>649 で論理OR演算子を使えという指示でした。
ちょっと解答が思いつかなかったので自分で作れる範囲で作ってみたのですが、
やはり問題文を無視しては解答にはならんだろうw、と質問させて頂きました。
>>656 独学・・なるほど。ま、がんがんソース書きまくれ。
まさかとは思うけど ( sa = n1 - n2 ) >= 0 || ( sa = n2 - n1 ); だったりしてw
>>654 >
>>651 気を悪くしたら許してくれ。
> malloc() free() の関係はできるだけ見通しがいいようにという余計な話をした。
> 作り手の趣向だから非難してるんではないよ。
確かにあまりいい設計ではないね。
やむを得ずそうなっちゃうこともあるけど。
メモリアロケートを関数で行なわなければならないなら、こんな戦略かな。 ・関数名にallocなどのキーワードを含めるようにして確保も行なっていることを明示する。 ・(freeするだけになってしまうかもしれないが)解放用の関数も用意し、使ってもらう。
ついでにログを仕込んだり、アロケート回数を管理したりとかね
>>644 わたしはldについて理解が浅いので、調べていたらレスに時間が掛かってしまいました。
ごめんなさい。
$ gcc -c src?.c
でコンパイル直前まで終わらせて、-vオプションをつけて何をしているか調べてみました。
$ gcc -v src?.o -o a.out
Using built-in specs.
Target: i386-redhat-linux
コンフィグオプション: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared
--enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=i386-redhat-linux
スレッドモデル: posix
gcc バージョン 4.1.1 20070105 (Red Hat 4.1.1-51)
/usr/libexec/gcc/i386-redhat-linux/4.1.1/collect2 --eh-frame-hdr -m elf_i386 -dynamic-linker /lib/ld-linux.so.2
-o a.out /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crt1.o /usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crti.o
/usr/lib/gcc/i386-redhat-linux/4.1.1/crtbegin.o -L/usr/lib/gcc/i386-redhat-linux/4.1.1
-L/usr/lib/gcc/i386-redhat-linux/4.1.1 -L/usr/lib/gcc/i386-redhat-linux/4.1.1/../../.. src1.o src2.o -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i386-redhat-linux/4.1.1/crtend.o
/usr/lib/gcc/i386-redhat-linux/4.1.1/../../../crtn.o
どうやら--allow-multiple-definitionオプションは入っていないようです。
これをコピペして、敢えて--allow-multiple-definitionをつけてリンクしてみましたが、
どちらにしても、
>>637 で言ったようにグローバル変数aは同じアドレスのようです。
あとどこを調べてみたらいいでしょう...よろしくお願いします。
長文失礼しました。
>>662 -fno-common オプションをつけるといいらしい
コンパイラの動作なんか気にする前に素直に 他のソースに実体があることを示したいならexternをつけなさい そのファイル内でしか使わないことを確実にしたいならstaticをつけなさい
>>663 $ gcc -fno-common src?.c
/tmp/ccuJF0uA.o:(.bss+0x0): multiple definition of `a'
/tmp/ccU9yxgD.o:(.bss+0x0): first defined here
でました。
このフラグが通常で立ってないということは、
bss領域に割り当てられる変数は、コンパイラ任せにしないでね、
ってことなんでしょうね。
プログラマが管理できてない部分にエラーメッセージもなしっていうのはちょっと怖いですね。
面白かったです。
ldで多重定義をチェックするやりかたも調べてみたいと思います。
ありがとうございました。
666 :
デフォルトの名無しさん :2008/04/23(水) 16:04:05
おまえらはよ作れや!!!!!!!!!!!!!! このオタク野郎 ぼけ あほ かす ニート 日本の恥
まあ>664でFAだがな
char cRet[512]; printf("ファイルパス:\n"); fgets(cRet, 512, stdin); こんな感じで画面上に入力された文字(ファイルパスを想定)を取得した後に fopenでファイルを開こうと思っているのですが、何度やっても開けずにエラーになります ファイル自体はちゃんと存在しているファイルなのですが、何が悪いのでしょうか?
>>669 馬鹿か?それだけだされてわかるわけねーだろwwww
>>669 受け付けたcRetには入力したファイル名+改行コードが入ってんじゃね?
ゲッツと言えば、今日放送されたクイズヘキサゴン2に出演してたなぁ。
すいません\nを削除するにはどうしたらいいんでしょうか
ちょっとは頭使え
嫌なら環境にもよるが、EOFを入力しちゃいな。Ctrl+Zとか+Dとか。 むりぽなら別のライブラリで入力を受付ちゃいな。
二度と入力できなくなるじゃないか・・・
突然すまん #include <stdio.h> main(){ int *A, n, i; printf("数字を入力してください\n"); for(i=0; i<n; i++) scanf("%d", &A[i]); printf("ヒープソートの結果\n"); for(i=0; i<n; i++) printf("%d", heapsort(A[i])); } void heapsort(int *A, int n){ int i; heapify(A, n); for(i=n-1; i>0; i--) A[i] = deletemax(A, i+1); } void heapify(int *A, int n){ int i; for(i=n/2-1; i>=0; i--) downmax(i, A, n); } つづく
void downmax(int i, int *A, int n){ int j; j = 2*1+1; if(j >= n) return; if(j+1<n && A[j]<A[j+1]) j = j+1; if(A[j] > A[i]) { swap (i, j, A); ownmax(j, A, n); } return; } int deletemax(int *A, int n){ int max; max = A[0]; A[0] = A[n-1]; downmax(0, A, n-1); return(max); } void swap(int i, int j, int *A){ int temp; temp = A[i]; A[i] = A[j]; A[j] = temp; return; } コンパイル使用とすると error C2371 heapsort が再定義されています 同様にheapify downmax swap が再定義されてるといわれる。 Microsoft.NET Framework SDK で C です。
関数プロトタイプ書け。
>>682 関数は使用(呼び出し)に先立って宣言する必要があります。
685 :
682 :2008/04/24(木) 00:21:49
>>683 ,684
ググってみたので、
void heapsort(int *A, int n);
void heapify(int *A, int n);
void downmax(int i, int *A, int n);
void deletemax(int *A, int n);
void swap(int i, int j, int *A);
を追記したのですが
heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。
heapsort.c(26) : error C2120: void 型がほかの型と同時に使われました。
heapsort.c(51) : error C2371: 'deletemax' : 再定義されています。異なる基本型です
。
heapsort.c(6) : 'deletemax' の宣言を確認してください。
orz・・・ とりあえずエラーナンバーでググってきます
>>685 使っている処理系の標準ライブラリーにheapsort関数etcがあるんじゃないですか?
名前を変えてみるとか
>printf("%d", heapsort(A[i])); これはheapsortの使い方がよろしくないし。 >int deletemax(int *A, int n){ >void deletemax(int *A, int n); プロトタイプと実体は一致してないし。 コンパイラが文句言うのも当然というか。
>>687 heapsortをheapsortsに変えてやってみたのですが、
変化なし・・・
一応凡ミス :→;、 void→intとかを修正したところ
以下のエラーが。
heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
異なっています。
heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
番目の引数にエラーがあります。
17行目周辺は
scanf("%d", &A[i]);
printf("ヒープソートの結果\n");
for(i=0; i<n; i++)
printf("%d", heapsorts(A[i])); //17行目
}
void heapsorts(int *A, int n)
{
int i;
heapify(A, n);
for(i=n-1; i>0; i--)
A[i] = deletemax(A, i+1);
}
です。
690 :
682 :2008/04/24(木) 00:39:51
>>682 後者は修正しました。
タイミングずれたけど689のように。
heapsortの使い方・・・調べてみます。
>>689 > heapsort.c(17) : warning C4047: '関数' : 間接参照のレベルが 'int *' と 'int' で
heapsortsの第一引数(int *A)がアドレス参照してない。
17行目でheapsorts(&A[i])とする
> heapsort.c(17) : error C2198: 'heapsorts' : 実引数が少なすぎます。
関数の引数は2個あるのに渡してるのは1個だけ。
これiでも渡すの?
> heapsort.c(17) : error C2095: 'printf' : void 型引数を関数に渡そうとしました。2
heapsortsの戻り値がvoid型だから。
戻り値をint型にして値を戻すように修正する。
まあ、Aが未確保というオチはあるし。 たぶん結果って言っているわけだから、heapsortはfor文の前段で仕掛けて、 for分の中はA[i]の表示だけで良いような気がするわけ。
693 :
691 :2008/04/24(木) 00:44:54
あーごめん。配列渡してるのか 渡すのは heapsorts(A, i) とかでよろしく
694 :
682 :2008/04/24(木) 00:52:37
>>691 どうもです。
1番目と3番目を修正ました。
ただその2番目、
692,693の言ってる部分がまだ理解できてないす・・・
現状
for(i=0; i<n; i++)
printf("%d", heapsort(&A[i]));
}
int heapsort(int *A, int n)
{
int i;
heapify(A, n);
エラー
heapsort.c(17) : error C2198: 'heapsort' : 実引数が少なすぎます。
printf("%d", heapsort(&A[i]));を
printf("%d", heapsort(A, i));??
無知fで申し訳ない・・・
無知と言うよりも、基礎を学ばずにいきなりヒープソートだなんて、一体全体何考えているんだか。
引数の意味すらわかってないようにも見えるしな
>>680 いえ、fclose() されるわけではないので、大丈夫です。
>>697 行の途中では^zや^dは利かないんじゃないか?
逆に、利いたとしたらストリームが閉じられているわけだから
二度と入力できなくなるぞ。
そこで、gets関数
っツーか、面倒くせぇ〜からmainへの引数として、実行する際にパラメーターに ファイル名を渡して処理しチャイナと。
>>686 わざわざ質問してくださってありがとうございます。
http://pc11.2ch.net/test/read.cgi/tech/1201153965/139 の後半で述べられてることについて、こちらでも確認しました。
片方のみ初期化すると、その初期値で定義され、両方初期化すると
$ gcc src?.c
/tmp/cc4a7Yre.o:(.data+0x0): multiple definition of `a'
/tmp/ccwrP69I.o:(.bss+0x0): first defined here
collect2: ld はステータス 1 で終了しました
と望むエラーメッセージが表示されました。
ちなみにわたしはグローバル変数について勘違いしていたようです。
グローバル変数の宣言は、0での初期化が同時に行われると思っていたのですが、
実際は実行時に0で初期化される.bss領域ということを失念しておりました。
一応nmでシンボルのフラグをチェックしてみたところ、
>>637 は.bss領域にあり、
片方だけ明示的に初期化してもう片方にexternを使用すると.data領域に確保されることを確認しました。
グローバル変数は普通、明示的に初期化して使うものなんでしょうね。
グローバル変数を使う機会が多くないもので知りませんでした。
ありがとうございました。
CreateProcessで起動したプログラムをSendMessageで終了させるにはどうしたらいい?
検索してたらこんなん見つけたんだけど
引用元:
http://homepage2.nifty.com/DSS/VCPP/API/ProcessEnd.htm BOOL CALLBACK EnumProc(HWND hwnd, LPARAM lParam)
{
DWORD dwThreadId, dwProcessId;
dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == (DWORD)lParam) {
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
return TRUE;
}
// pi は CreateProcess() したときの PROCESS_INFORMATION
EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);
この使い方解説誰かお願い
CreateProcess
→FindWindow
→SendMessage
これだとFindWindowがおかしくてできなかった
FindWindowが駄目なら FindWindowExを使えば良いじゃない。
Exは子ウィンドウのときだろ。 「FindWindowがおかしい」 キャプションかクラス名の指定がウンコなんじゃねーの。
>>703 使い方解説もなにも、
そのEnumProc関数をどこかに作っておいて
>EnumWindows(EnumProc, (LPARAM)pi.dwProcessId);
を実行するだけじゃない?
707 :
703 :2008/04/24(木) 18:08:43
CreateProcess(NULL, "sample.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); hWnd = FindWindow("sample", NULL); sample.exeはSleep(1000)で無限ループさせてる hWndが0になってしまうorz
>>707 プロセスを作ってすぐにFindWindowしても、sample.exeの方はまだCreateWindowを呼ぶ前かもしれないし
WaitForInputIdleとか試してみたらどう
sleepで無限ループさせてるなら、なぁ。 sample.exeのキャプションに"sample"が無いんじゃねーの。 Spy++でも使って調べてクラス名でやってみれ。
いつまでスレチにかまってんだよ
>>681 int *A;
scanf("%d", A[0]); // この時点ば終わっている
貴方はポインターの使い方を全く理解していない。
int iValueBody[256];
int* A = iValueBody;
A の実体が無いのに、そこに値を放り込むなんてダメだよ。
なのでそれ以降はナンセンス。
nに値が入ってないのにループ回してるほうが先だろw
>>712 むむむ。彼の書き込みをみると、n には程よい値が入っていてくれて A はどこかちゃんとしたメモリー空間を示していてくれる・・という、とてつもない期待をしてるんだろうなぁ。(遠い目)
人工知能の C++MiKu とかだったら、希望通りにしてくれるのかもしれない(今は無くとも将来はまんざらでないかも)
少なくともソートとかに手を出すレベルじゃないのは確かだな
>>716 同感です。
引数の渡し方がわからなくてあれだけ書いてるんだから
なんかサンプルみながらやってるんじゃない?
719 :
デフォルトの名無しさん :2008/04/24(木) 21:58:27
自分で入力したデータの件数分の平均身長、平均体重を出したいです。 (人数は一番最初に入力) この場合、変数は、int型のweight height の他何が必要でしょうか?
10人に聞けば10通りの答えが返ってくる。 プログラムの書き方次第でどうにでもなるから答えようがない。
人数受け取ってmalloc
723 :
デフォルトの名無しさん :2008/04/24(木) 22:06:54
C言語におけるリテラル文字列の取り扱いですが、 置かれるメモリプールとかライフタイムとか どうであるのが正しいんでしょうか? 例えば以下のコードはありですか? const char * func() { return "AAA"; }
リテラル文字列は静的な領域に置かれる。
>>724-725 回答ありがとうございました。
実装依存とかだと困るなーと思ってたんですが
そうじゃないんですね。
ファイルパス文字列(という言い方をしますが)の左右のダブルクォーテーションを削りたいです ファイルパスの途中にスペース(C:\Program Filesみたいな)があるとダブルクォーテーションで 括られると思うのですが、これを削る方法はあるのでしょうか?
728 :
側近中の側近 ◆0351148456 :2008/04/24(木) 23:05:22
>>727 (っ´▽`)っ こういう感じ。
void deleteDoubleQuotation(
char *c1,
char *c2
){
if(c1[0] = '"'){
strcpy(c2, &c1[1]);
}
else{
strcpy(c2, c1);
}
if(c2[strlen(c2) - 1] = '"'){
c2[strlen(c2) - 1] = '\0';
}
return;
}
729 :
719 :2008/04/24(木) 23:09:08
質問変えます。 件数分の身長、体重を集計・・・するんですが、 どういう計算処理をすればいいんでしょうか?
合計して人数で割る
>>728 VB厨の私ですが感動しました
探して早速明日組んでみます(゚▽゚)
>>729 つか, 算術的にはどういう計算をするかを考えないのか?
もしダブルクォーテーションならスキップ
>>729 そういうのを考える事が初めの段階だと思うけど・・
アルゴリズムの本でも買ったらどうだろう
>>730 のとおり算数と同じ処理をしてあげればいい
単純に考えた場合 [入力用] int型 人数、1人の身長、1人の体重 [ほか] int型 身長の合計、体重の合計、ループ用変数 こんなもん
〜略〜 ループ{ 身長体重入力 ついでに人数カウント } 合計・平均計算 〜略〜
>>713 そのEnumWindows()を使う手法はもちろんウィンドウを持つプロセスに対
してしか使えない。
コンソールアプリだとふつうはメッセージを受けとらないから、
TerminateProcess() するしかないんじゃないかな。
>>728 家にある環境でやってみたらできました(゚▽゚)
if(c2[strlen(c2) - 1] = '"')
c2[strlen(c2) - 1] = '\0';
↓
if(c2[strlen(c2) - 2] = '"')
c2[strlen(c2) - 2] = '\0';
改行コード?分があるようだったので-2にしてみたら綺麗に取れました
ありがとうございますー
739 :
737 :2008/04/24(木) 23:55:49
>>737 他のスレで話が進んでいた。とても虚しい気分になった…
〜略〜 int 人数、1人の身長、1人の体重 int 身長の合計、体重の合計、ループ用変数 人数 = 入力() ループ { 1人の身長 = 入力() 1人の体重 = 入力() 身長の合計 += 1人の身長 体重の合計 += 1人の体重 } (ループ用変数が人数になるまで) 結局平均が欲しいのかよくしらないけど、とにかく集計の計算 〜略〜 まとめてみた。できそうじゃないか!
char *c, data[200]; c = fgets(data, 200, stdin); if(c != NULL && data[0] != '\n') というのを、 char data[200]; if((fgets(data, 200, stdin) != NULL) && data[0] != '\n') と書いても大丈夫でしょうか。
大丈夫なのと書いた方がいいのとの間には 大きな壁があるけどな
744 :
TT :2008/04/25(金) 01:37:26
「Continue文」を使った宿題が出ました 内容が「60点以上を合格とし、合格者の平均点を出力する」です 誰かソースを教えて下さいm(_ _)m
>>744 宿題スレへどうぞ。
いや、どちらかと言えば半年ROMってから出直すことをお勧めしますが。
>>744 ソースを教えろといわれても、個人の成績のデータの入力仕様がわからないから教えられないだろ。
747 :
TT :2008/04/25(金) 02:03:32
「個人の成績のデータの入力仕様」は適当な数値で・・・
宿題スレ行け
749 :
デフォルトの名無しさん :2008/04/25(金) 13:40:24
「uint16」「uint8」というのは、 どういう型ですか?おもに何に使うのでしょうか? たぶん数字を代入できると思うのですが・・・ 「int」の高度版のような奴でしょうか?
num of bits
uint16 おそらく16ビット符号なし整数 uint8 おそらく8ビット符号なし整数 おもに16ビット/8ビット符号なし整数として使う。 数字を入れてもいいけど、普通は数値を入れるだろうな。
>>744 人数入力
人数回ループ {
点数入力
60以上なら合計変数へ加算し合格人数+1
60未満ならcontinue
}
合格者合計点÷合格人数を表示
753 :
デフォルトの名無しさん :2008/04/25(金) 21:06:03
2次元配列変数sampleの中身を表示し、sampleの各値を1の位で四捨五入したものを resultに入れ、resultの中身を表示するプログラムを作成せよ。 実行例 sample 13 36 18 54 25 62 19 78 41 93 87 21 result 10 40 20 50 30 60 20 80 40 90 90 20 これ出来る人いますか?
#include <stdio.h> main() { float P,r ; for (P = 1; P <= 9 ; P++) { r = P / 10 ; printf("Hello! r=%f \n",r) ; } } ↑このとき「Hello!」は9回出ますが #include <stdio.h> main() { float r ; for (r = 0.1; r <= 0.9 ; r=r+0.1) { printf("Hello! r=%f \n",r) ; } } ↑このときは「Hello!」が8回しか出ないのはなぜですか? r=0.9のとき、なぜか出力がされません。 Cは初めてなので初歩的な勘違いかもしれませんが、解説おねがいします。
756 :
753 :2008/04/25(金) 21:20:06
誰かソースをお願い
>>755 小数も2進数で表されるんだが、そのときに誤差が出る場合がある。
丸め誤差とかで調べてみ。
>>757 十進法と二進法でわずかな誤差が出てるんですね
前者を使うことにします、ありがとうございました。
整数でまわすんならループ変数はintの方がいいよ。
>>755 > for (r = 0.1; r <= 0.9 ; r=r+0.1)
r <= 0.9のイコールが問題
浮動小数点の場合イコールは厳禁
#define EPC 0,000001
for (r = 0.1; r <= 0.9+EPC ; r=r+0.1)
とかやるんじゃないの?
厳禁ってほどでもないだろ 確かに計算結果としてその値ちょうどになることを期待してはいけないけど、 フラグ値として0.0とか-1.0とか仕込むことはありうるわけで
>とかやるんじゃないの? カンマとピリオドはともかくとしてや ら ね え よ ふつうforカウンタに浮動小数点数は使わない
どうしてもやりたいなら for(r=0.1; r<1.0; r+=0.1) だな 配列の添字などが0スタートなこともあるので、 Cでのループは i=0; i<n; i++ ってな風に書く癖をつけといたほうがいい
767 :
755 :2008/04/25(金) 21:39:52
なんという返事の速さ みなさん返答ありがとうございました。 ループ内で、rを式に使いたかったのですが、ループ変数は 整数を使うことにします
そうだね for文の中身をシンプルにしたほうが読みやすいコードになるし、バグも少なくなる。
>>756 できたよー
#include<stdio.h>
#define f(x) for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p) { \
if ((i + 1) % 4) printf("%d ", *p); \
else printf("%d\n", *p); }
int main(void)
{
int sample[][4] = {{13, 36, 18, 54}, {25, 62, 19, 78}, {41, 93, 87, 21}};
int *p = (int *)sample, i;
puts("sample");
f(p);
p = (int *)sample;
for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p)
*p = *p % 10 >= 5 ? (*p / 10 + 1) * 10 : *p / 10 * 10;
p = (int *)sample;
puts("result");
f(p);
return 0;
}
*p = (*p + 5) / 10 * 10 でいいじゃん。
>>755 #include <stdio.h>
int main(void)
{
float af,bf=0.1;
double ad,bd=0.1;
int cnt;
for(af=0.1,cnt=1; af<=0.9; af+=bf,cnt++) {
printf("%2d Hello\n",cnt);
}
printf("\n");
for(ad=0.1,cnt=1; ad<=0.9; ad+=bd,cnt++) {
printf("%2d Hello\n",cnt);
}
return 0;
}
772 :
756 :2008/04/25(金) 21:57:55
これはひどい(笑
他はともかくそのマクロの使い方はないだろう わざとか?
>>769 行末に \ が入るエディタ使うてますな?自分もかつて大学生時代に使ってますたが
東大、京大卒の教授の下で受けていた授業で
>>774 なんで?理由を求む。自分はそうしないとか、そういうのはという 主観 では
世の人間は理解しないよ。速度を出しすぎても、事故らなきゃ問題のないという
人はいくらでもこの世にいるように。しかし、そんな奴でも目の前に障害物があれば
当然それに応じて回避するなり速度を落とす、さ?
わざとって明らかだろ 756>先生宿題やってきました! 先生>なんだこのソースは。君、解説できるのかね 756>・・・・・・・・・・・・ 先生>またどこかで拾ってきたソースだろう。減点だ、減点。
>>776 コーディングスタイルというのは共有化された主観だからな
違和感をもたれた時点で好ましくない
こんなコードでコーディングスタイル論争するなよww
>resultに入れ これが見えない人に何言ってもムダw
>>779 > 違和感をもたれた時点で好ましくない
はい、でました、それがお前の 主観 に過ぎないってことだよ。
お前、この世に自分以外の人間が何人いるとでも?
渦中の国民でも世界の人口の6分の1、10億人だよ?
世界全体で60億人。お前はその中の 1人 に過ぎない。
そのくせ、主観で否定して良いとでも思ってんのか?
全員が通している コンパイラ様 が良いつってんのに?w
まぁ、世の中ってのは何かと 人間が決めたルール ってのがあって コンピュータの基本的な仕組みは共通でも、そのシステムは 基本構造を人間が都合よく定義や規定(標準化)を決めて作っているわけだ。 その定義や規定に則って、俺らはコードを書いてプログラミングをしているわけだ。 そのコンパイル様に、これでええか?ええのんか?なぁ、もっとこうしたらええか? それはあかんか?なんていちいちご機嫌を伺うのか?良いなら良い、ダメならダメ そうとしか言ってくれませんよ、脳みそこねこねコンパイルは。
人が書いたコードに違和感持つのは当たり前じゃないか? ループ { } ループ { } ループ { } いろんな人でてくるだろ 人が書いたコードを読んで理解する力も必要だと思うけどな
>>785 違和感は良いとして、それが否定できるものではなかろう。
そんなこといったら、貧乏人は一生金持ちから理解されないだろうね。
だから共通した ルール に基づいて通れば良いんだよ。
ホリ○モンみたく、小賢しいけど誤魔化しで通そうとすると、後で
まともに動作しないプログラムが出来て、多くの人から理解されないだろうけどなw
関数型マクロなのに、xが意味なかったり、iとかsampleとかpなんて平気で使ったり、 頭おかしいだろw
とにかく、基本部分は同じ汎用電子計算機のプログラムのコードを書く人の 思想や人種、生活スタイルは様々でも同じコンパイラ、プログラム言語にて 通用するものであればなんら問題はないわけだ。所詮自分なんてこの世の 一人に過ぎない。この世は自分一人だけの都合や、一人の力では 成り立ってもいなければ動いてはいませんよ、よほどのVIPでない限り。 たとえVIPでも、地球の運命までは変えられんよ。より多くの人の行動によって 社会、歴史は動いてきたのだから。戦争にしても、ね。
あー 人に見せるんだから変数は最低限わかりやすくしないとな
無限ループ突入しそうだから一旦break;しようぜ
皆おちつけ 常識のない人間に関わるのは時間の無駄だ
自分が常識人だと思う前に、常識人テストでも受けて 成績を見せてから言えよw
マクロ内での\の意味すらわかってないヤツがなに言ってもな……
>>793 わかった気になっているお前の方が知ったかぶりってことだw
>>793 意味不明。お前が説明しろ。ちなみに、マクロを改行して記述した場合どうなるか?
お前が分かってないみたいだな。
だからもうあれはわざとでFA
>>756 が減点サレルノダヨ
検索するのに少し時間かかったなw
>>793 793 名前:デフォルトの名無しさん 投稿日:2008/04/25(金) 23:23:49
マクロ内での\の意味すらわかってないヤツがなに言ってもな……
↑分かった振りをして誤魔化す馬鹿。あれは改行していないのに
あるエディタにて、あのように行末に表示されるものがあるんだよ
それをコピペしたというのは、使っている人なら普通に分かる。
778 名前:デフォルトの名無しさん 投稿日:2008/04/25(金) 22:17:05
>>775 お前は一体何をw
↑ほらな、茶化すだけで 説明 すらしない。知ったかぶりってのはこういうことを言うんだよ。
知っている人は普通に知っている。こいつはあのマクロを特殊だと思ったんだろうねw
マクロの中に \ あのように入る意味があると思っているんだろうねw
改行が必要なほど長いマクロを書く場合は行末に\を置く必要がある。 エディタの種類とか関係ない。
突っ込まれても、突っ込んだ人が分かってないと茶化すだけで 自分がだめだしした 理由 を述べない卑怯者。 こんな奴は、一生他人から理解されないまま干されて孤立するだろうね。 一方、理由が分かっている人は、理屈や現実的な話をして 相手を理解させることが出来る。だいたい、事実無根か真実かは 本人が体験すれば一番分かることだから。
以下いつもの流れ
>>769 とりあえず、これをコンパイルしてみろ。話はそれからだ。
gdgdそんなのはと、主観しか言わない奴は論外。
お前が作ったコンパイラでもC言語でもないだろw
しばらく静かだったからどっかの精神病院に入院したか、親にPC取り上げられたかと思ってたのになぁ
ヒント:筋の通った説明が出来ない奴ほど、誤魔化して相手が理解していないことを 必死に粗探しをするかのごとく始め、勝手な自分基準で相手が分かってないということにして 相手のすべてを否定しようとする姑息な手段をとる 卑怯者の常套手段だな。そんなの、一定以上の人生経験を積み重ねた人に 通用するわけねーだろ、JK
ム板はIDないから不便だな おいそこのお前コテハン付けろよ
ここの住人は荒らし耐性0なんだな
808 :
側近中の側近 ◆0351148456 :2008/04/26(土) 00:04:21
(っ´▽`)っ マクロの中の\は意味があると思うよ。 改行コード\nを無効化しないといけない。 っていうか、釣られてますな・・・
ちょいと質問です。 大学で卒業までにC++でオリジナルカードゲームを作ろうと思っています(複雑さはUNOぐらいです)。 特徴は、 ・見た目は、Windowsに入っているソリティアの様な感じ ・CPU戦ではなく、一対一でオンライン対戦 ・マッチングは考えず、とにかく二つのPCで対戦出来れば良い といった感じです。 そこで、これを作るのに必要だと思われる開発環境を教えて頂けないでしょうか? 現在あるのはCのコンパイラとCPADのみです。 オンラインや見た目の部分で他にも色々と必要だと思うのですが・・・。 ちなみにプログラムの腕は黒い画面で○×ゲームが作れるぐらいです(現在大学2年)。
Win API頑張ったらいいと思う
言いたいことがあるなら筋の通った理論で反論しろや? マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ?
812 :
側近中の側近 ◆0351148456 :2008/04/26(土) 00:09:49
>>811 (っ´▽`)っ
コンパイルエラー出ると思うよ・・・
ねとすた見るから後でな
さて釣り宣言はいつごろになるのかな
>>811 >マクロの \ にry
先生!この人おかしいです!
>筋の通った理論で反論 マクロで改行する場合は末尾に \ がいる これでいいか?顔真っ赤な人久しぶりに見たわ
だめだ、知ったかの基地外が \ に意味があると思い込んでるよ・・・ ここまでいくと、重症だよな。絶対にこいつは説明が出来ないよ。 コンパイラを無視して主張しても無駄ってことだから。
マクロの中で\なしで改行してもコンパイルできるコンパイラを教えてくれw
あと、俺は別にあのマクロを問題がないとか良いとか言ってないから。 あくまでも コンパイラが通す かどうか、だぞ。 処理結果の内容については話は別。言っただろ? ルールに基づいていれば良いと。しかし、それがどういう結果を招くか?は そいつ次第。
マクロから\抜いたらコンパイラ通らないってみんな言ってんだよw
\無しじゃコンパイラ通さないしw あの、自信過剰で人生うまくいくと思いますか・・・ >マクロの \ に何の意味があるんだ?その前に改行したのをコンパイルしてみろよ? >あくまでも コンパイラが通す かどうか、だぞ。 通さないから\がいる 頭痛ぇ〜コイツ
さんざん自信満々でかみついてそのたびにボコボコにされたことは数知れないのに、 ちっとも成長しないからな……
そもそも、マクロを処理するのはプリプロセッサだから、コンパイラは通すもへったくれもないけどね。 って空気読まずに書いてみる。
空気嫁
>>815 ぷっ コンパイルしてからモノを言え、基地外
>>809 おもしろいゲームにするためのルールを考える方が先だ
その他のものは後からどうにでもなる
まぁ広義の方のコンパイラではあるわけですし
一体化してるしな
顔を真っ赤にして釣りえさに食いつくおまいらに脱帽、参ったw
たまに伸びてたらコレかよ おまえら暇ですね
>>769 スレ違いだけどグローバルなマクロに見えるからここらに書いてくれた方が読みやすいと思った
int main(void)
{
#define f(x) for (i = 0; i < sizeof(sample) / sizeof(int); ++i, ++p) { \
if ((i + 1) % 4) printf("%d ", *p); \
else printf("%d\n", *p); }
int sample[][4] = {{13, 36, 18, 54}, {25, 62, 19, 78}, {41, 93, 87, 21}};
int *p = (int *)sample, i;
>>760 コンパイラの次元で十進数扱いは COBOL 位しか思い浮かばない。
C++ とかなら BCD パッケージで十進演算を取り入れられるけど・・・
そんなことより整数なら十進数と二進数に誤差は無いのだからその特性を使うのがいいのでは。
二進数の少数は 1 -> 0.5 -> 0.25 -> 0.125 -> 0.0625 ...
というのを組み合わせて 0.75 = (0.5 + 0.25) ぴったしみたい以外もあるわけだから気をつけないとね。
>>809 WindowsアプリをつくりたいのならVisualStudioかさもなきゃC++Builderを買っとくのが普通
もちろんAPI/SDKを駆使してできないわけじゃないけどそこまで苦労する意味はあんまりないからな
>>831 その課題、問題がなんで出たか?って話では?
そういうコードを見せて、何でこうなるのか?理由を考察せよとか。
説明されているように、2進法では2^-nを用いて、小数点以下は
精度の範囲内で表されていると。
834 :
デフォルトの名無しさん :2008/04/26(土) 03:26:51
C++Builder
>>818 宿題スレから消えたと思ったら、こんどはここですか?
>>749 どっかのヘッダファイルに
typedef unsigned short uint16;
typedef unsigned char uint8;
と書いてあると思う。
つまり、unsigned short/unsigned charと同じだが、
作成者は
>>751 のような意味を持たせてると思う。
>>835 宿題スレから消えたと思ったら、こんどはここですか?
>>835 = 目障りな入力はキーボードのみの知ったか似非講師
っつか、誰かと勘違いしてんだろ、お前。自ら粘着基地外って
自己紹介、アピールしなくて良いから、下らない主張をしてないで黙ってろよ
最初に利率金額年数を入力すると、合計返済金額を計算し出力するプログラム (但し、利率計算は関数を呼び出す)を作りたいのですが、計算部分がうまくいきません。 #include <stdio.h> float interest(float r,int n); int main(void) { double r; int y,n,amo; printf("利率(r): "); scanf("%g",&r); printf("金額(y): "); scanf("%d",&y); printf("期間(n):"); scanf("%d",&n); amo = y * (float)interest(r,n); printf("返済金額は%d円です\n",amo); return 0; } float interest(float r,int n) { float rate; int i; for(i=1; i<=n; i++) { rate = rate * (1+r/100); } return rate; } オーバーフロー起こしたりしているので、正常では無いにしろ計算部分に飛んではいると思うのですが、 どこに問題があるのでしょうか?ご教示願います。
>>839 特に必要がない限り、float型を使うのはやめましょう。
そして、scanf()のフォーマットは"%lf"にすべき。
"%lg"でもいいけれど、"%g"は間違い。
>>835 言い負けした粘着乙。そんなに東大、京大卒の教授の下で指導を受けた元生徒のことが
妬ましくて、言い負けして悔しいのぅ悔しいのぅ?
843 :
側近中の側近 ◆0351148456 :2008/04/26(土) 11:10:14
(っ´▽`)っ きめぇ
どちらが粘着質かは自明だな。
845 :
デフォルトの名無しさん :2008/04/26(土) 11:46:00
C言語の実行に必要なのを マイクロソフトのホームページからダウンロードできると聞いたのですが、 どうすればいいですか?
C言語は実行できません。
849 :
デフォルトの名無しさん :2008/04/26(土) 13:35:51
浮動少数点型の-0.0000を環境によらずに"-0.0000"と表示するスマートな方法を教えてほしい 以下は自分で考えたコード float d = 0; *(int*)(&d) |= 0x80000000; if((*(int*)(&d)) & 0x80000000) { printf("-"); } *(int*)(&d) &= ~(0x80000000); printf("%.4f\n", d);
>>849 それは、おもいっきり環境依存の書き方だと思われ。
851 :
デフォルトの名無しさん :2008/04/26(土) 13:41:46
>>850 どこが環境依存なのかくわしく教えてください
852 :
デフォルトの名無しさん :2008/04/26(土) 13:45:09
>>849 だいぶ説明不足みたいなんで補足します。
浮動小数点少数型の表現はIEEE 754に限定します。
環境に依存したくないのは
printf("%.4f\n", d);
の部分だけです。すいません。
-0.0000のときに0.0000と表示されるのを避ける方法を教えてください。
>>849 おいちゃんがきんもぉ〜★なソースで示しちゃうYO!
printf("%.4f\n", d*-1);
854 :
デフォルトの名無しさん :2008/04/26(土) 13:47:14
>>853 それだと
0.0000 -> 0.0000
-0.0000 -> 0.0000
と表示されてしまいます。
必要なのは
0.0000 -> 0.0000
-0.0000 -> -0.0000
と表示する方法です。
Cの配列って即値でしか大きさを指定できないの?
float d = -0.0; おいちゃんが詰まらんことをするYO!
>>855 C99なら、変数でも指定できるらしいよ。
C99ならそうでもありません。
861 :
デフォルトの名無しさん :2008/04/26(土) 13:57:38
>>856 ちょっと綺麗になったけど、まだ何とかなりそうな気がします。
>>849 float d = -0.0;
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
printf("%.4f\n", fabs(d));
さらにエレガントな方法を教えてください
何で、別に0.0に対して-なんて要らんでしょうに。
-0.0<0.0という想像でものを言うけど sprintfしたあとその条件を使って頭に-つけるかつけないか操作すればいいんじゃない
>>860 VC++なら、vectorとか使えばいいのに。
865 :
デフォルトの名無しさん :2008/04/26(土) 14:03:02
>>862 -0.000001を%.4fで出力した場合、出力結果が-0.0000になるものと
0.0000になるものがあります。
866 :
デフォルトの名無しさん :2008/04/26(土) 14:04:12
-0.0 == 0.0
>>865 それって、表示云々よりも環境によって本来は0以下の値だったものが
情報が失われて0と等価にされてしまった場合によるものだろうし
環境によると言えばよるけど、変数には0として値が入っているわけだから
気にしてもしゃーないべ。より厳密にというなら、doubleで、doubleでも
精度によるけどさ、floatよりはってことで。
869 :
デフォルトの名無しさん :2008/04/26(土) 14:16:30
>>868 説明不足ですまそ。
入力文字列"-0.000"を貰って、変数に格納して、それから出力するんだが、
入力と出力を一致させたいんだ。
float d = atof("-0.0000");
if((*(int*)(&d)) & 0x80000000)
{
printf("-");
}
printf("%.4f\n", fabs(d));
で、"-0.0000"ってのは好きで"-"を付けてるわけじゃなくて、
他人が作ったファイルに付いてるから、
こっちもそれに合わせないとしょうがないという状況です。
さらに
printf("%.4f %.4f %.4f", v1, v2, v3);
みたいに複数の数値を大量に出力する必要があるから、
printf()を何度も呼び出す余裕もない。
うちの環境だと、-0.0は「-」がつく… printfをラップするのがスマートかな
俺のも-ついて表示されるな
>>870 cygwinだと-0.0
mingwだと0.0
atof()の仕様と矛盾してるmingw側がおかしいとおもわれ
なんかその手の入出力動作を制御する関数があった気がする… 調べてみるけど、他の文字列化関数探した方が良いかもな
>>872 >>872 > atof()の仕様と矛盾してるmingw側がおかしいとおもわれ
規格のどこにそんな仕様が書いてある?
JIS の atof 見ると strtod を見ろと書いてあって, strtod の脚注には
以下の記述がある.
「浮動小数点傘寿値が符合付き0をサポートしている場合, 関数は0の符合を
正しく処理することができる」
要するに mingw が符合付き0をサポートしてないだけじゃないのか?
mingwのatofのmanでその辺言及されてる?
>>875 しらね. 使ったことないもん mingw なんて.
ただ, 規格的には無問題だろうと言いたかっただけ
>>859 const intだろうと怒られなかった?c89規格
全てのconst intがコンパイル時に解決できるとは限らないからねぇ。
>>877 int a[1 + 3]; とかいう意味だろ
なるほど!
#include <stdio.h> int main(int argc, char* argv[]) { char sz[argc]; printf("sizeof(sz) = %lu¥n", sizeof(sz)); return 0; } これが gcc -std=c89 -Wallで警告なしでビルドできて、結果もvariableなんだけどそんなもん?
int main() { double b = 3.345; printf("%lf", b); return 0; } みたいなもんなんだろう
>>881 gcc 4.0.1 だが
main.c: In function ‘main’:
main.c:4: warning: ISO C90 forbids variable-size array ‘sz’
とか出てきたけど?
バージョンはいくらだ?
と思ったら、癖で -pedantic 入れてたわ。 -pedantic ないと警告出ないのね。
886 :
881 :2008/04/26(土) 16:58:09
>>883 bccは厳密なのかもね。
>>884 gcc version 4.0.1 (Apple Inc. build 5478)
ちなみに-pedantic付けたら同じ警告が出た。
まあでも警告レベルってことは、gccはvariable-size arrayに関してISO C90 compliantじゃないってことなのかな。
887 :
881 :2008/04/26(土) 16:58:51
あ、遅かったorz
>>886 そもそも可変長配列が規格に入ったのはISO C99。
BCCはC99に対応していないからエラーになるのだし、
gcc -pedanticでエラーになるのもC90モードだから。
gcc -std=c99 -pedanticならエラーなくコンパイル・実行できる。
889 :
881 :2008/04/26(土) 17:13:32
>>888 >>886 はC99がどうとかじゃなくて、
>>886 はgccのISO C90への準拠度について
。
gcc -std=c89 -pedanticではエラーじゃなくて「警告」が出るんだよ。
ISO C90モードならエラーにならないとおかしいから、
>>886 って書いた。
>>889 そういうことか、すまん。
エラーにしたければ-pedantic-errors使えばいい。
891 :
デフォルトの名無しさん :2008/04/26(土) 20:28:11
>>874 mingwでもatof()は-0.0を正しく処理できる
atof()が-0.0を認識するのにprintf()では-0.0を認識しないのに納得いかないんだ
仕様という言葉を使ったのは軽率だったかと思う
規格には関係なく、-0.0を出力する方法を知りたい。
だからさぁ、もう値としては0として格納されているんだから 仕様 ということに しよう
893 :
デフォルトの名無しさん :2008/04/26(土) 21:00:46
>>892 いや、値はちゃんと-0.0として格納されてんだよ。
ソフトの仕様も-0.0を出力で納得できる。
なのになんでオレの処理系は0.0を出力しやがるんだ、このアホ処理系め〜!
0と言う値に符号があること事態おかしいんだよ、ボーイ?
IEEE 754的には-0 == 0のはず。 そう考えれば-0を0と出力する処理系があるのも仕方ない気がする。
896 :
デフォルトの名無しさん :2008/04/26(土) 21:07:01
>>894 -0の妥当性なんてどうでもいいんだ。
とにかく、入力(メタセコとか言うソフトらしい)の書式にあわせた出力をしなけりゃならん
解決しそうにないので、あきらめます
>>895 それじゃ、符号なんてどうでも良いじゃんwwwww
第一、0より大きいか小さいか、そういう値ではなく単純に0なんだから。
そういう表示がされるからって、いちいち気にするような神経質だと
早く禿げるぞ。もっと気楽にいけや、な?
君は、年中気温が熱い土地で、北極や南極のような極寒を求めるのかい?
よく判らんな。 例えば-1e-10を"%f"で出力するときに-0.000000"にしたいってことか? mingwのprintf()はAPI由来なのかな? それが嫌ならcygwinのprintf()を使えばいいじゃん。
小数を文字列に変換する関数を自作するのが妥当?
>>897 >>861 で自己解決してるじゃねーか、
printfの問題はサポートにでもメールを出せ。
902 :
900 :2008/04/26(土) 21:27:50
頭に やっぱ がつくのな
まぁ、力を抜いて前も抜いておけや、な?及川○央でもどぞ?
?
このスレを見ている人はこんなスレも見ています
つまり何も見ていないという事か。
このスレを見ている人はこんなスレを見捨てています
つまんね〜質問だな!
909 :
デフォルトの名無しさん :2008/04/27(日) 12:30:01
mllocとcallocについて質問です。 int *pi; pi = (int *)calloc(5, sizeof(int)); と pi = (int *)malloc(sizeof(int) * 5); で、それぞれ確保された領域に値を代入すると双方とも *(pi + 0),*(pi + 1),*(pi + 2),*(pi + 3)・・・・ で参照できると思うんですが callocもmallocも同じように使っても問題ないんですか? まだ勉強始めたばかりなので間違った認識をしているのかもしれませんが どういうときに使い分けるのか良く分かりません。
別にcallocは使えなくても死なない。 勝手にゼロクリアする分の処理がまるまる無駄になることも少なくないし。
calloc → ゼロクリアが必要なときに使う malloc → ゼロクリアが必要でないときに使う 特にゼロクリアが必要なくても その処理が邪魔じゃなければ calloc 使っても別に構わない。
俺はcallocなんて使ったこと無いな
>>861 float d = -0.0;
printf("%.*s%.4f\n", (((*(int*)(&d)) & 0x80000000) ? 1 : 0), "-", fabs(d));
これでどうだ?
パソコンにC言語のコンパイラをインストールしたいのですが、オススメのサイトはありませんか? 出来ればBorlandCの解説サイトがありがたいです
今の時代 VC++ Express Edition のがいいと思うが、 まあ気にしない事にしておこう。
そうなんですか 大学の講義で推奨されたのでBorlandCをインストールしようと思ったのですが
別にCコンパイラなんか有名どころなら何使っても大差ないだろう
規格準拠率の低いコンパイラ使っても、 そのコンパイラ特有の癖を知る事は出来るが、 それ以上得る所は無いどころか 間違ったものを C++ 仕様だと勘違いしてしまう恐れがある。 仕事でずっと Borland C を使うつもりなら別にそれもいいかもしれないが、 まずそんな職場は無い。
そうですね 将来役立てるためにVC++ Express Editionをインストールします ありがとうございました
C++ じゃねえや、C だ。
>>918 規格票読んで分かって使えば無問題
レトロかつマイナーなCPUに至っては未だにK&R敷かない場合もある
そんなもの後から勉強すればいいだけだろう
bccが規格に準拠してない部分ってたとえばどこ?
switch で変な事あった気がする。 あとはそのうち C++ やりたいと思った時とか。
Borland CでC++やってるけど何か問題あるの?
Microsoft Visual C++ 2008 Express Editionはあるんだけど Microsoft Visual C 2008 Express Editionみたいなんはないの? C++はまだやってないからCで使いたいんだ
>>926 Microsoft Visual C++ 2008 Express EditionはC/C++が使える
>>925 無料の奴じゃないならいいけど
無料の奴は古い
C++ の最新の仕様が 2003 年に出てるから 2003 年より前に出た奴は古いと思っていい。
C言語でprintf(゙┌┐┘└゙); だと┌┐┘└って表示できるのに char kigou1 ; kigou1 ='┌'; printf(kigou1); だとτとか・みたいなのが表示されるのはどうしてですか? 変数を通して┌┐┘└こういう文字を表示させるにはどうすればいいの?
'┌' が 1 バイトに収まらないから。 文字列使う。
char *str; str = "┌"; printf(str);
wchar_tとwprintfを使うとか
935 :
デフォルトの名無しさん :2008/04/27(日) 19:21:32
どこがよ?
いや、考えたら確かにひどくはあるなw
全角文字は2バイト
SJIS ならな。
?_?
未だにどこがひどいのか分からない俺
誰か解説してくれ
・ const がない。 ・ 文字列へのポインタを直接 printf に入れるのは、 その文字列が % を含んでるかもしれないので危険。 必ず %s を使って表示する。 とりあえずこの辺は気になった。
なるほど ありがとうございました
945 :
デフォルトの名無しさん :2008/04/27(日) 19:46:28
こーしろってか? static const char const *str = "┌" printf("%s", str);
2つ目の const 意味ねー
やらなくていいとこまで突っ走ってる感が否めない
const char * const str だな
fputs("┌", stdout)でいいじゃない
c初めて1ヶ月ちょっとのド素人なんですが 「#include<stdio.h> int main(void){ //カウント-ダウン int a,b,c,d=0; printf("数字どぞー\n"); scanf("%d",&a); c=a; while(c>0){ d++; c=c/10; }; //桁数確認:桁数はd switch(d){ case 0:puts("0・・・をどうしろと・・・?") ;break; case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break; case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break; case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break; default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); break; } b=a; do{ b=b--; printf("%d ",b); }while(b>1); puts("\nハィ0、 終了ォ──(・∀・)──!!"); return 0;}」 このプログラムで4桁上を入力された時にscanfのトコに戻るようにしたいんですが どうやったらいいか皆目見当つきません、助けてください
do { scanf("%d",&a); c=a; while(c>0){ d++; c=c/10; }; //桁数確認:桁数はd switch(d){ case 0:puts("0・・・をどうしろと・・・?") ;break; case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break; case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break; case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break; default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); break; } } while (d > 3);
input: scanf("%d",&a); c=a; while(c>0){ d++; c=c/10; }; //桁数確認:桁数はd switch(d){ case 0:puts("0・・・をどうしろと・・・?") ;break; case 1:puts("1桁とはまたナメられたものだな・・・!!") ;break; case 2:puts("2桁・・・ちと数字が大きいかな・・・") ;break; case 3:puts("3桁っておまww多すぎだろww\nとりあえずお前、後で〆るからなwww覚えてろよw") ;break; default:puts("マテマテマテ、数字大きすぎ、エラーだよ!!\nダリーよ、やる気しねーよ、入力しなおせコノヤロー!!"); goto input; }
954 :
951 :2008/04/28(月) 02:34:16
そーだった do { scanf("%d",&a); ↓ do { d = 0; scanf("%d",&a);
955 :
952 :2008/04/28(月) 02:37:43
956 :
デフォルトの名無しさん :2008/04/28(月) 09:50:24
図形の頂点ごとに赤、黄色、緑、青の色をつけろ! 幅2ドットと幅8ドットの線分を描け! 三角形、四角形、5角形のポリゴンを描け! この質問ってこのスレでいいの?
vfwprintfは使えたんですが、vfwscanfがヘッダファイルに無くて使えません。。 vfwscanfかこの関数と同等の機能を持つ関数を使いたいんですが、どうすれば使えるようになりますか? 開発環境はVisual Studio 2005で、 ソースは以下の文です。 int print(const wchar_t* format, ...) { va_list args; int result; va_start(args, format); result = vfwprintf(format, args); va_end(args); return result; } int scan(const wchar_t* format, ...) { va_list args; int result; va_start(args, format); result = vfwscanf(format, args); return result; }
959 :
デフォルトの名無しさん :2008/04/28(月) 13:29:15
商品番号860????、6000÷2の余り+1番の問題 ?には6000が入ります このプログラムはどう書けばいいですか? C言語なのでこっちで質問します。お願いします
宿題スレ行け
エスパーしろってか? 6000が抜きたいなら数値なら剰余でもいいし 文字列ならそのまま抜いて数値にすればいい そもそも6000/2って余りないよな・・・
すみません質問です。 printfとかでファイルにデータを書き込んだ場合、printf命令が戻った地点で ファイルの書き込みは完了していると考えていいんでしょうか? 後ろでOSがゆっくり書いてたりするのかな…と。 スレチだったらすみません。
fprintfですね^^;
>>962 fprintf()から戻った時点では、バッファに書かれているだけでファイルに書きに行ってないかもしれません。
確実に書き込むには、バッファをフラッシュする必要があります。
# 尤も、その段階で本当にファイルに出力されているかどうかはOSやデバイスに依存します。
俺はSだから sprintf が好きですが何か?
967 :
デフォルトの名無しさん :2008/04/28(月) 18:24:10
969 :
デフォルトの名無しさん :2008/04/28(月) 18:27:41
ダウンロードした後 どうやって使えばいいかよくわかりません。
971 :
デフォルトの名無しさん :2008/04/28(月) 19:57:39
C言語の勉強がしたいのですが 無料で作れて実行できるフリーのソフトはないでしょうか? できたらVB等も教えてください
Microsoft Visual C++ Express Edition (C も可能) Microsoft Visual Basic Express Edition
読み込む整数値以下の偶数を並べるソースを書いてみました。 偶数ではなく、2のべき乗を並べるにはどう書き換えるべきでしょうか? #include <stdio.h> int main (void) { int i, no; printf("整数を入力してください:"); scanf("%d", &no); i = 2; if(no > 0){ while(i <= no){ printf("%d ", i++); i++; } putchar('\n'); } else puts("正の数を入力してください。"); return 0; }
>>976 i = 2;
while(i <= no){
printf("%d ", i);
i *= 2;
}
でどうだろうか。intでは値の範囲が狭すぎるかもしれないが。
>>976 for(i=2;i<=no;i*=2) printf("%d", i);
連投します #include <stdio.h> int main(void) { int value1 = 10; int value2 = 20; printf("1:value1 %d\n",value1); printf("1:value2 %d\n",value2); { int value1; value1 = 30; value2 = 40; printf("2:value1 %d\n",value1); printf("2:value2 %d\n",value2); } printf("3:value1 %d\n",value1); printf("3:value2 %d\n",value2); return 0; } 実行結果 1:value1 10 1:value2 20 2:value1 30 2:value2 40 3:value1 10 3:value2 40
>>977 >>978 ありがとうございます。
今日読んだインクリメントに固執しすぎました。
同じ結果を出すのにも色々な書き方があって大変参考になります。
後、intでは範囲が狭いとの事ですが
今のところ参考書がそこまでたどり着いていないので、
とりあえずはソースを書いて慣れることを目標としています。
981 :
979 :2008/04/29(火) 00:11:07
まったくの初心者です。最後のvalue2が40になるのが 分からない。ブロック内でvalue2に40を代入したのでブロック内の 実行結果が40になるのはわかるけど。 ブロック外まで代入された40は引き継がれるのでしょうか? グローバル変数ではないですよね。 最後のvalue2が20なら納得できるのですが。 教えてください
ブロック内で新たに value2 を宣言してないから
>>980 #include<stdio.h>
int main(void)
{
int i=0, a[] = { 0x8A, 0xE6, 0x92, 0xA3, 0x82, 0xC1, 0x82, 0xC4, 0x82, 0xCB, 0x81, 0x49, '\0'};
while(a[i] != '\0') {printf("%c",a[i]); i++;}
getchar();
return 0;
}
>>982 ああ、そうですか。宣言しなければ、ブロックの垣根を越えて
持ち越されるのですね。
さっきブロック内で新たにvalue2を宣言したら、持ち越されませんでした。
ありがとうございました
system("cls"); と同じような動作する関数って何ですか?
>>986 ありがとう、APIスレにでも行ってみます
#include <stdio.h> int main (void) { int i, j, ln, mn; printf("何段ですか:"); scanf("%d", &ln); mn = ln; for(i = 1; i <= ln; i++){ for(j = 1; j <= mn; j++) putchar('*'); putchar('\n'); mn--; } return 0; } 実行結果(入力が5の場合) ***** **** *** ** * 今回4つの変数を使ったんですけど、mnを使わずにスマートに書き換えられますか?
printfの書式でうまいことできなかったかな?
空白か 0 ならうまいことできるが・・・。 C++ なら setfill でうまいことできるんだがなあ。
const char * str = "**********": puts( str + strlen( str ) - ln ); あんま考えずに書いたけど、イメージはこんな感じで。 大きな入力きたらOUTだけど・・・
for(i=1; i<=ln; i++) { for(j=i; j<=ln; j++)
for(i=ln;0<i;i--){ for(j=1;j<=i;j++){ putchar('*'); } putchar('\n'); }
{ for( ; ln > 0; ln--) { for(k = 0; k < ln; k++) putchar('*'); putchar('¥n'); } }
n = 5; for(i = 1; n; i++){ printf("*"); if(i % n == 0){ printf("\n"), n--; i = 0; } } こんな感じでどう?
この程度だと考えるところは似たり寄ったりになるな。 質問主は何が知りたいのか判らんが・・・
みなさんありがとうございます。
自分の基本的な数学の力の無さが浮き彫りになるっつーか、
閃きが出来ないっつーか…
>>997 やっぱりソースは出来るだけ簡素な方がいいのかと思いまして質問しました。
とりあえず俺ならこう書く。 #include <stdio.h> int input_line(void) { int line; printf("何段ですか: "); fflush(stdout); scanf("%d", &line); return line; } void show_same(int ch, int repeat) { int i; for (i = 0; i < repeat; i++) { putchar(ch); } } void show_line(int line) { int i; for (i = line; i >= 1; i--) { show_same('*', i); putchar('\n'); } } int main(void) { show_line(get_line()); return 0; }
え?
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。