ぼるじょあがC/C++の宿題を片づけますYO! 21代目
1 :
ぼるじょあ ◆yBEncckFOU :
04/03/02 01:15 (・3・)アルェー 最近Javaに手を出したC++房のぼるじょあですYO!
わからない宿題を片づけますYO!
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
2 :
デフォルトの名無しさん :04/03/02 01:16
5 :
ぼるじょあ ◆8F06CsBYBE :04/03/02 01:30
(・3・) エェー ぼるじょあ ◆yBEncckFOUですYO! ぼるじょあ◆yBEncckFOUは共同体で連続体で群生体だから 無限の知識と無尽蔵の体力を持ってるんだYO!24時間、いつでも質問オッケー♪ (・3・) エェー こっちが嫌になるほど質問しろYO! 名前欄に「ぼるじょあ#ぶるじょあ」って書けば、キミも今日から ぼるじょあ◆yBEncckFOU だYO! 名前欄に「ぼるじょあ#セV8cLFセz」って書けば、キミも今日から ぼるじょあ◆yEbBEcuFOU だYO! *ぼるじょあ◆yBEncckFOUはコテハンじゃないYO! *ぼるじょあ◆yBEncckFOUはいつだって全力投球ダジェ!! *ぼるじょあ◆yBEncckFOUは共同体で連続体で群生体だYO! *ぼるじょあ◆yBEncckFOUはみんななれるからイイぼるじょあも悪いぼるじょあもいるYO! *ぼるじょあ◆yBEncckFOUはエムエクースとニーはよくわからないYO! *ぼるじょあ◆yBEncckFOUは2ちゃんねるの人気者だYO! *ぼるじょあ◆yBEncckFOUはちょっと基地外はいっているYO!
6 :
ぼるじょあ ◆yBEncckFOU :04/03/02 01:31
トリップミスった・・・
しかし、一体いつの間にこのスレはぼるじょあ専用スレに なったんだ?
>>7 ( ・3・) エェー すべてがぼるじょあになるYO
8+7=15って少なくね? 6+9=15とかは普通じゃん? 5+10=15とか4+11=15とかそのまんまじゃん? 7+8=15って少なくね?おかしくね? 7って結構でかくね?8なんて更にでかいじゃん。 7でさえでかいのに8って更にでかいじゃん? 確かに15って凄いけどこの二人が力を合わせたら16ぐらい行きそうな気がしね? 二人とも強豪なんだからもっといってもよさそうじゃね?なんかおかしくね? どう考えてもおかしくね? 7ってかなり強くね?世間は7を甘くみすぎじゃね? 8なんて更に強いじゃん?ドラゴンボールで言えば7はピッコロじゃん? 8は悟空じゃん?15はラディッツじゃないね。ラディッツは16ぐらいだね。 悟飯の一撃分1引いて15として勝ったのどっちよ? ピッコロなんて戦い終わった後全然平気そうだったじゃん? って事は7+8はもっといくだろ。絶対おかしくね?15ってありえなくね? なんか変じゃね?これ俺達の知らない所でなんか起こってるっつー知らせじゃね?
(´Д`υ)
>>9 7は孤独な数字ですからね。
その事実を使って
1〜9を一度ずつ用い二つの積を
つくったとき(例:1*4*5*9 と 2*3*6*7*8)
同じ値をもつものはできないということが容易に証明できる。
そう、片方は7の倍数であり、もう一方は7の倍数ではない。
よって、題意は示される。
ってミステリー小説にありましたよ。。。
7は孤独な数字ですからね。 その事実を使って 1〜10を一度ずつ用い二つの積を つくったとき(例:1*4*5*9 と 2*3*6*7*8*10) 同じ値をもつものはできないということが容易に証明できる。 そう、片方は7の倍数であり、もう一方は7の倍数ではない。 よって、題意は示される。 ってミステリー小説にありましたよ。。。
ネタの定期便です。 任意の数を引数に取り、ローマ数字の文字列を返す関数を作り給へ。
15 :
デフォルトの名無しさん :04/03/02 16:55
1兆ってローマ数字でどう書くの?
手元の辞書には1000までしか載ってないぽ これでは3999までしか表せないぽ
>>17 なんだよその、ぽってのはよ あ?
ぬっ殺すぞ?
四季たん(゚Д゚)ハァ?(゚Д゚)ハァ?
hairetu[10]{4,2,3,5,1,6,4,7,10,9} を、大きい順に並び替えて 10,9,8,7,6,5,4,3,2,1 となるようにしたいんですが、for文やif文などの初心者でもわかるやり方で どうなるか教えてください。別の変数を作ってそこに入れて入れ替える感じかとは思うんですが…。
#include <stdio.h> int main(void){ int i, x, y, temp; int hairetu[10] = {4,2,3,5,1,6,4,7,10,9}; for(i = 0; i < 10; i++){ for(x = 0, y = 1; y < 10 - i; x++, y++){ if(hairetu[x] > hairetu[y]){ temp = hairetu[x]; hairetu[x] = hairetu[y]; hairetu[y] = temp; } } } for(i = 0; i < 10; i++){ printf("%d ", hairetu[i]); } }
お〜!わかりやすい! ありがとうございます。そんな見やすいの早く書けるようになりたいです
//誰でも考え付きそうな単純選択法(遅い)。 #include<stdio.h> int main(){ int hairetu[10]={4,2,3,5,1,6,4,7,10,9}; int max_index,temp,k,i,j; for(i=0;i<10;i++){ max_index = i; for(j=i;j<10;j++){ if(hairetu[j]>hairetu[max_index]){ max_index = j; } } temp = hairetu[i]; hairetu[i] = hairetu[max_index]; hairetu[max_index] = temp; } for(k=0;k<10;k++){ printf("hairetu[%d]=%d\n",k,hairetu[k]); } return 0; }
>>25 もありがとうございました。
これぐらいすぐできるように頑張らないとだ。
>>22 って前スレの最後の方のソートのネタだよな?
単純なソートは、挿入ソートを覚えておこう。 ちょっと複雑なときはqsortを使うか、シェルソートで。
安定なソートはどれのことをいうの?
私が挿入ソートを再開発したのはマージャンソフトを改変しているときだった。 オリジナルの単純選択法の遅さを解決できたのみならず、ソートする過程を そのままパイの移動の絵にできて大変楽しんだものだ。
ソートについて覚えておくべきなのは std::sort() std::stable_sort() std::partial_sort() std::nth_element() std::partition() std::stable_partition() だな。自分で書く必要は「ない」。
>>29 std::stable_sort()
(普通マージソートで実装されている)
36 :
デフォルトの名無しさん :04/03/03 00:40
ひーぷそーとぜんぜんわからん
>>36 コードは説明より物を言う。手持ちの処理系のC++標準algorithmヘッダの
std::sort_heap()の実装を眺めてみてはどうだろう。
38 :
デフォルトの名無しさん :04/03/03 01:16
横レスでスマンですが、
>>23 の i は何を表してるんですか?
どの部分だかわからない
>>38 探索するyの値の最大値
だんだんと狭い範囲を処理するようにする
qsort()はクイックソートで実装されている保証は規格にないんだね。知らなかったよ。
>>40 要素数が少ないときはバブルソート、多いときは基本的にはクイックソート、
クイックソートが苦手な並びに対してヒープソートしてます、みたいな実装
の話を聞いたことがあるなぁ。
/*配列の全要素を逆順に並べ替える */ #include <stdio.h> int main(void) { int i; int vx[5]; for(i=;i<5;i++){ printf("vx[%d]:",i); scanf("%d",&vx[i]); } for(i=0;i<2;i++){ int temp = vx[i]; vx[i]=vx[4-i]; vx[4-i] =temp; } for(i=0;i<5;i++) printf("vx[%d]=%d\n",i,vx[i]); return(0); }
↑このプログラムをコンパイル使用とすると エラーが多発しまつ。 for(i=;i<5;i++) ここの文でエラーがでるYOと怒られます。 バグが分かりません ヒントでいいので教えてください。
>>43 for(i=;i<5;i++) ←この行に構文の間違いがあるよ
ってか、普通気付かんか?
ネタ便でーす。 今度のネタは、 UNIXタイムと指定時間の相互変換をするのにはどのようにするか? です。
46 :
デフォルトの名無しさん :04/03/03 10:39
ぼるじょあって誰????
>>45 ネタといいつつ本当は宿題なんではと思ったりしつつも、
宿題の少ないこの時期に提供ごくろうさん。
UNIXタイムをテキストにするにはctimeとかlocaltime+strftimeで片付くだろうけど、
逆はパーザが面倒っぽいね。
フォーマットを ISO 8601 の制限つきとかに固定した方が、より宿題っぽくなる。
あとは、うるう秒をどれだけまじめにやるか。
>>44 回答サンクス
自分で見直してて
ちょっとあきれてしまいました。
49 :
デフォルトの名無しさん :04/03/03 17:19
age
STLなんですが 構造体の要素が特定の値であるものを検索する方法を教えてください 下記のdefの値がたとえば100のものを探したい場合はどのように記述すればよいのでしょうか。 struct STLLIST { int abc; int def; }; vector<STLLIST> StlList; find(StlList.begin(),StlList.end(),StlList.def==100); <---もしろんエラー STLの勉強をはじめてまだ1日です。 しょうもない質問だとは思うのですが、よろしくおながいします。
>>50 ファンクタ(関数オブジェクト)を使ってfind_if
あとは自分で調べるよし。勉強だ。
find_if(StlList.begin(),StlList.end(),StlList.def==100); と安易に記述してもエラーですた。 vector<int>の例を発見したのですが 構造体の例がありません(涙 vector<int>なら find_if(StlList.begin(),StlList.end(),bind1st(equal_to<int>(),100)); と書けばよさそうなことはわかりました。 でも構造体での指定の仕方がわかりません。 構造体の特定の要素について指定するにはどうすればよいのでしょうか。
だれか親切な人教えてください。
>>53 >構造体の例がありません(涙
「でもクラスの例はあります」ってことはないよね?
>>50 だからファンクタ使えといってるだろヴォケ
あとはスレ違いだから自分で調べろ
一番しりとりを長く続けられるプログラムのソースキボン
62 :
デフォルトの名無しさん :04/03/03 22:43
C++ で C の system(3) 見たいなことをするにはどうするのでしょう。 環境は gcc-c++-3.2 です。
63 :
デフォルトの名無しさん :04/03/03 22:45
>>62 #include <cstdlib>
std::system("cmd");
サンキュです。
要するにだれもわからないということなのですね。
>>50 struct pred
{
bool operator()(const STLLIST& x) const
{
return x.def == 100;
}
};
とか構造体を定義しておいて(これをファンクタという)、
std::vector<STLLIST> StlList;
std::vector<STLLIST>::iterator it = std::find_if(StlList.begin(), StlList.end(), pred());
とする。
STLにこだわらないならboost::lambda使って
std::vector<STLLIST>::iterator it = std::find_if(StlList.begin(), StlList.end(), boost::bind(&STLLIST::def, _1) == 100);
みたいに書ける。
こういう話題は初心者歓迎C/C++室当たりかな。
http://pc2.2ch.net/test/r.i/tech/1077102238/ 携帯からなんでtypoとかあったらスマン。
>>50 struct pred
{
bool operator()(const STLLIST& x) const
{
return x.def == 100;
}
};
とか構造体を定義しておいて(これをファンクタという)、
std::vector<STLLIST> StlList;
std::vector<STLLIST>::iterator it = std::find_if(StlList.begin(), StlList.end(), pred());
とする。
STLにこだわらないならboost::lambda使って
std::vector<STLLIST>::iterator it = std::find_if(StlList.begin(), StlList.end(), boost::bind(&STLLIST::def, _1) == 100);
みたいに書ける。
こういう話題は初心者歓迎C/C++室当たりかな。
http://pc2.2ch.net/test/r.i/tech/1077102238/ 携帯からなんでtypoとかあったらスマン。
すまん、手元が狂った。 スレ汚しスマン
>>60 #include <iostream>
int main()
{
for (;;) std::cout << "くじゃく" << std::endl;
}
>>65 だからC++スレに来いって。ネタがなくて皆ひもじい思いを
してるから。
#include<stdio.h> main(){ printf("abcde\n"); } こーゆーソースをパソコンで実行できるフリーツール は「phoebe」ってやつが一番お勧めですか?
秒数を入力すると、時分秒で出力されるプログラムお願いします! 例)3920秒を入力すると、1時間5分20秒とでる。
1、長方形の面積を計算して返す関数をお願いします。 関数は、長方形の縦と幅のパラメータそれぞれ一つを含み、整数を使う。 2、長方形の縦と幅を整数で入力すると、面積と周囲がでるプログラムをかいて ください。(1の関数を使ってお願いします。) 例)縦5、幅4、を入力すると、面積20と周囲18が出る。
>>76 1.
int chouhoukeinomenseki(int tate, int haba) { return tate * haba); }
2.
void chouhoukeinomensekitoshuui(int tate, int haba)
{ printf("menseki%dshuui%d",chouhoukeinomenseki(tate, haba),2*(tate+haba)); }
>>73 厚生労働省ってところになんかあるんですか?
自分はphoebeと、LSI C-86 Ver.3.30c 試食版
ってコンパイラで、一応プログラム実行できてるのですが・・。
下のプログラムは、Fahrenheit(華氏)をCelsius(摂氏)に変換するというもの なんですが、このプログラムを次のような構成でかきなおしてください。 Celsiusを計算する関数とその値を返す関数を別別にしてかく。 main()が、Fahrenheitで入力されて、関数を呼んで、関数によって返された値を出力する。 #include <stdio.h> int main(void) { int fahrenheit, celsius; printf("Enter a temperature in fahrenheit:"); scanf("%d", &fahrenheit); celsius=5*(fahrenheit-32)/9; printf("%d in Fahrenheit is %d in Celsius.\n", fahrenheit, celsius); return 0; }
80 :
デフォルトの名無しさん :04/03/04 16:02
>>78 なぜファイル名で言う。
C言語を始めよう!と言え。
あとコンパイラはBCCも入れたほうがいいかと。
>>77 すいません、
#include <stdio.h>
void ここなんですか?
{ printf(".....", ここなんですか?(tate, haba
>>77 すいません、全部書いてくれませんか・・?
初心者なので、あいまいでよくわからないで、うまくいきませんでした
>>80 早レスサンクス!
phoebeっていうのが、このアプリの略称かなーと思ったので‥すみません
BCCっていうのも入れてみますね。
>>79 #include<stdio.h>
void Celsiuswokeisansuru(int *celsius, int fahrenheit){*celsius=5*(fahrenheit-32)/9;}
int sonoataiwokaesu(int fahrenheit){int celsius;Celsiuswokeisansuru(&celsius,fahrenheit);return celsius;}
int main(void)
{
int celsius,fahrenheit;
printf("Enter a temperature in fahrenheit:");
scanf("%d", &fahrenheit);
celsius=sonoataiwokaesu(fahrenheit);
printf("%d in Fahrenheit is %d in Celsius.\n", fahrenheit, celsius);
return 0;
}
>>82 #include<stdio.h>
int chouhoukeinomenseki(int tate, int haba){return tate*haba;}
void chouhoukeinomensekitoshuui(int tate, int haba)
{printf("menseki%dshuui%d",chouhoukeinomenseki(tate,haba),2*(tate+haba));}
int main(void){int tate,haba;printf("tate=");scanf("%d",&tate);printf("haba=");scanf("%d",&haba);
chouhoukeinomensekitoshuui(tate,haba);return 0;}
86 :
デフォルトの名無しさん :04/03/04 16:20
おまいらわざとやってるなw
>>84 >>85 さん、素早いお返事どうもありがとうございます。
よければ、
>>75 もお願いできますか??
結構時間かけてやっても、なかなかうまくいかないんです。。
そんなんじゃプログラムできるようにならないよ。 自分でやる力をつけないと、分からないところは自分で調べる、これ基本。 スレ違いなのでsage
>>87 #include<stdio.h>
int main(void){int t;printf("秒数=");scanf("%d",&t);
printf("%d時間%d分%d秒",t/3600,(t%3600)/60,(t%3600)%60);
return 0;}
90 :
デフォルトの名無しさん :04/03/04 16:27
>>88 誤爆だし、一番上のスレッドでsageているし、もうさんざんですね。
>>87 #include<stdio.h>
int main(void){int t;printf("秒数=");scanf("%d",&t);
printf("%d時間%d分%d秒",t/3600,t%3600/60,t%3600%60);
return 0;}
>>90 アッハッハというしかないですね。
取り合えず脳内free()で開放してきます。
>>91 素晴らしい!!!!
なんでそんなにすぐにできるんですか・???
私も
>>91 さんみたいになれるようにがんばります!!
ありがとうございました!
>>93 > なんでそんなにすぐにできるんですか・???
89をコピペして無駄な括弧を消しただけだから。
>>89 さん≠
>>91 さん??
問題を解いてくれた皆さん有難うございます。
私も早く皆さんのようにプログラミングを極めたいです!
おいおいネタか? 極めたいと思うのならこんな問題自力で解いて見せてくれ
>>93 >なんでそんなにすぐにできるんですか・???
2〜3日前にどっかのスレで同じ問題を解いたから。
double main() { return 0.0 }
>91 >t%3600%60 秒は t%60 で十分だろ?
>100
これchar g; ='F';と、10行目にエラーがあるらしいんですが見つけれません。。 Name used before setとでます。 どこが間違っているでしょうか?? #include <stdio.h> double average(int a, int b, int c); char computegrade(double a); void printresult(char* k, char g); void main(){ int t1, t2, t3; char* name; char g; double d; int i; for (i=0; i<3; i++){ printf("what is your name:"); scanf("%s", name); printf("%s Enter your three tests\n",name); scanf("%d %d %d", &t1, &t2, &t3); d=average(t1, t2, t3); g=computegrade(d); printresult(name, g); }} double average( int a, int b, int c){ return (double)(a+b+c)/3; } charcomputegrade(double a){ char g; ='F'; if (a>=90) g='A'; else if (a>=80) g='B'; else if (a>=70) g='C'; return g; } void printresult (char* k, char g){ printf("%s your grade is: %c\n", k, g); }
>>101 > char g; ='F';
最初のセミコロンは不要かと。
103 :
デフォルトの名無しさん :04/03/05 16:24
char *nameでは文字列を格納する領域が取れてません.
>>102 そうでした。。
Warningっていうのはエラーではないのですか?問題は無いのですか?
>>105 char *name を
char name[256] とかにする
>>101 のプログラムに
最優秀成績者と最低成績者をディスプレイできるように
変更して下さい。
>>101 =107
何でこのスレがあるって知ってて別スレにマルチする?
>>108 すいません。。
このスレに人がいなかったので。。
110 :
デフォルトの名無しさん :04/03/05 19:28
#include <stdio.h> double average(int a, int b, int c); char computegrade(double a); void printresult(char* k, char g); void main(int argc, _TCHAR* argv[]){ int t1, t2, t3; char name[100]; char g; double d; int i; char TopName[100],WorName[100]; double TopAve = 0,WorAve = 100; for (i=0; i<3; i++){ printf("what is your name:"); scanf("%s", name); printf("%s Enter your three tests\n",name); scanf("%d %d %d", &t1, &t2, &t3); d=average(t1, t2, t3); if (d > TopAve){ TopAve = d; strcpy(TopName,name);} if (d < WorAve){ WorAve = d; strcpy(WorName,name); } g=computegrade(d); printresult(name, g);} printf("Top %s : Worst : %s\n", TopName, WorName);} double average( int a, int b, int c){ return (double)(a+b+c)/3;} char computegrade(double a){ char g ='F'; if (a>=90) g='A'; else if (a>=80) g='B'; else if (a>=70) g='C'; return g;} void printresult (char* k, char g){ printf("%s your grade is: %c\n", k, g); }
111 :
デフォルトの名無しさん :04/03/05 19:54
失礼 この行を void main(int argc, _TCHAR* argv[]){ ↓ void main(){ へ直して。
114 :
デフォルトの名無しさん :04/03/06 03:02
115 :
デフォルトの名無しさん :04/03/06 03:12
>>110 char name[100] の100はなんで100なんですか?
>>115 100文字ぶんもとっておけば名前を入力するには充分だろうという
楽観的な発想から!
最初に3桁になる数だから
あとでメンテ仕事の工数をとりたいから
>>115 は実はベテランプログラマーなので2の倍数以外は適当な数として認められません。
>119 バカ? 本当のところは ビット長の2の倍数がよかろう。128とか。
「ビット長の2の倍数」ってなんですか?
2の乗数?
冪(巾)
わかったわかった。 xが適当な数である <==> x ∈{2^t|t∈N} ただしNは自然数全体の集合 これで良いか?
>>125 それはわかったけどさ、バッファのサイズが128とかそうである理由は何?
宿題スレで
>>121 みたいな事言うのもなんだかなぁと思うんだが。
オレも前から疑問に思ってた 2の乗数だと領域の確保がスムーズに行われるとか そういうのがあるの?
>>128 言語とは直接は関係しない無い話だよ。
ましてや宿題とはなおさら関係無い。
OSやCPUのアーキテクチャを学べば、自然と2の冪を使いたくなる。 そういう数字だ。
この話題は俺に聞けスレのほうがいいとおもーよ。
132 :
wakaranai :04/03/07 12:32
10日分の時間と分を入力していき,表形式で表示する という問題を出されたのですが、解けません。 どなたかお助けを・・・
134 :
wakaranai :04/03/07 12:36
#include <stdio.h> struct jikan { int h; int m; } void input (struct jikan b[],int n); void output struct jikan c[] ,int n); struct jikan keisan (struct jikan d[],int n); void main (void) { struct jikan a[10],sou; input (a,10); output (a,10); sou = keisan ( ? , ? ,); printf("|総合|%4d|%2d|\n",???,???); printf("+------------+\n"); }
135 :
wakaranai :04/03/07 12:37
134の続き void input (struct jikan[],int n); { sou = keisan (?,?,);{ printf("%d日目\n",i+1); printf("時間->"); scanf(%d,?); printf("分->"); scanf(%d,?); } } struct jikan keisan (struct jikan d[],int n) { struct jikan s; int i; s,h=0; s,m=0; for (i=0; 計算 計算 } 計算 計算 return s ; } の???と計算のところがわからないです。
>>135 ネタっぽいけど混じれ酢してみる。
>???と計算のところがわからないです。
そこだけ直したって動きません。
まずC言語の勉強をしましょう。
>>132 問題の意味がわかりません。予定表かなんか?
>>132 出力結果の具体例を見せてくれないと書きようがない。
>>132 宿題はこういうのを書けということか?
#include <stdio.h>
#define DAYS 10
typedef struct data { int hour; int minute; } Data;
void input(Data *data) { int i; for (i = 0; i < DAYS; ++i) {
printf("\n-------- %2d日目 --------\n", i + 1);
printf("時間> "); scanf("%d", &(data[i].hour));
printf(" 分> "); scanf("%d", &(data[i].minute));
} }
void output(Data *data) { int total_hour = 0, total_minute = 0, i;
printf("+--------+------+------+\n| | 時間 | 分 |\n");
printf("+--------+------+------+\n"); for (i = 0; i < DAYS; ++i) {
total_hour += data[i].hour; total_minute += data[i].minute;
printf("| %2d日目 | %4d | %4d |\n", i+1, data[i].hour, data[i].minute);
printf("+--------+------+------+\n"); }
printf("| 総合 | %4d | %4d |\n", total_hour, total_minute);
printf("+--------+------+------+\n");
}
int main(void) { Data times[DAYS]; input(times); output(times); return 0; }
140 :
デフォルトの名無しさん :04/03/07 18:24
今年分のカレンダーを表示させたいんですが、これ以上できません。 難しい技術はわからないのでこのぐらいのレベルで、ちゃんと動くプログラムを教えてください。 main(void){ int month[]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int m;/*月*/ int h;/*日*/ int s=4; char buf[100]; printf("month="); gets(buf); m=atoi(buf); printf("\n%d月\n",m); for(h=0;h<m;h++){ s=s+month[h]; s=s%7; } printf(" SUN MON TUE WED THU FRI SAT\n"); for(h=0;h<s;h++) { printf(" "); } for(h=1;h<=month[m];h++){ printf("%4d",h); if((s+h)%7==0){ printf("\n"); } } }
system("cal");
ごめん。曜日を全く考慮に入れてなかった。 逝ってくる。
訂正
/*
http://www.eskimo.com/~scs/C-faq/q20.31.html */
int dayofweek(int y, int m, int d)
{
static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
y -= m < 3;
return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
void calendar(int m)
{
int i, skip;
printf("==== %s ====\n", months[m]);
printf("SUN MON TUE WED THU FRI SAT\n");
skip = dayofweek(2004, m, 1);
for (i = 0; i < skip; i++)
printf(" ");
for (i = 1; i <= days[m]; i++)
printf("%3d%s", i, ((i + skip)%7 == 0) ? "\n" : " ");
printf("\n");
}
>>144 ありがとうございます。
でも、visual C++でエラーが出て実行できないんですが…。
>>145 #include <stdio.h>
int main()
{
int days[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int i, m, s = 4;
for (m = 1; m <= 12; m++) {
printf("%d月\n", m);
printf("SUN MON TUE WED THU FRI SAT\n");
for (i = 0; i < s; i++)
printf(" ");
for (i = 1; i <= days[m]; i++)
printf("%3d%s", i, ((i+s)%7 == 0) ? "\n" : " ");
printf("\n");
s = (s + days[m]) % 7;
}
return 0;
}
>>147 プ 結果ずれてるよ。
しかも
>>140 は何月か指定してその月を表示させるやつだろ
これでいいか?
h
連続する半角空白は切り詰められるとみた。 半角空白8文字 " " &nbsp; " " 全角空白4文字 " "
135さん。おっしゃるとおりです、 ほとんど何も解りません・・・ 139さん。 不完全なソースから私の希求するものを読み取っていただき有難うございます。 路が見えたような気がしましたので何とかしてみようと思います。
main(){ char a[2][3]; char *i; i=(char*)a; printf("%p %p %p %p",i,&a[0][0],&a[1][3],i+6);} (char*)とせず、i=a; でも結果は 同じになります(コンに叱られるけど i=(char*)a; との違いは、どんなものなんでしょうか ? (早速、ポインタで つまずきました (char*)が、何で必要なのかが わかりません
・省略して呼ぶな。 ・警告は警告、叱っているわけではない。 ・そもそも型の違うものを代入するから警告している。
略したい年頃なんだよ、きっと
こちらで質問します。宜しくお願いします。 「バイナリエディタ」で開くと 例えば 12 34 EF なるファイルがある場合 そのファイルを読み込んで内容をウインドウに表示する サンプルを教えてください。 バイナリモードでファイルを読み込んで その内容をウインドウに表示するプログラム です。
>>155 問題文はちゃんと最後まで読めよ。
>>154 >その内容をウインドウに表示するプログラム です。
>>156 プログラムを実行したウィンドウに表示されますが?
俺の環境でも仕様を満たしてるよ
160 :
こんぴゅ− :04/03/09 00:29
評価と評価値それぞれの意味を教えてもらえませんか。 迷惑かけてごめんなさい
Cでの話ということなら、式の値を求めることが評価、その結果が評価値。 どっかでたてたスレの内容に関連づけるなら、3とかa=3とか、例示されてる もの全てが式。 ただ、それに;をつけたら文だから、ちょっとちがうんだけどな。
162 :
デフォルトの名無しさん :04/03/09 00:36
>>159 ウィンドウ=コンソールだと勝手に思ってしまっていました・・・・・。
で、環境に依存か。
つーか、どーせ環境依存なら X Window にしてほしかった。
>>154 >VC++6.0を使っています。
X Window ???
>>165 お手数おかけしました。
できました。
ソースファイルをみて勉強したいと思います。
ございました。
>>166 > つーか、どーせ環境依存なら X Window にしてほしかった。
X Windowってなんですか?まさかX Window Systemの事ではないですよね?
C言語でソースプログラムをコンパイルするという一連の流れの中でアセンブルの後の「リンク」とはいったい何をしているのか教えてください。できるだけ詳しく。優秀なプログラマーさんお願いします。
>>171 優秀なプログラマはこんなところにはいません。
俺は優秀
175 :
デフォルトの名無しさん :04/03/10 01:59
ありがとうございました
rectureって……
178 :
教えて・・・ :04/03/10 11:21
#include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください: "); scanf("%d", &num); /* 約数があるかどうかを調べる */ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1) printf("素数です"); else printf("素数ではありません"); return 0; } これの説明してもらえますか・・・
日本語になっている所だけ読めばわかるだろ? ・判定したい数を入力 ・約数があるかどうか調べ ・素数か素数でないか表示
180 :
デフォルトの名無しさん :04/03/10 12:26
numより小さい数でわれないならば素数なんですよ。 なんでforでmun/2までを調べているかは自分で考えてみたらわかるよ。
どうでもいいことかもしれんが 約数が最初にみつかった時点で break しないと明らかに無駄な処理が続くぞ #大元のアルゴリズムが素直すぎるんだけどそれは別にして i=i+1 とかも気になる。
検査はsqrt(num)まででいいんだけど
日付と曜日に問題ですが よく日記で3月10日水曜日と書いてあるだけで(ファイル名とかでも)年がわからないときがあります。 そこで何月何日何曜日と入れたら該当する年を10年先から過去へ5個表示させるプログラムを作りたいのです。 曜日はMon Tue Wed Thu Fri Sat Sunと仮定してます 例 (入力) >03 10 Wed (出力) 2010 2004 1999 1993 1982 自力では年月日から曜日を求めるプログラムの関数を用いて10年先の同月日から曜日が一致する年を 順に表示していくことで対処しましたが何か効率が悪いようです。 よろしくお願いします
> 年月日から曜日を求めるプログラムの関数を用いて10年先の同月日から曜日が一致する年 これでも大きな問題はないんと思うけど、 効率が悪いってどれくらいを期待して、 どれくらいになったの? 曜日を求めるアルゴリズムが悪いとか? 効率をどうしても上げないといけないなら、 うるう年の2/29をまたぐかどうかで、 前年の同日が何曜日かというのはすぐわかるから、 それを使っては?
185 :
デフォルトの名無しさん :04/03/10 21:10
* で、半径1の円を30倍にして表示させたいんですが、どんなプログラムになりますか? 勉強しはじめでもわかるぐらいな、簡単な感じでお願いします。
186 :
デフォルトの名無しさん :04/03/10 21:38
質問失礼します。 プログラミングの勉強をしようと思ってC言語の入門書片手にやり始めたのですが Sample1.cというソースファイルをコンパイルしてSample1.exeというファイル にするというところでいきずまっています。 その入門書には\CGENGO\PRACTICEに移動してdirでSample1.cがあるのを 確認した後Lcc Sample1 と入れてEnterでコンパイルとなっているのですが 以下のような文がでてきてできません.なぜできないのでしょうか? これだけの情報ではわからないかもしれませんがご教授の願います。 Microsoft (R) KKCFUNC バージョン1.10 Copyright (C)Microsoft Corp. 1991,1993. All rights reserved. KKCFNC が組み込まれました。 マイクロソフトかな漢字変換 バージョン 2.51 (C)Copyright Microsoft Corp. 1992-1993 エラー:エクスドメモリーマネージャーがすでにくみこまれています。 XMSドライバは組み込まれていません。 Microsoft (R) KKCFUNC バージョン1.10 Copyright (C)Microsoft Corp. 1991,1993. All rights reserved. KKCFUNCはすでに組み込まれています。 コマンドまたはファイル名が違います。 lcc: can't exec: cpp: No such file or directory
マルチだし宿題じゃないし
>>186 あんたにLSI-Cは無理だ。C言語スレで紹介されているコンパイラを使うことは強くお勧めしておくよ。
スタックソをもちいて 入力 12+4* 出力 12 となるようなプログラムを書きなさい。(数字は一桁でよしとする)
スタックを用いて逆ポーランド表記された数式を計算するプログラムを作りなさい。 入力例:12+4* //コマンドラインから文字列として入力される 出力例:12 //標準出力へ出力 また、入力される数式に使用される数値は0〜9とする。
3倍速で 2時間14分か
>>191 できたよ。
#include <stdio.h>
#include <string.h>
void stackso(){}
void main(int argv,char *argc[])
{
if(argv==1)return;
if(strcmp(argc[1],"12+4*")!=0){
puts("コマンドラインがおかすぃ");
return;
}
stackso();
puts("12");
}
1〜10までの整数を使って、4段の逆三角形を自動的に作成する 任意の逆三角形を取り出すと上の二つの数の差が下の数と等しくなる 1度使った数は使用してはならない 例) 1 6 4 5 2 (6-1=5, 6-4=2) 3 (5-2=3) Cで、処理の部分は10行程度で出来るらしいのですがさっぱり思いつきません どなたかご教授願います
すべての順列を列挙する方法がわかるなら、 順列を一つ作るたびに判定していけば? 順列を完成させなくても作る途中で満たさないとわかる場合もあるけど。
>>191 #include <stdio.h>
#include <string.h>
int a[100],b=0;void U(int c);int O();int main(){char d[100];int i,l,r;fgets(d,1\
00,stdin);for(i=0;i<strlen(d);i++){if(d[i]>='0'&&d[i]<='9'){U(d[i]-'0');}else{r\
=O();l=O();switch(d[i]){case '+':U(l+r);break;case '-':U(l-r);break;case '*':U(\
l*r);break;case '/':U(l/r);break;default:U(l);U(r);break;}}}printf("%d",O());\
return 0;}void U(int c){a[b++]=c;}int O(void){return a[--b];}
限りなく適当。エラー処理なんてやってない。
turbo c++てのを使ってるんですが、量子あたりの問題で円とか競技場とか楕円の中でビリヤードの玉を打った軌跡をグラフィック表示させるやつありますよね? その辺のは解ったのですが円の中にもう一つ小さな円変があった場合のプログラムがどうしてもわかりません。教えていただけないですか?
>>199 日本語と、自分の意図を相手が汲み取れるように
文章を書く思いやりを勉強しろ。まずはそれからだ。
201 :
デフォルトの名無しさん :04/03/15 21:53
ageてみる
>>202 円が1つの場合は分かったんだろ。
どうして円が2つの場合が分からないんだ。
まず、そこら辺の説明ができないとな。
>>200 俺はすぐ分かったよ。読み手の読解力の問題もあるな。
四角い台はわかった(これは自分で書けたという意味だと思っていいんだな?)なら 次に丸や楕円の台の反射は書けたのか? 四角からそこに行く方がそこから内部に丸が入るより よほど難易度の増加が激しいはずだが。
丸や楕円は授業で行ったので一応理解はしました。 丸が1つの時は玉が円とぶつかる時ぶつかる点というのは確実に1つしかないですよね? ですが丸の中にさらに丸があるということになると、ぶつかる点の候補が最大3つになります。この三つのうち一番近くの点に決定するためにはどうしたらよいかわからなくて困っています。
>>199 成歩堂君。発想を逆転させるのよ。
円と玉の組み合わせで考えるから難しくなるの。
"玉の半径分大きい"円と点の問題に変換すれば、
ただの距離公式で片付くわ。
わからねぇっす。千尋さん 星影さんにも解るようにお願いします。
んもう! 成歩堂君全然駄目じゃない!
210 :
デフォルトの名無しさん :04/03/16 18:43
ソースファイルを読み込み、そのソースファイルの構成を標準出力ファイルに 表示する(ライブリ関数のみ) ex) XXX.Cのファイル構成 ライブラリ関数名 使用回数、 printf() 3回、 scanf() 2回、 ・ (中略) ・ ・ ・ ライブラリ関数使用回数 合計n回 上記の様にライブラリ関数の使用回数を各関数ごとにカウントして 最後に合計回数を出力すると言うもんだなのですが。 どうしたらよいですか?
条件がそれだけだと、Cプリプロセッサとパーサを書く必要があるんだが。 マクロで置換されることはないとか、文字列の中やコメントの中には存在しな いか存在したら数えてもいいとか、なんか条件ないの?
212 :
デフォルトの名無しさん :04/03/16 19:17
失礼しました。 main関数,および文字列内の関数は表示、/* コメントは除外 */ プリプロ、サブルーチン内は無視です。
213 :
デフォルトの名無しさん :04/03/17 00:47
4桁の数字の組み合わせを求めるプログラムをお願いします。 例えば、0123という4桁の数字なら 0123、0132・・・・・3210の24通りの組み合わせがあります。 この24通りの数字を求めるプログラムをお願いします。
>>214 すいません、数字が連続してない場合も
>>214 のサイトのルーチンでできますか?
3579とかの場合でも、24通りの組み合わせを出したいのですが。
>>215 まったく同じじゃ多分無理。
1〜Nっていうのを a[1]〜a[N] (a[] = { 3, 5, 7, 9 })とかに
置き換えればできるんじゃないかな。
ちゃんと読んでないからわかんない。
>>210 STLに確か組み合わせの集合を得るそのままの関数があった気がする
218 :
デフォルトの名無しさん :04/03/17 02:58
>>213 何も考えないバージョン
int atom[]={1,2,3,4};
int main()
{
for(i=0; i<4; i++) {
for(j=0; j<4; j++) {
for(k=0; k<4; k++) {
for(l=0; l<4; l++) {
if(i==j || i==k || i==l ||
j==k || j==l ||
k==l) continue;
printf("%d%d%d%d",atom[i],atom[j],atom[k],atom[l]);
}}}}
}
219 :
デフォルトの名無しさん :04/03/17 03:01
>218 4つめのforの終了条件は K<4 X l<4 O あと変数宣言してなかった。。。逝って来ます
220 :
デフォルトの名無しさん :04/03/17 03:42
>>213 ,>219
が正しい!
#include <stdio.h>
int atom[4]={1,2,3,4};
int main()
{
int i,j,k,l;
for(i=0; i<4; i++) {
for(j=0; j<4; j++){
if(i==j) continue;
for(k=0; k<4; k++) {
if(i==k || j==k) continue;
for(l=0; l<4; l++){
if(i==l || j==l || k==l)
continue;
printf("%d%d%d%d\n",atom[i],atom[j],atom[k],atom[l]);
}
}
}
}
return 0;
}
あるフォルダを再帰的に削除するプログラムをスパッと 書いていただけませんでしょうか?
あるフォルダって? 削除の方法は? パスの持ち方は? で、それ宿題?
#include <stdlib.h> int main() { System( "rm -r /" ); }
そもそも処理系がわからん
225 :
デフォルトの名無しさん :04/03/17 08:32
226 :
デフォルトの名無しさん :04/03/17 09:19
210ですどなたかヒントなりを〜〜
227 :
デフォルトの名無しさん :04/03/17 09:24
ライブラリ関数ってのは標準ライブラリのことか? 全てに対応しようと思ったら、かなりめんどくさいのだが。
229 :
デフォルトの名無しさん :04/03/17 09:46
>>211 も言っているがCプリプロセッサをつくらなければならない。
230 :
デフォルトの名無しさん :04/03/17 11:37
すいません、次の演習問題を教えてください。 繰り返しデータ入力可能とし"^"(サーカムフレックス)という文字でプログラム終了する。 ・標準入力から入力されたデータの入力番号をコンソールに表示する。 ・標準入力から入力された文字数をコンソールに表示する。(空白も1文字と数える) ・標準入力から入力された単語の数をコンソールに表示する。 単語の区切りは、1バイトスペース(0x20)1個以上で判断する。 空白は2個以上ある場合もあるので注意すること ・使用する標準関数は以下ののものを最低限使用する。 ・printf()・scanf()・stren() 形式:int exp13 実行形式:以下はサンプルです。用件をみたしていれば入出力の形式は問わない。 exp13〔Enter〕 input word 001: AB CDE *****check Word***** 入力番号1 文字数=7 単語数=2 *****check word***** input word 002: ^ *****ProgramExit!
231 :
デフォルトの名無しさん :04/03/17 11:43
>>230 その例ではAB CDEと^は入力で、それ以外はプログラムから出力するんだな?
二番目の*****check word*****は間違いじゃないんだな?
232 :
デフォルトの名無しさん :04/03/17 11:52
っていうかscanf使うなよ。 むしろ「wc」コマンドと同じようなものを作らせたほうがよほど勉強になる。 文句あるなら作ってみろ!
233 :
デフォルトの名無しさん :04/03/17 12:02
scanfのところでつまった。 頼む、fgetsで入力させてくれ。
234 :
デフォルトの名無しさん :04/03/17 13:18
>230 int exp13 これは何に使うか分からないがとりあえず下のソース参考にして。 #include <stdio.h> #include <string.h> #include <ctype.h> #define Max 256 int checkWord(char *str) { static int num=1; int word=0,nc,i=-1,sign=0,exit=0; nc=strlen(str); printf("Input word : %03d\n",num); while(str[++i] != '\0'){ if( isalpha(str[i])==1 ){ sign=1; } else{ if(sign==1){sign=0;word++;} if(str[i]=='^'){exit=1;break;} } } printf("Input Number:%d The number of characters : %d word : %d\n",num++,nc,word); return exit; } int main () { char str[Max]; while(1){ fgets(str,Max,stdin); if(checkWord(str)==1){break;} } return 0; }
235 :
デフォルトの名無しさん :04/03/17 16:27
1から100までの素数を求めるプログラムを教えてください。 調べても難しいやり方が多いので、初心者でも分かるレベルでお願いしたいです。
>>235 googleで、["2 3 5 7 11" 97]を検索する
#include<stdio.h> int main(void){ int i,j; for (i=2;i<=100;i++){ for (j=2;j<i;j++){ if (i%j==0) break; } if(i==j) printf("%d ",i); } }
239 :
デフォルトの名無しさん :04/03/17 16:39
return 0; 忘れた。
return 0;は付けないのが最近の潮流
>>240 warning: control reaches end of non-void function
-std=c99 つけたら出ないよ
>>242 ほんとだ。探してみたらreturnしなくても0返すとか書いてあるし。
なんかためになったので、サンクス。
244 :
デフォルトの名無しさん :04/03/17 17:40
ハノイの塔の問題が解けません。 条件は再帰を使ってはいけないことです。 どうかお願いします。
>>244 再帰版を見せてみろ。
書き直してやるから。
246 :
デフォルトの名無しさん :04/03/17 17:51
これです。 お願いします。 /*ハノイの塔*/ #include <stdio.h> void hanoi(int, int, int, int); main() { int n; printf("ハノイの塔の解法を提示します。\n"); printf("円盤の枚数を入力してください:"); scanf("%d", &n); hanoi(n, 1, 2, 3); /*棒の最初の位置*/ return 0; } void hanoi(int n, int a, int b, int c) { if( n > 1) hanoi(n - 1, a, c, b); printf("%d→%d\n", a, c); if(n > 1) hanoi(n - 1, b, a, c); }
>>244 再帰は忘れて1から考えたほうがいいぞ。
ループ -> (末尾)再帰 は簡単だが (一般の)再帰 -> ループ は
機械的にはできない。
>>245 がどうやる気なのか知らんが(w
# 問題の意図として、gotoを使うのは再帰と同じで反則だろう。
やっぱり反則だったか… orz
ありがとうございます。
ネットで探してたのですが、なかなか見つからないです。
再帰よりは大変難しいらしいというのは書いてあるのですが(w
>>250 さん
これって再帰⇔反復を比較させる問題のようです。
もし出来たら比較しろとありました。
つかって良いのは、おっしゃる通りwhile程度のレベルです。
gotoとかは、まだ出てきていないので不可かもしれないです。
それにしても、問題で「もしできたら」っていうのはいかがなものか。。。。
linked list使ってスタック作っていいレベルなの? でかい配列用意してそこにスタック作るレベル?
過去ログみたら載ってました。
しかし難しすぎで読めないので、コピーだけ。。。。
>>252 さん
どうもです。
これなら理解できそうです。
わからない文法も出てきてないし。
ただ、この課題に関しては構造体とか駄目なんです。
while,if/else,for,switch程度なんです。
配列とかポインタとか構造体とかレベルは駄目かもです。
もう少し自分でも探してみます。
本当にありがとうございます。
>>252 さん
ありがとうございます。
とにかくすごいの一言です。
でも、動きはさっぱり。。。。。
ここのスレの方がこんなに苦労しているところをみると、
かなり大変な問題なんですね。。。。
このプログラムを理解するよう、がんばってみます。
>>244 なんかみんなgotoのエミュレートばかりのようだね。
おれの思いついた方法は、次のルールに従ってプレートを動かすというもの。
(1) 動かせる中で最大のプレートを動かす
(2) 各プレートは最後に(最近に)動かす時に元あった場所には動かさない。
スタートは、
(3) 最初は一番下のプレートから2,3,2,3..と番号を振る。
インプリメントしてないので、違うかもしれんが。
252さんのプログラムを読んでみました。
考え方としては、僕の最初に書いた再帰の考え方と一緒みたいです。
棒を動かしていって考えるって感じで。
ただ、各if文へ飛ぶ条件が理解できませんでした。
>>247 さん
252さんのプログラムってgoto文のエミュレートなんですか。
ハノイの塔って深いですね。
だから108の種類で作る人とかでてくるのか。
259 :
デフォルトの名無しさん :04/03/17 23:24
ハノイの塔の非再帰問題はダイテルに載ってますな。 まぁ、もちろん解答がないんだが。 だれかダイテルの解答サイトオシエテクレ・・・・・・・・・・・。
void hanoi(int n, int a, int b, int c) { int cnt; for (cnt = 1; cnt <= (1 << n) - 1; ++cnt) { int ic; int tmp = cnt; for (ic = 0; (tmp & 1) == 0; ++ic, tmp /= 2) { } printf("disk %d moves.\n", ic + 1); } } しまった、どこからどこへっての考えてないや。
>>258 > 252さんのプログラムってgoto文のエミュレートなんですか。
Yes. 関数をgotoとflagに直したもの。
ところで、
>>257 は正しいよ。
C言語ではないものでimplementしたのでソースは張らないけど。
>>261 訂正。関数を(gotoに直して、それをさらに)whileとflagに直したもの。
>>260 こんな感じか?
void hanoi(int n, int a, int b, int c)
{
int disk;
int cnt;
char * from = malloc(n + 1);
char * to = malloc(n + 1);
for (disk = 0; disk < n + 1; ++disk) {
from[disk] = disk % 2 == n % 2 ? b : c;
to[disk] = a;
}
for (cnt = 1; cnt <= (1 << n) - 1; ++cnt) {
int ic;
int tmp = cnt;
for (ic = 0; (tmp & 1) == 0; ++ic, tmp /= 2) {
}
if (to[ic + 1] == to[ic]) {
char next = a + b + c - to[ic] - from[ic];
from[ic] = to[ic];
to[ic] = next;
} else {
from[ic] = to[ic]
to[ic] = to[ic + 1];
}
printf("disk %d moves from %d to %d.\n", ic + 1, from[ic], to[ic]);
}
free(from);
free(to);
}
>>247 さん
257に書かれているのも正しいんですね。
なるほど。
さらにネットで探したんですが、252さん以上にシンプルに
書いてあるプログラムには当たりませんでした。
どうやら、もっと知識をつけてから出ないとハノイの塔(非再帰)は無理なようです。
というか、現在の知識の範囲でやるから、さらに難しかったり。
英語圏でも非再帰は情報が少ないみたいです。
というか、ハノイは再帰でやったほうがメモリ食うけど早いという分析がありました。
どうなんでしょうか。
252さんのプログラムは入力時にnに1足したらうまくいきました。
なんとなくですが。
だれか252にコメントつけてやればー。 そうすれば244も納得するんでねーの。 えっ?俺? スマン、俺には出来ん。 もうすぐ社会人だってのに鬱だ。
>>260 >>263 すんません。
読めないっす。
配列は昔やった記憶があるのでなんとかですが。
動的なメモリ確保とかは。。。
>>265 さん
そこをなんとか。。。
下記の条件を満足するフローチャートを書いてください また、そのフローチャートを元にコーディングをして下さい。 @電源投入時5sec間はDuty100%制御 Aその後、PWM制御を行う。方式は下図参照 電源電圧 15V以上で、Duty 75%制御 電源電圧 11V以下で、Duty 100%制御とする。 B本プログラムは1msのタイマ割込みで発生するものとし、 出力のON,OFFも1ms単位で行われるものとする。 Duty[%] 100┝━━━━━━━┓ │ ↑ ↓ 75 ┝ーーーー━━━━━ │ l l │ l l │ l l └───────── 11 15 高圧電流[V] お願いします・・・・
× 高圧電流 ○ 電源電圧
それはC/C++の宿題なのか? 電圧云々とか、せめて制御用の擬似コード示さないと誰もわかんないよ。
>>268 電源電圧の比較はどうやって行うか。
タイマ割り込み信号は外部から送られてくるのか、自ら発生させるのか。
がわからんとなんともなぁ。
そういう組み込み系はターゲットとするCPUにもよると思う。
麻雀で親が9種9牌で流せる確率をシミュレーションで求めてみて。 0.22か0.32が正解っぽいんだが・・・
>>271 さん
実は読んでもイマイチでした。
>>272 さん
学校の図書館になかった。。。
本屋で読みましたが、この本いいですね。
アルゴリズムは
1.最も小さい円盤を柱kから柱k mod 3+1へ移す。
2.完成なら終了。それ以外なら、最も小さい円盤以外を移す。
3.1へ。
てことで、非常に簡潔で理解できました。
ただ274に書かれてるプログラムはちょっと。。。
てわけで252さんはこれを元になのかなと考え再び読んでみます。
>>276 >ただ274に書かれてるプログラムはちょっと。。。
ん? 何か変?
そんなに無駄な処理とかはやっていないと思うけど?
>>278 さん
いや、配列が。
配列は実は範囲外なのです。
配列を使えば簡単とは様々な人から言われました。
>>277 さん
すごくシンプルですね。
感動しますた。
ちょっと読んでみます。
やっぱりハノイの塔は興味を惹かれる対象なのですか?
/.とかみるとマニアが多いなと。
インドかどっかに数十枚重なったのがおいてあるらしい これをルールに沿って動かすと世界が終わるという言い伝え 実際にこれを手でやると何億年もかかるという
281 :
デフォルトの名無しさん :04/03/18 18:26
>>234 の質問をしたものです。
回答ありがとうございました。
またまた、質問です。
下記の演習問題をご教授ください。
・パラメータとして、3つの数値を与える。
・3つの数値を比較し、大きい順にコンソールに出力する。
・使用する関数は、以下のものを最低限使用する。
・printf()
・ atoi()
・ exit()
形式: int exp str12 str2 str3
Usage str1数値1 0〜65535の範囲までの数値
str2数値2 0〜65535の範囲までの数値
str3数値3 0〜65535の範囲までの数値
出来れば、初心者なので、処理のコメントも入れてください。
以上宜しくお願いします。
282 :
デフォルトの名無しさん :04/03/18 21:07
>281 atoi()を使うということは char str1[10],str2[10],str3[10]; int i1,i2,i3; と定義して scanf("%s",str1); i1=atoi(str1); と言う風に変換しろと言うことでしょうか? exit()は何に使うんだ?
>>282 >exit()は何に使うんだ?
0〜65535じゃなかったらexit()させるんじゃないかな。
if (strcmp(str1,"65535") < 0) exit(1); こうか?
/*
>>281 */
#include <stdio.h>
#include <stdlib.h>
#define numberof(x) (sizeof(x)/sizeof(*(x)))
#define NUM_COUNTS 3
int intCompare(const void *a, const void *b)
{
int ia = *(const int *) a;
int ib = *(const int *) b;
return ia < ib ? -1 : ia > ib;
}
int main(int argc, char **argv)
{
int nums[NUM_COUNTS];
if (argc < numberof(nums) + 1) {
exit(EXIT_FAILURE);
}
for (ic = 0; ic < numberof(nums); ++ic) {
nums[ic] = argv[ic + 1];
}
qsort(nums, numberof(nums), sizeof(*num), intCompare);
for (ic = 0; ic < numberof(nums); ++ic) {
printf("%d\n", nums[ic]);
}
return EXIT_SUCCESS;
}
質問ですが 下記の演習問題の御教授をお願いします。 「n個の整数データを読み込み、大きい順に順付けするプログラムを作成しなさい ただし、データの終りは−1とする。」 まだC言語は習い始めなので良く分からない所があるので・・・ 宜しくお願いします。
288 :
デフォルトの名無しさん :04/03/19 05:28
>>287 入力された値[ランク]の形式で出力
#include <stdio.h>
#include <stdlib.h>
int cmp(const int **x,const int **y)
{
return (**x==**y)?0:**x>**y?-1:1;
}
int main()
{
int array[1024];
int rank[1024];
int *b[1024];
int i,n;
for(i=0;i<1024;i++){
scanf("%d",array+i);
if(array[i]==-1)
break;
}
/* つづく */
289 :
288のつづき :04/03/19 05:29
n=i; for(i=0;i<n;i++) b[i]=array+i; qsort(b,n,sizeof(int *),(int(*)(const void *,const void *))cmp); for(i=0;i<n;i++) rank[b[i]-array]=i+1; for(i=0;i<n;i++) printf("%d[%d] ",array[i],rank[i]); putchar('\n'); return 0; }
290 :
デフォルトの名無しさん :04/03/19 05:31
あ、同じ値でも順位が異なるのは仕様。
>>287 こんなのでどうでしょう。同じ値は同じ順位になります。
#include <stdio.h>
#define N 1024 /* 入力できるデータ数の最大値 */
int main(void)
{
int a[N], r[N]; /* a[]: 入力データ,r[]: データの順位 */
int i, j;
for (i = 0; i < N; i++) {
r[i] = 1;
printf("数値を入力して: ");
scanf("%d", &a[i]);
if (a[i] == -1) break;
for (j = 0; j < i; j++) {
if (a[i] < a[j]) r[i]++;
else if (a[i] > a[j]) r[j]++;
}
}
for (i = 0; i < N; i++) {
if (a[i] == -1) break;
printf("%d の順位は %d\n", a[i], r[i]);
}
return 0;
}
任意のデータファイルから次のようなデータ"2004/01/10 19:58:37DATA=,1111,2222,3333" を取り出して別のファイルに保存するのですが、ファイルの日付と時間を読み込むには どのようにしたらよいでしょうか? 一行の文字列として読み込むならできるのですが (gets()を使ってなら)
見にくかったので ファイルのデータ部分でつ, 2004/01/10 19:58:37 DATA=,1111,2222,3333,・・・・・・,0000
>>292 これを lex に喰わせて
DATA "DATA"{ return DATA; }
NUM [0-9]+{ return NUM; }
"/"{ return '/'; }
":"{ return ':'; }
"=" { return '='; }
","{ return ','; }
[ \t];
これを yacc に喰わせて
goal: date time data;
date: NUM '/' NUM '/' NUM { readdate(); };
time: NUM ':' NUM ':' NUM { readtime(); };
data: DATA '=' list;
list: | ',' NUM list;
後は適当にくっつければいいんじゃないの?
295 :
デフォルトの名無しさん :04/03/19 15:00
>>294 すいません意味まったくわからんのですが
もう少し判りやすくお願いします。
>>295 こんな奴気にするな。かなり適当な回答だから。
#include<stdio.h> int main(void){ char ymd[16],time[16]; char buf[]="2004/01/10 19:58:37 DATA=,1111,2222,3333,・・・・・・,0000 "; sscanf(buf,"%s %s",ymd,time); printf("日付%s\n時間%s\n",ymd,time); return 0; } これは参考になる? 初めにいったほうのデータでは時間とDATAの間に空白がないから %8sに変えればいいけど。(時間が08:45:06と桁数が変わらない表示方式なら)
298 :
デフォルトの名無しさん :04/03/19 16:07
>>297 さん
ありがとうございます参考にさせて頂きます
ところで, やはり文字列としてchar型で代入する
しか方法はないのでしょうか?
>>292 >ファイルの日付と時間を読み込むには
何型の変数にどういう形式で格納するの?
それを言ってくれないと答えようが無い
300 :
デフォルトの名無しさん :04/03/19 16:18
>>299 さん ご指摘ありがとうございます
できればchar型以外の変数に格納したいのです。
gets()を使えば一行読み込めますよね、と言うことは
char型で格納する事はできるので、それ以外の方法があればと
思ったのですが。
ちなみに この後の問題で『新たに作成したファイルからn年n月分のデータを
表示するプログラムを作りなさい』みたいな問題が出てくると思うので。
>>300 なるほど。じゃあこんなのはどうでしょう。
データはdata.txtという名前のファイルに入ってるものとします。
このプログラムでは最初の1行しか読み込みません。
#include <stdio.h>
int main(void)
{
FILE *fp = fopen("data.txt", "r");
int year, month, day;
int hour, minute, second;
char data[256];
fscanf(fp, "%d/%d/%d %d:%d:%d DATA=%s", &year, &month, &day, &hour, &minute, &second, data);
fclose(fp);
printf("%d年%d月%d日 %d時%d分%d秒のデータは %s\n", year, month, day, hour, minute, second, data);
return 0;
}
302 :
デフォルトの名無しさん :04/03/19 18:22
>>281 の質問をしたものです。
>>286 さん回答の程ありがとうございます。
しかし、コンパイルがとおりませんでした。
また説明がたりなくてすいませんでした。
exit関数については制御文の終了処理もしくはデバッグ処理で使用するそうです。
exit(0)・・・正常終了、exit(1)・・・異常終了を使用します。
制御文はfor文も使ってほしいです。
3つの数値の範囲は0〜65535までの数値で、動き、そうでない場合の
エラー処理も入れるとの事です。
ソースの流れとしては、
/*引数の妥当性チェック*/
↓
/*ソート処理*/
↓
/*結果出力*/
↓
/*入力された数値を昇順に並び替える。*/
の流れで作ってほしいです。
追加質問はルール違反なのは、解っております。本当に申し訳ございません。
以後気をつけますので、優秀な2CHのプログラマーの皆様、宜しくご指導の程
宜しくお願い申し上げます。
304 :
デフォルトの名無しさん :04/03/19 20:09
>>291 が何気にすげぇー って思った僕は失格ですか?
>>291 このアルゴリズム、効率の点ではイマイチだと思うが、
俺は今まで見たことなかったな。
これってメジャーな手法なのか?
>>305 いや、その場の思いつきで作っただけです。
処理の効率よりも単純さを重視しました。
>>299 さん ありがとう
このプログラムはおいらも考えたのですが効率が良いのかちょっと判らなくて
ほかの皆様
質問です、このプログラム問題作った人に聞いたところ
この問題には、発展系の応用問題があるそうです。
一つはこのデータの
DATA=, の後の数字列が16進表記になり 051A,FFFF,7FFF,ABAF,・・・・
のようなデータの各値を上位2桁をひっくり返すと言う問題です
実行結果
1A05,FFFF,FF7F,AFAB
となるようなプログラムに改造しなさいと言うことです
>>307 この問題どこかで見たことありますね。
教えて!goo だったかな?
309 :
デフォルトの名無しさん :04/03/19 21:22
>>75 の問題に挑戦してみたのですがどうもうまく行きません
ソースは
#include<stdio.h>
int main(void)
{
int h,m,s;
unsigned long int in;
printf("InputTime>>>");
scanf("%ld",&in);
s=in%60%60;
m=in%60/60;
h=in/3600;
printf("%d:%d:%d\n",h,m,s);
return 0;
}
のような感じです 時と秒はうまく行くのですが どうしても分がおかしいです
すいませんが どなたか どうしてうまく行かないのか教えてください
>>309 m=in/60%60;
じゃねえのか?
>>307 とりあえず
>>299 にデータをひっくり返す処理を追加しました。
(ところであなたの言う「効率」とは?)
#include <stdio.h>
void swap(char *a, char *b) { char t = *a; *a = *b; *b = t; }
int main(void)
{
FILE *fp = fopen("data.txt", "r");
int year, month, day;
int hour, minute, second;
char data[256];
int i;
fscanf(fp, "%d/%d/%d %d:%d:%d DATA=,%s", &year, &month, &day, &hour, &minute, &second, data);
/* データの並び替え (strtok()使えと言いたいけどやめときます) */
for (i = 0; data[i] != '\0'; i += 5) {
swap(&data[i], &data[i+2]);
swap(&data[i+1], &data[i+3]);
}
printf("%d年%d月%d日 %d時%d分%d秒のデータは %s\n", year, month, day, hour, minute, second, data);
fclose(fp);
return 0;
}
s=in%60%60; ↓ s=in%60; 一回でいい。
君達かっこいい 惚れそう よし おまいら 俺にとけそうな問題だしてみ 解いてみせらぁ ってか ハノイの塔ってなに?
- --- ----- ===== ===== ===== - --- ----- ===== ===== ===== に上が小さいのを維持しながら、動かすでしょ?それ? わかる?
分かるわけないよな。何でleftされてんの?(TT) 下段は右の'====='の上に持ってきて。
>>314 サンクス でもさっぱり分からん
上が小さいのを維持しながら、動かすってどういう意味?
教えてプリーズ
検索しれ
>314 2ch初心者はカエレ
家にいるんだけど
>>321 懐かしい……
junk.test@ascii PCSの思い出が甦るようだよ。
int main(void){ int a=3,b=5; printf("%d",(a<b)); return 0; } これって結果が1になることって保証されてる? それとも0以外になることが保証?
>>323 組み込みの演算子での評価は0か1のみ。なので保証されてる。
326 :
デフォルトの名無しさん :04/03/20 16:57
printf("%d",(a<b)); この結果って0か0以外だろ。 必ず1が返ってくるってのは間違い。
>>326 JIS X3010:2003の63ページを読め。
この前のやつを改良してみた #include<stdio.h> int main(void) { unsigned int h,m,s; unsigned long int in; printf("InputTime>>>"); scanf("%ld",&in); s=in%60; m=in/60%60; h=in/3600; if(m<10 && s<10) printf("%d:0%d:0%d\n",h,m,s); else if(m<10) printf("%d:0%d:%d\n",h,m,s); else if(s<10) printf("%d:%d:0%d\n",h,m,s); else printf("%d:%d:%d\n",h,m,s); return 0; } ~ 聞きたいんだけど数字の前に0って入れれないの? 例えば4なら桁合わせのために04とか 教えてプリーズ それと問題くれよぉ〜〜 上の訂正やこうしたら? 見たいなのあったらそれもプリーズ
%02d
>>329 あ ごめんなさい
全然忘れてました 氏んできます
>>328 時間の問題が気に入っているなら、こんなのはどうだ。
※某サイトより転載
>UNIX系OSをはじめ、Windowsなどその他様々なプログラムでも使われている
>C言語ですが、このC言語の標準的な日付関数にtime_t型が使われています。
>このtime_tは、(UNIXが1972年に開発されたことにちなみ)1970年1月1日0時
>からの経過時間(秒)を、32ビットの2進法で表します。
time_t 型の値から年月日及び時間(秒まで)を求めよ、ってのは?
>>331 サンクス
オッシャーーーーー 挑戦してみます
ちなみに閏年って世界共通だよね?・・・
2000年も閏年ってあったっけ? 何百年か何千年かに一度ないとかなかったっけ?
>>332 せつめいしてくれと言われましても・・・
書いた人に聞いてくださいw
>>333 >2000年も閏年ってあったっけ? 何百年か何千年かに一度ないとかなかったっけ?
そういう落とし穴がありまくり。
がんがってくれ。
>閏年 グレゴリオ暦は閏年を、西暦年が4で割りきれる年、 ただし西暦年が100で割りきれても、400で割りきれない西暦年は平年としている。 Microsoft(R) Encarta(R) Reference Library 2003. (C) 1993-2002 Microsoft Corporation. All rights reserved. だそうです。
csvファイルに書かれている任意の列を読み込むプログラムを教えていただきたいです。 例えば、***.exe 3 4 という具合で引数にcsvの3列目、4列目と指定する感じです。
↑間違えました。 ***.exe ***.csv 3 4 といった感じです。
>>336 sed.exe -n -e '3,4p'
とか
awk.exe 'NR >= 3 && NR <= 4 {print;}'
とか?
>>338 336ですが、すべてCプログラムで処理させたいです。
コマンドラインで実行する際は、引数にCSVファイル名と読み込む列を与えるイメージです。
CSVファイルのすべての行にたいして指定した列を読み込むにはどうしたらよいかがわかりません。
「,の数」とかで処理させるのですか?
それは列じゃなくて桁(カラム)じゃないのか? 取り敢えず、数値だけのシンプルなcsvで、カラム固定でいいなら、 fgets()で1行取り込んでsscanf(buf, "%*d,%*d,%d,%d", &col3, &col4)って感じかな。
1.ファイルのn行目のデータを出力するプログラムを作れ. 2.あるCSVの一行分のデータに対して、gettokenを利用して1データごとに分けるプログラムを作れ. 3.組み合わせろ char data[]="aho,baka,manuke"; char *token; token=gettoken(data,","); do{ printf("%s",token); token=gettoken(NULL,","); }while(token!=NULL); 適当なんで動くか知らないが
>>340 列=カラム かと思われますが
>>341 gettoken()って何?strtok()のこと?
>>331 考えてたのに調べたら
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timer;
time(&timer);
printf("%s\n", ctime(&timer));
return 0;
}
これで行けるんだってさ 関数あるのかよ・・・ ショボーーーン
次の問題プリーズ
>>336 int int_comp(const int *x, const int *y) { return *x - *y; }
int getcolumn(char *src, int *columns, int ncolumns, char **results)
{
char *current_token;
int token_number = 0;
int *current_number = columns;
qsort(columns, ncolumns, sizeof (int), &int_comp);
for (current_token = strtok(src, ","); current_token != NULL; current_token = strtok(NULL, ",")) {
if (current_number - columns >= ncolumns)
break;
if (++token_number == *current_number) {
*results++ = current_token;
current_number++;
}
}
return current_number - columns;
}
こんな感じでどう?
srcにCSVファイルから1行づつ読んでそれを渡す。 strtokをこれに直接適用するので、
srcの指す文字列は書換えられる。
columnsは取り出したい列の番号を保持するintの配列。処理の都合上この配列をソートするので、
この配列も書換えられる。同一の数字が複数含まれていると、正常に動作しないはず。
ncolumnsはcolumnsの要素数。
resultsはchar*の配列。ここに指定された列へのポインタを書き込む。必要なサイズは呼出し側が
判っているはずなので、きちんと用意すること。
mainは面倒なので適当にでっちあげて。
>>344 アドバイスありがとうございます。
まだ見たばかりで理解し切れていないですがやってみます。
助かります。
たびたびすみません。 読み込むCSVで指定した文字列の行だけ取り出すにはどうするのでしょうか? 例えば「***.exe ***.csv 文字列」 としたとき***.csvをfgetsで読み込んで、指定文字列の入っている行だけ取り出す方法です。
>>346 >340は読んだ?
指定文字列の入っている行だけ取り出すには、fgets()で読んだ行を
strstr(行バッファ, 検索文字列)すればいい。
348 :
デフォルトの名無しさん :04/03/21 14:22
もうマルチはしちゃだめだよ。
349 :
デフォルトの名無しさん :04/03/21 17:09
良スレ保守。
350 :
デフォルトの名無しさん :04/03/22 01:28
乱数表示プログラム教えて下さい
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { srand(time(NULL)); printf("%d", rand()); return 0; }
#include <stdio.h> int main(void) { printf("乱数"); return 0 }
353 :
デフォルトの名無しさん :04/03/23 00:50
354 :
デフォルトの名無しさん :04/03/23 00:53
しかもエラーだし
356 :
デフォルトの名無しさん :04/03/23 01:32
文字列(半角10文字以下・dogなど)を10回入力、アルファベット順に表示させるものですが、これからどう作ればいいですか?読み込みとかが良く分からないです /*読み込み*/ for(tate=0;tate<=kaisu;tate++){ for(yoko=0;yoko<=MAX;yoko++){ gets(moji); moji[tate][yoko]=atoi(moji); } } for(tate=0;tate<kaisu;tate++){ for(yoko=0;yoko<MAX;yoko++){ printf("%s",moji[yoko][tate]); printf("\n"); } } } /*ソート*/ for(i=0;i<kaisu;i++){ for(j=i+1;j<kaisu;j++){ if(moji[i]>moji[j]){ temp=moji[i]; moji[i]=moji[j]; moji[j]=temp; } } } /*表示*/ for(i=0;i<kaisu;i++){ printf("%s\n",moji[i]); } return(0); }
357 :
デフォルトの名無しさん :04/03/23 01:52
>>356 何を言ってるのかは分かるが
下のソースは何?
読み込みはscanfでいいんじゃないの?
>>356 #include <stdio.h>
#include <string.h>
#define KAISU 10
#define MAX 256
void main()
{
char Moji[ KAISU ][ MAX ];
char * pMoji[ KAISU ];
char * p;
int i,l;
//文字列取得
for( i = 0; i < KAISU; i++ ){
scanf( "%s", Moji[ i ] );
pMoji[ i ] = Moji[ i ];
}
//ソート
for( i = 0; i < KAISU - 1; i++ ){
for( l = i + 1; l < KAISU; l++ ){
if( strcmp( pMoji[ i ], pMoji[ l ] ) > 0 ){
p = pMoji[ i ];
pMoji[ i ] = pMoji[ l ];
pMoji[ l ] = p;
}
}
}
//表示
for( i = 0; i < KAISU; i++ ){
printf( "%2d:%s\n", i, pMoji[ i ] );
}
}
別にあるdesolveを使って計算をしたいのですがエラーがでてしまいます。 incompatible type for argument 4 of `desolve' 間違っているポイントを教えてください #include <stdio.h> #include <math.h> #define dx 0.001 #define NUM 100 void desolve(double t, double dt, int nx, double *u, double a, double b, double k, int bc, int final); int main(void) { double t = 0; double dt = 0.001; int nx = 100; double u0; double a = 0; double b = 1; double k = 1 / 6; int bc = 0; int final = 0; real x = 0; u0 = 0.3 * (sin(M_PI * x) + sin(2 * M_PI * x) + sin(3 * M_PI * x)); while (x < 10) { desolve(t,dt,nx,u0,a,b,k,bc,final); printf("%f \n", u0); x += dt; } return(0); }
double* u = u0;
すいません もう少し詳しくお願いします
>>359 エラーメッセージ嫁
desolveの4番目の引数の型がちがう
わかりました ありがとうございました
364 :
デフォルトの名無しさん :04/03/23 10:57
この実習では、マルチスレッド プログラムの要素について確認します。 以下のプログラムはマルチスレッド アプリケーションです。 PulseEvent 関数は、指定したイベントをセットして待ち状態のスレッドの実行を開始します。その後、イベントをリセットします。 #include <process.h> TCHAR szBuf[256]; HANDLE hSetEvent; HANDLE hReadEvent; VOID MyWorkerThread(LPVOID pv) { while( TRUE ) { ::WaitForSingleObject( [ 空欄 1 ], INFINITE ); _getts( szBuf ); PulseEvent( [ 空欄 2 ] ); if( *szBuf == _T('q') ) break; } }
365 :
364続き :04/03/23 10:58
int _tmain(int argc, TCHAR* argv[]) { hSetEvent = CreateEvent(0, TRUE, FALSE, 0); hReadEvent = CreateEvent(0, TRUE, FALSE, 0); _beginthread( [ 空欄 3 ], 0, 0 ); while( TRUE ) { PulseEvent( hReadEvent ); ::WaitForSingleObject( hSetEvent, INFINITE ); if( *szBuf == _T('q') ) break; _tprintf( "%s\n", szBuf ); } CloseHandle( hReadEvent ); CloseHandle( hSetEvent ); return 0; } Q1:ソースコードの空欄を埋めてください。 Q2:プログラムについて改善すべき点を説明してください。 という問題ですが全然わかりません。教えてください。
>>365 スレッド関係は専門じゃないので自信ないが。
(Q1)
1:hReadEvent 2:hSetEvent 3:MyWorkerThread
(Q2)
メインスレッド側がReadイベントを送信した時点で、
ワーカースレッド側がまだイベント待機状態になっていない場合
イベントが無視され、両スレッドがストップしてしまうので、
イベントがかならず届くような機構(またはタイムアウト処理)が
必要である。
ちなみに PulseEvent( hReadEvent ); を
SetEvent( hReadEvent ); にすると一応ちゃんと動く。
367 :
364,365 :04/03/23 13:35
>>366 ありがとうございます。
助かりました。最高です。
Cでランダムな数字を抽出するにはどのようにすればいいのですか? 時間は使用しないということでおねがいします。
キーボードを1万文字ぐらいでたらめに打ってもらって、 種にすればいいんでない?
>>368 ランダムに並び替えるもので bogosort ってのがあるけど、
アルゴリズムとかは、私には読解できません。
某掲示板過去ログよりコピペ #include <stdio.h> #include <conio.h> void main(void ) { int Idx = 0; while(1){ Idx++; /* インクリメント */ if (Idx > 6) Idx = 1; /* 6以上の場合1に戻す */ /* スペースキーが押されたらループ終了 */ if (kbhit() && getch() == 0x20) break; } printf("数値:%d\n",Idx); }
>>371 なるほど!そういう手がありましたか。ありがとうございます。
なんだ、環境依存で擬似的に時間計ってるのにいいのかよ
374 :
デフォルトの名無しさん :04/03/24 00:12
* を使って7セグメントLED風のデジタル時計を出すプログラムで、時間情報を取得してから どうやって表示に反映させたらいいでしょうか?
333 1 6 1 6 1 6 444 2 7 2 7 2 7 555 0:123567 1:67 2:23456 3:34567 4:1467 5:13457 7:123457 8:1234567 9:13467
377 :
デフォルトの名無しさん :04/03/24 11:12
Cです #include<stdio.h> int main(void) { int i; while(i<0 || i>10000){ printf("INPUT DATA> "); scanf("%d",&i); if(i<0 || i>10000) printf("ERROR\n"); } printf("OK %d\n",i); return 0; } 0〜10000以外の数は偽、 記号、文字、空白が1つでも入ってたら偽 また、nullも偽にしたいです このままだと文字を入力すると無限ループになるんですがどうすればいいですか
378 :
デフォルトの名無しさん :04/03/24 11:18
"null"という文字列か? そういう問題ならscanfは使うな。fgets等で一行読み込んでから調べろ。
nullという文字列なら「記号、文字(おそらく数字以外)、空白が1つでも」に引っかかるか。
null==空文字列と勝手に判断して書いてみた。ちなみにテストしていない。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; char buf[1024]; size_t n; for(;;printf("ERROR\n")){ printf("INPUT DATA>"); fgets(buf,sizeof buf,stdin); n=strspn(buf,"0123456789"); if(n==0||buf[n]!='\n'||buf[n]!='\0') continue; i=atoi(buf); if(i>=0&&i<=10000) break; } printf("OK %d\n",i); return 0; }
すいません席外してて返答できませんでした >381空白文字列でもERRORって出ますが、通る数を入れてもERROR出ますね どこ直せばいいですか
383 :
デフォルトの名無しさん :04/03/24 12:30
>>382 ああ本当だ。
if(n==0||buf[n]!='\n'||buf[n]!='\0')
を
if(n==0||buf[n]!='\n'&&buf[n]!='\0')
に変更
PDFをページ毎に分割するプログラムをって事を言われたのですが、 これって、どうやったらいいんでしょうか? Acrobat SDKとやらはダウンロードした(Ver6のヘッダーを)んですが、 使い方がさっぱりです・・・
#include <stdio.h> struct seiseki {//構造体の宣言 int no,sur; char name[20],hyo[1]; }; int main(void) { FILE* fp; int i; struct seiseki seito2[3],seito1[3]; for(i = 0; i < 3; i++) {//三人分繰り返す printf("no >"); scanf("%d", &seito2[i].no);//番号を入力 printf("name >"); scanf("%s", seito2[i].name);//名前を入力 printf("salary >"); scanf("%d", &seito2[i].sur);//給与を入力 printf("point >"); scanf("%s", &seito2[i].hyo);//評価を入力 }//↓続く
printf("no name salary point\n"); fp = fopen("alpha.dat", "w");// 書き出し用にファイルを開く for(i = 0; i < 3; i++) {//三人分繰り返す fprintf(fp, "%d\n", seito2[i].no);// 番号をファイルに書き出す fprintf(fp, "%s\n", seito2[i].name);// 名前をファイルに書き出す fprintf(fp, "%d\n", seito2[i].sur);// 給与をファイルに書き出す fprintf(fp, "%s\n", seito2[i].hyo);// 評価をファイルに書き出す } fp = fopen("no.txt", "r"); for(i = 0; i < 3; i++) { fgets(seito1[i].no, 5, fp); fgets(seito1[i].name, 20, fp); fgets(seito1[i].sur, 5, fp); fgets(seito1[i].hyo, 1, fp); } for(i = 0; i < 3; i++) {//三人分繰り返す printf("%d %s %d %s\n",seito1[i].no, seito1[i].name, seito1[i].sur, seito1[i].hyo); } return 0; } 書き込めたんですが読み込めません fgetsのあたりですか?どうなおせばいいんですか エラーは「34: パラメータ '__s' は signed char * 型として定義されているのでint型は渡せない」
char *fgets(char *s, int n, FILE *f);
389 :
デフォルトの名無しさん :04/03/24 18:47
intじゃなくてsize_t(符号無し整数型)だYO!
あ、わかったです、どうも
>>389 (・3・)アルェー
ISO/IEC 9899:1993 には int って書いてあるYO!
s/1993/1998/ だNE
393 :
デフォルトの名無しさん :04/03/24 20:32
>>391 (・3・)アルェー
勘違いだったYO!
ごめん。
>>385 PDF は、テキストエディターで読めるから、
ページの区切りの文法とか調べればそれほど難しくないのかも。
Acrobat SDK とかの使いかたは知りません。
396 :
デフォルトの名無しさん :04/03/24 22:18
* を使って7セグメントLED風のデジタル時計を出すプログラムで、時間情報を取得してから どうやって表示に反映させたらいいでしょうか?
int no,sur; char name[20],hyo[1]; }; struct seisekih { char name[20],hyo[1],no[5],sur[5]; }; int main(void) { FILE* fp; int i; struct seiseki seito2[3]; struct seisekih seito1[3]; for(i = 0; i < 3; i++) {//三人分繰り返す printf("no >"); scanf("%d", &seito2[i].no);//番号を入力 printf("name >"); scanf("%s", seito2[i].name);//名前を入力 printf("salary >"); scanf("%d", &seito2[i].sur);//給与を入力 printf("point >"); scanf("%s", &seito2[i].hyo);//評価を入力 }
printf("no name salary point\n"); fp = fopen("alpha.dat", "w");// 書き出し用にファイルを開く for(i = 0; i < 3; i++) {//三人分繰り返す fprintf(fp, "%d\n", seito2[i].no);// 番号をファイルに書き出す fprintf(fp, "%s\n", seito2[i].name);// 名前をファイルに書き出す fprintf(fp, "%d\n", seito2[i].sur);// 給与をファイルに書き出す fprintf(fp, "%s\n", seito2[i].hyo);// 評価をファイルに書き出す } fp = fopen("alpha.dat", "r"); for(i = 0; i < 3; i++) { fgets(seito1[i].no, 5, fp); fgets(seito1[i].name, 20, fp); fgets(seito1[i].sur, 5, fp); fgets(seito1[i].hyo, 1, fp); } for(i = 0; i < 3; i++) {//三人分繰り返す printf("%s %s %s %s\n",seito1[i].no, seito1[i].name, seito1[i].sur, seito1[i].hyo); } return 0; } ごめんなさい、解ってなかったです 画面に表示するときに文字化けしてしまうんですが、どうすれば
>>399 scanf()でcharの配列に"%d"つかってる。
#include <stdio.h>
struct seiseki {//構造体の宣言
int no,sur;
>398の頭の部分が切れてますね、すいません
>>400 scanfの方の構造体はnoとsurがint型です、%dでいいですよね
ていうかへぼいプログラムでごめんなさい
>
>>400 scanfの方の構造体はnoとsurがint型です、%dでいいですよね
ソッスネ
seiseki と seisekih があったのか。
charの配列はナル文字('\0')の分も確保しとかないとダメ。
>402どうもです、 配列の数を1ずつ増やしたんですが違う字でまだ化けます
404 :
デフォルトの名無しさん :04/03/25 01:03
knight's tourのc言語版ができません。 ポインタや構造体は使わないで、配列でできるそうです。 お願いします。
今度この本買ってきます。 サンクス。
ファイルのオープン、クローズをちゃんとやってないのが原因でした お手数かけました、 >399のようにすると変数表示のたびに改行されてしまうんですが 改行しない方法はありますか
408 :
デフォルトの名無しさん :04/03/25 02:02
>>407 >"%s %s %s %s\n"
↓
"%s %s %s %s // "
no name salary point 12 we 23 e // 45 rt 67 t // 12 we 58 u // >409サンクス、そのとおりやると↑こんな感じ もうちょっと試行錯誤してみます、ああ朝だ
>>410 fgets()は改行文字も配列に格納するのはご存知?
me_0.0.datには中に文字が書き込まれるのですが me_1.0.dat以降には中になにも書き込まれません 解決策をお願いします #include <stdio.h> #define NUM 100 int main(void) { FILE *fp; char filename[NUM]; double t = 0; double a = 0; double dt = 0.001; while (t < 0.003) { sprintf(filename, "me_%.1f.dat", t * 1000); fp = fopen(filename, "w"); while (a <= 0.05) { fprintf(fp, "aaa\n"); a += 0.01; } t += dt; } fclose(fp); return(0); }
解決しました スルーしてください
414 :
デフォルトの名無しさん :04/03/29 12:59
ログ飛んでいるな。416までしか漏れのには残っていなかったので
他の人補完よろ
*************************************
414 名前: デフォルトの名無しさん :sage 投稿日: 04/03/25 (木) 18:17
このプログラムをコンパイルし実行すると
この部分の数値を入力し
printf("実数を入力して下さい:>");scanf("%1f",&x);
2つ目の
printf("整数を入力して下さい:>");scanf("%d",&n);
を出力した所で処理が終了します。
文法ミスがあると思うのですが、間違っている所を教えて下さい
ソース)
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html#1 415 名前: デフォルトの名無しさん :sage 投稿日: 04/03/25 (木) 18:22
>>414 int power ==> double power
scanf("%1f",&x); ==> scanf("%lf", &x);
416 名前: デフォルトの名無しさん :sage 投稿日: 04/03/25 (木) 18:47
>>415 有難う御座います。
@double powerに修正
Ascanf("%lf", &x);(エル)lfに修正
しました。
415 :
デフォルトの名無しさん :04/03/29 13:02
pc5に移転しましたな ログは416までしかもっていないので他の人の補完を待ってから 質問したいけど、きっと夜までまたないと補完が無いのでここで質問させてもらいます。 **************************************************** 【宿題】 マウスで操作できるキーボードプログラムを作れ 多分、ボタンを26個くらい配置してボタンを押したら [A]を押したキーボードの イベントを発生させると思うんですが。 あと、その「キーボードを押した」ということがメモ帳とかに伝えられなかったら 意味ないですよね?
417 :
デフォルトの名無しさん :04/03/29 19:00
〔質問〕 二つのバイナリーデータがあり その二つのバイナリーデータを差分して 一つのビットマップファイルを作れ。 まずどういった関数を使用すべきか? @fopen A論理演算子(OR,XOR)で差分をとっていいのか? まずこの場合の差分とは何を意味するのか? ファイルの受け渡し 新しいファイルを作成する時の処理はどうしたらいいのか? 教えて下さい。
>>417 バイナリデータは同じサイズか
この問題でのビットマップファイルの仕様
そもそもどれがおまいの質問で、どれが問題文なのか
などなどわかりません。もちょっと整理して書くがよろし。
ちなみにファイル作るのはfopen()で出来る。
>>418 >「パーソコン」のgoogle検索結果 56件
お前、もしかしてマイナー用語一覧表でも持っているのか?
差分とは何を意味するのかって・・・ 知るか!
>>420 ああ、持ってる、っていうか、作ってる
8010件「デイスプレイ」
5320件「キイボード」
みたいなみんなで間違えば怖くない用語から
28件「インタネトー」
7件「ブロバティ」
1件「インターネットエクスプロローラー」
みたいなものまで、暇なときに検索しまくり
漏れもひまだなぁ
417から419まで
417 名前: 412[] 投稿日:04/03/25 22:02
printf("こん"に"ちわ");
こう入力すると
こんにちわ
と表示されますよね
こん"に"ちわ
と表示させたいのですが
"が表示されません
"をprintf文の中で表示させたいのですが
どのようにすればよいのでしょうか
418 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25 22:02
\"
419 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25 22:19
>>417 printf("こん"に"ちわ");
ってコンパイル通るのか…?
ウチのVC6はエラー吐くけど。
思わず実験しちゃったよ…。
420から423まで
420 名前:デフォルトの名無しさん[] 投稿日:04/03/25 22:19
printfやscanf関数の使い方が載ってるようナ参考書で勉強している
初心者ですがこれをマスターして段々と応用したプログラムが書けるように
なったら本当に色々ソフトって作れるの?訳分からん質問してゴメンちゃい
421 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25 22:22
色々つくれるよ
422 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25 22:55
>>420 もっと素直に自分の持っている疑問をぶつけてみたら?
例えば、もし printf や scanf でアニメや音声が出せると
思っているのなら、それは間違いだよ。
423 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25 22:57
>>420 おまえはもう作っている
424 名前: [] 投稿日:04/03/25 23:34
>>417 遅くなりましたがありがとうございました
続けて質問なんですがgnuplotを使って
アニメーションをつくりたいのですがなかなかうまいこといきません
#include <stdio.h>
int main(void)
{
double i;
printf("set terminal x11\n");
for (i = 0; i <= 500; i++) {
printf("gnuplot [0.0:1.0] [-1.0:1.0] \"frame_%.f.dat\" with lines\n", i);
}
printf("pause 10\n");
return(0);
}
このプログラム(aaa.c)をコンパイルして
aaa | gnuplot -
これでいけると思ったのですがうまくいきません
readline: warning: rl_prep_terminal: cannot get terminal settingsgnuplot> ^
invalid command
このようなエラーがファイル数分でてしまうのですが
どこが間違っているのでしょうか
何度も質問すいません
>>422 お前、もしかして文章で飯を喰ってるんじゃないのか?
>>426 食ってないって
便乗でC言語の怪しい用語集
393件「サブ関数」
215件「関数副プログラム C言語」
50件「printf命令」(日本語ページ)
30件「ボインタ」
10件「ブリプロセッサ」
怪しい用語はなぜか大学教授が書いた文章に多い…
>>428 バイナリデータが8bit?
1バイトのデータをエッジ検出?
>>429 どっかに専用スレ立てておけ。保存しておく価値がある。
そのうち変わるよ
>>433 rev_int()のdo-while文の条件式は、tmp > 0でなくてnum > 0が正しい。
# ところで、逆順というのは整数の10進表記をひっくり返すという意味でいいのかな。
# 俺は、幾つかの整数を読み込んで、それを読み込んだ順とは逆に出力することの
# ような気がするのだけど。
# 更に余談。scan_unitではなくscan_uintじゃないのかな。
# 非負の整数を読むのだから、Unsigned INTegerの略だと思うのだけど。
>>434 いつも丁寧に教えて頂き感謝です。
# 俺は、幾つかの整数を読み込んで、それを読み込んだ順とは逆に出力することの
# ような気がするのだけど。
そうです。
# 更に余談。scan_unitではなくscan_uintじゃないのかな。
# 非負の整数を読むのだから、Unsigned INTegerの略だと思うのだけど
今後は変数名をつける際にもっと気をつけます。
有難う御座いました。
>>435 > # 俺は、幾つかの整数を読み込んで、それを読み込んだ順とは逆に出力することの
> # ような気がするのだけど。
> そうです。
意志の疎通って難しいね。。。
1
23
4
567
8
90
を
90
8
567
4
23
1
と表示するのでは、と言っている
>>436 ご指摘有難う御座います。
そういう意味ではなく
例えば
558と入力したら、
step 1
tmp=8 num=55
step 2
tmp=85 num=5
step3
tmp=855 num=0
と私は考えていました。
そこら辺が説明不足でした。
いくつかの整数の意味を取り違えてました。
失礼します。
438 :
デフォルトの名無しさん :04/04/01 19:14
ところで 最後のメインルーチンをreturnで返す時 1.return (0)と括弧をしますか それとも 2.return 0; のように括弧しないどちらが正しいんでしょうか? 個人的には1の方が正しいような気がします。 皆さんどう書きますか?
>>438 EXIT_SUCCESS
EXIT_FAILURE
440 :
デフォルトの名無しさん :04/04/01 19:36
>>438 上はi=(0);とやっているようなもの。
>438 計算式でreturnするときは () をつけても良いかな 後はつけない
>>438 関数扱いされると嫌なので括弧はつけない
なぜか sizeof には必要ない括弧をつける人が多いね。
なんかマクロっぽいからつい括弧つけちゃうんだよな。> sizeof ぱっと見、演算子というよりマクロや関数に似ているから括弧つけたほうが可読性がよくなる気がする。まぁ慣れだろうが。 実際、関数だと思ってコーディングしても問題になることはほとんど無いし。
>>443 ナニー!!
sizeofに括弧はいらないのか…。
知らなかったよ…。
int a; sizeof(int); /* 括弧必要 */ sizeof a; /* 括弧不要 */
sizeofは歴史的に優先順位の混乱があったからつけておくべきかと
それに
>>446 にもあるとおり文法が微妙だからってのもあるしね
sizeof ((((((((((((((((((((((T * T)))))))))))))))))))
(((((((((((((((゚Д゚))))))))))))))) ガクガクブルブル
誰か宿題だせよな・・・・全く・・・
sizeof(sizeof(sizeof(sizeof(sizeof(sizeof(int(*)()))))))
452 :
デフォルトの名無しさん :04/04/07 22:29
>>445 型のサイズを知りたいときはsizeof キャスト式という構文をとるから括弧が必要というだけ。
>>452 キャストは式ではない、演算子だ
>sizeof キャスト式という構文をとるから
とらない
文法はこのとおり
unary-expression:
sizeof unary-expression
sizeof ( type-name )
cast-expression:
unary-expression
( type-name ) cast-expression
454 :
デフォルトの名無しさん :04/04/09 20:16
『キーボードから数値を入力して、その平方根を求めるプログラムを作成しなさい』 と、言う問題だったので作ってみたんですが どんな数値を入力しても「0.0000000000」と出てしまうんです どこが間違ってるでしょうか? #include <stdio.h> #include <math.h> void main(void) { double x; scanf("%1f",&x); printf("%14.10f \n",sqrt(x)); }
>>454 > scanf("%1f",&x);
参考にした本を1文字ずつ一度見直すと吉。
「C(gcc) で、コマンドの引数として アルファベット1文字 受け取って a〜z と A〜Z と比較して引数がどの文字だったか判定しなさい。」 比較部分はどうやったらいいですか? int main(int argc, char *argv[]) としておいて、 argv[1] と a b c ... A B C ... を strcmp で比較しようと思ったのですが、 char small[27][1]={"a","b", ... "z"}; として、strcmp(arg[1],small[i]) だと、 1文字だけでは無くて、abc...z とか bcd...z と比較することになってしまいます。
if ('a' <= argv[1][0] && argv[1][0] <= 'z') ...
>>459 ありがとうございました。
なんか、面倒というか余計なことやってたんですね、私。
>>458 char *s;
if (argc == 2 && (s = strchr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", *argv[1])) != NULL)
printf("%c(%s)\n", toupper(*s), isupper(*s) ? "UPPER":"LOWER");
>>458 const char *s = "abcdefghijklmnopqrstuvwxyz";
int i;
for (i = 0; s[i] != '\0'; i++) {
if (argv[1][0] == s[i]) { printf("argument is %c\n", argv[1][0]); break; }
if (argv[1][0] == toupper(s[i])) { printf("argument is %c\n", argv[1][0]); break; }
}
日立の この期なんの気?機になる機になる の歌が出来た由来を教えてください。
>>464 >歌が出来た由来
小林亜星の腹が減った為に作られました。
>>466 例えばEBCDICはアルファベットが連続しない。
>char small[27][1]={"a","b", ... "z"}; として、strcmp(arg[1],small[i]) だと、 >1文字だけでは無くて、abc...z とか bcd...z と比較することになってしまいます。 なかなか微妙なバグだね(たまたま偶然落ちずに動いているって奴) small[27][2]に汁
469 :
デフォルトの名無しさん :04/04/12 02:23
つーかさ、>458の環境、ASCII限定で全然問題なかろう?
C言語のソースファイルを読み込み、出現する識別子を1行に1つずつ出力するプログラムを書け。 ただし、予約語は含めないこと。コメントや文字列はスキップすること。 C言語です、おねがいします。
みなさんレスありがとうございました。 small[27][2] で判定できるようになりました。
>>472 ありがとうございます。
大きなプログラムになるのですね。感謝します。
課題文に含まれていない、
16進数(例えば、0xabcd)などは、プログラムでは対応していない。
#include <stdio.h> はinclude stdio h という3つの識別を得る。
などと説明書きを入れて、提出することにします。
ある関数のパラメータに配列を渡してやって その配列のサイズを知る方法教えてください。 何度やっても4にしかならなくて・・・
476 :
◆H0824hril6 :04/04/13 11:21
#include<stdio.h> main(){ double a,b,x; double step; printf("Input a>"); scanf("%lf",&a); printf("Input b>"); scanf("%lf",&b); step = 0.2; for(x=a; x<=b; x+=step){ printf("TEST:%lf\n",x); } exit(0); } 下につづきます
477 :
◆H0824hril6 :04/04/13 11:22
入力したa,b(double型)の範囲を0.2ずつ増やすプログラムです。 a,bのいずれかに「絶対値が3以上の数」を代入すると、最後に出力される 数が"b-0.2"になってしまいます。具体的には、 a=0, b=1 TEST:0.00000 TEST:0.20000 TEST:0.40000 TEST:0.60000 TEST:0.80000 TEST:1.00000 a_2, b=3 TEST:2.00000 TEST:2.20000 TEST:2.40000 TEST:2.60000 TEST:2.80000 といった感じです。どこがおかしいのかご指摘お願いします。
>>477 double型の大小比較はループでは御法度だ。
int型で比較・ループするようにする。x,a,bは
そのループ変数から計算して導く。
479 :
◆H0824hril6 :04/04/13 11:49
>>478 >double型の大小比較はループでは御法度だ。
なぜ御法度なのですか?手元の参考書を見ても、それに関することが書いてありません…。
>>479 精度の問題と実数型の変数は整数値を正しく保持できない場合があるから。
で、あってる?
電卓で1/10*10=1 になるのはおかしい、とかいう話を聞かされた記憶があるのう。
>>479 ちなみに、IEEE754に準拠している浮動小数点なら、小数点以下
を一切使用しなければ正しい比較ができる。
小数点以下を使用していても、0.5のべき乗(0.25、0.125・・・・)なら
正しく比較ができる。
今回のように0.1とか0.2のような、二進数では循環小数となる数
の比較・連続加算では誤差が累積して意図した動作をしなくなる
可能性が大きい。
>小数点以下を使用していても、0.5のべき乗(0.25、0.125・・・・)なら >正しく比較ができる。 もちろん無限の精度があるわけではないのでどこかで頭打ちには なるけどね。
484 :
◆H0824hril6 :04/04/13 12:44
>>780-783 みなさん、ありがとうございます。
次の講義が始まってしまうので、また家に帰ってから考えます。
ありがとうございました。
>>475 その"ある関数"に配列の大きさも渡せ(w
>475 ワロタ sizeof(ポインタ)が藻前の環境だと4って事だNe
文字列ならstrlen(s) + 1になるがね。
Cでwavファイルを読み込み、波形を表示する…。なんてCだけでできます?
>488 波形表示が * * * ** * * * * * *** ** * * ** ** みたいな感じになってもよければ可能。 漏れは激しくやりたくない。
>>489 やっぱりC++にしないとキツイですよね…。 そっちでのやり方を調べて来ます。ありがとうございました。
>>491 グラフィックライブラリが充実してなければC++にしたって同じ。
→波形表示
あと、wavといってもフォーマットがいろいろあるから、全部に対応するのは
かなり大変。少なくとも俺には無理。
>>491 DirectXを使ってバッファ表示をすればいいんでないの?
>>479 int main(void){
int i=0;
double num=.0;
unsigned short *p=(unsigned short*)#
while (i<10){
printf("%2d: %2.18lf ",++i,num+=1./10.);
printf("[%04x %04x %04x %04x]\n",*(p+3),*(p+2),*(p+1),*p);
}
return 0;
}
これ回してみるといいよ。
496 :
デフォルトの名無しさん :04/04/13 22:43
200個の(10.0、100.0)の乱数(float type,小数点)生成しAで始まる長さ8文字の通し番号、乱数、(該当乱数ー乱数全体の平均値)+100、乱数全体における順位を出力するプログラムを教えてください。お願いします。
>>496 君の場合は、問題文は要約せず、まんま書いてくれ。
498 :
デフォルトの名無しさん :04/04/13 22:49
>Aで始まる長さ8文字の通し番号 A0000001〜A0000200って事か?
499 :
デフォルトの名無しさん :04/04/13 23:07
NO. 乱数値 偏差値 順位 A0000001 50.12 153 A0000002 90.31 16 . . 乱数値の生成、偏差値の計算、順位の並びをそれぞれの関数で表しなさい。 偏差値は(該当乱数ー乱数全体の平均値)+100です。
500 :
デフォルトの名無しさん :04/04/14 00:08
>>501 きれいじゃないとか
そういう次元のもんだいじゃねーな
>496,499 の問題だが、 順位はソートする以外に算出不可能か? つーか、もれはソートする以外思い浮かばなかった...
>>501 9行目の
t.c:9: error: `conststaticintdaysOfMonth' undeclared (first use in this function)
は直したとしてもだ、
C:\>gcc t.c
t.c: In function `main':
t.c:36: error: `year' undeclared (first use in this function)
t.c:36: error: (Each undeclared identifier is reported only once
t.c:36: error: for each function it appears in.)
こーなるんだよ
突っ込みどころ満載だが。 static const char * const month_name[]; にすべきだし、cじゃないし、無駄な定数はあるし、関数名は変だし、書き方汚いし……
>>506 すみません、提出しても恥ずかしくない解答に修正(もしくは新規作成)していただけませんでしょうか。
よろしくお願いします。
508 :
デフォルトの名無しさん :04/04/14 17:23
教えてください(Cです) 2つの引数として与えた2つの文字列p、qの先頭から一致する部分の長さを返す関数を書いて、実際に動作させろ。 って問題なんですけど、文字列とかがどうもよく分かりません。一応以下のように書いたのですが、動きませんでした。 #include<stdio.h> #define N 15 int string_prefix( char *p , char *q ) { int i; for( i = 0 ; i < 15 ; i++ ) { if( (p[i] != q[i]) || (p[i]=="\0") || (q[i]=="\0") ) break; } return i+1; } main() { int i; char p[N] , q[N] ; scanf("%s", *p ); scanf("%s", *q ); printf( "%d\n",string_prefix(p,q) ); }
scanf("%s", *p) --> scanf("%s", p) qも
実行例としては、humanとhumateと入れた場合は、 4が返ってくるようにしたいです。
"\0" --> '\0'
動くようになりました。 素早い回答ありがとうございます。
513 :
デフォルトの名無しさん :04/04/14 18:54
宿題やってください。宜しくお願いします。 -数字をdecimal, octal(0から始まるとoctalと認識), hexadecimal(0xか0Xで始まるとhexと認識)のいずれかで入力します。 符号も受け付けます。(スペースが入力されると無視して、エンターが押されるまで入力を受け付けます。) -入力された数字をdecimal, binary, octal, hexadecimal のいずれかに変換して表示します。 -なお、メニューの関数以外はprintf,scanf等を使わないで、putchar,getcharを使います。 atoiなどはメニューの関数とint getInteger()以外は使用可です。 (続き↓)
514 :
デフォルトの名無しさん :04/04/14 18:55
-下のプロトタイプを使う事。 /* base.c Inputs and displays integer values in selected bases. - input bases are decimal, octal, hexadecimal. - display bases are decimal, octal, hexadecimal, and binary. */ #include <ctype.h> #include <stdio.h> #include <string.h> /* no other #include statements are allowed */ #define MAXCHARS 34 /* maximum length of value string, in chars */ /* enumeration constants to identify menu choices */ enum choice { enter, decimal, octal, hex, binary, quit }; /* prototypes for required functions */ enum choice menu(void); int getInteger(void); void putDecimal(int value); void putOctal(int value); void putHex(int value); void putBinary(int value); /* optional: any other function prototypes */ /* implement main, followed by the other functions */ お願いします。
文字列を入力して頭の文字が数の場合は、次に数以外の文字が 出てくるまでの数字を返すプログラムを作りたいんですけど、 どうすれば良いですか?
516 :
デフォルトの名無しさん :04/04/14 19:04
↑書くの忘れてましたが、C言語です。宜しくお願いします。
>>515 strtod()について調べると幸せになれるかもしれません
518 :
デフォルトの名無しさん :04/04/14 19:13
n(0〜3)に対して(nの値、11×256^n)が表示されるように完成させてください。 ※ポインタ演算、cast、間接演算子を用いてください。乗算は使用禁止です。 include <stdio.h> int main( void ) { int ai[3] = {10, 11, 12}; for( n=0; n<4; n++ ){ printf( "%d,%d\n", n, _________________); } よろしくお願いします。
strtod()に関して調べ、書いてみましたが出来ませんでした。 どこが駄目ですか? #include<stdio.h> #include<stdlib.h> main(){ char *s , *stop ; double x ; s = getchar(); x = strtod( s , &stop ); printf("%e",x ); }
>>518 *(int *)((char *)(ai + 1) - n)
解っていると思うが環境依存。
>>519 文字列を取るならfgets()とか使う。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char buf[BUFSIZ];
char *stop;
double d;
fgets(buf,BUFSIZ,stdin);
d = strtod(buf,&stop);
printf("%e\n",d);
return 0;
}
522 :
デフォルトの名無しさん :04/04/14 20:10
このプログラムの実行結果で最後の Size of double*型が 4になる理由を教えて下さいな #include <stdio.h> int main(void) { int *ptr; ptr = &value; printf("Size of int 型 :%d\n", (unsigned)sizeof(int)); printf("Size of int *型 :%d\n", (unsigned)sizeof(int *)); printf("Size of double 型 :%d\n", (unsigned)sizeof(double)); printf("Size of double *型 :%d\n", (unsigned)sizeof(double *)); return 0; }
>>522 おまいが32bitなマシンを使ってるからです。
525 :
デフォルトの名無しさん :04/04/14 21:33
>>524 物凄く早い回答ありがとうございました!
ちゃんと動くものをこんな短時間でなんて、、ほんと驚きです、、、
助かりました。どうもありがとうございました。
526 :
デフォルトの名無しさん :04/04/14 23:11
>>518 どうもありがとうございました。
今日はよく眠れそうです。
アルゴリズムの講義で有限の整数列の部分和の最大値を求めるプログラムをC言語で作成する宿題がでました。 O(n)の解も求めなければなりません。 よろしくお願いします。
>>527 僕は頭悪いから言ってる意味がプーだYO!
宿題なんてやらなくたって・・授業なんて出なくたって・・・成績がCになりますた orz
>>527 1)整数列とは具体的な例を2〜3挙げてくれ。
2)整数列の指示方法(入力方法)はどうするのか、教えてくれ。
【_】アンダーバー文字をキー送信したいのですが
533 :
デフォルトの名無しさん :04/04/15 11:13
ポインタで三次元の配列って?
534 :
デフォルトの名無しさん :04/04/15 11:15
ポインタのポインタって?
535 :
デフォルトの名無しさん :04/04/15 11:21
ポインタって?
って?
537 :
デフォルトの名無しさん :04/04/15 11:23
ポインタのポインタのポインタって?
ボインたん(;´Д`)ハァハァ
539 :
デフォルトの名無しさん :04/04/15 11:55
ぽるじょあ召喚!!!!
540 :
ぽるじょあ ◆L9tzkMG4Fo :04/04/15 11:57
(・e・)ホェー ポインタは簡単だYO!
>>540 先生 半角文字アンダーラインを
keybd_eventする方法教えてくださいよー お願いします
542 :
デフォルトの名無しさん :04/04/15 12:32
long *ptr; ptr++; で4バイト進むのはわかる。 しかし ptr += 0x001; で4バイト進んでしまうというのはつい最近知った。 (10年間しらずにいた)ぽるじょあさん知ってた? ストラクチャ型のポインタも+=1でストラクチャのサイズ分 進んでしまうのですよね?
>>542 >long *ptr;
>ptr++;
>で4バイト進むのはわかる。
sizeof(long)分進む
544 :
デフォルトの名無しさん :04/04/15 12:42
int *a;のとき、 a[i]と*(a+i)が等価だと知らなかったのか。
>>542 知らない方がおかしいと思われ。
なんで構造体を特別視するか解らんが、全部同じだ。
546 :
デフォルトの名無しさん :04/04/15 13:12
ptr++;の++が何をするための演算子か分かってないんじゃねーの?
下痢を治すための演算子
548 :
デフォルトの名無しさん :04/04/15 17:24
せーくるのための演算子。 ぴゅっ
549 :
デフォルトの名無しさん :04/04/15 18:55
キーボードから整数(1〜50の範囲)を入力させ、 2からその整数までのあいだの素数を求めるプログラムを作成しなさい。 お願いします。
++って、クラスのことじゃないの?
>>549 int primetab[] = {0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0};
int t, i;
scanf("%d", &t);
for(i = 2; i < t; i++) if(primetab[i]) printf("%d", i);
>>531 レスありがとうございます。
1)整数列とは具体的な例を2〜3挙げてくれ。
3,-5,2,12,543,-342,4,-12,・・・・
のようなランダムな数列です。昇順にも降順にもなっていません。
正の数も負の数も含まれます。
5,5,5,5,・・・・
このような正の数だけで構成された数列も考えられますが、この場合の最大値は初項から末項まで足したものとなります。
2)整数列の指示方法(入力方法)はどうするのか、教えてくれ。
整数列がすでに配列に格納してあるとして下さい。
int a[8] = {3,-5,2,12,543,-342,4,-12};のように。
自分で少し考えたのですが、数列の始めと終わりの両方から攻めていくのが良いのではないかと思いました。
よろしくお願いします。
すみませんが
>>500 をCでやってもらえないでしょうか?
よろしくお願いします。
>>555 あなたの感性にあわせて書き換えればよろしい
>>552 まあ普通にやればO(N^2)になるだろね。
>>552 じゃなかった、O(N)ですた。Sn-1からSnを求めるのに、わざわざ
Sn-1から求め直す必要ないし。
とりあえず、部分和を順に全部求め、最大値を割り出す、でお茶を濁すとか。
んー、よくわからないんだけど、こういうのを求めればいいわけ? int i,sum,n,max,a[8] = {3,-5,2,12,543,-342,4,-12}; n = sum = max = 0; for(i=0;i<8;i++) { sum += a[i]; if ( sum > max) { max = sum; n = i; } }
皆さんありがとうございます。
>>563 そんな感じですが、部分和の始まりは初項とは限らないようです。
int a[8] = {3,-5,2,12,543,-342,4,-12};のような数列でしたら、答えは第3項から第5項までの和が答えになるようです。
以上の理由で頭を悩ませています。
>>566 なんだかさっき見たHPの部分和の説明とは違うな。
#include <stdio.h> int main(void){ int retu[8]={3,-5,2,12,543,-342,4,-12}; int i,j,kei,dai; dai=kei=0; for(j=0;j<8;j++){ for(i=j;i<8;i++){ kei=kei+retu[i]; if(kei>dai) dai=kei; } kei=0; } printf("%d\n",dai); return 0; } これでどう?
>>566 単純に二重ループにしてみるとか。
#include <stdio.h>
int main() {
int i,j,sum,n,m,max,a[8] = {3,-5,2,12,543,-342,4,-12};
n = m = max = 0;
for(i=0;i<8;i++) {
sum = 0;
for(j=i;j<8;j++) {
sum += a[j];
if ( sum > max) {
max = sum;
n = j + 1;
m = i + 1;
}
}
}
printf("max %d ... %d = %d\n",m,n,max);
return 0;
}
ちゃんとどっからどこまでの和とか出したほうがよかったか・・・
ま、いいや。
>>569 がやってくれてるっぽいし。
おいおい O(n) だって一点だろ
もう寝るので、O(n)のコードを誰か書いておいて。
マンドクセーのでヒントを晒す {3,-5,2,12,543,-342,4,-12} [0-0]:3 >> max=3[0-0] [0-1]:3-5=-2 >> max=3[0-0] [2-2]:2 >> max=3[0-0] [2-3]:2+12=14 >> max=14[2-3] [2-4]:14+543=557 >> max=557[2-4] [2-5]:557-342=215 >> max=557[2-4] [2-6]:215+4=219 >> max=557[2-4] [2-7]:219-12=207 >> max=557[2-4] >> max=557[2-4]
0(n)ってなんだろ?
>>574 簡単に言うと 配列を1ループるだけで終える
二重ループはO(n^2)
まあ。思考を書いてみる。 (たたき台、プログラムは任せた) a) 数列すべて負なら、最大値を見つける O(n) b-1) 数列にプラスの連続、マイナスの連続があるなら、符号ごとでまとめてしまう O(n) -1, 3,-,4 2, 3, 5, -6, 10, 1, -100 ↓ -1, 3, -4, 8, -6, 11, -100 b-2) 最初と最後が負なら、カウントしない。 うまくく言葉にできんが、順番に足していって、負になったらそれより前と後ろは別に計算する。 多分O(n)以下でできる。 b-3) 出来上がったら、O(n^2)のアルゴリズムで検証する
578 :
デフォルトの名無しさん :04/04/16 04:06
550 :デフォルトの名無しさん :04/04/15 18:56 ++って、クラスのことじゃないの?
>>576 >二重ループはO(n^2)
ちょっと誤解を招きそうなんで勝手に補足。
int a = (nとは無関係の定数);
/* O(n) */
for (i = 0; i < a; i++)
for (j = 0; j < n; j++)
...
/* O(n^2) */
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
...
皆さんのお陰で一応形になりました。 個人的には完成かと思いますが、何か間違いがあったら指摘して下さい。 #include <stdio.h> int main(void){ int a[8]={3,-5,2,12,543,-342,4,-12}; int i,sum=0,max=0; for(i=0;i<8;i++){ sum += a[i]; if ( sum > max ){ max = sum; } else if ( sum < 0 ){ sum = 0; } } printf("%d\n",max); return 0; }
全部、負のケースで試してみそ(w
>583 >max=INT_MIN それだけではダメな悪寒
>>584 あら本当だw
abs()でもつかっとくか?
>>581 (・3・) エェー 結局2重ループいらなかったのかYO
(・3・) エェー なんでぼるじょあ一匹もいないんだYO
(・3・) エェー ぼるじょあは頭悪いから居心地悪くなっちゃったんですYO
>>581 一回目のみ、forの外に書いてはいかがでしょうか
max = a[0];
for(i=1;i<8;i++){
表現がわかりづらかったです。
要するに↓みたく言いたかったんです。失礼しました
#include <stdio.h>
int main(void){
int a[8]={-3,-5,-2,-12,-543,-342,-4,-12};
int i,sum=0,max = a[0]; /*
>>581 から変更した行 */
for(i=1;i<8;i++){ /*
>>581 から変更した行 */
sum += a[i];
if ( sum > max ){ max = sum; }
else if ( sum < 0 ){ sum = 0; }
}
printf("%d\n",max);
return 0;
}
>>566 による指定を追加して、
>>573 さんのヒントを参考に書きました。変な所あったら教えてください
#include <stdio.h>
int main(void){
int i,sum,n,m,max,a[8] = {3,-5,2,12,543,-342,4,-12};
int temp;
max = a[0];
sum = 0;
temp = n = m = 0;
for(i = 0; i < 8; i++) {
sum += a[i];
if(sum > max) {
max = sum;
n = temp;
m = i;
}
if(a[i] < 0) {
temp = i + 1;
sum = 0;
}
}
printf("max %d ... %d = %d\n",n+1,m+1,max);
return 0;
}
>>590 全部負の場合、絶対値が最小の要素を求めるようにしたんですが、おかしいですか?
>>591 おかしいです。たとえば全部 -1 だとどうなる?
つーかなぜ試さない?
ついでに指摘。
tempいらない。
だからさ、 > sum=0; がダメだろって
594 :
デフォルトの名無しさん :04/04/17 15:35
>>586 答えるとき、ついうっかりぼるじょあになるのを忘れてしまう。
>>591 は全部 -1 だとmax 1 ... 1 = -1が出力されて
>>589 は全部 -1 だと-1が出力されるね。
間違ってるんが
"が"?
>>589 ,
>>591 よ
int a[8]= {6,-5,2,12,543,-342,4,-12};
で試せw (答えは第1項からになるべき)
なるほど、こりゃダメだ
if( a[i] < 0 ) を if( sum < 0 ) にすればいい? tempがわからない
そもそもO(n)で解ける証明は?
602 :
デフォルトの名無しさん :04/04/17 21:49
>601 もまえ、>573 が理解できんのか...かわいそうに(シクシク)
C++の課題なんですが教えて下さい。 途中までやってみたのですが、どうも 出来ないのでアドバイス下さい。 問題は、キーボード入力した文字列を 逆から表示させるプログラムを作る、です。 #include <stdio.h> main() { int i=0,l=0,s; char a[20],b[20]; printf("文字列を入力して下さい:\n"); gets(a); while(a[i] != '\0') { s=i++; } for(l=0;l<=s,l++,i;i>=1,i--) { b[l]=a[i-1]; } b[i]='\0'; printf("%sは逆から%s",&a,b); }
>>603 まず、どこがC++なのかと小一時間(ry
C++とかいうの使ってるんですけど、ただのC言語ですかねw よくわかりませんが…
課題にC++が協調されているならSTL使えとか。 stringのようなクラス作れってことじゃないのか?
strlen()使っちゃいかんのか?
C++(標準ライブラリ)をちゃんと使えってんならこんな感じだろうが #include <iostream> #include <iterator> #include <string> #include <algorithm> int main(void) { std::string str((std::istreambuf_iterator<char>(std::cin)), std::istreambuf_iterator<char>()); std::copy(str.rbegin(), str.rend(), (std::ostream_iterator<char>(std::cout))); return 0; }
(・3・) エェー 最近B言語を勉強しはじめましたYO 質問どんとこいですYO
>>603 のコードを元にして考えても変なところが多すぎ。
1.aに入力された文字数をsに代入
2.aの文字s個分、逆順にしてbに代入
3.それを表示する
という処理のようだが、おかしな点がありすぎ。
まず、1.には標準ライブラリ関数のstrlenとか使わないの?
使わないにしても、毎回s=i++としているのはムダ以外の何ものでもない。
次に2.だが for(l=0;l<=s,l++,i;i>=1,i--) というのは何よ?
forの構文とカンマ演算子について勉強し直せ。
極めつけは、b[i]='\0';
意味ねえよ。
printf("%rs", str); で逆に出力できろろろろん
612 :
デフォルトの名無しさん :04/04/18 00:12
printf("%sは逆から%s",&a,b); なんで &a にするの?
friend void function2(classname& a) { ・・・・・・ }; void function1(classname& a) { function2(classname& a); }; というように関数の中の関数に参照でClassを渡したいのですがエラー がでますC++ではこのようなことはできないんでしょうか?
614 :
デフォルトの名無しさん :04/04/18 00:24
>>603 のCの場合の参考例
まあこれでもいろいろ問題あるんだけど今の学習段階だとこんなもんでしょ
ただし目的が出力だけなんで
>>603 のように無駄に別の領域にコピーしたりせず
逆順に直に出力するようにしてある
#include <stdio.h>
#include <string.h>
#define BUFMAX 512
int main(void) {
char buf[BUFMAX], *i;
fgets(buf, BUFMAX, stdin);
for (i = buf + strlen(buf) - 1; i >= buf; i--)
putchar(*i);
return 0;
}
>>613 短いんでついでに。
関数呼び出しの際の引数に型名を付けたらいかん。#ついでにその firend は何?
いろいろありがとうございます。とりあえず、 まだC言語始めたばかりなので 変数やら配列みたいなこと使うらしいですが…. strlenは使用禁止みたいです。 あと、この一題前がstrlen使用禁止で入力した文字数を 数えさせるプログラムの問題だったんで、そのままつか ってみたんですが…
>>615 とりあえず、おまいのコードをちょっと変更してみた。
#include <stdio.h>
int main()
{
int i,l=0;
char a[20],b[20];
printf("文字列を入力して下さい:\n");
gets(a);
while(a[l] != '\0') l++;
l--;
for(i=0;i<=l;i++) b[i] = a[l-i];
b[i]='\0';
printf("%sは逆から%s",a,b);
return 0;
}
すみません、気を付けます。
ところで
>>617 さん、かなり助かりました。恐縮ですが、
while文のl++,l--のところがよくわからないんですが、教えて下さい。
619 :
デフォルトの名無しさん :04/04/18 00:55
while(a[l] != '\0') l++; l--; は、 while(a[l] != '\0'){ l++; } l--; と同じことですよ。 ここまではいい?
いいっす、わかりました。ですが、どうもl++はlを一つずつ増やしてヌル文字 がでたら終わるというのはわかるんですが、l--でなんでへらしてしまうのかが わかってないっす。なんどもすみません。かなり助かってます。
621 :
デフォルトの名無しさん :04/04/18 01:04
減らさないとABCD\0→\0DCBAなってしまうでしょ?
>>620 3文字か4文字くらいを入力したと仮定して、変数の値を表示するように改造するか、
紙にでも書いて実行される内容を順番にトレースしてみな。
つーか、個人的にはわざわざl--するようなコーディングは嫌いだが。
わかりました!たしかにそうなります。ですが、そうするとまた疑問がでて きたんですが、forのi<=lだとABCD\0→DCBAとなってしまう感じがするんで すが、最後のヌルの分はどうなるんですか? b[i]='\0'のところでも、最後の Aの所に\0がかぶってしまう気がします…
for抜けた時にiの値がどうなってるか考えろ
>>624 ABCDと入力したとき、for文に入る段階でlの値はどうなっているか?
forに入る時は、3だと思います…
>>627 つまり、for文は何度繰り返され、i++が何度実行される?
i=0,1,2,3ではないんですか??気分的には4までいってほしく感じますが…
>>629 i == 3なら、i <= l (l == 3)の条件は真なので、ループ継続するでしょ?
解らないのなら、素直にprintfつかっとけ。 printf("%d\n",i); とかw
632 :
デフォルトの名無しさん :04/04/18 02:05
i<=3 ということは、iが3より小さいか等しい場合にfor文を継続する。 ということは、iが4になってはじめてfor文は終了するってことだ。
ループの中わわかりました!でも、b[i+1]='\0';ではだめなんですよね… すみません。
>>632 ということは、4も使われるということですが!?
全然解ってねえだろ
やっぱ3までですよね…
新しく入れ換えた、DCBAのAの上にヌル文字を入れている感じがするんです…
for( 初期化; 継続条件; インクリメント) 文 初期化→継続条件のチェック→真なら→文→インクリメント→継続条件のチェックに戻る →偽なら→終了
グダグダ言ってないで、実行して確かめろ。
実行してみたら、i+1はできませんでした。多分何かわかってないんですよね。 まじ、すんません。
forについては、わかりました。ありがとうございます。多分最後のヌルのi がわかっていないんです。
642 :
デフォルトの名無しさん :04/04/18 02:28
for(i=0;i<=3;i++){;} printf("i=%d",i); 実行結果 i=4
643 :
デフォルトの名無しさん :04/04/18 02:33
for(i=0;i<=3;i++){;} /*この時点でiは4になっているんだよ〜*/ printf("i=%d",i); 実行結果 i=4
はぁ。特別出血大サービス。 ABCDと入力したとする。 この場合、a[0] == 'A', a[1] == 'B', a[2] == 'C', a[3] == 'D', a[4] == '\0' だ。 while(a[l] != '\0') l++; により、a[4] が '\0' である場合まで繰り返されるので、l == 4 l--; により、l == 3となる。 for(i=0;i<=l;i++) b[i] = a[l-i]; ここで、b[0] = a[3-0] つまり、b[0] = a[3], b[1] = a[3-1] つまり、a[2]、 以下同様に、b[2] = a[1], b[3] = a[0] となり、このときは、i == 3。 ここで、インクリメント節が実行されてから継続条件の検査が行われるので、 i == 4となり、継続条件 i <= l を満たさなくなり、ループを抜ける。 最後に、b[i] に '\0'を代入する。i == 4なので、b[4] == '\0' 。 最終的に、b[0] == 'D', b[1] == 'C', b[2] == 'B', b[3] == 'A', b[4] == '\0' だ。
わかりました!!forを飛び出た時は、i=4なんですね。3だと思ってました! こんなにわかっていないのに、ここまで付き合って下さってほんとにありがとう ございました!感激です(涙)
647 :
デフォルトの名無しさん :04/04/18 02:46
>>646 暇つぶしにはなったよ。
釣りだったのかもしれんが...
ここまでアフォなのも珍しいからな。
まじ鮮やかにわかったす!!ここまで付き合って下さって ほんとに感謝してます!またわからなかったら聞きたいんで お願いいたします。とても、勉強になりやした。
>>647 まじやさしっすね、釣りの意味がよくわかりませんが…
最近Cを始めてまだ修行が足らんとです。
九州人かw
愛知っすよー!!二チャンにはあまり来たことないっす。つれは大好きなんすよ!
俺の友達にはこの説明でもわからんだろう奴がいっぱいいる…
二チャンて。
655 :
デフォルトの名無しさん :04/04/18 19:12
5人の学生の3教科(英語 数学 国語)の点数を2次元配列を用いて処理 するプログラムを自由に作成せよ。 @科目別の最高点を求める A各学生の一教科の平均点を求める。 アルゴリズムを考える所から教えて下さい。
(1)全科目を見ていって最高なものを選ぶ (2)3教科の点数を足して3で割る
「各学生の一教科の平均点」ってナニ? 各学生の三教科の平均点、 各学生の三教科のサンプルが複数組あって「各学生の一教科の平均点」ってこと、 それとも各教科の平均点。 3つの内のどれよ。
そこまでは分かるんですよ。 @おそらく eigo[3][5] sugaku[3][5] kokugo[3][5] の配列を逐次探索する。 A 3教科の点数の平均を出してそれぞれ表示する。 でもって 先に@ですが ここからとまってどうコーディングしていったらいいか分かりません。 すぐに解答を教えない範囲でヒントを教えて下さい。
円周率出すのに 428224593349304/136308121570117 を計算して小数点以下30桁まで出せって問題なんだけど どうやったら計算できる? 428224593349304を配列に入れて筆算と同じようにすればいいって 言われたんだけどサパーリなんだよね
660 :
デフォルトの名無しさん :04/04/18 19:48
>>659 つまり私の言ってる事は
本質的にあなたの質問と同じ質問をしているとゆうこと?
更新が遅れてたのでスマソ 各学生の三教科のサンプルが複数組あって「各学生の一教科の平均点」ってこと 2です。
>>658 ごめん その二次元配列の意味が分からない
>>662 多倍長計算でググってみたけど
難しすぎてわからんYO
わかりやすくおせーて
>>658 @
/* tensuu[i][j]: 学生jの、科目iの点数 */
/* saikou[i]: 科目iの最高点 */
for (i = 0; i < 3; i++) {
saikou[i] = tensuu[i][0];
for (j = 1; j < 5; j++)
if (saikou[i] < tensuu[i][j])
saikou[i] = tensuu[i][j];
}
>>658 eigo[3][5],sugaku[3][5],kokugo[3][5];も確保して
何入れるんだ?
2次元配列使ってる意味なくなるだろ
はじめまして。 C言語を習い始めたのですが問題が全然わからなくて すいませんが教えてください。 C言語始めたばかりなのですがこの問題が全く分かりません。 すいませんが教えてほしいです。お願いします。 整数型配列 array に,先頭から n 個データが入っているとする.このようなときに,次の操作を行う二つの関数を作れ. 1、新しいデータ newdata を第 k 要素 array[k] の場所に挿入する(挿入前に array[k] 以降にあったデータは一つずつ後ろにずらす)関数 array_insert(int array[], int n, int newdata, int k) 2、第 k 要素の内容を削除する(削除前に array[k+1] 以降にあったデータは一つずつ前にずらす)関数 array_delete(int array[], int n, int k)
>>668 /* 後ろにずらす */
for (i = n; i > k + 1; i--) array[i] = array[i - 1];
/* 前にずらす */
for (i = k; i < n - 1; i++) array[i] = array[i + 1];
ありがとうございます! できそうなのでがんばってみます。
#include <iostream.h> #include <stdio.h> #include <fstream.h> #define SEITO_KAZU (5) #define KYOUKA_KAZU (3) int main(){ int seiseki[SEITO_KAZU][KYOUKA_KAZU]; int tmp=0; int tmp2=0; int tmp3=0; int saikou[KYOUKA_KAZU]; char ch; ifstream seiseki_file("seiseki"); for(tmp=0;tmp<SEITO_KAZU;tmp++){ for(tmp2=0;tmp2<KYOUKA_KAZU;tmp2++){ seiseki[tmp][tmp2]=0; saikou[tmp2]=0; } } tmp=tmp2=0;
while (tmp<SEITO_KAZU&&tmp2<KYOUKA_KAZU){ seiseki_file.get(ch); switch (ch){ case ' ': seiseki[tmp][tmp2]=tmp3; tmp3=0; tmp2++; break; case '\n': seiseki[tmp][tmp2]=tmp3; tmp3=0; tmp++; tmp2=0; break; default: tmp3*=10; tmp3+=(ch-'0'); break; } } for(tmp2=0;tmp2<KYOUKA_KAZU;tmp2++){ for(tmp=0;tmp<SEITO_KAZU;tmp++){ if(saikou[tmp2]<seiseki[tmp][tmp2]){ saikou[tmp2]=seiseki[tmp][tmp2]; } } } for(tmp=0;tmp<KYOUKA_KAZU;tmp++){ printf("教科%cの最高は%d\n",('A'+tmp),saikou[tmp]); } }
seisekiファイルサンプル 9 49000 62 51 53 61 17 89 19 32 422 5 100 2 32
うわ、平均忘れとった
for(tmp=0;tmp<KYOUKA_KAZU;tmp++){ for(tmp2=0;tmp2<SEITO_KAZU;tmp2++){ tmp3+=seiseki[tmp2][tmp]; } printf("教科%cの平均は%d\n",('A'+tmp),tmp3/SEITO_KAZU); tmp3=0; }
676 :
('A`) :04/04/18 21:54
あげ
あの続きかわからないのですいませんが教えてください。
/* 下記のプログラムはn個の整数型データ a1, a2, … , an を入力し、 最大値と最小値を求めるプログラムです。 ただし、データの最大個数を10とする。 */ #include<stdio.h> int main(void) { int i, n; int min, max; int a[10]; printf("n ="); scanf("%d", &n);/* nの入力 */ for(i=0;i<n;i++){ printf("整数型データ a[%d]=", i); scanf("%d", &a[i]);/* n個のデータ入力 */ } min=a[0]; max=a[0]; for(i=1;i<n;++i){ if(min>a[i]) min=a[i];/* 最小値を求める */ if(max<a[i]) max=a[i];/* 最大値を求める */ } printf("最大値 %d\n", max); printf("最小値 %d\n", min); return(0); } 「これを関数max_ofとmin_ofを用いて書き換えよ」 との事なのですが、教えていただけますでしょうか?
void array_insert(int array[], int n, int newdata, int k) { int i; for (i = n; i > k + 1; i--) array[i] = array[i - 1]; array[k]=newdata; }
できましたありがとうございます。 でもどうしてarray[k]=newdata;なんですか? 問題の意味も全然わからなくて質問はだめですかね。
>>680 >1、新しいデータ newdata を第 k 要素 array[k] の場所に挿入する
から。
>>663 を見て無かった
スマソヌルポクァwセdrftgyフジコlp
なるほど! 文章を理解しないとだめですね。
そのまんまだが... #include<stdio.h> int max_of(int *a, int n) { int i,max=a[0]; for(i=1;i<n;++i) if(max<a[i]) max=a[i];/* 最大値を求める */ return max; } int min_of(int *a, int n) { int i,min=a[0]; for(i=1;i<n;++i) if(min>a[i]) min=a[i];/* 最小値を求める */ return min; } int main(void) { int i, n, a[10]; printf("n ="); scanf("%d", &n);/* nの入力 */ for(i=0;i<n;i++){ printf("整数型データ a[%d]=", i); scanf("%d", &a[i]);/* n個のデータ入力 */ } printf("最大値 %d\n", max_of(a,n)); printf("最小値 %d\n", min_of(a,n)); return(0); }
>>680 ラボちゃんが書いた(やってみたけどダメだった)ソース見せて。
他の人にとってもある意味いい勉強になると思うから。
もう消してしまったんだけどfor文二つにして なぜかprintfとか・・・全然違いますね。 ダメダメです。
問題文やらを小出しにされると、解答する人間にとっても非常にやりづらいので、
全文を省略せず、ソースが長ければ
>>1 のところに貼り付けるなりしてください。
キーボードから文字列を入力して、対称(abaなど)なら:aba→yes 非対称(abc)なら:abc→no、と表示させるプログラムを作りたいので すが、やってみたのですがうまくできません。教えて下さい!恐縮で すが、超初心者なので、出来れば基礎的な知識で教えていただけると 幸いです。strlenは使用禁止になっています。
自分で作ってみたプログラムです。 #include <stdio.h> int main() { int i,l=0; int k; char a[20],b[20]; printf("文字列を入力して下さい:\n"); gets(a); while(a[l] != '\0') l++; l--; for(i=0;i<=l;i++) {b[i] = a[l-i]; } b[i]='\0'; for(k=0;k<=l;k++) { if(b[l]==b[l-k]) printf("%s-yes\n",a); else printf("%s-no\n",a); } return 0; }
関数定義も駄目なのか?
>592 別の配列に移さなくてもできるっしょ
間違えた >692 宛てだ
696 :
デフォルトの名無しさん :04/04/18 23:26
>>693 多分よくないと思われます。
この問の前の問題からの流れ的にですが…
全然わかりません勉強にはげみます。
698 :
デフォルトの名無しさん :04/04/18 23:27
>>695 まじっすか!この前の問題が移していたので移してみました。
こんな感じかな #include <stdio.h> int main() { int i,l,k; char a[20]; printf("文字列を入力して下さい:\n"); gets(a); for(l=-1; a[l+1]!='\0'; ++l) ; k=0; for(i=0; i<l; ++i,--l) if(a[i]!=a[l]) k=1; printf("%s-%s\n",a, (k==0)?"yes":"no"); return 0; }
>>700 {l++;}
l--;
のがよかですかね??
#include <stdio.h> int main() { int i,l=0,flag=0; char a[20],b[20]; printf("文字列を入力して下さい:\n"); gets(a); while(a[l] != '\0') l++; for(i = 0;i < l / 2;i++) { if(a[i] != a[l-i-1]) { flag = 1; break; } } if (flag == 0) printf("%s-yes\n",a); else printf("%s-no\n",a); return 0; } こんなんとか
>>700 おまいのコードを改造してみた
#include <stdio.h>
int main()
{
int i,l=0;
char a[20];
printf("文字列を入力して下さい:\n");
gets(a);
while(a[l] != '\0')/*strlen使いたいな〜*/
l++;
l--;
for(i=0;i<=l;i++)
{
if(a[i]!=a[l]){
printf("%s-no\n",a);
return 0;
}
l--;
}
printf("%s-yes\n",a);
return 0;
}
フラグ使うのと途中でリターンするのと、両方出たわけだが どっちがいいかな? もれは、今回のケースではフラグでOKって感じ
みなさんありがとうございます。 ところで>704さん質問です。for(i=0;i<=l;i++) の意味がいまいちわからないので教えて下さい!
flag,returnともに初めて使います、returnのが個人的には 分かりやすそうに感じます!
>>706 >...がいまいちわからないので教えて下さい!
なんか「いまいち」って言われると
どこまでならわかるんだ?
ってききたくなっちゃうな。
>>704 じゃないけどとりあえず答えときます。
>l=0;
>while(a[l] != '\0')/*strlen使いたいな〜*/
>l++;
>l--;
>for(i=0;i<=l;i++)
は
for (i = 0; i < strlen(a); i++)
と同じ。
>>706 これならどう?
int main()
{
int i,l=0;
char a[20];
printf("文字列を入力して下さい:\n");
gets(a);
while(a[l+1] != '\0')/*strlen使いたいな〜*/
l++;
for(i=0;i<l;i++,l--)
{
if(a[i]!=a[l]){
printf("%s-no\n",a);
return 0;
}
}
printf("%s-yes\n",a);
return 0;
}
ほんとすいません、分からんとこ間違えてました。if(a[i]!=a[l])の 意味とそれ以下がわかりません、教えて下さい。return 0もわかりま せんです。
つーかさ、前の課題の続きなんでしょ? 元の文字列と逆順にした文字列があるのなら その 2 つを strcmp (相当の処理)を用いて等値判定しろって出題意図だったりしないの?
>>711 そういうことが問題中に触れられていないので、意図的に違うコードを書いてみたわけだがw
>>711 どうなんすかねぇ?なんともいえんすけど、strcmpも
初めてきたっすよ…>709さんのプログラムだいぶわかり
やすいです!ifからが理解できてないんです…
10文字入力しました このときl==9ですね。 まず1番目と10番目(a[0]とa[9])を比較してみましょう もし1番目(a[i])と10番目(a[l])が異なる文字だったら, 線対称じゃないからnoと出力して終了しましょう(=return(0)) i++;l--; 次にもし2番目(a[1])と9番目(a[8])が異なる文字だったら 線対称じゃないからnoと出力して終了しましょう(=return(0)) : : iがlよりもおおきくなったら線対称が確定しますね。 for文も終了します。 yesを出力してプログラムを終了させましょう。(=return(0)) これであってるのかな? 俺もわかんなくなってきた
>714 l=文字列の最後の位置; i=0; if(i<l && a[i]!=a[l]){ /* 対称ではない */ return 0; } ++i; --l; if(i<l && a[i]!=a[l]){ /* 対称ではない */ return 0; } ++i; --l; : /* 対称でした */ ってことだろ
>>715 そうなんだけどね。
それじゃわかってもらえないような気がしたので...
日本語で説明してたらこっちまで混乱してきた。
ところで
715=="大学生"だったりしたら面白い落ちだね。
>>668 配列の要素を追加したり削除したりしても要素数nを変更しないでよいのか?
もれは納得できん!
printf("ヌルポ")
;
1から100までの2つの整数a, bで、適当な整数cを用いて a * a + b * b == c * c と書けるすべての組(a, b, c)を出力するプログラム (3辺が整数の直角三角形の列挙をしていることに他ならない)。
723 :
デフォルトの名無しさん :04/04/19 19:37
(*-*)
#include <stdio.h> main(){ int c_max; int a=0,b=0,c=0; for(a=1;a<=100;a++){ for(b=a;b<=100;b++){ for(c=1;c<=10000;c++){ if((c*c)==(a*a)+(b*b)){ printf("%d\t%d\t%d\n",a,b,c); } } } } }
int c_max;は忘れて
c<=10000じゃなくてc<=a*100だともっといい
729 :
デフォルトの名無しさん :04/04/19 20:29
質問があります。 #include <stdio.h> int main( void ) { int ai[3] = {10,11,12}; int n; for(n=0;n<4;n++){ printf("%d,%d\n",n,*(int *)((char *)(ai+1)-n)); } return 0; } の実行結果が 0,11 1,2816 2,720896 3,184549376 なんですが 11×256^n になる理由がいまいちよくわかりません。 どなたかわかりやすく教えていただけないでしょうか。
>>729 環境依存っぽいので
#include <stdio.h>
int main(void)
{
union {
int n
char c[4]; /* 4はsizeof(int)にする */
} x;
int i;
x.n= 11;
for (i = 0; i < sizeof(int); i++) printf(" %X", x.c[i]);
return 0;
}
の結果を教えて。
>>729 0A 00 00 00 0B 00 00 00 0C 00 00 00
↑
ai+1は矢印んとこ指してる。これが1バイトずつ左へ動いてるだけ。
sizeof(int) == 4でリトルエンディアンな環境前提な。
>>730 B 0 0 0
となりました。
>>731 1バイトずつ左へ動くとなぜあのような実行結果になるのでしょう??
>>732 >>731 のやり方を使うと
0A 00 00 00 0B 00 00 00 0C 00 00 00
↑--------- リトルエンディアンなので、00 00 00 0B
0A 00 00 00 0B 00 00 00 0C 00 00 00
↑--------- 00 00 0B 00
0A 00 00 00 0B 00 00 00 0C 00 00 00
↑--------- 00 0B 00 00
0A 00 00 00 0B 00 00 00 0C 00 00 00
↑--------- 0B 00 00 00
>>733 11×256^2 はどこから出てくるのですか?
すいません。 11×256^n でした.。
>>734 0x0B == 11 0xFF == 255
つまり、00000B00 / 0000000B = 256
738 :
デフォルトの名無しさん :04/04/19 22:10
おまえらやっぱり頭いいな。 オレもがんがろうっと。
739 :
デフォルトの名無しさん :04/04/20 01:05
#include <stdio.h> void func0() { printf("func0\n"); } void func1() { printf("func1\n"); } int main() { int a; scanf("%d",&a); if(a==0) func0(); if(a==1) func1(); return 0; } これを if switch goto を使わずに作れ。
void (*f[])() = { func0,func1 }; f[a]();
#include <stdio.h> void func0(void) { puts("func0"); } void func1(void) { puts("func1"); } int main(void) { int a; scanf("%d", &a); a == 0? func0(): a == 1? func1(): 1; return 0; }
int main() { int a; scanf("%d", & a); a ? func1(): func0(); return 0; }
s/\&/|/g;
while()でいいんぢゃね? while(a==0){ func0(); break; } while(a==1){ func1(); break; }
746 :
デフォルトの名無しさん :04/04/20 04:18
747 :
デフォルトの名無しさん :04/04/20 14:00
すみません。初歩的な質問があります。。 C/CPPのグローバル変数についてなんですけど、 関数内からグローバル変数を宣言することは可能なんでしょうか? 例えばmain関数内でグローバル変数としてチェスボード(配列)を宣言して それを他の再帰的に使用する関数で参照できるのかどうか。 親切な方、よろしくお願いします。
>>747 >C/CPPのグローバル変数についてなんですけど、
CPPってC++のこと?プリプロセッサだと思われちゃうよ。
>関数内からグローバル変数を宣言することは可能なんでしょうか?
『宣言』はたぶんできます。『定義』はできません。
>>747 int global; /* 定義 */
void function(void)
{
extern int global; /* 宣言 */
}
750 :
デフォルトの名無しさん :04/04/20 16:11
2つの数の最大公約数を求めるには以下のプログラムのようなユークリッドの互除法を用いるが普通である。 #include <stdio.h> int main() { int i, j, k; scanf( "%d%d", &i, &j ); printf( "i = %d, j = %d\n", i, j ); while ( 1 ){ if ( j == 0 ){ printf( "%d\n", i ); break; } /* if */ k = i % j; i = j; j = k; } /* while */ return ( 0 ); } /* main */ このプログラムをまず入力しその動作を確認してから、0から20までの2つの数のあらゆる組み合わせについて、その最大公約数を表示させるプログラムを作れ。 例: (0, 0)->0 (1, 0)->1 ........ (4, 6)->2 .........
int i,j; for(i=0;i<=20;i++) for(j=i;j<=20;j++) printf("(%d,%d)->%d\n",j,i, ユークリッド(i,j));
752 :
デフォルトの名無しさん :04/04/20 19:02
文章aと文章bを比較して違う文字を表示させるプログラム。 例えば文章aの内容が「あいうえお」で文章bが「あいええあ」の場合 う:え お:あ 見たいな感じで表示するプログラム作って( ゚д゚)ホスィ…
日本語もちゃんと処理しろって?
754 :
デフォルトの名無しさん :04/04/20 19:13
#include <fcntl.h> void main (int argc, char *argv[]) { int fd; if (fd=open(argv[1],O_RDONRY)==-1) perror("open"); else closed(fd); } ↑のプログラムを元にして、 プログラム実行時の引数の個数と引数を表示する その後エラーがあればメッセージを表示する 2つの条件を満たすプログラムを作成して欲しいです 軽いヒントでも結構です 正直、何をしたらいいのかすら分からずに困っているので助けてください
756 :
デフォルトの名無しさん :04/04/20 20:48
>>752 #include <stdio.h>
#include <string.h>
int kanji(int c){
c = c & 0x000000ff;
return ((0x81<=c && c<=0x9f) || (0xe0<=c && c<=0xfc));
}
int func(char *s,char *out){
if(kanji(*s)){
sprintf(out,"%c%c",*s,*(s+1));
return 2;
}
else
sprintf(out,"%c",*s);
return 1;
}
int main(){
char s1[] = "あいうえおac",s2[] = "あいaえうあb";
char tmp1[3],tmp2[3];
int i = 0,j = 0;
while(s1[i] && s2[j]){
i += func(&s1[i],tmp1);
j += func(&s2[j],tmp2);
if(strcmp(tmp1,tmp2) != 0)printf("%s : %s\n",tmp1,tmp2);
}
return 0;
}
※NEC PC-9800用
757 :
お願いします :04/04/20 21:57
整数nを読み込み、nの素因数分解の結果を、例えば 588=2*2*3*7*7 という形に出力するプログラミングを考えよ。その時に、 (1)入力値がn=588の時の手計算を行ってみて、どういう変数を用意すればよいのか、 (2)入力値がn=588の時に、用意した変数の値の組をどの様に更新していけばよいのか を考えて、プログラミングを構成せよ。
758 :
デフォルトの名無しさん :04/04/20 21:59
広末さん長男は「宏志」 母子は既に退院 女優の広末涼子さん(23)の所属事務所は20日、広末さんが10日に出産した長男の名前が「宏志(ひろし)」に決まったと発表した。 広末さん親子は既に東京都内の病院を退院している。(共同通信) ひろしって案外、普通だなw
760 :
デフォルトの名無しさん :04/04/20 22:05
761 :
お願いします :04/04/20 22:22
>>759 具体的には、どのようにやればいいのでしょうか?
>>761 俺はまだまだプログラミング初心者だからよくわからんが
もしnが2で割れたら、2で割れるまで割る、で、割れなくなったら
3を試す4を試す・・・・・みたいな感じ?
あとは詳しい人に聞いてくれ。すまぬ
763 :
お願いします :04/04/20 22:38
>>762 ありがとうございました。 詳しい方、お願いします。
764 :
デフォルトの名無しさん :04/04/20 22:39
#include <stdio.h> main(){ int a=2,n; scanf("%d",&n); printf("%d=",n); while(a < n) { if(!(n % a)) { n/=a; printf("%d*",a); } else a++; } printf("%d",n); }
765 :
デフォルトの名無しさん :04/04/20 23:33
>>763 1)まず素数テーブルを用意する。(unsigned intの範囲なら要らないかも)
2)sqr(N)以下の素数まで因数分解。
3)因数分解の結果は
逐次表示するなり
1)のテーブル更新に利用しとけ。
わからないので教えて下さい! #include <stdio.h> int main() {int i, j, k; scanf( "%d%d", &i, &j ); printf( "i = %d, j = %d\n", i, j ); while ( 1 ){ if ( j == 0 ){ printf( "%d\n", i ); break; } /* if */ k = i % j; i = j; j = k; } /* while */ return ( 0 ); } /* main */ 0から20までの2つの数のあらゆる組み合わせについて、その最大公約数 を表示させるプログラム{例:(0, 0)->0 (1, 0)->1}を、このプログラムを基に作るという問題なん ですが、教えて下さい、お願いします!
この問は、ユーグリットの互除法というものが使われています。 自分で作ってみたプログラムです。 #include <stdio.h> int main() { int i, j, k,l; int a,b; for(i=1;i<=20;i++) { for(j=1;j<=20;j++) { if ( l=0 ) { printf( "(%d,%d)=>%d,", i, j , i ); k = i % j; i = j; j = k; } printf( "(%d,%d)", i, l ); } } }
768 :
デフォルトの名無しさん :04/04/21 00:19
746です。どなたかおねがいできませんか?よろしくおねがいします。
ひまなのでやってみた。 たぶんこんなでいいんとちがうかな。 #include <stdio.h> int main() { int i, j, k; for(i=1;i<=20;i++){ for(j=1;j<=20;j++){ int tpi = i; int tpj = j; while( 1 ){ if ( tpj == 0 ){ printf( "(%d,%d)=>%d\n", i, j , tpi ); break; } k = tpi % tpj; tpi = tpj; tpj = k; } } } return 0; }
>>768 単方向リスト(連結リスト、線形リスト)の典型的な実装の一つ。週末まで待って。
>>768 悪いこといわないから自分でできるだけやれ、そのほうが絶対ちからになるって。 で、お前は留学生か?
>>768 ヒントだけ書いておくと、リストの項目の追加や並び替えは、すべてnode->nextを書き換えることによって行われる。
>>768 線形リストはぐぐればたくさんあるから読んでみるのもお勧め。
漏れも先セメ、連結リストで死んだ
関数ってなんですか?
プロフェッショナアウな俺にも分からん
printf("駄目歩")
いっこだけチャレンジ void addLast ( SitePtr , SiteList * ) { if ( SiteList->next == NULL ) SiteList->next = createNode( SitePtr.name, SitePtr.coord ); else { SitePtr *p = SiteList->next; while( p->next != NULL ) p = p->next; p->next = createNode( SitePtr.name, SitePtr.coord ); } }
...ねます。 void addLast ( SitePtr hoge, SiteList *list ) { if ( list->next == NULL ) list->next = createNode( hoge.name, hoge.coord ); else { SitePtr *p = list->next; while( p->next != NULL ) p = p->next; p->next = createNode( hoge.name, hoge.coord ); } }
>>779 同じ処理を二回書かなくても、最初に whileを持ってくればいいのでは。
>>768 Middle Earthって指輪物語かよ。
MORIA、AngBandっていうRogue系のゲーム
渡せば単位くれそうだな。
すでに持ってるかもしれんけど
SitePtrはnodeのポインタだからhogeからメンバを 参照するにはアロー演算子が必要。ていうか #define NAME(ptr) ((ptr)->name) #define COORD(ptr) ((ptr)->coord) #define NEXT(ptr) ((ptr)->next) #define EMPTY(ptr) ((ptr)==NULL) 使ってくれって感じみたいだけど俺なら使いたくない気持ちはわかる。
確かに。妙なマクロ使う方が可読性悪くなるよね。
>>769 さんありがとうございます。理解できました!!
785 :
デフォルトの名無しさん :04/04/21 13:52
768です。
>>771 さん
おっしゃる通りです。できるとこはやろうとしてるんですが、、
Deleteのファンクション以外のアルゴリズムはわかるんですが、
自分には知識・能力がない為、実際にコードを書くとなったら辛いんです、、、
まだ.hファイルの中身を整理しきれていないので、それから徐々にコードを書こうと思います。
みなさん助けて下さって本当にありがとうございます。
>>785 Deleteのアルゴリズム。
SiteListをたどって、指定されたSitePtrをnextにもつノードを探す。
そのノードのnextをSitePtrのnextで置き換え、SitePtrを解放。
イメージとしては、
node->next
node->next 3.←ここに設定すると、
node->next 1.←これが該当するノードだとすると、
node->next 2.←このノードを
node->next
node->next 4.←これの指す先は
node->next 5.←このノードになり、
node->next 6.ここは宙ぶらりん。解放する。
787 :
デフォルトの名無しさん :04/04/21 15:32
>>786 さん
deleteのアルゴリズムありがとうございました。
具体的なコードを書くのは今の段階ではきついんですが、
こんな感じでいいんでしょうか?
delete
{
//SiteListをたどって、指定されたSitePtrをnextにもつノードを探す。
NEXT(Ptr)==node;
Ptr->next=node->next;
free(node);
}
本当に感謝しています。ありがとうございます。
788 :
デフォルトの名無しさん :04/04/21 16:01
構造体について質問があります。 struct Node{ char *value; struct Node *next; }; この構造体の中のstruct Node *nextの意味がよくわかりません。 宜しくお願いします。
Nodeへのポインタを格納...
>>788 struct Node *head, *p, *q;
head = malloc(sizeof (struct Node));
p = malloc(sizeof (struct Node));
head->next = p;
while(1){
q = malloc(sizeof (struct Node));
p->next = q;
p = q;
if ((getch()) == 'q') break;
}
(まったく意味のないプログラムですが)たとえばこんな風に使うんですかね?
たどっていくため。
>>790 746=768がやってる線形リストのような構造で使う。辿るのに使うというか、辿るための構造というか。
792 :
デフォルトの名無しさん :04/04/22 00:29
すいませんちょっと質問よろしいでしょうか #define A 10; #define B 5; となっているときに main() { int x[10]; int i; for(i = 0; i < 10; i++){ x[i] = B + A * i; } } という処理を行うと間接指定演算子(*)が〜というエラーがでてしまいます。 Aの部分を内部変数や1、2等の数字にするとエラーは出ないのですが Aをそのまま使う方法は何か無いでしょうか?
>>792 #define A 10;
#define B 5;
↑これが原因。
これを展開すると、
x[i] = 5; + 10; * i; すなわち、
x[i] = 5;
+ 10;
* i;
の三つの文になる。
あと、エラーメッセージを省略するのは何も書いてないのと同じだ。
x[i] = i * A; x[i] += B;
#include <stdio.h> char *prompt="% "; char *argv[20], input[80]; main() { printf("%s", prompt); while(fgets(input, sizeof(input), stdin) != NULL){ input[strlen(input) -1] = '\0'; if(fork() == 0){ split(input, argv); if(execvp(argv[0], argv)<0) perror(argv[0]); }else{ wait(0); } printf("%s", prompt); } } int split(char *input, char *argv[]){ } 問題:上記プログラムを改変して、 課題1 一行の入力を空白で分割し、char *argv[n]に格納する関数splitをつくれ。 ただし、ポインタと文字列(終端記号)の性質を利用すること。 課題2 実行したコマンドを配列に保存し、特定のキーを押したら 過去のコマンドのリストを表示、実行できる機能(ヒストリー)を付加せよ。 お力添えを願います。
まず、 struct ptr { double x,y; }; と構造体を宣言する。 6*x+4*yをx'として、-2*x+yをy'という座標とする。(線形変換) xとyをキーボードから入力して、x'とy'を出力するプログラムを作成する。 ただし必ずstruct ptr型の構造体変数を用いることとし、線形変換の部分を関数void lin_tra(struct ptr *)として作成すること。 突破口が全然開けずorz どなたか助言お願いします。
>>796 void lin_tra(struct ptr *point)
{
struct p = { point->x, point->y };
point->x = 6 * p.x + 4 * p.y;
point->y = -2 * p.x + p.y;
}
>struct p = { point->x, point->y }; ↑間違ってた struct ptr p = { point->x, point->y };
ここの人にとっては本当にくだらない質問かもしれないけど 学校の課題で、C言語で2つの整数(例4と3)を入力しその 和(例7)を出力しるっていうのが出たけどサッパリなので どうかおながいします。
#include <stdio.h> int main(void) { int x, y; scanf("%d%d", &x, &y); printf("%d\n", x + y); return 0; }
そうか、こういう時期なんだな。
>>793 ,794
どうもありがとうございました。
マクロの後ろにセミコロンつけたなんて初歩的なミスだったんですね。
今度はよく見直してから質問するようにします。
>あと、エラーメッセージを省略するのは何も書いてないのと同じだ
大変失礼しました。今後気をつけます。
>>804 (1) exit()→stdlib.h
(2)if(year%4==0 && year%100!=0 || year%400==0)
↓
if((year%4==0 && year%100!=0) || year%400==0)
(3)for(;day>totaldays1;i++)→for(;*day>totaldays1;i++)
(4)最後のprintfに')'が足りない。
これでコンパイルできるかも。
あたしも実行して確かめたわけじゃないからね。
age
>>804 汚いsourceで直す気にもならんが、そのエラーは
printf("西暦%d年の%d日目は…のprintfの最後の括弧が抜けている。
エラーメッセージを読んでから質問しろ。
Winny3を作れという宿題がでました。全く作り方がわかりません。よろしくお願いします
#include <iostream> main() { cout << "Winny3.exe" << endl; }
>>810 ありがとうございました。
#include <stdio.h> int main(void) { int num, i; char buf[256]; FILE *fp; printf("いくつ作りますか?\n>"); scanf("%d", &num); for(i = 0; i < num; i++) { sprintf(buf, "winny3(%d).exe", i + 1); fp = fopen(buf, "w"); fclose(fp); } }
以下の動作を順番に実行するコードをMPIを用いて作成しなさい 1.プロセス群の生成処理 2.ランク0のプロセスがファイル(in.dat)からデータを64個読み込む。ファイル中には一行に倍精度実数が1つづつ記述されている。 3.ランク0のプロセスが読み込んだデータの総和を計算する。 4.ランク0のプロセスがその総和をファイル(out.dt)に出力する。 5.プロセス群の終了。 お願いします。
俺仕様ですか。
プログラムをコンパイルすると いつもwarning: no newline at end of file というのが出るんですがどうすれば直るんでしょうか?
最後の行で改行する
gccka?
>>816 GCCかCC使ってるのか。
メモ帳以外のエディタで開いてみな(k2editerとか
最後に[EOF]てのがあるからそれだけ最後の行に来るように改行汁。出なくなる。
820 :
デフォルトの名無しさん :04/04/23 01:13
>>819 その制限は何のために存在するのですか?
821 :
デフォルトの名無しさん :04/04/23 01:17
ぼるじょあの意味が全然わからなかった。 山崎渉のコピペにも使われていたので勘違いしていた。 ポンキッキーズが由来だったのか? それともPC初心者板専用?
>>820 昔からテキストファイルは改行で終わるのが一般的。
そりゃそうと、最後の行に改行がないとバグるコンパイラがあったなぁ。
以下の動作を順番に実行するコードをMPIを用いて作成しなさい 1.プロセス群の生成処理 2.ランク0のプロセスがファイル(in.dat)からデータを64個読み込む。ファイル中には一行に倍精度実数が1つづつ記述されている。 3.ランク0のプロセスが読み込んだデータの総和を計算する。 4.ランク0のプロセスがその総和をファイル(out.dt)に出力する。 5.プロセス群の終了。 お願いします。
1・ファイル(in.dat)からデータを64個読み込む。ファイル中には一行に倍精度実数が1つづつ記述されている。 2・読み込んだデータの総和を計算する。 3・その総和をファイル(out.dt)に出力する。 この部分は fp = fopen("in.dat","r"); for(i=0;i<64;i++){ fscanf(fp,"%lf",&s[i]); sum+=s[i]; fclose(fp); fp = fopen("out.dat","w"); fprintf(fp,"%lf",sum); fclose(fp); であってますか?
>>829 >fprintf(fp,"%lf",sum);
"%lf"じゃなくて "%f"
別にlfでも構わんよ。 但し最新規格準拠のコンパイラを使ってるならね。
>>830 ありがとうございます。
それでですね、下のソースを作ったのですが、コンパイルできても実行できません。
どなたか間違いを指摘していただけたら・・・
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
int main(int argc , char **argv){
int a,i;
double sum;
double s[100]={0};
FILE *fp;
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&a);
if(a == 0){
fp = fopen("in.dat","r");
for(i=0;i<64;i++){
fscanf(fp,"%lf",&s[i]);
sum+=s[i];
}
fclose(fp);
fp = fopen("out.dat","w");
fprintf(fp,"%f",sum);
fclose(fp);
}
MPI_Finalize();
}
833 :
デフォルトの名無しさん :04/04/23 17:10
回文を作成するCのプログラムを作っているのですが、 配列の要素から後ろの一文字だけを削除するにはどうしたらいいのでしょうか?
>>832 mpirun じゃなくて ./a.out ってやってたりしない?
>>833 配列って普通の文字列のことか?それなら、
char str[] = "abc";
...
if(str[0] != '\0') /* 空でない */
str[strlen(str)-1] = '\0';
>>833 a[strlen(a) - 1] = '\0';
>>834 mpirun -np 1 filename
で実行しています。これは間違いないはずですが・・・
「実行できません」の内容は? out.datというファイルは作成されるのか、 作成されるのならサイズはいくらか、中身な何か、 エラーメッセージは出ないのか? あと、読むたびに表示してみたりってできるのかな?
>>837 まさか filename がソースファイルの名前ってことは無いよね?
mpicc でコンパイルしてできたバイナリの名前だよね?
すいません、やっぱり実行方法が間違ってました・・・ file名じゃなくて、a.outでした。 ありがとうございました。
そのまさかだったのか... 言ってみるもんだな。
でもこれって、-np 1 だし、「プロセス群の生成」ってしてないよね。 ランク0だけが仕事してるし。 どっか並列にしないといけないんでは?
いえ、これはまだ1問目で並列計算は2問目からなんです。
845 :
デフォルトの名無しさん :04/04/23 17:36
>>835 >>836 ありがとうございました!!
いけました
で、回文を作るプログラムなのですが2バイト文字を扱うにはどうすればいいのでしょうか?
あきらめたらそこで試合終了だよ。
すいません少し教えてください。 10〜99999までの範囲の数字で、配列を使用して 例えば12なら21、990なら99、6700なら76、15324なら42351のように 数字を逆にする方法はどうやるんでしょうか?
>>847 void reverse(char *str) {
int i, j;
for(i = 0, j = strlen(str) - 1; i < j; i++, j--) {
int temp = str[i];
str[i] = str[j];
str[j] = temp;
}
}
int i = 6700;
char temp[6];
sprintf(temp, "%d", i);
reverse(temp);
sscanf(temp, "%d", &i);
//負の数とかINT_MAX近辺には使えんよ int reverseNum(int num){ int ans=0,keta=1,ten =1; while(num/keta >= 10)keta *= 10; for(;keta>=1;keta /= 10,ten*=10){ ans += ten*(num/keta); num %= keta; //printf("\nnum=%d,ans=%d,keta=%d,ten = %d",num,ans,keta,ten); } //printf("\n%d\n",ans); return ans; }
>>848 ,849
ようやく完成させることができました。
お二方どうもありがとうございました。
851 :
デフォルトの名無しさん :04/04/24 13:13
お邪魔します。 コンソールから半角カタカナを入力したら、 それを2バイトのひらがなに直す関数を作りたいんですが、 普通の文字(「あ」や「い」など)は何とか考えられそうなのですが、 濁音・半濁音(「が」「ぱ」など)はどうすればいいのか分かりません。 あと、ASCIIコードでやるのと、二次元配列で2つを対応させるのと、 どっちが良さそうですかね? どなたか教えてください。お願いします。 void func( char str1[], char str2[] );
>濁音・半濁音(「が」「ぱ」など)はどうすればいいのか分かりません。 慌てずに常に次のもう1文字見ながら変換していけ
M$なら LCMapString ってのがあるらしい
>>851 まず濁音・半濁音が存在する音なのかどうか判定して
存在するなら次の文字を調べ、それが濁点・半濁点だったら、
濁音・半濁音として変換する。
これをプログラムにすればいいんじゃのかしら。
とりあえず、今作っているものの、必要そうなところだけ抜粋します。 #define MAX 80 void trans( str1[], str2[] ) { short i; for (i = 0; str1[i]; i++){ if (str1[i + 1] == '゙' || str1[i + 1] == '゚'){ /* ここがわかりません */ } str2[i] = 0x82; str2[i + 1] = str1[i] + /* ここもわかりません */; } /* ここでstr2に'\0'を入れます */ } int main( void ) { char str1[MAX + 1], str2[MAX * 2 + 1]; printf("半角カタカナを入力してください:"); scanf("%s", str1); trans( str1, str2 ); printf("変換前:%s\n", str1); printf("変換後:%s\n", str2); return 0; } もし全然見当違いでしたらおっしゃって下さい・・・
あ、書き込んでから気づきました。 trans関数の宣言で仮引数の型が抜けてますね、char型です。 あと > str2[i] = 0x82; > str2[i + 1] = str1[i] + /* ここもわかりません */; じゃなくて str2[i * 2] = 0x82; str2[i * 2 + 1] = str1[i] + /* ここもわかりません */; かな?
857 :
デフォルトの名無しさん :04/04/24 15:02
誰か教えてください。 回文を作成するプログラムを考えているんです。 strcpyとstrcatとstrlenの3つの文字列操作関数を使おうと思っているのですが、 どうやったら文字を逆さまにすればいいのかが思いつきません。
モニタを上下逆にする
なんとか形になってきました。
>>852 さん、
>>854 さんのおっしゃったように、
for (i = 0, cnt = 0; str1[i]; i++){
if (str1[i] < 0xA6 || str1[i] > 0xDF){ continue; }
if (str1[i] == 'ー'){
str2[cnt++] = 0x81;
str2[cnt++] = 0x5B;
continue;
}
str2[cnt++] = 0x82;
if (str1[i] >= 'カ' && str1[i] <= 'ト' || str1[i] >= 'ハ' && str1[i] <= 'ホ'){
if (str1[i + 1] == '゙' || str1[i + 1] == '゚'){
:
という風にしてみました。が、
このあとswitch文で、だらだらとカの場合、キの場合、クの場合、
と、頭の悪そうな行が続きます。
これを計算で求める、効率の良い方法が思いつきません。
表が完全に対応していないのでやりにくいです・・・
860 :
デフォルトの名無しさん :04/04/24 15:36
#include <stdio.h> #include <string.h> int main(void){ char buf[64]; int len, i, t; fgets(buf, sizeof buf, stdin); len = strlen(buf); len -= 2; /*ナル文字と改行分*/ for (i = 0; i < len / 2; i++){ t = buf[i]; buf[i] = buf[len - i]; buf[len - i] = t; } puts(buf); return 0; }
>>859 >このあとswitch文で、だらだらとカの場合、キの場合、クの場合、
>と、頭の悪そうな行が続きます。
普通のかなに変換して、濁音なら+1、半濁音なら+2でいいんじゃない?
幸い、平仮名の濁音半濁音は全て1バイト目が0x82だし。
>>863 あ、なるほど!
最初に普通に変換してしまうんですね!
そのあと濁音半濁音の判定をすればいいのか・・・。
ありがとうございます!これでちょっと効率よくなります!
がっ
早朝から質問させていただきます。 ________ |100 + 30 = 130 | |100 - 30 = 70 | |100 * 30 = 3000 | |100 / 30 = 3 | |100 % 30 = 10 |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ↑の実行画面になるとおりに下記のプログラムを穴埋めせよ #include <stdio.h> void main(void) { int n1,n2,wa,sa,seki,syo,amari; n1=100; n2=30; wa=n1+n2; sa=n1-n2; seki=n1*n2; syo=n1/n2; amari=[ @ ]; printf("%d + %d = %d\n",[ A ]); printf("%d - %d = %d\n",[ B ]); printf("%d * %d = %d\n",[ C ]); printf("%d / %d = %d\n",[ D ]); printf("%d %% %d = %d\n",[ E ]); } という問題なのですが、全然わかりません。 どうかご教授お願いします。
試しに @n1%n2 Awa Bsa Cseki Dsyo Eamari で実行してみましたが _________ |130 + 3 = 3000 | |70 - 3 = 3000 .| |3000 * 3988 = 869 .| |3 / 3988 = 869 | |10 % 3988 = 869 .|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ となってしまいます。 参考書等はありませんし、検索してもわかりませんでした。
>>867 原因は、printfの使い方が間違ってる、というか、分かってないから。
printfの関数リファレンス(使い方説明)を調べるべし。
ちなみに、宿題で出されてるのに参考書などがないというのはどういう事かと。
amari=n1%n2; printf("%d + %d = %d\n",n1,n2,wa); printf("%d - %d = %d\n",n1,n2,sa); printf("%d * %d = %d\n",n1,n2,seki); printf("%d / %d = %d\n",n1,n2,syo); printf("%d %% %d = %d\n",n1,n2,amari);
>>868-
>>869 ありがとうございました。
>>869 さんの正解を参考に
>>868 さんの言われたとおりに考えると「なぜそうなるか」が理解できました。
%dは変数で代入していく値を順に書き込むんですね。
>>868 参考書は私のミスで学校に置いたままなのです;
4月は漏れでも答えられるような簡単な問題ばかりで嬉しいなあ
そうッスね
0〜50までの値を配列に格納してそれを昇順/降順で 表示させたいのですが上手くいきません・・・ #define QUEUE_SIZE 64 #define next(a) (((a) + 1) % QUEUE_SIZE) #define K 62 --プロトタイプ宣言省略-- int queue[QUEUE_SIZE]; int front; int rear; main() { int num = 0; int i; init(); for(i = 0; i <= K; i++) { enqueue(num++); printf("%d\n", queue[i]); } for(i = K; 0 <= i <= K; i--) { printf("%d\n", queue[i--]); } }
void init(void) { front = rear = 0; } void enqueue(int x) { if(next(rear) == front) error("これ以上要素を追加できません\n"); queue[rear] = x; rear = next(rear); } void error(char *s) { fprintf(stderr, s); exit(1); }
#define K 62 ↓です #define K 50
>>874 for(i = K; 0 <= i <= K; i--)
{
printf("%d\n", queue[i--] /* ←これなによ?*/ );
}
queueはFIFO・・・
あと、0 <= i <= K もおかしい。
for(i = K; 0 <= i <= K; i--)→ for(i = K; 0 <= i; i--) printf("%d\n", queue[i--]); → printf("%d\n", queue[i]);
4月は漏れでも答えられるような簡単な問題ばかりで嬉しいなあ
そうッスね
ありがとうございます。 やっとポンコツソースがまともに動きました(´・ω・`)
882 :
デフォルトの名無しさん :04/04/25 16:57
>>746 です。
現在自力でやってみてるのですが、test.cを書くどころか、
まだsites.cもままらない状況です。この調子では期限まで間に合いそうにありません、、
もう限界です、、、どなたかお願いできませんか??宜しくお願いいたします。
883 :
デフォルトの名無しさん :04/04/25 16:59
締切りはいつ?
884 :
デフォルトの名無しさん :04/04/25 19:35
このような問題が出たのですがやり方がわかりません。教えていただけないでしょうか。お願いします。 "struct element"型構造体を以下のように宣言する。 struct element{ char name[10]; int price; struct element *pp; }; struct element型構造体を使う。 startをstruct element型へのポインタとする。 startのポインタをたどり、第3番目のデータのNULL(='\0')を見つけるまで、次のように画面表示するプログラムを作成せよ。 -> apple \150 -> orange \100 -> melon \500
void find(struct element *p){ while (p != NULL){ printf("-> %s \%d ", p->name, p->price); p = p->pp; } }
早いお答えありがとうございます。
887 :
デフォルトの名無しさん :04/04/25 20:07
あっ \→\\に。
プログラムの問題じゃなくてもいいかな(´ω`) 既に64ビットコンピューターが一般に手に入るようになってきたが、 その場合、fseek、ftell関数などの定義をどのように変更すると もっともシステムの変更が少なくなるか考察せよ。 (IntelとAMDではアプローチが違うのでその点も加味すること) ってのが良く分からなくて・・ 助言お願いします。
size_t 使わないヤシのことなんか知らん
891 :
デフォルトの名無しさん :04/04/26 04:23
>>883 締め切りは火曜日までなんです。
よろしかったらお願いいたします。
かなり視野の狭い範囲の問題だな。 んなもんコンパイラとAPIの依存の問題で マクロなどを使って工夫しろとしか言いようが無い。
>>890 どこから size_t なんて沸いて出やがりましたか?
894 :
デフォルトの名無しさん :04/04/26 15:44
896 :
デフォルトの名無しさん :04/04/26 16:14
まんまこのような絵を渡されてこういうプログラムを作れと言われまして。 一応問題の全文を書きました。 私の考えた事を書きますと、 1.入力プロセス&出力プロセスをcreateprocess関数で作成起動 2.入力プロセス:キーボードで"Hello world"を入力 3.メールスロットを使って出力プロセスへ渡す 4.受信待ちしていた出力プロセスが、"Hello world"を受け取る 5.出力プロセス:"Hello world"をファイルへ書き込む 6.出力プロセス:"Hello world"を表示 7.5と6が終わったら"OK"をメールスロットを使って入力プロセスへ返す 8.受信待ちしていた入力プロセスが"OK"を受け取る 9.入力プロセス:"OK"を表示する 10.入力プロセス:キーボードの入力待ち こういう事ではないかと思います。どうもこの手順を書きながら思ったのですが もしかすると学生がどこまで独学で出来るのかを図る意図があったのかもしれないですね。
>こういう事ではないかと思います。どうもこの手順を書きながら思ったのですが >もしかすると学生がどこまで独学で出来るのかを図る意図があったのかもしれないですね。 そんな考えを持ちながら、このスレに投稿したというのか
>>896 >一応問題の全文を書きました。
どこに書いてあるの?
899 :
デフォルトの名無しさん :04/04/26 16:32
>>898 正しくは「描きました」ですね。すいません。
>>899 なるほど。了解です。
んで、図だけで文章無し?
901 :
デフォルトの名無しさん :04/04/26 16:45
>>900 はい。図だけでなのです。
>>894 であるようにcreateprocessとmailslotを使う事を
口頭で指示されているのですが、文章はありません。
よろしくお願いいたします。
902 :
デフォルトの名無しさん :04/04/26 18:52
1000までのすべての素数を表形式で表示するHTMLを出力するプログラムを作れ。ただし、素数を計算するプログラムは以下を参照すること。 #include <stdio.h> #include <stdlib.h> int is_prime( int i ) { int n; for ( n = 2; n < i; n++ ){ if ( i % n == 0 ) return 0; } /* for */ return 1; } int main() { int i, j; j = 0; for ( i = 2; i <= 1000; i++ ){ if ( is_prime( i ) ){ j = j + 1; printf( "%5d", i ); if ( j == 10 ) { printf( "\n" ); j = 0; } /* if */ } /* if */ } /* for */ printf( "\n" ); return 0; } /* main */
うわー、めちゃくちゃ効率悪いな。
すみません884で質問した者ですが、10時間ぐらい考えても、どうしてもプログラムが作れません。 main関数の中も教えていただけないでしょうか。お願いします。
#include <stdio.h> struct element{ char name[10]; int price; struct element *pp; }; void find(struct element *p){ 略 } int main() { struct element melon = { "melon",500,NULL }; struct element orange = { "orange",100,&melon }; struct element apple = { "apple",150,&orange }; struct element *start = &apple; find(start); return 0; } なんか違うような気もするが。
906 :
デフォルトの名無しさん :04/04/26 19:14
適当なASCII文字で構成されたファイル(たとえば漢字を使わないで書かれたC言語のプログラムなど)を入力して、アルファベットの部分のみすべて大文字にして別のファイル名でセーブするプログラムを書け。たとえば、 input file: foobar.c output file: foobar2.c というように最初に聞いて、その情報に基づいて動作するようにせよ。ただし、下線は手で打ち込んだ部分。また、変更した文字数などを最後に出力するようにせよ。
>>902 printf("<html><head><title>hoge</title></head><body><table>");
for ( i = 2; i <= 1000; i++ ){
if ( is_prime( i ) ){
if(j == 0) printf("<tr>");
j = j + 1;
printf( "<td>%5d</td>", i );
if ( j == 10 ) {
printf( "</tr>\n" );
j = 0;
} /* if */
} /* if */
} /* for */
printf("</table></body></html");
>>906 #include <stdio.h>
#include <ctype.h>
int main() {
FILE *in_fp,*out_fp;
int c;
long count=0;
char in_file[80],out_file[80];
printf("input file: "); gets(in_file);
printf("output file : "); gets(out_file);
if((in_fp = fopen(in_file,"r")) != NULL) {
if((out_fp = fopen(out_file,"w")) != NULL) {
while((c = fgetc(in_fp)) != EOF) {
if(islower(c)) {
count++;
c = toupper(c);
}
fputc(c,out_fp);
}
}
fclose(out_fp);
}
fclose(in_fp);
return 0;
}
printf("chars : %d\n",count);
910 :
デフォルトの名無しさん :04/04/26 19:38
だいぶエラーが出てしまうのですが、やりかたが根本的に違うということなのでしょうか? 配列を使ったりして、なんとか動くようにならないでしょうか。お願いします。
>>908 toupper() は変換できない場合はそのままのコードを返すから、
fputc(toupper(c), out_fp); でおk。
>>912 >また、変更した文字数などを最後に出力するようにせよ。
>>913 あー指摘するのも面倒くさい。そーすよめ
916 :
デフォルトの名無しさん :04/04/26 19:54
>>911 struct element melon = { "melon",500,NULL };
struct element orange = { "orange",100,NULL };
struct element apple = { "apple",150,NULL };
struct element *start = NULL;
start = &apple; apple.pp = &orange; orange.pp = &melon;
に変えてみろ。
それとも挿入は自分で入力できるようにしたいのか?
917 :
デフォルトの名無しさん :04/04/27 05:23
解説おねがいします! #include <stdio.h> #include <stdlib.h> int ***malloc3Dint(int, int, int); void free3Dint(int ***); int main(void){ int l=2, m=3, n=4; int ***aaai; aaai = malloc3Dint(l, m, n); aaai[1][2][3] = 123; printf("%d\n", aaai[1][2][3]); free3Dint(aaai); return 0; }
int ***malloc3Dint(int l, int m, int n){ int i, j; int ***aaai2; int **aai2; int *ai2; if((aaai2 = (int ***)malloc(sizeof(int *)*l)) == NULL) exit(1); if((aai2 = (int **)malloc(sizeof(int *)*l*m)) == NULL) exit(1); if((ai2 = (int *)malloc(sizeof(int)*l*m*n)) == NULL) exit(1); for(i=0; i<l; i++){ for(j=0; j<m; j++) aai2[i*m + j] = ai2 + i*m*n + j*n; aaai2[i] = aai2 + i*l; } return aaai2; } void free3Dint(int ***aaai2){ free(aaai2[0][0]); free(aaai2[0]); free(aaai2); } このプログラムは何をやっているのか順を追って説明していただけませんか? よろしくおねがいします。
>>919 count_bits()の中
> while (x){
> if(x&1U)count++;
> }
if文の次に x >>= 1; を追加。
以上。
921 :
助けてください。 :04/04/27 11:49
C言語を使ってやる宿題なんですができません。 わかる方お願いしますm(_ _)m 自力では何もできないもので。バカなんです。 次のような規則にしたがって離散時間tにおける状態xtから次の時刻t+1における状態xt+1が決まるシステムがある。 xt+1=tanh(axt) t=0,1,2,3..... この規則を繰り返し適用すれば初期状態xoから出発してそれ以降の任意の時刻での系の状態を計算できる。 x0→x1→x2・・・→xt→・・・ 次の2つの場合について初期値(正負どちらもあり得る)をいろいろ変えながら系の時間発展を計算せよ。典型的な例について状態xを時間の関数として図示し、系の振る舞いについてわかったことを述べよ。またなぜそうなるのかも考えてみよ。 (1)a=0.95の場合 (2)a=1.05の場合 マジお願いします。泣きそうなので。
すいませんがこの問題わかりません またお願いしたいです。 スタックを初期化する関数 void stack_initialize(stack *stk) およびスタックが空であるかどうかを判断する関数 int is_stack_empty(stack *stk) を作れ. is_stack_empty は,スタックが空であるときに 1 を,空ではないときに 0 を返す.
>>922 初期化→スタックポインタを0にすればいいんだろ。
俺ならスタックポインタの初期値は -1 にする。 使ってないって感じがするから。
-1が有効なアドレスだったらどうするよ。 ポインタならNULL使えって。
二つのやり方があるだろって言ってるんだよ。 stack[sp++] = push_data; stack[++sp] = push_data;
>>921 初期値の配列作って。ループ回して計算。
CVS形式でprintfした後,出力をExcelにでも読み込んで観察すれば?
プログラム書く必要がないなら,漏れはExcelだけで済ますけどな。
929 :
助けてください。 :04/04/27 13:59
921について。 928>> 図と説明はいいとして最初のプログラムがわかりません。 わかる方教えていただけたら幸いです。
int i,j; double x[10]; const int t_max = 1<<16; const int t_delta = 1; const double a=1.05; printf("a=%f\n"); printf("0,\t"); for(i=0; i<sizeof(x)/sizeof(x[0]); ++i) { printf("%f,\t",x[i]=0.1*i); } printf("\n"); for( i=1; i<t_max; i+=t_delta ){ printf("%d,\t",i); for( j=0; j<sizeof(x)/sizeof(x[0]); ++i){ printf("%f,\t",x[i]=tanh(a*x[i])); } printf("\n"); } しかし,SASとかグラフ描画ライブラリをか,しかるべきものを使うべき演習じゃねーのか,コレ?
縦5×横5のマスに○×をランダムで表示させる。 毎回同じであってはならない マスの左と上には座標数字を表示 マスの2行下に座標指定を‘XY’で入力する ‘00’を入力したら現在状態を破棄し、最初から始める ‘001’のように入力したらエラー、再入力 ‘Z’を入力で終了する 座標指定入力において何を入力しても不正な動作はしない。 ‘66’とか入力したら再入力にする 座標指定された位置、及び上下左右のマークを反対にする 指定された位置の上下左右が範囲外の時、何もしない。該当する部分のみ反対にする。 全マス同じマークになったら‘You win’を表示 全マス同じマークになったら何を入力しても最初から始める 条件は グローバル変数はマスに使うtableのみ ほかの変数はグローバルは認めない メイン関数の中身は 初期化処理する関数 ランダムで○×を表示する関数 座標を入力する関数 マークを反転させる関数 その結果を表示する関数 全マス同じマークか判定する関数 You winを表示する関数 どうかよろしくお願いします。m(_ _)m 本当に泣きそうです・・・
んーこれは、どこかで見たようなゲームかな。 ■□■□■ □■■■□ ■■■■■ □■■■□ ■□■□■ この状態で、中央を指定すると、 ■□■□■ □■□■□ ■□□□■ □■□■□ ■□■□■ このように反転する、と。
>>932 そんな感じです
>>933 ユーザー定義関数で以下を作れと言われました。
で、メインから呼び出せと・・・
この説明で分かるでしょうか?
初期化処理する関数
ランダムで○×を表示する関数
座標を入力する関数
マークを反転させる関数
その結果を表示する関数
全マス同じマークか判定する関数
You winを表示する関数
「ライツアウト」だろ?そのゲーム。
>>931 >全マス同じマークになったら何を入力しても最初から始める
これがよく判らん…が、他は↓こんなんでいい?
tp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1074774948&res=8
いかん、'z' 入力で終わるって仕様を実装すんの忘れた。 まあそれくらいは自分でやってちょ。
「float *p[10];」と「float (*p)[10];」の2つの変数宣言の違い、 「float a[][10]」と「float (*a)[10]」という 2つの関数の引数の宣言の違いについて 説明せよ、というのが分かりません。 お願いします。
float型のポインタの10要素配列、float型の10要素配列のポインタ float型の10要素配列の配列
940 :
デフォルトの名無しさん :04/04/28 01:48
猿ロダにうpしたソースファイル
ttp://www1.linkclub.or.jp/~yon/haha/saru-img/saru0757.c をポインタで書き換えたいのです。
//-------------------------------------------------------------------
// 以下のプログラムを作成してください
// 上記の四則演算関数の結果をポインタを用いて得るように改造する
// 次のような関数を作成する
// void Add(int a, int b, int *ans)
// void Sub(int a, int b, int *ans)
// void Mul(int a, int b, int *ans)
// void Div(int a, int b, int *ans)
//
//-------------------------------------------------------------------
初期値はプログラム内部で設定するので、入出力は気にしなくていいです。
お暇な方、よろしくお願いします<(_ _)>
void Add(int a,int b,int *ans) { *ans = a + b; } int x,y,z; x = 10; y = 5; Add(x,y,&z); これだけ書けば、あとは自分でできるよな、というほどの問題でもないが。
>>936 本当にありがとうございますm(_ _)m
自分でも読んでしっかり理解できるよう頑張ります
ありがとうございました。無事プログラムが完成しました。
なんで誰も>125に突っ込まないの?
続きものです。
//-------------------------------------------------------------------
// 以下のプログラムを作成してください。
// 941の作ってくれた関数をさらに一般化します。演算の仕方も引数で渡してください
// void Calc(int calc, int a, int b, int *ans)
// calc == 0 和
// calc == 1 差
// calc == 2 積
// calc == 3 商
//
//-------------------------------------------------------------------
それで作ったプログラムを、また猿ロダにあげました
ttp://www1.linkclub.or.jp/~yon/haha/saru-img/saru0759.c エラーが4つ、同じ関数の部分で出てしまいました。
どなたか添削していただけないでしょうか・・。
void型は戻値を持たない。
>>946 最後の引き数 「&z」 を渡すことで
戻り値は z の中に入るから
「z = 」は要らないよん。
こういうのってenumとか使ったほうがいいんじゃないの?
951 :
デフォルトの名無しさん :04/04/28 22:08
952 :
デフォルトの名無しさん :04/04/28 22:37
通りますたー! 949ありがd。947は、その通りですた。 「950のenumを使うのはC++だ」と言いたい951も(ついでに)ありがとお。 ・・実は、この続きがもう一問ありまつ。 //--------------------------------------------------------- // // さきほどのソースファイルの関数をさらに完全なものとする // @返り値を付加する(0なら正常/1ならエラー) // A計算方法を分かりやすくするため、#define定義にする // //--------------------------------------------------------- これで最後です。最終形態のラスボスです。 クリアしてエンディングを自力で見たいので、もちっと考えますが。
955 :
デフォルトの名無しさん :04/04/28 23:43
すいません。自然定数eを計算によって求め、結果を表示するプログラムの作り方を教えてください。
>>955 マルチ帰れ。
自然定数eなんてものは存在しないだろ。
>>953 >enumを使うのはC++だ
意味不明
958 :
デフォルトの名無しさん :04/04/28 23:56
そう問題に書かれていているからわからんのです。
959 :
デフォルトの名無しさん :04/04/28 23:57
(*n)[10] と n[10] はどう違うんですか?
>>958 そこまでマルチに徹するとは。
おそれいった。
あるファイルから文字を呼び出し、他のファイルへ左右逆にして 貼り付けたい時はどうすればいいですか? I am a boy. I like 2ch. ↓ .yob a ma I .hc2 ekil I こんな感じです。
for文とstrlen()を使えばいいです
char buf[1024];while(gets(buf)){char*p=buf+strlen(buf);while(p!=buf)putchar(*--p);}
#include <iostream> #include <iomanip> #include <limits> #include <cmath> double exp_(){ double tmp = 1.0; // eを計算するための一時変数 double term = 1.0; // eの展開級数の各項を保存する変数 int k = 1; // 展開級数の項番号 double eps = std::numeric_limits<double>::epsilon(); // machine epsilon while( term / tmp > eps ){ // 収束判定 term /= k; // 展開級数の各項が1 / k!なので,前の項の計算結果を使って // 1 / k! = 1 / (k-1)! * (1 / k) // と計算できる tmp += term; // 各項を足していく ++k; // 次の項の計算へ } return tmp; } int main(int argc, char *argv[]){ std::cout << std::setprecision(15); // 表示精度を15桁に std::cout << exp_() << std::endl; // 計算結果表示 std::cout << std::exp(1.0) << std::endl; // 比較のため }
>>963 一行の長さが1023超えたら条件を満たさなくなる。
ってことで、こんなもんかな。
static bool revCpChr(FILE *fpSrc, FILE *fpDest);
void revCp(FILE *fpSrc, FILE *fpDest)
{
while (revCpChr(fpSrc, fpDest)) {
}
}
bool revCpChr(FILE *fpSrc, FILE *fpDest)
{
int ch = fgetc(fpSrc);
switch (ch) {
case EOF:
return false;
case '\n':
return true;
default:
bool rtn = revCpChr(fpSrc, fpDest);
fputc(ch, fpDest);
return rtn;
}
最後の}が抜けた気がする。 ついでに蛇足ながら、 FILE *fpSrc = fopen("original", "r"); FILE *fpDest = fopen("reversed", "w"); revCp(fpSrc, fpDest); fclose(fpSrc); fclose(fpDest); って感じで利用する。