C言語何でも質問掲示板


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

規約と使い方

 
   複数のファイルを使っ ....   
     ・[3138] 管理人 
     ・[3139] box 
     ・[3140] Justy 
     ・[3183] 夢霧 
   関数の問題について   
     ・[3125] box 
     ・[3127] mika 
     ・[3128] box 
     ・[3129] mika 
     ・[3130] box 
     ・[3131] mika 
     ・[3133] box 
     ・[3136] mika 
     ・[3146] 管理人 
   借金の計算です。   
     ・[2877] 管理人 
     ・[2902] マグナーテン 
     ・[2903] 管理人 
     ・[2908] 管理人 
     ・[2929] マグナーテン 
     ・[2930] 管理人 
     ・[2933] フリオ 
     ・[2934] マグナーテン 
     ・[3008] 管理人 
     ・[3116] フリオ 
     ・[3137] 管理人 
   フローチャート   
     ・[3098] ミサ 
     ・[3099] ミサ 
     ・[3100] ミサ 
     ・[3101] ミサ 
     ・[3102] ミサ 
     ・[3103] ミサ 
     ・[3104] ミサ 
     ・[3110] Justy 
     ・[3111] ミサ 
     ・[3114] Justy 
     ・[3120] 管理人 
   ファイルのコピーが上 ....   
     ・[3089] box 
     ・[3090] keichan 
     ・[3093] hiro 
     ・[3095] hiro 
     ・[3106] box 
     ・[3117] keichan 
     ・[3119] hiro 
   教えてください   
     ・[3107] box 
     ・[3112] 初心者 
   組み合わせ   
     ・[3021] 管理人 
     ・[3028] 管理人 
     ・[3030] 管理人 
     ・[3033] キリコ 
     ・[3034] 管理人 
     ・[3036] キリコ 
     ・[3040] 管理人 
     ・[3041] 管理人 
     ・[3043] キリコ 
     ・[3046] 管理人 
     ・[3048] Justy 
     ・[3049] キリコ 
     ・[3050] 管理人 
     ・[3051] キリコ 
     ・[3052] キリコ 
     ・[3053] 管理人 
     ・[3054] 管理人 
     ・[3055] Justy 
     ・[3056] 管理人 
     ・[3057] キリコ 
     ・[3058] 管理人 
     ・[3063] フリオ 
     ・[3076] 管理人 
   線形リストと配列 ど ....   
     ・[2970] ☆ 
     ・[2972] 管理人 
     ・[2981] Justy 
     ・[2982] 管理人 
     ・[2983] ま〜く 
     ・[2984] Justy 
     ・[2986] 管理人 
     ・[2989] Justy 
     ・[2990] 管理人 
     ・[2991] フリオ 
     ・[2993] Yuki 
     ・[2999] Justy 
     ・[3000] 管理人 
     ・[3005] Justy 
     ・[3007] 管理人 
     ・[3012] 管理人 
     ・[3014] Justy 
     ・[3025] 管理人 
     ・[3061] Yuki 
     ・[3075] 管理人 
   進級製作で苦戦してい ....   
     ・[2987] 管理人 
     ・[2988] 管理人 
     ・[2992] バグ 
     ・[2995] 管理人 
     ・[2998] 管理人 
     ・[3067] バグ 
     ・[3072] 管理人 
   問題で・・・   
     ・[2975] 管理人 
     ・[2976] box 
     ・[2977] 管理人 
     ・[2978] 管理人 
     ・[2979] box 
     ・[3065] rua 
     ・[3071] 管理人 
   複素数   
     ・[2582] box 
     ・[2586] キリコ 
     ・[2603] mas 
     ・[2604] mas 
     ・[2641] キリコ 
     ・[2680] キリコ 
     ・[2681] mas 
     ・[2740] キリコ 
     ・[2770] キリコ 
     ・[2771] 管理人 
     ・[2772] 管理人 
     ・[2773] mas 
     ・[2780] 管理人 
     ・[2882] キリコ 
     ・[3029] キリコ 
     ・[3031] 管理人 
     ・[3032] indent 
     ・[3035] キリコ 
     ・[3037] mas 
     ・[3038] キリコ 
     ・[3039] 管理人 
     ・[3042] キリコ 
     ・[3044] キリコ 
     ・[3045] 管理人 
     ・[3047] キリコ 
     ・[3059] 管理人 
   エクセルで出力   
     ・[2912] 管理人 
     ・[2914] 管理人 
     ・[3015] サト 
     ・[3024] 管理人 
   問題   
     ・[3020] 管理人 
   乱数   
     ・[3004] バグ 
     ・[3006] 管理人 
     ・[3009] バグ 
     ・[3010] 管理人 
     ・[3011] Justy 
     ・[3013] 管理人 
   毎度お世話になってい ....   
     ・[2894] けいすけ 
     ・[2895] けいすけ 
     ・[2896] けいすけ 
     ・[2898] Justy 
     ・[2901] 管理人 
     ・[2931] けいすけ 
     ・[2932] Justy 
     ・[2994] けいすけ 
     ・[3002] 管理人 
   時刻表示について   
     ・[2949] Yuki 
     ・[2951] 管理人 
     ・[2952] 管理人 
     ・[2996] コロン 
     ・[2997] コロン 
     ・[3001] 管理人 
   計算   
     ・[2822] box 
     ・[2831] meigin 
     ・[2832] box 
     ・[2836] box 
     ・[2837] meigin 
     ・[2838] Justy 
     ・[2841] ま〜く 
     ・[2843] meigin 
     ・[2845] Justy 
     ・[2853] meigin 
     ・[2868] Justy 
     ・[2873] meigin 
     ・[2876] Justy 
     ・[2880] Justy 
     ・[2881] meigin 
     ・[2886] meigin 
     ・[2887] Justy 
     ・[2926] meigin 
     ・[2927] Justy 
     ・[2928] Justy 
     ・[2935] meigin 
     ・[2964] Justy 
     ・[2980] meigin 
   文字列ソート   
     ・[2915] 管理人 
     ・[2916] 管理人 
     ・[2917] box 
     ・[2918] ☆ 
     ・[2919] フリオ 
     ・[2920] 管理人 
     ・[2922] 管理人 
     ・[2923] ☆ 
     ・[2924] 管理人 
     ・[2936] ☆ 
     ・[2937] box 
     ・[2938] ☆ 
     ・[2939] box 
     ・[2940] ☆ 
     ・[2941] box 
     ・[2942] ☆ 
     ・[2943] ☆ 
     ・[2944] box 
     ・[2945] ☆ 
     ・[2946] 管理人 
     ・[2947] 管理人 
     ・[2950] box 
     ・[2953] Yuki 
     ・[2954] box 
     ・[2955] GPGA 
     ・[2956] box 
     ・[2957] 管理人 
     ・[2958] 管理人 
     ・[2959] ☆ 
     ・[2960] 管理人 
     ・[2961] 管理人 
     ・[2962] 管理人 
     ・[2963] 管理人 
     ・[2965] ☆ 
     ・[2966] 管理人 
     ・[2967] ☆ 
     ・[2969] 管理人 
     ・[2971] ☆ 
     ・[2973] ☆ 
   シューティングゲーム ....   
     ・[2848] Justy 
     ・[2856] 管理人 
     ・[2859] 管理人 
     ・[2864] 管理人 
     ・[2871] BRACE 
     ・[2872] 管理人 
     ・[2925] a.k.a.dRESSING 
   Pari/GPからCへ変換・ ....   
     ・[2755] box 
     ・[2756] nana 
     ・[2760] box 
     ・[2785] nana 
     ・[2798] 管理人 
     ・[2801] nana 
     ・[2813] Justy 
     ・[2824] mas 
     ・[2846] nana 
     ・[2847] Justy 
     ・[2852] nana 
     ・[2870] Justy 
     ・[2911] nana 
     ・[2921] Justy 
   構造体で…   
     ・[2897] Justy 
     ・[2909] テルル 
   プログラムの呼び出し   
     ・[2825] 管理人 
     ・[2883] satoshi 
     ・[2885] box 
     ・[2888] Justy 
     ・[2891] satoshi 
     ・[2904] satoshi 
     ・[2905] keichan 
     ・[2906] satoshi 
     ・[2907] Yuki 
   コマンドラインについ ....   
     ・[2784] 管理人 
     ・[2787] 管理人 
     ・[2790] 管理人 
     ・[2792] 管理人 
     ・[2803] 努力中 
     ・[2810] 管理人 
     ・[2816] 努力中 
     ・[2817] 管理人 
     ・[2819] 管理人 
     ・[2826] 努力中 
     ・[2827] 管理人 
     ・[2828] 努力中 
     ・[2829] box 
     ・[2834] 管理人 
     ・[2835] box 
     ・[2844] 努力中 
     ・[2850] 管理人 
     ・[2857] 努力中 
     ・[2861] box 
     ・[2867] 管理人 
     ・[2869] 努力中 
     ・[2890] 努力中 
     ・[2899] 管理人 
     ・[2900] 管理人 
   無題   
     ・[2820] 管理人 
     ・[2889] アイス 
   構造体についてお聞き ....   
     ・[2878] 管理人 
     ・[2879] Justy 
     ・[2884] ふわりん 
   笑える検索エンジン(雑 ....   
     ・[2849] ダッシュ 
     ・[2854] 管理人 
     ・[2858] ダッシュ 
     ・[2860] 管理人 
     ・[2862] ダッシュ 
     ・[2863] 管理人 
     ・[2865] ダッシュ 
     ・[2866] 管理人 

Name: 夢霧  ..ぴよぴよ(108ポイント)   Date: 2006/12/22(金) 17:56   No:3132       
Title: 複数のファイルを使ってコンパイル    
初めまして。
つい先日からプログラミングを勉強し始めた者です。
実は、本当に初歩のことなのですが、シューティングゲームの館の方の6番の、『プログラムを分割する』が
上手くいかずに困っています。
全てのファイルが未解決になってしまいます。
Borlandを使っているので、説明どうりに出来ず、どうしていいのかわかりません。
どうすればいいのでしょうか?教えてください。
お願いします。


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


Name: 管理人 [URL]  ..ハッカー(151,273ポイント)   Date: 2006/12/22(金) 21:00   No:3138     
Title: Re:初歩の初歩のことだと思いますが・・・    
こんにちは。

そのようにファイルを分割してコンパイルすることを「分割コンパイル」と言います。

Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。

Visual Studioなどでしたらそのままコンパイルするだけで自動的にしてくれるんですが。

http://www.google.co.jp/search?hl=ja&q=%E5%88%86%E5%89%B2%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB&lr=

この辺を参考にしてみてください。


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

Name: box  ..プログラマー(26,066ポイント)   Date: 2006/12/22(金) 21:16   No:3139     
Title: Re:初歩の初歩のことだと思いますが・・・    
> Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。

BCC Developerというフリーの開発環境を使うと、
複数のソースファイルからなるプログラムの開発が
比較的スムーズにできます。

プロジェクトという概念の下に、複数のソースファイル(ヘッダーファイル含む)を
登録しておき、Ctrl+F9一発でビルドします。


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

Name: Justy  ..熟練のプログラマー(48,880ポイント)   Date: 2006/12/22(金) 21:16   No:3140     
Title: Re:初歩の初歩のことだと思いますが・・・    
 分割コンパイルは BCCの場合、幾つか方法があります。

 今後の事も考えるとメイクファイルを使う方式でコンパイルしておくといいと思います。

http://www.geocities.co.jp/Milano/8000/bcc/make.html
http://www.neco.nu/gohodoji/bccfaq/bccfaq.html


 これが面倒なら
http://www.hi-ho.ne.jp/jun_miura/bccdev.htm

 このツールを使ってみるのもいいかと思います。


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

Name: 夢霧  ..ぴよぴよ(137ポイント)   Date: 2006/12/23(土) 17:22   No:3183 解決!     
Title: Re:初歩の初歩のことだと思いますが・・・    
ありがとうございます!
いろいろ参考にさせていただきます!


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



Name: mika  ..ぴよぴよ(607ポイント)   Date: 2006/12/22(金) 16:48   No:3124       
Title: 関数の問題について    
関数の乱数の問題について教えて下さい。
一度できたのですが、関数が正しくないとのことで返却されてしましました。
どうかお願い致します。

【問題】
乱数を使って1桁の掛け算の問題を出し、答えを入力させ、正解が得られるまで同じ問題を出し続ける
プログラムを作成せよ。
ここでは、入力された答えが正しいか否かを判定する関数を用いること。
関数の仕様は規定しないので、実行例を参照し、各自で適切に作成すること。

※乱数はrand()関数を使用して発生させよ。
※int judge(int a, int b, int c);
という関数を作成し、aとbは乱数で発生させた値、cは入力値とし、
judgeの中で正解か否かを判定し、正解ならば1を不正解ならば0を
返却する、
というようにしてください。
--------------------------------------------------
int judge(int a, int b, int c);
返却値:1:正解
0:不正解
引数 :a:乱数で生成した値1
b:乱数で生成した値2
c:入力された値
処理 :入力された値が引数2と引数2の掛け算結果と
等しいか判定する


【実行例】
7 * 9 = 62 ←7と9は乱数で発生。「7 * 9 = 」までを表示。62を入力
Please retry. ←答えが正しくないので再入力を促す

7 * 9 = 64 ←再び「7 * 9 = 」までを表示。64を入力
Please retry. ←答えが正しくないので再入力を促す

7 * 9 = 63 ←再び「7 * 7 = 」までを表示。63を入力
Right!! ←答えが正しいのでその旨を表示して終了


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


Name: box  ..プログラマー(25,746ポイント)   Date: 2006/12/22(金) 16:59   No:3125     
Title: Re:関数の問題について    
> 一度できたのですが、関数が正しくないとのことで返却されてしましました。

では、そのコードを見せてください。


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

Name: mika  ..ぴよぴよ(827ポイント)   Date: 2006/12/22(金) 17:04   No:3127     
Title: Re:関数の問題について    
>では、そのコードを見せてください。
以下のコードです。

#include <stdio.h>
#include <time.h>

main(){
time_t seed;
int a,b,ans;

time(&seed);
srand(seed);

a=(int)rand()%10;
b=(int)rand()%10;

while(1){
printf("%d * %d = ",a,b);
scanf("%d",&ans);
if(ans==a*b){
printf("Right!!\n");
break;
}else{
printf("Please retry.\n");
}
}
return 0;
}


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

Name: box  ..プログラマー(25,804ポイント)   Date: 2006/12/22(金) 17:06   No:3128     
Title: Re:関数の問題について    
問題文には

>※int judge(int a, int b, int c);
>という関数を作成し、

と書いてあります。
judge関数のコードはないのですか?


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

Name: mika  ..ぴよぴよ(878ポイント)   Date: 2006/12/22(金) 17:14   No:3129     
Title: Re:関数の問題について    
問題文にある「judge関数を使用する・・・」の文章は後から追加されたものです。
なので、使い方が分からなかったのでこのコードにはありません。
すみません、、言葉が足りなくて。


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

Name: box  ..プログラマー(25,881ポイント)   Date: 2006/12/22(金) 17:20   No:3130     
Title: Re:関数の問題について    
>使い方が分からなかった

main関数から他の自作関数を呼び出すコードを書いたことはありますか?
先生に教えてもらったり、教科書に載っていたりしていませんか?


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

Name: mika  ..ぴよぴよ(983ポイント)   Date: 2006/12/22(金) 17:26   No:3131     
Title: Re:関数の問題について    
>main関数から他の自作関数を呼び出すコードを書いたことはありますか?
>先生に教えてもらったり、教科書に載っていたりしていませんか?

今までそういったコードを書いたことはありません。今回が初めてです。
Cは教えてもらったことがありません、独学しています。
参考書はあるのですが、持っている本には呼び出す方法が書いてありませんでした。


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

Name: box  ..プログラマー(25,961ポイント)   Date: 2006/12/22(金) 19:45   No:3133     
Title: Re:関数の問題について    
>参考書はあるのですが

その本に、「関数」についての章はありませんか?

その本に、サンプルコードは載っていますか?載っているとして、
main関数だけでできていますか?


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

Name: mika  ..かけだし(1,193ポイント)   Date: 2006/12/22(金) 20:55   No:3136 解決!     
Title: Re:関数の問題について    
本にはサンプルはたいしてありません。
載っているのも簡単なもので関数の部分だけです。

でも考えてみてなんとか解決しました。

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

int judge(int a,int b,int c)
{
if(a*b==c)
{
printf("Right!!\n");
return 1;
}
else
{
printf("Please retry.\n");
return 0;
}
}
int main()
{
int a=0;
int b=0;
int c=0;

srand(time(NULL));
a=rand()%10;
b=rand()%10;

do
{
printf("%d * %d = ",a,b);
scanf("%d",&c);
}while(judge(a,b,c)==0);

return 0;
}

コンパイルして合っていたので、たぶん問題の意図はこういうことだと思うので解決しました。
お騒がせいたしました。ありがとうございます☆


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

Name: 管理人 [URL]  ..ハッカー(153,478ポイント)   Date: 2006/12/23(土) 03:17   No:3146     
Title: Re:関数の問題について    
mikaさん、こんにちは。

お返事が遅くなってしまい、、すみません。

一応、解決されたようですが、関数の使い方はばっちり覚えておいた方がいいです。

もしもまだなんとなくって感じでしたらここより少し上の投稿

「二次方程式の解と一次元配列」のトピにある内容を読んでみてください。

私が後半、関数の使い方を説明しておりますので。

質問者さんの間違いと、それを訂正したプログラムを見比べたり、自分でもプログラムを書いてみたり、関数の使い方を読んでみたりしてみてはいかがでしょうか。

ほかの方への回答を使いまわすようで申し訳ないですがm(_ _)m


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



Name: マグナーテン  ..ぴよぴよ(26ポイント)   Date: 2006/12/17(日) 00:51   No:2874       
Title: 借金の計算です。    
元金、返済回数、利率を入力し、
元金均等払いの1回目から指定回数までの
支払額、利息、残高を実行結果画面に実行結果画面に表示する。

という課題が出されたのですが、基礎が出来ていないためわかりません。

元金均等払いとは返済額の元金部分が一定であるもので
・毎月の元金返済部分     元金÷返済回数で一定固定
・初回の利息支払部分     元金×利率÷12ヶ月
・N回目利息部分       元金×(1−(N−1)÷返済回数)×利率÷12ヶ月
・N回目の返済額       元金÷返済回数+元金×(1−(N−1)÷返済回数)×利率÷12ヶ月
ということらしいというところまでたどり着いたのですが、プログラミングがちんぷんかんぷんです。

よろしければ教えていただきたいです。お願いします。


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


Name: 管理人 [URL]  ..ハッカー(134,411ポイント)   Date: 2006/12/17(日) 03:52   No:2877     
Title: Re:借金の計算です。    
こんにちは。

>プログラミングがちんぷんかんぷんです。

このように言われましてもこちらとしては、どこからどの程度お教えしたらいいのかわかりません。

どの辺までわかって、どこ辺りを教えてほしいのか、

自分ではどの程度まで調べたのか、まず、書いてください。


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

Name: マグナーテン  ..ぴよぴよ(0ポイント)   Date: 2006/12/18(月) 10:18   No:2902     
Title: Re:借金の計算です。    
自分でやろうとしたのですが
複数文字を入力させるにはどうしたらいいかわかりません。


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

Name: 管理人 [URL]  ..ハッカー(135,558ポイント)   Date: 2006/12/18(月) 10:36   No:2903     
Title: Re:借金の計算です。    
数値を入力するにはscanf関数を使用します。

scanfを使って2種類の入力を格納してみます。

#include <stdio.h>


int main(){
int gankin,kaisu;

printf("元金 ->") , scanf("%d",&gankin);

printf("回数 ->") , scanf("%d",&kaisu);

for(int i=0;i<kaisu;i++)
printf("%d : %d\n",i,gankin*(i+1));

return 0;
}


このようにすることで、回数年分の出力が可能で、元金から年数倍して表示しています。


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

Name: 管理人 [URL]  ..ハッカー(136,117ポイント)   Date: 2006/12/18(月) 15:52   No:2908     
Title: Re:借金の計算です。    
後は単純に計算だけだと思ったのですが、複利の返済って難しいですね。
上記の式でうまくいくんでしょうか?
上の式ではうまく計算できないように思うのですが。

上記の式で計算すると

元金 -> 100000

回数 -> 30
利率 -> 0.25
1 : 返済 5416 残高 94584
2 : 返済 5416 残高 89168
3 : 返済 5416 残高 83752
4 : 返済 5416 残高 78336
5 : 返済 5416 残高 72920
6 : 返済 5416 残高 67504
7 : 返済 5416 残高 62088
8 : 返済 5416 残高 56672
9 : 返済 5416 残高 51256
10 : 返済 5416 残高 45840
11 : 返済 5416 残高 40424
12 : 返済 5416 残高 35008
13 : 返済 5416 残高 29592
14 : 返済 5416 残高 24176
15 : 返済 5416 残高 18760
16 : 返済 5416 残高 13344
17 : 返済 5416 残高 7928
18 : 返済 5416 残高 2512
19 : 返済 5416 残高 -2904
20 : 返済 5416 残高 -8320
21 : 返済 5416 残高 -13736
22 : 返済 5416 残高 -19152
23 : 返済 5416 残高 -24568
24 : 返済 5416 残高 -29984
25 : 返済 5416 残高 -35400
26 : 返済 5416 残高 -40816
27 : 返済 5416 残高 -46232
28 : 返済 5416 残高 -51648
29 : 返済 5416 残高 -57064
30 : 返済 5416 残高 -62480


計算したソースはこちらです。

#include <stdio.h>


int main(){
int kaisu,zandaka,hensai;
double gankin,riritu=0.0;

printf("元金 -> ") , scanf("%lf",&gankin);

printf("回数 -> ") , scanf("%d",&kaisu);

printf("利率 -> ") , scanf("%lf",&riritu);

zandaka = gankin;

for(int i=1;i<=kaisu;i++){
hensai = gankin/(double)kaisu+gankin*(double)(1-(i-1)/kaisu)*riritu/12.0;
printf("%2d : 返済%7d",i,hensai);
zandaka -= hensai;
printf(" 残高%7d\n",zandaka);
}

return 0;
}


寝てなくて頭がボーっとしてるのでものすごい重大なミスしてたらすみません・・。



返済金額が毎月同じ額になるように計算するには・・・どうしたらいいのでしょう。

利子は毎月残金にかかり、利率の1/12がかかるんでしょうか?

利率r(%ではなく1.05等とする)円でA円借りて、6回で毎月同額L円返すとき
1ヶ月目の残高は

(A)*(r/12)-L

ですよね?2ヶ月目の残高は

((A)*(r/12)-L)*(r/12)-L)

となり、6ヶ月で返済するのなら

(((((((A)*(r/12)-L)*(r/12)-L)*(r/12)-L)*(r/12)-L)*(r/12)-L)*(r/12)-L) = 0

となるって計算でいいんでしょうか?
このLを求めたらいいんでしょうけど、数学が苦手なんで求め方がわかりません(_ _|||)


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

Name: マグナーテン  ..ぴよぴよ(577ポイント)   Date: 2006/12/19(火) 01:33   No:2929     
Title: Re:借金の計算です。    
最初の説明がわかりにくかったようですいません。

元金均等返済では毎月の支払いは段々減っていきます。
利子は毎月残金に残金にかかり、1/12です。
1ヶ月の残高は 支払額10000、利息3%、支払い回数10回とすると

・毎月返済額は
元金÷支払い回数より
100000/10=10000円
・初回の利息は
元金*年率/12(ヶ月)
100000*0.03/12=250円
・初回返済額は
10000+250=10250円

2回目以降は

・利息は
残高*年率/12
89750*0.03/12=224円
・2回目支払額
10000+224=10225円
・残高は
元金-毎月返済額(金利含)
89750-10225=79525円


回数 返済額 内元金 内利息 残高
総計 101,375 100,000 1,375 100,000
1 10,250 10,000 250 89,750
2 10,225 10,000 225 79,525
3 10,200 10,000 200 69,325
4 10,175 10,000 175 59,150
5 10,150 10,000 150 49,000
6 10,125 10,000 125 38,875
7 10,100 10,000 100 28,775
8 10,075 10,000 75 18,700
9 10,050 10,000 50 8,675
10 8,675 10,000 25 0

となります。scanf関数は理解できました。ありがとうございます。


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

Name: 管理人 [URL]  ..ハッカー(137,121ポイント)   Date: 2006/12/19(火) 02:14   No:2930     
Title: Re:借金の計算です。    
返済額は毎月徐々に減っていますけどいいんですか?

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

Name: フリオ  ..ぴよぴよ(179ポイント)   Date: 2006/12/19(火) 07:46   No:2933     
Title: Re:借金の計算です。    
 
 とりあえずできましたけど、

>回数 返済額 内元金 内利息 残高
>総計 101,375 100,000 1,375 100,000
>1 10,250 10,000 250 89,750
>2 10,225 10,000 225 79,525
>3 10,200 10,000 200 69,325
>4 10,175 10,000 175 59,150
>5 10,150 10,000 150 49,000
>6 10,125 10,000 125 38,875
>7 10,100 10,000 100 28,775
>8 10,075 10,000 75 18,700
>9 10,050 10,000 50 8,675
>10 8,675 10,000 25 0

このサンプルは、間違ってるんじゃないでしょうか?
各返済額を全部足しても総返済額 101375 になりません。


#include <stdio.h>
#include <math.h>

int main(void)
{
int pri, num, pay, pri_bal, total = 0, odd, i;
double in;

scanf("%d %d %lf", &pri, &num, &in);
printf("\n借入金 %d, 返済回数 %d, 年利率 %.3f\n\n", pri, num, in);
in /= 12;
odd = pri % num;
pri_bal = pri;
puts("回数 支払額 利息 元本残高");
for(i = 1; i <= num; i ++){
pay = (int)floor(pri / num + pri_bal * in + (odd > 0) + 0.5);
printf("%4d %10d %5d %10d\n",
i,
pay,
(int)floor(pri_bal * in + 0.5),
pri_bal - pri / num - (odd > 0));
total += pay;
pri_bal -= pri / num + (odd -- > 0);
}
printf("\n総返済額 %d\n", total);
return 0;
}

 


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

Name: マグナーテン  ..ぴよぴよ(765ポイント)   Date: 2006/12/19(火) 10:14   No:2934 解決!     
Title: Re:借金の計算です。    
自分でやってみた表が間違っていました。
http://www.miya-shoko.or.jp/interest/interes4.html
上のサイトでやるとフリオさんのようになりました。
お忙しいところお時間をかけていただいて、ありがとうございます。


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

Name: 管理人 [URL]  ..ハッカー(145,149ポイント)   Date: 2006/12/20(水) 13:33   No:3008     
Title: Re:借金の計算です。    
内 元 金、 内 利 息 の合計が毎月同じになるように計算できないんですかねぇ・・。

考えてみたけどよくわかりませんでした(_ _||)


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

Name: フリオ  ..かけだし(2,168ポイント)   Date: 2006/12/22(金) 04:54   No:3116     
Title: Re:借金の計算です。    
 
 いまさらですが、
元利金等支払いの場合ができたので,載せておきます。


#include <stdio.h>
#include <math.h>

int main(void)
{
unsigned int num, i;
double pri, in_rate, pay, pay_pri;

printf("借入金額 : ");
scanf("%lf", &pri);
printf("返済回数 : ");
scanf("%d", &num);
printf(" 年利率 : ");
scanf("%lf", &in_rate);
printf("\n <借入金額:%d, 返済回数:%d, 年利率:%.3f>\n", (int)pri, num, in_rate);
in_rate = 0.03 / 12;
puts("\n[回数] [返済額] [内元金] [内利息] [元金残高]");
pay_pri = pri * in_rate / (pow(1 + in_rate, num) - 1);
for(i = 1; i <= num; i ++){
pay = pay_pri + pri * in_rate;
printf("%5d %10d %10d %8d %10d\n",
i,
(int)pay,
(int)pay_pri,
(int)(pri * in_rate),
(int)(pri - pay_pri));
pri -= pay_pri;
pay_pri *= (1 + in_rate);
}
printf("\n <返済総額 : %d>\n", (int)(pay_pri * num));
return 0;
}

 


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

Name: 管理人 [URL]  ..ハッカー(150,819ポイント)   Date: 2006/12/22(金) 20:56   No:3137     
Title: Re:借金の計算です。    
ホントですね!
なるほど、、そのように計算するのですね。

これからもこのプログラムを参考にさせてもらいます♪


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



Name: ミサ  ..ぴよぴよ(258ポイント)   Date: 2006/12/21(木) 20:04   No:3097       
Title: フローチャート    
こんばんは。
私の作ったフローチャートがダメだと言われてしまい、元データを渡して返却もないのでなにがダメでどこをなおしたらよいのか分からず困っています。どなたか、フローチャートのお手本を教えていただけないでしょうか?

みなさんのおかげで完全に理解できました
迷惑をかけたくないのとこれ以上頼るわけにはいかないのであとは自分の力だけでやりたいとおもいます


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


Name: ミサ  ..ぴよぴよ(346ポイント)   Date: 2006/12/21(木) 20:12   No:3098     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..ぴよぴよ(680ポイント)   Date: 2006/12/21(木) 20:14   No:3099     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..かけだし(1,105ポイント)   Date: 2006/12/21(木) 20:20   No:3100     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..かけだし(1,393ポイント)   Date: 2006/12/21(木) 20:21   No:3101     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..かけだし(1,607ポイント)   Date: 2006/12/21(木) 20:22   No:3102     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..かけだし(1,924ポイント)   Date: 2006/12/21(木) 20:24   No:3103     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: ミサ  ..かけだし(2,343ポイント)   Date: 2006/12/21(木) 20:27   No:3104     
Title: Re:フローチャートを教えてください。    
ありがとうございました
迷惑をかけたくないのであとは自分の力でやることにします


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

Name: Justy  ..熟練のプログラマー(48,542ポイント)   Date: 2006/12/21(木) 22:48   No:3110     
Title: Re:フローチャートを教えてください。    
元データを渡して返却もないのでなにがダメでどこをなおしたらよいのか分からず困っています
 フローチャートですか。
 現代プログラミングではもうほとんど使われなくなって久しいのでもうすっかり忘れてしまっていますが、目的や状況によって伝えたいことが変わるので書き方が変わります。

 どんなのを提出しましたか?
 テキストでも画像でも適当でいいので、思い出して書き出してみて下さい。


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

Name: ミサ  ..かけだし(2,431ポイント)   Date: 2006/12/21(木) 22:56   No:3111     
Title: Re:フローチャートを教えてください。    
私はド素人なので、本にのってた関係ないフローチャートを上のプログラムを見てなんとなく勘?で書いたような感じです。それに手書きでしたし、よく覚えていないです(T_T)
栄光のプログラマーさんが上のプログラムを見て書けるフローチャートを教えていただけないですか?


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

Name: Justy  ..熟練のプログラマー(48,733ポイント)   Date: 2006/12/21(木) 23:59   No:3114     
Title: Re:フローチャートを教えてください。    
上のプログラムを見て書けるフローチャート
 PICはよくわからないので処理内容はコメントに依存していますが、課題1はこんな感じでしょうか。

 点灯と待機、消灯と待機を1項目にしてしまってもいいでしょうし、いっそのこと
 開始 - ポートの初期化 - 適当に点灯と消灯を繰り返す - ポートCの値をAに転送
 くらいに簡略化してしまってもいいでしょ


栄光のプログラマー
 栄光のプログラマーは私のハンドルネームではないです。


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

Name: 管理人 [URL]  ..ハッカー(150,146ポイント)   Date: 2006/12/22(金) 12:16   No:3120     
Title: Re:フローチャートを教えてください。    
こんにちは。
すみません、昨日は忘年会があって、全然見ることが出来ませんでした;

フローチャートの描き方は、

http://www.johoka.net/flowchart.htm

http://www2.ee.knct.ac.jp/el/E2/L210/algorism/flowchart1.html

をはじめ、単純にフローチャートでぐぐれば色々参考になるサイトがありますよ。

http://www.google.co.jp/search?hl=ja&q=%E3%83%95%E3%83%AD%E3%83%BC%E3%83%81%E3%83%A3%E3%83%BC%E3%83%88&lr=

投稿は消せないように設定しているので、いくつも同じ内容に変更なさったのでしょうけど、

最後に解決したと書いていただけたらいいですよ^^;


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



Name: hiro  ..ぴよぴよ(713ポイント)   Date: 2006/12/21(木) 16:23   No:3087       
Title: ファイルのコピーが上手くいきません。    
ファイルをコピーするプログラムを作りましたが上手く動作しません。
(コピーしたファイルの内容が変ってしまいます。)

プログラムを以下に示します。

#include <stdio.h>
main(argc,argv)char *argv[];
{
FILE *fin;
FILE *fout;
int c;

fin = fopen(argv[1],"r");
fout = fopen(argv[2],"w");

if(fin == NULL)
{
printf("入力ファイル[%s]がオープンできません。\n",argv[1]);
exit(1);
}
if(fout == NULL)
{
printf("出力ファイル[%s]がオープンできません。\n",argv[2]);
exit(1);
}
while((c=getc(fin)) != EOF)
{
putc(c,fout);
putchar(c);
}
fclose(fin);
fclose(fout);
}

上のプログラムに以下の3行のデータファイルを読ませて、画面表示と新しいファイルへの書き出しをさせました。

abcdefghijklmnopqrstuvwxyz
1234567890abcdefghijklmnop
zzzzzzzzzzzzzzzzzzzzzzzzzz


実行方法はDOSプロンプトで fcopy in_file out_file としました。
(fcopyは実行ファイルで、in_fileが上記の入力データファイルです。out_fileは画面と同じものをファイル出力させたものです。)

実行の結果、画面には正常に出力されましたが、out_fileの中身が以下のようになりました。

abcdefghijklmnopqrstuvwxyz^M?????????? 愀戀??攀ホ最?椀?????????zzzzzzzzzzzzzzzzzzzzzzzzzz^M?

putcharもputcも同じ出力内容になると思ったのですが...、また、どこがおかしいのでしょうか?




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


Name: box  ..上級者(24,895ポイント)   Date: 2006/12/21(木) 16:48   No:3089     
Title: Re:ファイルのコピーが上手くいきません。    
> #include <stdio.h>

exitを呼び出していますので、stdlib.hもインクルードしてください。

> main(argc,argv)char *argv[];

コンパイルエラーにこそならないものの、書き方が標準的ではありません。
int main(int argc, char *argv[])
あたりがよろしいと思います。

> fin = fopen(argv[1],"r");
> fout = fopen(argv[2],"w");

argcが3以上であるかどうかを判定してから、
argv[1]とargv[2]を参照する方がよいです。

> fclose(fout);

main関数の戻り値は言語規格上int型です。
プログラム終了時に return 0; などとしてください。

指摘した箇所を修正して、もう一度トライしてみてください。

> 実行の結果、画面には正常に出力されましたが、out_fileの中身が以下のようになりました。

なお、当方では、アップロードされたコードを
そのままコンパイルして(警告はいくつか出ましたが)できあがった
実行ファイルを使って、正しくコピーできました。
ご自身のところとどういう違いがあるかは、よくわかりません。


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

Name: keichan  ..初心者(8,529ポイント)   Date: 2006/12/21(木) 16:52   No:3090     
Title: Re:ファイルのコピーが上手くいきません。    
fin = fopen(argv[1],"rb");
fout = fopen(argv[2],"wb");
とした場合どのような結果になりますか?


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

Name: hiro  ..ぴよぴよ(556ポイント)   Date: 2006/12/21(木) 18:47   No:3093     
Title: Re:ファイルのコピーが上手くいきません。    
boxさん
keichanさん

回答ありがとうございます。
最小限の変更として下記の2点の修正で上手くいきました。

boxさん指摘のstdlib.hを入れると確かにワーニングが消えました。
ただ、それだけでは解決しなかったので、keichanさん指摘のbを追加しました。
fin = fopen(argv[1],"rb");
fout = fopen(argv[2],"wb");

入力ファイルはテキストエディタで作成した3行ものです。
なぜ、バイナリ―タイプにしたら上手くいったのでしょうか?


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

Name: hiro  ..ぴよぴよ(665ポイント)   Date: 2006/12/21(木) 19:12   No:3095     
Title: Re:ファイルのコピーが上手くいきません。    
先ほどのメールに、こちらの環境を書くのを忘れていました。
Microsoft Visual C++ 6.0 です。

あと、boxさんの書かれていた、

>argcが3以上であるかどうかを判定してから、

という文の意味がわかりません。
教えて頂ければ幸いです。


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

Name: box  ..プログラマー(25,221ポイント)   Date: 2006/12/21(木) 21:56   No:3106     
Title: Re:ファイルのコピーが上手くいきません。    
>argcが3以上であるかどうかを判定してから、

プログラム名 入力ファイル名 出力ファイル名 <Enter>
という形式で実行しますね。

このとき、コマンドライン引数の個数は
・プログラム名の文字列(へのポインタが、argv[0]に入っている)
・入力ファイル名の文字列(へのポインタが、argv[1]に入っている)
・出力ファイル名の文字列(へのポインタが、argv[2]に入っている)
の3個あります。この「3」が、main関数の引数であるargcの値です。

argcが3以上(ちょうど3でもいいです)というのは、
想定している形式に則って実行している、ということです。

例えば、
プログラム名 入力ファイル名 <Enter>
という形式だと、argcの値は2です。つまり、想定形式どおりではないわけです。

プログラムでargv[1]およびargv[2]に正しくアクセスするためには、
argcが3(以上)でなければなりません。


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

Name: keichan  ..初心者(8,661ポイント)   Date: 2006/12/22(金) 09:55   No:3117     
Title: Re:ファイルのコピーが上手くいきません。    
>入力ファイルはテキストエディタで作成した3行ものです。
>なぜ、バイナリ―タイプにしたら上手くいったのでしょうか?
考えられる可能性としては標準関数では処理できない"文字コード"で保存されている。というのが挙げられます。
Shift_JISで保存した場合は改行は'\r' + '\n'で表現されますが、その他文字コードだとそれ以外の可能性があります。
その入力ファイルはどのようなテキストエディタで作成されましたか?


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

Name: hiro  ..ぴよぴよ(927ポイント)   Date: 2006/12/22(金) 12:00   No:3119 解決!     
Title: Re:ファイルのコピーが上手くいきません。    
boxさん
keichanさん
ありがとうございます。

argcの数値を出力して3になるのを確認しました。

あと、入力ファイルの出力をunicodeにしていました。
データを作成したメモ帳の出力をANSIにした入力ファイルを使用すると出力ファイルが正常になりました。
(良く見ると画面への出力も変りました。悪い入力データの時にはスペースが入ったように間隔が開いていましたが、良くなった入力データでは詰まって表示されています。)

プログラム以前の所にも問題があったのですね!
本当に、ありがとう御座いました。




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



Name: 初心者  ..入門者(4,288ポイント)   Date: 2006/12/21(木) 19:36   No:3096       
Title: 教えてください    
xとyをそれぞれ0から10まで1きざみで変え、そのすべてを組み合わせた平面上の11x11個の点(x,y)を考える.
これらの点のうちで、
y = - ( x -1 ) ^2 + 10(二次関数)
y = 3
の2つの線に囲まれた領域内(線上は除く)に含まれる点の数を出力するプログラムを作成せよ.


この問題を考えています。for文とか使うだろうなーと想像がつきますが、どのようにやったらいいかお手上げ状態です。
どなたかご教授ください。


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


Name: box  ..プログラマー(25,408ポイント)   Date: 2006/12/21(木) 22:17   No:3107     
Title: Re:教えてください    
>y = - ( x -1 ) ^2 + 10(二次関数)
>y = 3

二次関数と直線のグラフを描いてみると、イメージがわいてきます。
与えられた二次関数は、(1, 10)を頂点とする放物線です。
y = 3はx軸に平行な直線で、そのy座標(3で一定)は、
放物線の頂点のy座標(10)よりも小さいです。

したがって、今回の問題は、(0, 0)〜(10, 10)の121個の点のうち、
y座標が放物線より小さく、かつ直線より大きい点の個数を求めることに
帰着します。

xとyに関する二重のforループの中で、if文による大小判定を
行なうことになります。


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

Name: 初心者  ..入門者(4,299ポイント)   Date: 2006/12/21(木) 23:11   No:3112     
Title: Re:教えてください    
ありがとうございます。

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



Name: キリコ  ..かけだし(1,104ポイント)   Date: 2006/12/20(水) 17:48   No:3017       
Title: 組み合わせ    
再びすみません。
再起呼び出しのnCr(rの値は適当)からn!を求めるプログラムなんですが、難しいらしいのですが、どういったプログラムになるのでしょうか?よかったら教えてください。お願いします。
今のところ前回の複素数はほぼできあがりそうで今回のこれはまだ検討中です。


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


Name: 管理人 [URL]  ..ハッカー(146,410ポイント)   Date: 2006/12/20(水) 21:13   No:3021     
Title: Re:組み合わせ    
キリコさん、こんにちは。
以前の問題は順調に進んでらっしゃるようで、よかったです。

組み合わせの問題は「再帰関数」で計算できます。

組み合わせ 再帰関数

などをキーワードで検索すると解決できるはずですよ。

再帰関数をご存知なかったらクイックソートの紹介ページをみてみてください。

再帰関数は難しくなく、逆にすごく「処理を書くのが簡単」です。

再帰関数のプログラムは数学の「一般式通りに書けばいい」という特徴をもっており、なれると非常に便利です。

しかし結構特殊な書き方になるので、慣れるまで書き方がよくわからないと思います。

多くの場合「処理がどのように行われているのか目でおえない」状況になります。

普段端から端まで処理をおいかけながらプログラムを組んでいる人にとってはかなり考え方を改めてみる必要があるので、慣れるまで少し大変かもしれませんが、

一度クイックソート解説アプリを使っていただけたら解るのではないかと思います。

調べてもわからなかったり、つまづいたらまた聞いてください。


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

Name: 管理人 [URL]  ..ハッカー(147,315ポイント)   Date: 2006/12/20(水) 22:31   No:3028     
Title: Re:組み合わせ    
組み合わせは別に再帰関数じゃないと計算できないわけではありません。
それに再帰関数は無駄な処理が多く、簡単に実装できるという利点はありますが、
処理に無駄があるため、あまり勧められない点もあります。

しかし一応勉強しておくべき分野です。
もし再帰で求めないのならばまず、数式を書いてみましょう。

		  m * (m-1) * .. * (m-n+1)

c(m,n) = --------------------------
1 * 2 * .. * n

ですね。
分母はmからm-n+1までかけあわせ、分子は1からnまでかけあわせ計算すればいいだけです。
for文で簡単に計算できますね。
再帰よりこちらの計算方法の方がずっと早いです。


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

Name: 管理人 [URL]  ..ハッカー(147,451ポイント)   Date: 2006/12/20(水) 22:45   No:3030     
Title: Re:組み合わせ    
プログラムの予測は立ちましたか?

scanfでmCnのmとnを読み取ります。

		  m * (m-1) * .. * (m-n+1)

c(m,n) = --------------------------
1 * 2 * .. * n


この理論で、iをmからm-n+1までデクリメントしながらループさせ、全てかけあわせた値をbunsiに格納します。

	for(int i=m;i>=m-n+1;i--)

bunsi *= i;


同様にiを1からnまでインクリメントしながらループさせ、全て掛け合わせた値をbunboに格納します。

	for(int i=1;i<=n;i++)

bunbo *= i;


たったそれだけで終わりです。簡単ですね?

完成品サンプルはこちら

#include <stdio.h>

int main(){
int m,n,bunbo=1,bunsi=1;
scanf("%d%d",&m,&n);
for(int i=m;i>=m-n+1;i--)
bunsi *= i;
for(int i=1;i<=n;i++)
bunbo *= i;
printf("%dC%d = %d\n",m,n,bunsi/bunbo);
return 0;
}


再帰のやり方も勉強してみてください。


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

Name: キリコ  ..かけだし(1,091ポイント)   Date: 2006/12/20(水) 23:18   No:3033     
Title: Re:組み合わせ    
管理人さん返信ありがとうございます。
私の説明が悪かったようですみません。nCrを求めるプログラムはなんとかわかるのですが、nCr(rの値は適当)からn!を求めるプログラムがどうも思いうかばないのです。これはどうにもお手上げです。


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

Name: 管理人 [URL]  ..ハッカー(148,152ポイント)   Date: 2006/12/20(水) 23:35   No:3034     
Title: Re:組み合わせ    
すみません、私は文章の最初だけみて意味を理解しようとするくせがあるのでよく誤読してしまいます;

nCrから求めるという意味がよくわかりません。

nCrの答えから求めるのですか?

nCrのアルゴリズムを使って求めるのですか?

いずれにしても出来ないように思います‥。

#include <stdio.h>


int comb( int m, int n ){
if( m>n && n>0 )
return comb(m-1,n-1) + comb(m-1,n);
else
return 1;
}

int main(){
int m,n;
scanf("%d%d",&m,&n);
printf("%dC%d = %d\n",m,n,comb(m,n));
return 0;
}


組み合わせを求めるプログラムはこうですね。
一方階乗を計算するプログラムはこうなので

#include <stdio.h>


int comb( int n ){
if(n>0 )
return n*comb(n-1);
else
return 1;
}

int main(){
int n;
scanf("%d",&n);
printf("%d\n",comb(n));
return 0;
}


別物になると思います。
同じ再帰でプログラムをかけという課題なのならわかるのですが。。


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

Name: キリコ  ..かけだし(1,235ポイント)   Date: 2006/12/20(水) 23:40   No:3036     
Title: Re:組み合わせ    
nCrの値(rは適当)n!を求めるアルゴリズム を求めるみたいです。


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

Name: 管理人 [URL]  ..ハッカー(148,085ポイント)   Date: 2006/12/21(木) 01:26   No:3040     
Title: Re:組み合わせ    
すみません、意味がわかりません・・・。

nCrとn!の値は同じものだと解釈されてらっしゃるのでしょうか?

nCrの値の計算のしかたは上の式のとおりです。

例えば

4C2なら 4*3 / 2*1 ですから6ですね?
4!は 4*3*2*1=24です。

4C2から4!を求める・・というのが意味がよくわかりません。

もう少し問題文をよく読んでみてください。

私の誤解釈でしたらお許しください。


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

Name: 管理人 [URL]  ..ハッカー(148,108ポイント)   Date: 2006/12/21(木) 01:27   No:3041     
Title: Re:組み合わせ    
nCrを求めるプログラムもn!を求めるプログラムもすでに上で紹介したのでご覧ください。

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

Name: キリコ  ..かけだし(1,535ポイント)   Date: 2006/12/21(木) 02:01   No:3043     
Title: Re:組み合わせ    
すみません間違いました。
nCrの値(rは適当)から、n!を求めるアルゴリズム を求めるみたいです。



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

Name: 管理人 [URL]  ..ハッカー(148,761ポイント)   Date: 2006/12/21(木) 02:24   No:3046     
Title: Re:組み合わせ    
すみません、考えても意味がよくわからないのです・・・。

nは同じnですよね?

先ほども言いましたが、

4C2なら 4*3 / 2*1 ですから6ですね?
4!は 4*3*2*1=24です。

つまり値からn!を求めるということは6から24を導けということでしょうか。
rの値を1からnまで1つずつ増やしてその値をかけていけばn!になりますが、

rの値は適当な値で何が入るかわからないとすると、推測のしようがありません・・。

適当というニュアンスが、1からnまで変化させていっていいというのならわかりますが、
それでは何の意味ももたないプログラムになってしまいます。

再帰を使う必要もありませんし、組み合わせのプログラムを使う必要もありません・・。


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

Name: Justy  ..熟練のプログラマー(48,265ポイント)   Date: 2006/12/21(木) 02:35   No:3048     
Title: Re:組み合わせ    
 まさかとは思いますが、こういうことだったり・・・。

  n! = nCr * r! * (n - r)!

 これなら、 nCrを元にして幾つか計算するだけで、n!が求まります・・・。


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

Name: キリコ  ..かけだし(1,780ポイント)   Date: 2006/12/21(木) 02:42   No:3049     
Title: Re:組み合わせ    
<すみません、考えても意味がよくわからないのです・・・。
申し訳ないです。


rは自分で適当に決めていいということだと思います。
この問題の前でn!からnCrを求める再帰関数呼び出しでプログラムをしたので、その逆のnCrからn!を求めることをするのだと思います。


<6から24を導けということでしょうか
多分そういうことだと思います。

r=5のを作ろうすると、
「nC5からn!をもとめるプログラム」を作ればいいと思います。


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

Name: 管理人 [URL]  ..ハッカー(148,805ポイント)   Date: 2006/12/21(木) 02:47   No:3050     
Title: Re:組み合わせ    
>この問題の前でn!からnCrを求める再帰関数呼び出しでプログラムをしたので

え?どうやったらそんな事出来るんですか?


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

Name: キリコ  ..かけだし(1,846ポイント)   Date: 2006/12/21(木) 02:48   No:3051     
Title: Re:組み合わせ    
つまりrは定数としていいことです。

値aを入力。
a*5!=n!/(n-5)!
ここからどうn!を求めたらいいのか、やっぱりちょっと見当つかないですね。


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

Name: キリコ  ..かけだし(1,890ポイント)   Date: 2006/12/21(木) 02:52   No:3052     
Title: Re:組み合わせ    
n!からというか、さきほど管理人さんが示されたように、関数である値のn!をもとめて、nCrをもとめただけです。

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

Name: 管理人 [URL]  ..ハッカー(149,621ポイント)   Date: 2006/12/21(木) 02:54   No:3053     
Title: Re:組み合わせ    
>>6から24を導けということでしょうか
>多分そういうことだと思います。

6から24はもとまらないですよ〜;
Justyさんのおっしゃるように計算するのなら求まりますが、そんなことして意味があるんでしょうか・・。

>r=5のを作ろうすると、
>「nC5からn!をもとめるプログラム」を作ればいいと思います。

とりあえず、紙とペンで計算してみましょうよ。

nが7、r=5だとすると7C5は 7*6 / 2 = 21ですよね?そこから7!を求めて意味があるんでしょうか?
また、求まるとは思えません・・。「値から求める」というからには数字そのものから推測しろという意味ですよね。
とても21という数字をみて7の階乗が計算できるとは思えません・・。

しかし、話の流れから行くと、作った組み合わせの再帰関数の中で計算に手を加えて違う結果を出そうとしている趣旨に聞こえます。

う〜ん、こんなやり取りをいつまでもしていても質問者さんも困ってしまうと思うので

一応あってそうな答えを推測して作ってみます。


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

Name: 管理人 [URL]  ..ハッカー(149,855ポイント)   Date: 2006/12/21(木) 03:01   No:3054     
Title: Re:組み合わせ    
とりあえず私の100倍問題の要旨理解の正しいJustyさんのおっしゃる通りに実装してみました。

困ったときはJustyさんのおっしゃる通りにやれば正解だろうというのが勝手な持論です(笑


n! = nCr * r! * (n - r)!

という式の通り計算しています。

ものすごい無駄な意味の無い計算に思います・・。

combは階乗を計算する関数でcomb2は組み合わせを計算する関数です。

#include <stdio.h>


int comb( int n ){
if(n>0 )
return n*comb(n-1);
else
return 1;
}

int comb2( int m, int n ){
if( m>n && n>0 )
return comb2(m-1,n-1) + comb2(m-1,n);
else
return 1;
}

int main(){
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",comb2(m,n)*comb(n)*comb(m-n));
return 0;
}

先ほど紹介したプログラムと同じです。


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

Name: Justy  ..熟練のプログラマー(48,402ポイント)   Date: 2006/12/21(木) 03:51   No:3055     
Title: Re:組み合わせ    
困ったときはJustyさんのおっしゃる通りにやれば正解だろうというのが勝手な持論です(笑
 いやいや、今回はかなり半信半疑です(w
 どちらかと言えば管理人さんの推測通り「nCrの再帰計算に手を加えて n!を計算する関数を作成する」方だと思っていますが。

 でもひょっとすると数学的に何か凄い公式があったりするのかもしれません。


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

Name: 管理人 [URL]  ..ハッカー(149,872ポイント)   Date: 2006/12/21(木) 04:39   No:3056     
Title: Re:組み合わせ    
色々考えてみたものの、やはりわからない・・・。
値から計算するのは論外でしょうし、Justyさんのおっしゃる計算で、似たような計算で階乗を求める方法以外に思いつきません。

他に思い当たる計算はまるでnをかけてその後nで割るような計算になってしまいます・・。

あきらかに意味の無いプログラムになってしまいますが、結局再帰関数をいじくることで勉強になっただろっていう結論なのなら
無理やりうなずくことも出来るかも・・。


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

Name: キリコ  ..かけだし(1,939ポイント)   Date: 2006/12/21(木) 04:53   No:3057     
Title: Re:組み合わせ    
Justyさん、管理人さんどうもありがとうございます。
たしかに私もこの問題は微妙だとおもいます。
私の遥か上にいるお二人のおっしゃるこれで多分あっているでしょう。
今日実行してみます。


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

Name: 管理人 [URL]  ..ハッカー(149,924ポイント)   Date: 2006/12/21(木) 05:01   No:3058     
Title: Re:組み合わせ    
なんかだらだらした回答になってしまってごめんなさいね。
頑張ってください☆


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

Name: フリオ  ..かけだし(1,693ポイント)   Date: 2006/12/21(木) 09:25   No:3063     
Title: Re:組み合わせ    
 
 わかりました。
きっと、スターリング数のことではないでしょうか。
http://homepage2.nifty.com/PAF00305/math/formula/combination.html


#include<stdio.h>

int Combi(int n, int r)
{
if(n < r) return 0;
if(n == r || r == 0) return 1;
return Combi(n - 1, r) + Combi(n - 1, r - 1);
}

int Stiring(int n, int r)
{
if(n == r) return 1;
if(n < r || r == 0) return 0;
return (n - 1) * Stiring(n - 1, r) + Stiring(n - 1, r - 1);
}

int Fact(int n)
{
int sum, r;

for(sum = r = 0; r <= n; r ++) sum += Stiring(n, r);
return sum;
}

int Fact0(int n)
{
if(!n) return 1;
return n * Fact0(n - 1);
}

int main()
{
int n = 10, r = 3;

printf("n == %d, r == %d\n", n, r);
printf("C(n, r) == %d\n", Combi(n, r));
printf("S(n, r) == %d(Stiring Number)\n", Stiring(n, r));
printf(" n! == %d(by Stiring Number)\n", Fact(n));
printf(" n! == %d\n", Fact0(n));
return 0;
}


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

Name: 管理人 [URL]  ..ハッカー(150,092ポイント)   Date: 2006/12/21(木) 14:35   No:3076     
Title: Re:組み合わせ    
へ〜ヤング図形ですかぁ。テトリスみたいですねw

ベル数とかスターリング数とか知らない言葉ばかりで…。

勉強になりました^^;


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



Name: 管理人 [URL]  ..ハッカー(141,867ポイント)   Date: 2006/12/19(火) 19:17   No:2968       
Title: 線形リストと配列 どちらが速い?    
☆さんの質問を受けて、数値が入力されるたびにソートして表示するという問題を考えてみました。

毎回ソートして表示するよりも、線形リストで途中に挿入していったほうが早いのではないかという結論になったのですが、

線形リストの代わりに配列を使った方が早いのではないかと思い、時間を測定してみました。
(こうなるとソートと呼ぶのはふさわしくない気がしますが)

配列は毎回全部のデータをfree、全部のデータをコピー、しなければならないので、一見遅そうに思えますが、測定してみて、意外な結果になりました。

3000回入力(rand()による自動入力)でソート表示、これを1000回行った計算時間です。


線形リストを使ったソート

計算時間 32.453秒



配列を使ったソート

計算時間 5.187秒



各測定に使用したコードはこちらです。大量にログが出てしまうので、printf文は省略してあります。


線形リストを使ったソート

#include <stdio.h>

#include <stdlib.h>
#include <time.h>

typedef struct node {
int data;
struct node *next;
} node_t;

//新規リストを作成.
node_t *list_new(void){
node_t *list;

if((list = (node_t *)malloc(sizeof(node_t))) == NULL)
exit(9);
list->next = NULL;

return list;
}

//node の後ろに,data を保持する節点を追加し,その節点を返す.
node_t *node_insert_after(node_t *node, int data){
node_t *new_node;

if((new_node = (node_t *)malloc(sizeof(node_t))) == NULL)
exit(9);
new_node->data = data;
new_node->next = node->next;
node->next = new_node;

return new_node;
}

//リスト解放
void list_delete(node_t *list)
{
node_t *node, *next;

for (node = list; node != NULL; node = next) {
next = node->next;
free(node);
}
}

int main(void){

int x;
node_t *list, *node,*copy;
clock_t t1,t2;

t1=clock();

for(int j=0;j<=1000;j++){

/*1回分のソートここから*/

list = list_new();

for(int i=0;i<3000;i++){

x = rand();
copy=list;
if(list->next==NULL){//一番最初なら
node_insert_after(copy,x);
}
else{
for (node = list->next; node != NULL; node = node->next){
if(node->data>x){//比較で見つかった値の一つ前に挿入
node_insert_after(copy,x);
break;
}
else if(node->next==NULL){//最後まで比較で見つからなかったら最後に挿入
node_insert_after(node,x);
break;
}
copy=node;
}
}
if(j%10==0)
printf("作業進行率%3d%\r",j/10);
}

list_delete(list);

/*ここまで*/
}
t2=clock();
printf("\n\n計算時間 %.3f秒\n",double(t2-t1)/1000);
return 0;
}




配列を使ったソート

#include <stdio.h>

#include <stdlib.h>
#include <time.h>

void sort(int *p,int num,int x){
int i,j;
for(i=0;i<num;i++)
if(p[i]>x)
break;
for(j=num;j>=i;j--)
p[j+1]=p[j];
p[i]=x;
return ;
}

int main(void){
int i,j,num=0,*p,x;
clock_t t1,t2;
t1=clock();

for(int s=0;s<=1000;s++){

p = (int *)malloc(sizeof(int)*(num+1));

for(int t=0;t<3000;t++){

x=rand();
if(num>0){
p=(int *)realloc(p,sizeof(int)*(num+2));
sort(p,num,x);
}
else p[0]=x;
num++;

}
if(s%10==0){
printf("作業進行率%3d%\r",s/10);
}
num=0;
free(p);
}
t2=clock();
printf("\n\n計算時間 %.3f秒\n",double(t2-t1)/1000);

return 0;
}


私としてはこの結果から線形リストより配列を使うほうがかなり早いのかと思いましたが、どこかに無駄があるために線形リストが遅くなっていたりするのでしょうか・・。

この問題の解答として一番早いソートのしかたはなんなのか気になったので調べてみました。

何かご意見くだされば光栄です。


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


Name:  ..入門者(4,625ポイント)   Date: 2006/12/19(火) 19:20   No:2970     
Title: Re:線形リストと配列    
線形の方が6倍も時間かかるんですか!!!!おどろきました!!!

時間などを気にしなくても、勉強し、理解する側としても、配列を用いた方が分かりやすいです。


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

Name: 管理人 [URL]  ..ハッカー(142,116ポイント)   Date: 2006/12/19(火) 19:23   No:2972     
Title: Re:線形リストと配列    
パパっと作ったものなので、どこかに間違いや、無駄があって遅くなっている可能性もあるので、家に帰ってちょっとゆっくり確認してみます^^;

確かに配列を使った方が書く量も少なくてすむし、わかりやすいですね。
一応今回の課題について

・実際にソートしながら表示
・リストによる表示
・配列による表示

の3種類のプログラムを作ってみると勉強になると思いますよ。


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

Name: Justy  ..熟練のプログラマー(47,624ポイント)   Date: 2006/12/19(火) 23:38   No:2981     
Title: Re:線形リストと配列    
 配列版とリスト版の大きな違いはメモリの確保回数が大きく影響していると思われます。

 リスト版は毎回アロケートをしていますし、リストの破棄時には全てを解放しなければならず、この処理に時間がかかっている物と思われます。
(試しに freeをコメントアウトするとちょっと早くなります)

 配列版でも毎回 reallocをかけていますが、Windowsの場合仮想メモリの領域を拡張するだけ「メモリ確保、領域(実体)の移動」をしなくて済む場合があります。
 その為、reallocによる負荷は仮想メモリ制御だけで済むので、高速なのだと思います。
(つまり、reallocを使わずに、新領域を malloc、新領域にコピー、旧領域を破棄、を行って領域を伸長すると重いはずです)


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

Name: 管理人 [URL]  ..ハッカー(142,510ポイント)   Date: 2006/12/20(水) 00:32   No:2982     
Title: Re:線形リストと配列    
ソートアルゴリズムっていうのは

バブルソート
バケットソート
基数ソート
ヒープソート
マージソート
クイックソート

などいろいろありますけど、このように配列で並び替えるソートに名前は付いているんでしょうか?


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

Name: ま〜く  ..ぴよぴよ(520ポイント)   Date: 2006/12/20(水) 00:46   No:2983     
Title: Re:線形リストと配列    
おお〜実際に試してるのですね^^

>配列で並び替えるソートに名前・・・
ってデータが配列でもリストでも関係ないんじゃないですかねー?
ソートはアルゴリズムですしね。

データ構造(リストや配列やハッシュなど)とソートの種類はそれぞれ向き不向きがあるので目的に応じて使い分けるのがいいですよね。

今回の
>数値が入力されるたびにソートして・・
に関しては、データが単純に増加するだけなので、データ構造としては配列を選択するのがよいかと思いますね〜

これが、例えば途中のデータを削除して〜なんてことが頻繁に必要ならば全体的にはリストがいいかも知れないですしね。
(まーハイブリッド的に持つのもいいですけどね^^)



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

Name: Justy  ..熟練のプログラマー(47,694ポイント)   Date: 2006/12/20(水) 00:48   No:2984     
Title: Re:線形リストと配列    
このように配列で並び替えるソートに名前は付いているんでしょうか
 原理的には挿入ソート(インサーションソート)だと思います。


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

Name: 管理人 [URL]  ..ハッカー(142,312ポイント)   Date: 2006/12/20(水) 02:47   No:2986     
Title: Re:線形リストと配列    
>Justyさん

なるほど、挿入ソートですか。
それに付随してシェルソートっていうのもあるんですね。
色々調べてみたら数え切れないくらいアルゴリズムがありそうですね。

やはりこんな簡単なアルゴリズム・・名前付いてますよねw


>ま〜くさん

挿入、部分削除などするたびに後の要素をすべてコピーしないといけないので
量が多くなってくるとリストの方がいいんですかね?
しかし配列で計算するとこんなに時間短縮されるとは実際びっくりでした。

一回探せるだけ探して、どのソートがどれ位の性能を持っているか表で表してみたいです^^

まぁそのアルゴリズムは状況によって得意不得意がありそうですね。


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

Name: Justy  ..熟練のプログラマー(47,704ポイント)   Date: 2006/12/20(水) 04:17   No:2989     
Title: Re:線形リストと配列    
色々調べてみたら数え切れないくらいアルゴリズムがありそうですね
 新しいより高速でより汎用的なアルゴリズムを開発してみると、面白いかもしれません。
 うまくいけば、特許がとれる・・・かも(w

量が多くなってくるとリストの方がいいんですかね?
 それはあると思います。
 個人的にはデータの管理で配列系では辛いなぁと思ったときは、単純なリストより二分木系の方が検索が早いことが多いという理由で好きです。
 それに二分木なら、自動的にソート済みになりますし。


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

Name: 管理人 [URL]  ..ハッカー(144,327ポイント)   Date: 2006/12/20(水) 05:36   No:2990     
Title: Re:線形リストと配列    
>うまくいけば、特許がとれる・・・かも(w

先日教授に「新しいソートアルゴリズム研究して学会で発表してみたら。ハッハッハ」って言われたのでちょっとソートに興味持ってました。
こんな事で画期的なアルゴリズムが見つかるとは思えませんけどw

世界中でこんな研究してる人ごまんといるんでしょうねぇ(;→〜←)

ソート一つで特許とった人いるんでしょうか?
研究して特許とるっていう仕事もありなのかもしれませんがバクチないきかたですねぇ・・。


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

Name: フリオ  ..かけだし(1,390ポイント)   Date: 2006/12/20(水) 06:14   No:2991     
Title: Re:線形リストと配列    
 
 リストを使ったほうは、かなり早くなりました。
配列を使ったほうは、ほとんど変わりませんが、気持ち早くなってるかも。


/* リスト */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct data{
int n;
struct data *next;
} DATA;

int Add(DATA *work, int n)
{
DATA *newdata;

for( ; work->next != NULL; work = work->next){
if(work->next->n > n) break;
}
if((newdata = (DATA *)malloc(sizeof(DATA))) == NULL) return 0;
newdata->n = n;
newdata->next = work->next;
work->next = newdata;
return 1;
}

void Clear(DATA *head)
{
DATA *work;

for(work = head->next; work != NULL; work = head->next){
head->next = work->next;
free(work);
}
return;
}

int main(void)
{
DATA head = {0, NULL};
clock_t t0, t1;
int i, j;

srand((unsigned)time(NULL));
t0 = clock();
for(i = 0; i <= 1000; i ++){
for(j = 0; j <= 3000; j ++){
if(!Add(&head, rand())) return 1;
}
Clear(&head);
if(!(i % 10)) printf("作業進行率%3d%\r",i / 10);
}
t1 = clock();
printf("\n\n計算時間 %.3f秒\n",(double)(t1 - t0) / 1000);
return 0;
}

 
 

/* 配列 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void Add(int *list, int l_num, int n)
{
int i;

for(i = l_num - 1; i >= 0; i --){
if(list[i] > n) list[i + 1] = list[i];
else{
list[i + 1] = n;
return;
}
}
list[0] = n;
return;
}

int main(void)
{
int *list, *temp;
int l_num, alloc_num, i, j;
clock_t t0, t1;

srand((unsigned)time(NULL));
t0 = clock();
for(i = 0; i <= 1000; i ++){
if((list = (int *)malloc(sizeof(int) * 1024)) == NULL){
puts("Alloc Error");
return 1;
}
alloc_num = 1;
for(l_num = 0; l_num <= 3000; l_num ++){
if(l_num >= 1024 * alloc_num){
temp = (int *)realloc(list, sizeof(int) * 1024 * (++ alloc_num));
if(temp == NULL){
puts("Realloc Error");
return 1;
}
list = temp;
}
Add(list, l_num, rand());
}
if(i % 10 == 0) printf("作業進行率%3d%\r", i / 10);
free(list);
}
t1 = clock();
printf("\n\n計算時間 %.3f秒\n",(double)(t1 - t0) / 1000);

return 0;
}

 


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

Name: Yuki  ..ぴよぴよ(727ポイント)   Date: 2006/12/20(水) 08:35   No:2993     
Title: Re:線形リストと配列    
>先日教授に「新しいソートアルゴリズム研究して学会で発表してみたら。ハッハッハ」って言われたのでちょっとソートに興味持ってました。

卒論等のテーマにはいいかもしれませんね。


>ソート一つで特許とった人いるんでしょうか?
>研究して特許とるっていう仕事もありなのかもしれませんがバクチないきかたですねぇ・・。

ソートの特許はないんじゃないでしょうか。
#でないと参考書に載せるだけでも使用料が発生する!??

特許申請にもかなりのお金がかかるようなので、却下されるとかなりショックかも。


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

Name: Justy  ..熟練のプログラマー(47,877ポイント)   Date: 2006/12/20(水) 11:35   No:2999     
Title: Re:線形リストと配列    
ソートの特許はないんじゃないでしょうか
 ソートはあまり見かけませんね。

 ぐぐってみたらと高速なソートを発明した会社が出願中らしいです。
http://www.thinkplan.co.jp/htm/index_SlipStream.htm

 あとはこれらでしょうか
http://jstore.jst.go.jp/cgi-bin/patent/ipc/detail.cgi?id=11420&parent=G06%20%20%20%20%20%20%20%20%20%20%20%20%20&fabrication=1

http://jstore.jst.go.jp/cgi-bin/patent/applicant/detail.cgi?pat_id=11165&parent=4&fabrication=1


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

Name: 管理人 [URL]  ..ハッカー(144,594ポイント)   Date: 2006/12/20(水) 12:14   No:3000     
Title: Re:線形リストと配列    
>フリオさん

う、リストややこしいことしなくても、それでよかったのですか・・。
どちらとも早くなってますね。
配列も1024ずつですかぁ、なるほど。

最初から3000回なら3000回って解っている状況ならsizeof(int)*3000先に確保しといた方が早そうですね。

>Yukiさん

そうですねぇ、テーマに一時期私も考えましたけど、
色々なアルゴリズムのソートの時間計測をいろんな状況でしたり
使う状況による変化を研究したりすると面白そうですね。

>#でないと参考書に載せるだけでも使用料が発生する!??

う、これはありえませんねぇ・・。こんなことになったらサイトでも紹介できない!?
どんなソートも紹介されているのなら特許はなさそうですね・・・、あ、そういうことなら特許のソートがあるとしたら公に出ないから知らないだけなのかも^^;

>特許申請にもかなりのお金がかかるようなので、却下されるとかなりショックかも。

なるほど・・、何でも気軽に申請できるわけじゃないんですね;
無料に近い金額だったらダメ元でなんでもかんでも申請する人がふえそうですもんね;


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

Name: Justy  ..熟練のプログラマー(48,141ポイント)   Date: 2006/12/20(水) 13:05   No:3005     
Title: Re:線形リストと配列    
最初から3000回なら3000回って解っている状況ならsizeof(int)*3000先に確保しといた方が早そうですね
 それはそうですね(w


配列も1024ずつですかぁ
 C++なんかではこれと似たようなことをするクラスに std::vectorがあります。
 実装によって異なりますが、挿入時にメモリが足らなければ現在の 1.5倍とかの領域を確保しなおしているようです。


何でも気軽に申請できるわけじゃないんですね
 専門家に頼むと数十万とかかかります。
 自分で申請すれば数万くらいです。でもものすごく面倒らしいです。

 申請しても認められるとは限らないですし、審査にも時間かかりますから、だからなかなか一般の人は申請しにくいですね。


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

Name: 管理人 [URL]  ..ハッカー(145,083ポイント)   Date: 2006/12/20(水) 13:27   No:3007     
Title: Re:線形リストと配列    
>>最初から3000回なら3000回って解っている状況ならsizeof(int)*3000先に確保しといた方が早そうですね

そういえば、元々、何回入力があるか解らないものという事が前提なの忘れてました;
・・・しかし手入力なんてそう何万回も出来ないし、多めに確保しても数KBも取らないですよね。


>C++なんかではこれと似たようなことをするクラスに std::vectorがあります。

あ〜JAVAに同じような機能がありますね。名前忘れましたけど・・。
C++早いとこ勉強しなければ・・。管理人失格(_ _|||)

>専門家に頼むと数十万とかかかります。
 
特許申請に専門家とかいるんですかぁ。
数十万・・よほど自信がないと出せませんねw

そういえば祖父の弟が特許いくつも取ってそのお金で東京にでっかいマンション3つも建ててオーナーやってました。
医学部を滑り止めにして東大に受かった人で親戚の中では有名人でした。
おいしい特許取ればそうとうなものなんでしょうね。
確かパンパースの濡れると青くなるあれを発明したと言ってました。
後、冷凍の魚や肉のしたにしくシートを発明したとか。
・・・あのシートは何の役目をしているのかよく知りませんが^^;

しかし、あの頭よかったおじさんも毎日毎日研究所に引きこもって研究していたせいで体を悪くして死んでしまいました・・。
寝ずに食べずに研究してたとか。エジソンか?^^;
いくつも特許とる位発明するには日々人一倍の努力が必要なんでしょうけど、あそこまでやって体壊してしまったのでは意味が無いですねぇ(_ _|||)


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

Name: 管理人 [URL]  ..ハッカー(145,830ポイント)   Date: 2006/12/20(水) 14:11   No:3012     
Title: Re:線形リストと配列    
クイックソート遅ぉ!

・・・というわけでクイックソートとの比較もしてみました。

作業進行率 100%

計算時間 100.218秒

やっぱクイックソートとはいえ、毎回全てがソートされるようなアルゴリズムを使うと遅くなってしまうんですね。

今回の場合、1個だけ挿入すればいいわけで、前回までの処理で他の部分は全てそろってるんですものね。

フリオさんのお書きになったプログラムを実行した配列のソートプログラム

作業進行率100%

計算時間 3.765秒

でした。

/*  配列  */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int n, list[3000] , num=0; clock_t t0, t1;
t0 = clock();
for(int i = 1; i <= 1000; i ++){
for(int l_num = 0; l_num < 3000; l_num ++){
n=rand();
for(int s = l_num - 1; s >= 0; s --){
if(list[s] > n) list[s + 1] = list[s];
else {list[s + 1] = n; break;}
}
list[0] = n;
}
if(i % 10 == 0) printf("作業進行率%3d%\r", i / 10);
}
t1 = clock();
printf("\n\n計算時間 %.3f秒\n",(double)(t1 - t0) / 1000);
return 0;
}


固定[3000]にして、短く書き直しました(掲示板のスクロールが長くなってしまうので;)


/* クイックソート */


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sort(int l, int r, int x[3000]){
int i,j,p,t;
i=l;j=r;p=x[(l+r)/2];
while(1) {
while(x[i]<p) i++;
while(p<x[j]) j--;
if(i>=j) break;
t=x[i],x[i]=x[j],x[j]=t;
i++ , j--;
}
if(l<i-1) sort(l,i-1,x);
if(j+1<r) sort(j+1,r,x);
}
int main(void){
int x[3000]; clock_t t0,t1;
t0 = clock();
for(int i=1;i<=1000;i++){
for(int j=0;j<3000;j++){
x[j]=rand(); sort(0, j, x);
}
if(!(i % 10)) printf("作業進行率%3d%\r",i / 10);
}
t1=clock();
printf("\n\n計算時間 %.3f秒\n",(double)(t1 - t0)/1000);
return 0;
}


 


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

Name: Justy  ..熟練のプログラマー(48,197ポイント)   Date: 2006/12/20(水) 14:36   No:3014     
Title: Re:線形リストと配列    
おいしい特許取ればそうとうなものなんでしょうね
 自分でとるのが面倒な場合、所属する会社で取ってもらうというのも手です(そういう精度がある場合、ですが)。
 権利は会社になってしまいますが、とある会社では社員が会社経由で(どんな役に立たないものでも)特許を申請しただけで以後ずっと月給+5000円、申請が通ると以後ずっとX万円加算されるという制度があるそうです。
 1件でそれなので、数件〜数十件申請してる人と全くしてない人では生涯給与で結構差が開く、なんてこともありそうです。

>パンパースの濡れると青くなるあれを
 おー、それはまた凄いですね。


>いくつも特許とる位発明するには日々人一倍の努力が必要
 勿論血のにじむような努力が必要なこともありますけど、結構特許を申請できそうなことって思いついたりしてると思います。


 特許電子図書館で検索してみるとわかりすいところで、ゲーム関連だと

「特許公開2003−334381」
 まんま PS2のゲーム SHINOBIですよね。

「特許公開2005−100133」
 塊魂ですかね。

 こんなゲームの仕組みというかルールのようなものも申請対象になるようなので、意外と思いついていても気付かないでそのまま・・・・ってことも多そうですね。


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

Name: 管理人 [URL]  ..ハッカー(146,951ポイント)   Date: 2006/12/20(水) 21:26   No:3025     
Title: Re:線形リストと配列    
>結構特許を申請できそうなことって思いついたりしてると思います。

そうですよね。ひらめいても、うまく応用できなかったりするだけで、特許につながる要素はいくつも思いついているかもしれませんね。

>特許電子図書館で・・

そんなものがあるんですね!
こういうサイトも面白そうですね。是非覗いてみます。


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

Name: Yuki  ..かけだし(1,011ポイント)   Date: 2006/12/21(木) 08:15   No:3061     
Title: Re:線形リストと配列    
まさしくありましたよ!!!
特許公開2006−39894「ソート(並び替え)手法・アルゴリズム」


>特許電子図書館
「・特許・実用新案公報DB」で、
「文献種別」にA、「文献番号」にH18-39894を入力すると、↑の詳細な特許情報が閲覧できます。
「●全項目」をクリックすると、【発明の詳細な説明】が表示されます。

クイックソートとか知ってる言葉もあるのですが、まだ完全に起きていない頭では日本語が難しいです・・・。


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

Name: 管理人 [URL]  ..ハッカー(150,037ポイント)   Date: 2006/12/21(木) 14:26   No:3075     
Title: Re:線形リストと配列    
おぉ!ホントですね。
しかも公開日が今年の2月とは新しい。

んん・・図が縮小されていて見えない;


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



Name: 円香  ..ぴよぴよ(746ポイント)   Date: 2006/12/20(水) 01:18   No:2985       
Title: 進級製作で苦戦しています    
初めまして、こんにちは。
実は、進級製作でドンキーコングを作っているのですが、
マリオを動かすプログラムがよくわからないので、どなたか教えていただけないでしょうか?

とりあえず、一枚の画像で動くようにはしたのですが、走っているときは走っている画像、
止まっているときは止まっている画像、はしごを上っているときは上っている画像といったようにしたいんですが・・・。

よろしくお願いします。

今のところ、プログラムはこんな感じです。


#pragma warning(disable : 4995) // 警告除去
#include <tchar.h>
#include "dxstdafx.h"

// 関数プロトタイプ宣言
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime ); // 関数を作成
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime );
void CALLBACK DeviceDestroyed( void ); // デバイス削除時
void CALLBACK DeviceLost( void ); // デバイス消失時

// グローバル関数
LPDIRECT3DTEXTURE9 pTexture; // テクスチャへのポインタ
LPDIRECT3DTEXTURE9 pTexture2;
LPDIRECT3DTEXTURE9 pTexture3;
LPDIRECT3DTEXTURE9 pTexture4;
LPDIRECT3DTEXTURE9 pTexture5;
LPD3DXSPRITE pSprite; // スプライトへのポインタ
LPD3DXFONT pFont; // フォントオブジェクト
D3DXVECTOR3 pos = D3DXVECTOR3(200,200,0);
D3DXVECTOR3 dpos = D3DXVECTOR3(40,-13,0);
D3DXVECTOR3 tpos = D3DXVECTOR3(20,51,0);
D3DXVECTOR3 ppos = D3DXVECTOR3(160,35,0);

// メイン関数
int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
DXUTSetCallbackFrameRender( FrameRender ); // コールバック関数の登録 (描画関数)
DXUTSetCallbackFrameMove( FrameMove ); // (更新関数)
DXUTSetCallbackDeviceDestroyed( DeviceDestroyed ); // (削除時関数)
DXUTSetCallbackDeviceLost( DeviceLost ); // (消失時関数)

DXUTInit();
DXUTCreateWindow(_T("DirectX 9.0 Graphice Sample05"));
DXUTCreateDevice(D3DADAPTER_DEFAULT, true, 512, 450);

D3DXCreateSprite( DXUTGetD3DDevice(), &pSprite );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("stage1.bmp"), &pTexture ); // テクスチャのロード
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("mario_1.png"), &pTexture2 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("donkey_1.png"), &pTexture3 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("taru-s.png"), &pTexture4 );
D3DXCreateTextureFromFile( DXUTGetD3DDevice(), _T("peach_1.png"), &pTexture5 );
DXUTMainLoop();

return DXUTGetExitCode();
}
// 描画用コールバック関数
void CALLBACK FrameRender( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); // クリアと背景色
DXUTGetD3DDevice()->BeginScene(); // シーンの開始
pSprite->Begin( D3DXSPRITE_ALPHABLEND ); // スプライトの開始
D3DXVECTOR3 center = D3DXVECTOR3(0,3,0); // 中心位置の指定

//  
pSprite->Draw( pTexture, NULL, center, NULL, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture2, NULL, NULL, &pos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture3, NULL, NULL, &dpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture4, NULL, NULL, &tpos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->Draw( pTexture5, NULL, NULL, &ppos, D3DCOLOR_ARGB(255,255,255,255));
pSprite->End(); // スプライトの終了
DXUTGetD3DDevice()->EndScene(); // シーンの終了
}

// 更新用コールバック関数
void CALLBACK FrameMove( LPDIRECT3DDEVICE9 pd3dDevice , double fTime , float fElapsedTime )
{
if( DXUTIsKeyDown( VK_RIGHT ) ){
pos.x += fElapsedTime*100.0f; // x座標を1秒間に100増やす
}
if( DXUTIsKeyDown( VK_LEFT ) ){
pos.x -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_UP ) ){
pos.y -= fElapsedTime*100.0f;
}
if( DXUTIsKeyDown( VK_DOWN ) ){
pos.y += fElapsedTime*100.0f;
}
}

// デバイス削除時コールバック関数
void CALLBACK DeviceDestroyed( void )
{
SAFE_RELEASE(pTexture); // テクスチャの解放
SAFE_RELEASE(pTexture2);
SAFE_RELEASE(pTexture3);
SAFE_RELEASE(pTexture4);
SAFE_RELEASE(pTexture5);
SAFE_RELEASE(pSprite); // スプライトの解放
}

// デバイスの消失時コールバック関数
void CALLBACK DeviceLost( void )
{
pSprite->OnLostDevice(); // テクスチャの復旧
}


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


Name: 管理人 [URL]  ..ハッカー(142,829ポイント)   Date: 2006/12/20(水) 02:59   No:2987     
Title: Re:進級製作で苦戦しています    
こんにちは。これはDirect3Dでしょうか?

Direct3Dは使ったこと無いので詳しくわかりませんが、とりあえず、走っている時は入力を受けているときなんですから、

例えば右・左ボタンを押しているときで、地面の上にいるときは、走る画像。

地面から離れているときはジャンプ中の画像。

という感じでプログラムしたらいいんではないのでしょうか?

歩く距離をカウントするカウンターを用意して、5カウント走ったら次の画像、5カウント走ったら次の画像を表示させて結果的に走るモーションを描いてはどうでしょうか?

ゲームプログラミングの館に歩くモーションの作り方が書いてあります。

ソースコードは初心者にとにかく解りやすく書いたもので、構造化やスマートになど一切気にしていない書き方なので、

考え方を理解した上で色々アレンジして書いてみてはいかがでしょうか?

ジャンプアクションや玉の発射、はねかえりなども

ゲームプログラミングの館で若干説明しておりますので参考にしてみてください。

マリオのファイヤ発射などはシューティングのように玉を制御すればいいように思います。

参考にならなかったらすみません。


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

Name: 管理人 [URL]  ..ハッカー(144,128ポイント)   Date: 2006/12/20(水) 03:16   No:2988     
Title: Re:進級製作で苦戦しています    
即席でこんな感じ作ってみました。

ゲームプログラミングの館の環境でコンパイルしてみてください。

#include "DxLib.h"


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int image[24],x=640/2,y=480/2;//分割して保存するためのimage,描画する座標を示すx,y
int graph_img; //その時表示すべき画像ハンドルを格納する変数
char Key[256]; //キーボードデータを格納するKey配列
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ) return -1; //DXライブラリ初期化 エラーが起きたら終了
SetDrawScreen( DX_SCREEN_BACK ) ; //描画先を裏画面に設定
LoadDivGraph( "char.png" , 24 , 6 , 4 , 24 , 32 , image ) ;//画像を分割してimage配列に保存
while(1){
int xx[4]={7,6,7,8};
char xpush;
xpush=1;
ClearDrawScreen(); //裏画面のデータを全て削除
GetHitKeyStateAll( Key ) ; //すべてのキーの状態を得る
if( Key[ KEY_INPUT_RIGHT ] == 1 ) //右ボタンが押されたら
x++ ; //xの値を1増やす
else if( Key[ KEY_INPUT_LEFT ] == 1 ) //右ボタンが押されたら
x-- ; //xの値を1増やす
else//キーが押されてなかったら
xpush=0;//キーが押されてないよ

for(int i=0;i<4;i++)
if(x%32>= i*8 && x%32< 8*(i+1))//32ピクセルで4つの画像をループ
graph_img=image[xx[i]];

if(xpush==0)//キーが押されてなかったら
graph_img=image[7];//たっている画像

if( Key[ KEY_INPUT_ESCAPE ] == 1 ) break ; //ESCボタンで終了
if( ProcessMessage() == -1 ) break ; //エラーが起きたら終了
DrawGraph( x , y , graph_img , FALSE ) ; //画像を描画
ScreenFlip() ; //裏画面データを表画面へ反映
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}


考え方は無数にあるので、この考え方でなくてももちろんいいと思います。
これは今いる座標32ピクセル毎に4つの画像をループして表示しています。
何も入力が無かったらたっている画像を表示します。

左右に動きますが、左は向きません。

マリオの場合は、カウンタを用意した方がよいと思います。
走っていると座標は同じだけど背景が動いているために走っているようにみせるってことが多いでしょうから。

入力を受け付け始めて特定カウントたつと、走る画像をループして表示するようにしてみてください。


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

Name: バグ  ..上級者(15,937ポイント)   Date: 2006/12/20(水) 08:11   No:2992     
Title: Re:進級製作で苦戦しています    
ドンキーコングとは懐かしい…
私の記憶にあるオリジナルのドンキーコングに登場したマリオの動きは、管理人さんの言うようにカウンタを持たせてアニメーションさせているように見える動きをしていたと思います。

横方向キーをチョン押しするとスプライトが1ドットスライドしてグラフィックが切り替わってそのままになっていたはずなので、間違いないんじゃないかな?

ジャンプは空中制御のできないタイプなので、納得のいく軌道さえ作れば問題ないでしょうし…あ、壁に向かってジャンプしたら、横方向の移動量の正負が反転して跳ね返ってきてたんで、これは画面外へのはみ出し防止処理かな?

それから、ハシゴ移動中は完全に登りきるか、降りきってしまうまでは上下移動しかできなかったはずなので、やられ判定を処理しつつ、上下以外のキー入力を受け付けなければできそうですね。


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

Name: 管理人 [URL]  ..ハッカー(144,245ポイント)   Date: 2006/12/20(水) 11:31   No:2995     
Title: Re:進級製作で苦戦しています    
あ、すみません、ドンキーコングとマリオって知りません・・・。

スーパードンキーコングってマリオの出てこない奴か、スーパーマリオブラザーズってマリオとルイジーしか出てこないやつどっちかしかやったことないので、

想像しているゲームとは違うのかも・・。


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

Name: 管理人 [URL]  ..ハッカー(144,305ポイント)   Date: 2006/12/20(水) 11:35   No:2998     
Title: Re:進級製作で苦戦しています    
もしかしてこれですか??

http://qtchicks.hp.infoseek.co.jp/dk.html

このゲームは見たこと無い;
1981年って生まれる3年前だ^^;


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

Name: バグ  ..上級者(16,332ポイント)   Date: 2006/12/21(木) 12:03   No:3067     
Title: Re:進級製作で苦戦しています    
>>管理人さん
それです(笑)
ちなみに、ファミコン版はステージが1つ削られてます。
1ではドンキーコングにさらわれたレディをマリオが助けにいくというシナリオだったのですが、2作目のドンキーコングJrでは、ドンキーコングの息子が主人公になり、マリオにとらわれた親を助けに行くというストーリーになっています。はい、マリオが悪役になってます(笑)

ちなみに、ドンキーコング3というのもありますが、これはあまり知られていないみたいで、知っている人が少ないです。結構面白かったんですけどね。ちなみに3にはマリオは出てこなかったはずです。


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

Name: 管理人 [URL]  ..ハッカー(150,000ポイント)   Date: 2006/12/21(木) 13:41   No:3072     
Title: Re:進級製作で苦戦しています    
>マリオが悪役になってます

えぇ〜!マリオって主人公のイメージが^^;
ドンキーもマリオも最初は同じゲームに登場してたんですねぇ。


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



Name: rua  ..ぴよぴよ(29ポイント)   Date: 2006/12/19(火) 21:11   No:2974       
Title: 問題で・・・    
フェーザ表記のインピーダンスをコマンドライン引数として入力し、アドミタンスYに変換して成分表示するプログラムを作るのですが・・・
main関数の二つ目のprintfのところの表示が整数ででてきてしまいます。
デバッガで見てもよくわかりませんでした。
ifの条件は少ないですがあとでたすつもりです。
大まかな構造は変えないで教えていただけると幸いです。

#include <stdio.h>

#include <stdlib.h>

struct complex_p {
double a;
double b;
};

struct complex_p cp_p( struct complex_p *a, struct complex_p *b);

int main( int argc, char *argv[] )
{
struct complex_p c1={0.0,0.0}, c2={0.0,0.0}, c3;
char n1,n2;

if(argc<2) {
printf("Error. The number of argument is too few..\n");
return(-1);
}

n1=*argv[1];
n2=*argv[2];
c1.a=atof(argv[1]);
c2.b=atof(argv[2]);

if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&&(n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){
c3 = cp_p(&c1,&c2);
printf("Z=%g-j%g.\n",c1.a, c2.b );
printf("Y=%g+j%g.\n",c2.a, c1.b );
}

return (0);
}

struct complex_p cp_p(struct complex_p *a, struct complex_p *b)
{
struct complex_p tmp;

tmp.a = (*a).a / ((*a).a * (*a).a + (*b).b * (*b).b);
tmp.b = (*b).b / ((*a).a * (*a).a + (*b).b * (*b).b);
return tmp;
}



  



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


Name: 管理人 [URL]  ..ハッカー(142,269ポイント)   Date: 2006/12/19(火) 21:41   No:2975     
Title: Re:問題で・・・    
ruaさん、こんにちは。

それはatofしていないものを表示しようとしているからじゃないですか?

よく処理の流れを見てみてください。

それから

if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&& (n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){

こんなに長くかかなくてもatofしてから範囲指定すればいいんじゃないですか?

仮にこの方法で行うとしても

n1>='1' && n1<='9'

でいけますよ。


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

Name: box  ..上級者(24,340ポイント)   Date: 2006/12/19(火) 21:42   No:2976     
Title: Re:問題で・・・    
main関数で、cp_p関数にc1のアドレスとc2のアドレスを渡していますね。
受け取ったcp_p関数で、引数aと引数bを使って計算していますが、
aとbの値そのものは変わっていません。
よって、main関数の2個目のprintfでは、c2.aとc1.bの各々の初期値である
0.0を出力しています。

ところで、cp_p関数の戻り値を、main関数でのその後の処理に使っていませんが、
それはOKなのでしょうか?


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

Name: 管理人 [URL]  ..ハッカー(142,379ポイント)   Date: 2006/12/19(火) 21:47   No:2977     
Title: Re:問題で・・・    
if((n1=='1'|| n1=='2'||n1=='3'||n1=='4'||n1=='5'||n1=='6'||n1=='7'||n1=='8'||n1=='9')&& (n2=='1'|| n2=='2'||n2=='3'||n2=='4'||n2=='5'||n2=='6'||n2=='7'||n2=='8'||n2=='9')){

この条件文の行いたいことが何かわからないんですけど、何がしたいんですか?

このままだと、第一引数の数字の一番左側の数字が1〜9かつ第二引数の数字の一番左の数字が1〜9ならってことになりますけど。

引数に最初0からはじまるものがあったらエラーにしたいのでしょうか?


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

Name: 管理人 [URL]  ..ハッカー(142,428ポイント)   Date: 2006/12/19(火) 21:54   No:2978     
Title: Re:問題で・・・    
atofで判定できない判定不可能な文字が含まれているときの処理などをしたいときは

http://www9.plala.or.jp/sgwr-t/lib/strtod.html

この辺の関数を使用するとよいですよ。


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

Name: box  ..上級者(24,426ポイント)   Date: 2006/12/19(火) 22:00   No:2979     
Title: Re:問題で・・・    
別の話ですが、(*a).a はアロー演算子 -> を使って
a->a と書く方が、より一般的でありましょう。


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

Name: rua  ..ぴよぴよ(31ポイント)   Date: 2006/12/21(木) 10:07   No:3065 解決!     
Title: Re:問題で・・・    
どうもありがとうございました。

参考にさせていただきできることができました。
また聞くことがあると思いますが、そのときはよろしくお願いします。


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

Name: 管理人 [URL]  ..ハッカー(149,953ポイント)   Date: 2006/12/21(木) 13:40   No:3071     
Title: Re:問題で・・・    
解決されたようでよかったです。
頑張ってくださいね☆


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



Name: キリコ  ..ぴよぴよ(420ポイント)   Date: 2006/12/10(日) 21:37   No:2581       
Title: 複素数    
どうもはじめまして。
わからないことがあって質問させていただきます。
複素数の割り算についてなのですが、まず
#include <stdio.h>
#include <math.h>
void xy_rt(double x,double y,double *pr,double *pt)
{
*pr=sqrt(x*x+y*y);
*pt=atan(y/x);
}

main()
{
double x1,y1,x2,y2,r1,t1,r2,t2;

if (scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=4){
printf("4つ数字をいれてください\n");exit(1);
}

xy_rt(x1,y1,&r1,&t1);
xy_rt(x2,y2,&r2,&t2);
printf("答え=%6.2lf,%6.2lf\n",(r1/r2)*cos(t1-t2),
(r1/r2)*sin(t1-t2));
}
というプログラムができるのですが、atanは値域が-2/πから2/πでx>0,y>0またはx>0,y<0という制限があるのでx,yの符号から判断し、0から2πの角度を出力する2変数関数を新たに定義して書き換えてほしいのです。
本や、検索してもわからなかったので、自分なりにかんがえてz=a+biと考えて、やるのかとか、sinとcosの逆関数から判断するのかと思ったのですが、どうも角度を出力することができませんでした。
どなたかわかる方がいらしたら教えてください、お願いします。

ついでなのですが、実数部がゼロの場合に対応させるしかたも組み込んでくれるとありがたいです。


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


Name: box  ..上級者(15,562ポイント)   Date: 2006/12/10(日) 22:18   No:2582     
Title: Re:複素数    
> 複素数の割り算

三角関数を使わずに、

a+bi (a+bi)(c-di) (ac+bd)+(bc-ad)i
---- = ------------ = ----------------
c+di (c+di)(c-di) c^2+d^2

という式(cとdの少なくとも一方は0でない)で
計算してもいいのですか?


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

Name: キリコ  ..ぴよぴよ(540ポイント)   Date: 2006/12/10(日) 22:44   No:2586     
Title: Re:複素数    
返信ありがとうございます。

「ライブラリ関数atanのかわりにx,yの符号から判断し、0から2πの範囲の角度を出力する2変数関数を新たに定義」となっていたので、そのような角度が出ればいいと思います。
多分*pt=atan(y/x); を新たにするのかな?と思うのですが・・・どうもまだわかりません。


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

Name: mas  ..入門者(3,164ポイント)   Date: 2006/12/11(月) 08:47   No:2603     
Title: Re:複素数    
>「ライブラリ関数atanのかわりにx,yの符号から判断し、0から2πの範囲の角度を出力する2変数関数を新たに定義」

これを見る限り複素数でなくても良さそうですね。

x, y, atan(y/x)の正負に注目しましょう。


x y atan(y/x) θ
正 正 正 0〜π/2
負 負 正 π〜3π/2


となりますね。
つまりatanの正負に加えてx, yの正負で場合分けすれば良いのです。
以下サンプルです。


double theta = atan(y, x);
if(theta >= 0) {
if(x >= 0)
return theta;
else
return theta + M_PI;
}


atan(y/x)が負のときは自分で考えてみてください。


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

Name: mas  ..入門者(3,216ポイント)   Date: 2006/12/11(月) 08:55   No:2604     
Title: Re:複素数    
何かいろいろ間違えてしまったような…
サンプルとして挙げたソース
× atan(y, x)
○ atan(y/x)

そもそもatanやacos等を使ってはいけないのかな?
だとしたらすみません。


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

Name: キリコ  ..ぴよぴよ(708ポイント)   Date: 2006/12/12(火) 07:59   No:2641     
Title: Re:複素数    
返信ありがとうございます。使ってよいとか悪いとかは書いてなく、2変数関数を新たに定義とかしか書いていないのですが、「ライブラリ関数atanのかわりに」のかわりという意味は使わないということでしょうかねぇ。微妙です。とりあえず、atanを使って角度を求める方法しかわかっていないのでなんともいえないのですが。
>acos等
これは私の勝手な思いつきなのですがacos asinでできそうな気がするのですがどうでしょう?


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

Name: キリコ  ..ぴよぴよ(728ポイント)   Date: 2006/12/12(火) 21:04   No:2680     
Title: Re:複素数    
すみませんacos asinじゃ値域0〜πと-π/2〜π/2ですね。
うーん難しいです。


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

Name: mas  ..入門者(3,292ポイント)   Date: 2006/12/12(火) 21:53   No:2681     
Title: Re:複素数    
acos, asinを使っても良いのなら簡単にできますよ。
上のほうにatanの例を挙げましたが、x, yの正負に注目してπを足せばよいので。


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

Name: キリコ  ..ぴよぴよ(854ポイント)   Date: 2006/12/13(水) 21:53   No:2740     
Title: Re:複素数    
返信ありがとうございます。

>acos, asinを使っても良いのなら簡単にできますよ。
>上のほうにatanの例を挙げましたが、x, yの正負に注目してπを足せばよいので。

すみませんがよければacos, asinのときどういった感じになるのか示してくれませんか?ちょっと自分の知識不足で理解できていないので・・・。

「atanのかわり」となると今のところacos, asinしか思い浮かびませんよねぇ、うーん。






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

Name: キリコ  ..ぴよぴよ(909ポイント)   Date: 2006/12/14(木) 19:11   No:2770     
Title: Re:複素数    
ほんとうにいろいろとすみませんでした。ある情報によるとatanを使ってよいと人伝えに聞きました。
まだ考えていませんが、もし私より早くできそうだったら教えてくださると助かります。よろしくお願いします。


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

Name: 管理人 [URL]  ..ハッカー(128,481ポイント)   Date: 2006/12/14(木) 19:39   No:2771     
Title: Re:複素数    
入力した2点から角度さえ求めたらいいんですか?
でしたらatan2ですぐ出来るんじゃないでしょうか。
実現しようとさせていることが違ったらごめんなさい。


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

Name: 管理人 [URL]  ..ハッカー(128,589ポイント)   Date: 2006/12/14(木) 19:52   No:2772     
Title: Re:複素数    
↑クリックで画像拡大↑

標準関数を使っていいということなんですが、めちゃそれだと簡単じゃないですか?

#include <stdio.h>

#include <math.h>
int main(void){
double x1=4.0,y1=1.0,x2=5.0,y2=3.0;
printf("%fラジアン\n",atan2(y2-y1,x2-x1));
return 0;
}


こういうことじゃなかったですか?(_ _||)


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

Name: mas  ..入門者(3,445ポイント)   Date: 2006/12/14(木) 20:26   No:2773     
Title: Re:複素数    
昨日レスしようと思ってたのに忘れてました。

> 管理人さん
atan2は私も考えてましたけど、どうですかね。
おそらくatan(やacos,asin)を使ってatan2相当の関数を自前で実装するという課題かと予想しているのですが。

> キリコさん
atanを使った方法は上で挙げてるのものを少し改良するだけなので、
もしわからないのなら、どこがわからないのかを教えてください。


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

Name: 管理人 [URL]  ..ハッカー(128,535ポイント)   Date: 2006/12/14(木) 22:42   No:2780     
Title: Re:複素数    
なるほど、2は使ってはいけないのですね m(_ _)m

http://www.adobe.com/jp/support/flash/ts/documents/fl0189.html


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

Name: キリコ  ..かけだし(1,006ポイント)   Date: 2006/12/17(日) 12:42   No:2882     
Title: Re:複素数    
atan2(y,x)と動作が同じになるか検討するのが、その次の問題でした。masさん、管理人さん、私の説明不足で申し訳ないです。
今は、とりあえず前にmasさんが場合わけした例を使って、作ってみています。


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

Name: キリコ  ..かけだし(1,012ポイント)   Date: 2006/12/20(水) 22:45   No:3029     
Title: Re:複素数    
{double z,f; z=atan(y/x);
if(z >0) { if(x >0) return (z);
if(x < 0) z=z + pi; return (z); }
if(z < 0) { if(x > 0) f= pi*2; z=z + f; return (z);
if(x < 0) z=z + pi; return (z); }
if(z ==0) { if(x >0) return (0);
if(x < 0) return (pi); }
if(x == 0){ if(y>0) return (pi/2);
if(y<0) return (pi*3)/2; } }
としたのですが、どうも270度のときが二分の3πがでません。この場わけであっているでしょうか?どなたか教えてください。お願いします。
そもそもこのプログラムでいいのでしょうか?


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

Name: 管理人 [URL]  ..ハッカー(147,679ポイント)   Date: 2006/12/20(水) 22:54   No:3031     
Title: Re:複素数    
ちょっとプログラムがごちゃごちゃしすぎて、どこに括弧がどこで閉じているかわからなくなっていませんか?
きちんと字下げしてみたほうがいいですよ。
間違いを減らすためにも。

前にも聞いたかもしれませんが、どうやって字下げしています?

{

{
double z,f; z=atan(y/x);
if(z >0) {
if(x >0)
return (z);

if(x < 0)
z=z + pi;

return (z);
}

if(z < 0) {
if(x > 0)
f= pi*2;

z=z + f;
return (z);

if(x < 0)
z=z + pi;

return (z);
}

if(z ==0) {
if(x >0)
return (0);

if(x < 0)
return (pi);
}

if(x == 0){
if(y>0)
return (pi/2);

if(y<0)
return (pi*3)/2;
}
}
return 0;
}


このように綺麗に書いて対応を確認してみてください。


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

Name: indent  ..ぴよぴよ(6ポイント)   Date: 2006/12/20(水) 23:09   No:3032     
Title: Re:複素数    
インデントは、gnu indent などを使うと、楽にチェック出来ますよ。
ただ、スタイルはいくつかのパタンに制限されるけど。


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

Name: キリコ  ..かけだし(1,209ポイント)   Date: 2006/12/20(水) 23:35   No:3035     
Title: Re:複素数    
if(y<0)
return (pi*3)/2;
のところだと思うのですが・・・πは定義しているのでいいと思います。x=0でy<0が270度にちゃんと対応しているとおもうのですが・・・。なぜ3π/2が出ないのか 

<管理人さん
< このように綺麗に書いて対応を確認してみてください。
おっしゃるとおり見にくいですね。今度から気をつけたいと思います。

<indent
<gnu indent
どう使うのかわかりませんが、がんばってみます。ありがとうございます。


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

Name: mas  ..入門者(3,488ポイント)   Date: 2006/12/21(木) 00:31   No:3037     
Title: Re:複素数    
x == 0 のときはy/xを計算してしまうとまずいので、atan(y/x)の前に条件分岐させましょう。
if(z < 0) のときの一つ目のreturn以降は実行されません。


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

Name: キリコ  ..かけだし(1,306ポイント)   Date: 2006/12/21(木) 01:16   No:3038     
Title: Re:複素数    
masさん返信ありがとうございます。
<atan(y/x)の前に条件分岐させましょう。
なるほど。ありがとうございます。

<if(z < 0) のときの一つ目のreturn以降は実行されません。
どうすればよいのでしょうか?


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

Name: 管理人 [URL]  ..ハッカー(148,257ポイント)   Date: 2006/12/21(木) 01:23   No:3039     
Title: Re:複素数    
return を行うと、そこ以降の処理は行われません。

インデントしたプログラムをみて、処理を確認してくださいと言うのは、その部分をみてほしかったのですが、
if文は括弧をつけないとその直後、;、までしか条件の処理が行われないことはご存知ですよね?
条件文による複数の処理を行いたい場合は括弧で囲む必要があります。


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

Name: キリコ  ..かけだし(1,506ポイント)   Date: 2006/12/21(木) 01:58   No:3042     
Title: Re:複素数    
管理人さんありがとうございます。
<ご存知ですよね?
実は知りませんでした。

つまりif(z < 0) のときのは

if(z < 0) {
if(x > 0){
f= pi*2;

z=z + f;
return (z);
}

if(x < 0){
z=z + pi;

return (z);
}
}


とやって初めの部分は
double z,f;

if(x == 0){
if(y>0)
return (pi/2);

if(y<0)
return (pi*3)/2;
}


         z=atan(y/x);


とやればいいでしょうか?


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

Name: キリコ  ..かけだし(1,560ポイント)   Date: 2006/12/21(木) 02:04   No:3044     
Title: Re:複素数    
字下げしているのですが、表示すると、上記のようになってしまうみたいなんですが・・・。Windowsだから?

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

Name: 管理人 [URL]  ..ハッカー(148,293ポイント)   Date: 2006/12/21(木) 02:21   No:3045     
Title: Re:複素数    
ウェブならどこの掲示板でもHPでも半角スペースやタブインデントは省略されてしまうんです。
これはHTMLの仕様なのだと思います。

半角スペースやタブインデントを有効にして表示したければ
<pre>と</pre>で囲んでやってください。

きれいに表示されます。ちなみに<>は半角で入力してください。
今半角で入力してしまうとそれ自体見えないタグになってしまうので全角で書いています。

括弧の対応についてはそれで大丈夫だと思います。


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

Name: キリコ  ..かけだし(1,583ポイント)   Date: 2006/12/21(木) 02:30   No:3047     
Title: Re:複素数    
管理人さんいろいろとありがとうございます。


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

Name: 管理人 [URL]  ..ハッカー(149,928ポイント)   Date: 2006/12/21(木) 05:01   No:3059     
Title: Re:複素数    
またお気軽にお聞きくださいませ☆

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



Name: サト  ..ぴよぴよ(17ポイント)   Date: 2006/12/18(月) 17:52   No:2910       
Title: エクセルで出力    
画像データをエクセルで出力したいのですがわかりません。
どなたか教えて頂けないでしょうか??
よろしくお願いします。


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


Name: 管理人 [URL]  ..ハッカー(136,288ポイント)   Date: 2006/12/18(月) 20:34   No:2912     
Title: Re:エクセルで出力    
画像データに限らず、printfで出力した出力先をcsvファイルにすればいいんですよ。

たとえば

#include <stdio.h>

#include <stdlib.h>
int main(){

printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());
printf("%d\n",rand());

return 0;
}


こんなプログラムがあるとして、実行ファイルがtest.exeだとします。

コンソール画面で

C:\test > test.csv

とすればいいんです。つまり実行ファイル名を書いて、その次に > ○○.csvとかけばいいですよ。


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

Name: 管理人 [URL]  ..ハッカー(136,416ポイント)   Date: 2006/12/18(月) 20:39   No:2914     
Title: Re:エクセルで出力    
ちなみに「,」で区切ると行で出力できます。

#include <stdio.h>

#include <stdlib.h>
int main(){

printf("%d,",rand());
printf("%d,",rand());
printf("%d,",rand());
printf("%d,",rand());
printf("%d\n",rand());

return 0;
}


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

Name: サト  ..ぴよぴよ(42ポイント)   Date: 2006/12/20(水) 16:08   No:3015 解決!     
Title: Re:エクセルで出力    
ありがとうございます。
早速取り掛かります。


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

Name: 管理人 [URL]  ..ハッカー(146,802ポイント)   Date: 2006/12/20(水) 21:24   No:3024     
Title: Re:エクセルで出力    
printfは何行にもわたって書いていますが、特に意味はなく、見やすいようにしたものなんで
1行に全部かかれても大丈夫です。
「\n」が列の区切り、「,」が行の区切りです。


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



Name: 美田月  ..ぴよぴよ(36ポイント)   Date: 2006/12/20(水) 17:29   No:3016       
Title: 問題    
C言語で1+1=2 1+2=3 ・・・
と答えが、100になるまでの計算をしてくれるプログラムがほしいです


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


Name: 管理人 [URL]  ..ハッカー(145,983ポイント)   Date: 2006/12/20(水) 21:07   No:3020     
Title: Re:問題    
>ほしいです

では、作ってください。としかいいようがありません。

厳しいことを言うようですが、誰かに何かを作ってもらう場ではありません。

何かわからない事がある時、その解決をすることを趣旨にしたサイトを作っているつもりです。

キツイ事を言っているようですが、こういう書き込みは、ホントにいろんな場で自分が損することが多いですので是非改めていただきたいです。美田月さんの為に。

困っている問題解決のお手伝いなら精一杯させてもらいますし、みんなも手助けしてくれるはずです。

気を悪くしてしまって言葉が響かなかったのなら意味がないですが、少し考えてみてください。


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



Name: empty  ..ぴよぴよ(89ポイント)   Date: 2006/12/20(水) 12:23   No:3003       
Title: 乱数    
はじめまして。よろしくお願いします。

乱数をこの前習ったところです。
ランダムな数はrand()を呼べば出来ると思うんですけど、
1〜10のランダムな数はどうやればいいんでしょう?
今のままでは大きな数も表示されてしまうんです。

それとか1個飛びのランダムな数とか自由に作るテクとかあれば教えてください。


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


Name: バグ  ..上級者(16,079ポイント)   Date: 2006/12/20(水) 12:51   No:3004     
Title: Re:乱数    
こんにちは

1〜10の乱数の作り方です。

rand() % 10 + 1;

10で割った余りというのは必ず0〜9の範囲におさまりますよね?
それに1足してやれば、1〜10の数になる訳です。

1個飛びの乱数というのがイマイチよく分からないのですが、奇数か偶数かという事でしょうか?(^_^;)


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

Name: 管理人 [URL]  ..ハッカー(144,902ポイント)   Date: 2006/12/20(水) 13:15   No:3006     
Title: Re:乱数    
こんにちは^^

普段数学とかしていると「余り」って言葉とほとんど縁がないので親しみが無いかもしれませんが、
プログラムで乱数使ったり、時間変化する変数使ったりする時には
よく出てきます。

乱数の使い方はバグさんのおっしゃるとおりです。

例えば0から無限大へ増加するint型のカウンターの値があるとしますよね。
その変数を使って、10枚の画像をループして表示したい時とか、よくあるんですよ。

if(counter>10) counter=0;

else counter++;

とかけばいいでしょうけど、カウンターの値は他でも使うので、ここで操作できません。

そんな時、counter%10をすると0〜9の値が出せるんです。

・・・って余計な事ですね^^;

1個とびって言うのがバグさんのおっしゃる奇数偶数って事でしたら
0〜99の範囲で偶数を出すなら

(rand() % 100) * 2

ですし、奇数ならそれに+1すればOKです。

>自由に作るテクとかあれば教えてください。

テク・・・っていうか慣れじゃないでしょうか?

それか、数式に一度あらわしてみるとかいいかもしれません。

偶数ってよく2mとかってあらわしますよね。奇数は2m+1とか。

今回mの部分が(rand()%100)なわけです。

プログラムの中で、よりスマートに書くためにどうかこうか悩んだりすることはよくあります。

そんな時、ちっとも考えないで答えを見るより、自分で試行錯誤して見つけ出した答えの方がずっとよく定着しますので。

しっかり悩むことも重要だと思いますw


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

Name: バグ  ..上級者(16,125ポイント)   Date: 2006/12/20(水) 13:33   No:3009     
Title: Re:乱数    
>>管理人さん
偶数 = rand() % 50 * 2

奇数 = rand() % 50 * 2 + 1

ではないですか?


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

Name: 管理人 [URL]  ..ハッカー(145,157ポイント)   Date: 2006/12/20(水) 13:39   No:3010     
Title: Re:乱数    
はい、その通りです(_ _|||)

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

Name: Justy  ..熟練のプログラマー(48,571ポイント)   Date: 2006/12/20(水) 13:52   No:3011     
Title: Re:乱数    
 ついでなんで、もう1つの1〜10の乱数の作り方も。



// rand()を使って 0.0〜1.0未満の値に正規化するマクロ
#define Random() (double)(rand() * (1.0 / ((double)RAND_MAX + 1.0)))


 こんなマクロを定義しておいて、使うときに

Random() * N + 1
 とすると1〜Nになります。


 最初のマクロは rand()が返す整数の最大値が RAND_MAXであることを利用して、
rand() / (RAND_MAX+1)を行うことで0〜1未満の数を計算しています。
 後はその値を元に、10倍して1を足すことで1〜10を実現しています。



# 利点は rand()内部のアルゴリズムに起因する問題をある程度改善できること、 RAND_MAXの値にかかわらず、ある程度大きな数であってもそれなり乱数になる、ということです。
 欠点は計算に整数ではなく浮動小数点数型を利用するので、浮動小数点数の計算が遅いマシンでは多用できないことです。


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

Name: 管理人 [URL]  ..ハッカー(145,765ポイント)   Date: 2006/12/20(水) 14:21   No:3013     
Title: Re:乱数    
なるほど〜!下位ビットは使わないほうがいいっていいますもんね。

そういえば、マシンの高速化が進んでいる現在、ソートより、よりよい乱数を考えたほうが需要が多いかもしれませんねw


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



Name: けいすけ  ..かけだし(2,492ポイント)   Date: 2006/12/18(月) 00:45   No:2893       
Title: 毎度お世話になっています。今回は引数に関して。    
皆さんのアドバイスが本当に毎回助けになっています。
授業をまじめに聞いているつもりではいるのですが落ちこぼれてしまっっているのですが
皆様のおかげでどうにか理解して課題が提出できています。
改めて感謝しています。

さてまた質問なのですが。。。。。
関数の中に関数を入れて、その中での引数を受け渡すということの
やり方がいまいちわかりません。自分ではわかったつもりでいるのですが、
コンパイルできませんって出てしまいます^^;

一応自分で今日日曜日を使ってずっとやってたのですがやっぱりできません・・・・・泣

どこが違うのかヒントをいただければと思ってまたここに書き込んだ次第です。

もしよろしければアドバイスをして頂きたいです。よろしくお願いします。


#include <stdio.h>

#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
main()
{
char fi[50];
int i,j,t;
FILE *fp;
unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
unsigned char *bmp;
bmp=(unsigned char *)malloc(MS*MS*3);
for(i=0;i<MS*MS;i++)
{
bmp[i*3+0]=0;
bmp[i*3+1]=0;
bmp[i*3+2]=0;
}
printf("Input rotate angle : ");
scanf("%s",fi);
t=atoi(fi);
for(i=25;i<=174;i++)
{
for(j=25;j<=174;j++)
{
bmp[(j*MS+i)*3+0]=0;
bmp[(j*MS+i)*3+1]=0;
bmp[(j*MS+i)*3+2]=255;
}
}
void rotate(unsigned char *,int,int);
main()
{
unsigned char *bmp;
rotate(b,x1,y1);
}
void rotate(unsigned char *b,int x0,int y0)
{
int i,j,x,y,x1,y1;
double th,si,co;
unsigned char *a;
a=(unsigned char*)malloc(MS*MS*3);
th=t*PI/180;
so=sin(th);
co=cos(th);
for(i=0;i<MS*MS;i++)
{
a[i*3+0]=0;
a[i*3+0]=0;
a[i*3+0]=0;
}
for(i=0;i<MS;i++)
{
y=i-MS/2;
for(j=0;j<MS;j++)
{
x=j-MS/2;
x1=x*co+y*si+MS/2+0.5;
y1=-x*si+y*co+MS/2+0.5;
if(0<x1 || x1<MS)
{
if(0<y1 || y1<MS)
{
a[(i*MS+j)*3+0]=b[(y*MS+x)*3+0];
a[(i*MS+j)*3+1]=b[(y*MS+x)*3+1];
a[(i*MS+j)*3+2]=b[(y*MS+x)*3+2];
}
}
}
}
for(i=0;i=MS*MS*3)
{
b[i]=a[i];
}
free(a);
}
printf("Input file name : ");
scanf("%s",fi);
if((fp=fopen(fi,"wb"))==NULL)
{
printf(stderr,"Error : file open[%s].\n",fi);
exit(1);
}
fwrite(header,2,13,fp);
fwrite(bmp,1,200*200*3,fp);
fclose(fp);
}


  


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


Name: けいすけ  ..かけだし(2,498ポイント)   Date: 2006/12/18(月) 00:45   No:2894     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ヒント1

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

Name: けいすけ  ..かけだし(2,492ポイント)   Date: 2006/12/18(月) 00:46   No:2895     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ヒント2

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

Name: けいすけ  ..かけだし(2,499ポイント)   Date: 2006/12/18(月) 00:46   No:2896     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ヒント3

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

Name: Justy  ..熟練のプログラマー(45,499ポイント)   Date: 2006/12/18(月) 01:26   No:2898     
Title: Re:毎度お世話になっています。今回は引数に関して。    
 まずは関数の呼び出し方が間違っています。
 というか、何故か main関数が2つあったりしています。
 関数の中に関数は書けません。

 rotateの3つの引数のうち後ろ2つが謎です。
 ヒントでは2つしか引数がありません。

 下に今回のケースでのひな形を書いておきますので、あとは埋めてみて下さい。

#include <stdio.h> 

#include <stdlib.h>
#include <math.h>

#define MS 200

static void rotate(unsigned char *, int);

int main(void)
{
int t = 0;
char *bmp = bmp=(unsigned char *)malloc(MS*MS*3);
// **********
rotate(bmp, t);
// **********
return 0;
}

static void rotate(unsigned char *bmp, int t)
{
// **********
}


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

Name: 管理人 [URL]  ..ハッカー(135,327ポイント)   Date: 2006/12/18(月) 02:55   No:2901     
Title: Re:毎度お世話になっています。今回は引数に関して。    
お返事が遅れてしまってすみません。

>関数の中に関数を入れて、その中での引数を受け渡すということの やり方がいまいちわかりません。自分ではわかったつもりでいるのですが、

関数の中に関数は書けないです。関数の中で、ほかの関数を呼び出すんです。このプログラムを見てください。

1 #include <stdio.h>


2 void calc(int a){
3 printf("%d",a);
4 return ;
5 }

6 int main(void){
7 int x=2;
8 calc(x);
9 return 0;
10}


処理はメイン関数から始まります。
6
7
8
2
3
4
8(戻り)
9
このような順番で処理が行われます。
メイン関数で2が代入されたxはcalc関数へ渡されます。
渡された受け取りの変数名はaですからcalc関数ではaが2となります。
その後、return から返ってきて、main関数もreturnで終了します。

関数の作り方、処理の流れをもう一度おさらいしてみてください。


・main関数は1個しか書けません。
・関数の中に関数はかけません。
・main関数より下に関数を作るときはプロトタイプ宣言をすること


に注意してください。


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

Name: けいすけ  ..入門者(3,447ポイント)   Date: 2006/12/19(火) 02:26   No:2931     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ありがとうございました。アドバイスを元にまた作り直してみました。
しかしまだうまく動きません。またアドバイスをいただければと思いまして
ここに書き込みます。アドバイスよろしくお願いします。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
void rotate(unsigned char *,int);
main()
{
char fi[50];
int i,j,t;
FILE *fp;
unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
unsigned char *bmp;
bmp=(unsigned char *)malloc(MS*MS*3);
for(i=0;i<MS*MS;i++)
{
bmp[i*3+0]=0;
bmp[i*3+1]=0;
bmp[i*3+2]=0;
}
printf("Input rotate angle : ");
scanf("%s",fi);
t=atoi(fi);
for(i=25;i<=174;i++)
{
for(j=25;j<=174;j++)
{
bmp[(i*MS+j)*3+0]=0;
bmp[(i*MS+j)*3+1]=0;
bmp[(i*MS+j)*3+2]=255;
}
}
rotate(bmp,t);
return 0;
printf("Input file name : ");
scanf("%s",fi);
if((fp=fopen(fi,"wb"))==NULL)
{
printf(stderr,"Error : file open[%s].\n",fi);
exit(1);
}
fwrite(header,2,13,fp);
fwrite(bmp,1,200*200*3,fp);
fclose(fp);
}
void rotate(unsigned char *b,int t)
{
int i,j,x,y,x1,y1;
double th,si,co;
unsigned char *a;
a=(unsigned char *)malloc(MS*MS*3);
th=t*PI/180;
si=sin(th);
co=cos(th);
for(i=0;i<MS*MS;i++)
{
a[i*3+0]=0;
a[i*3+0]=0;
a[i*3+0]=0;
}
for(i=0;i<MS;i++)
{
y=i-MS/2;
for(j=0;j<MS;j++)
{
x=j-MS/2;
x1=x*co+y*si+MS/2+0.5;
y1=-x*si+y*co+MS/2+0.5;
if(0<x1 || x1<MS)
{
if(0<y1 || y1<MS)
{
a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
}
}
}
}
for(i=0;i<MS*MS*3;i++)
{
b[i]=a[i];
}
free(a);
return;
}


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

Name: Justy  ..熟練のプログラマー(47,187ポイント)   Date: 2006/12/19(火) 02:55   No:2932     
Title: Re:毎度お世話になっています。今回は引数に関して。    
 ぱっと目に付くマズイところ。

1 途中で終了。
 main()の途中で画像を回転させるために rotate()を呼ぶも、その直後に return 0が来てるので、そのまま main()が終了してしまい、その後の保存処理が行われていません。

2 コンパイルが通らない。
 printf(stderr,"Error : file open[%s].\n",fi);
 の行でコンパイルエラー。printfと fprintfの引数の違いを確認して下さい。

3 メモリへの不正なアクセス
 rotate()内で画像の入力元の画素をコピーするとき、コピーする条件が (0<x1 || x1<MS)(0<y1 || y1<MS) になっています。
 これではどんな値が来てもこの if文は真として評価されます。

 ここでは x1/x2が画像サイズの範囲内であることを確認したいので、|| ではなく && が正解です。
 さらに、x1 = 0や y1 = 0の時もコピーできるので

            if(0<=x1 && x1<MS && 0<=y1 && y1<MS)

{
a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
}

 として下さい。

3 背景の塗りが不足
 roate()内の最初の方で、画像の全体を背景色で塗りますが同じところを何度も塗りつぶしています。

    for(i=0;i<MS*MS;i++)

{
a[i*3+0]=0;
a[i*3+1]=0;
a[i*3+2]=0;
}


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

Name: けいすけ  ..初心者(5,187ポイント)   Date: 2006/12/20(水) 10:39   No:2994 解決!     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ありがとうございました。皆さんのアドバイスのおかげで、今回も
完成させることができました。

/* 11rotate.c (2006/12/13) */
/* 06d4101 渡部景介 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MS 200
#define PI 3.14159265358979
void rotate(unsigned char *,int);
main()
{
char fi[50];
int i,j,t;
FILE *fp;
unsigned short header[13]={0x4d42,54490,1,0,0,26,0,12,0,MS,MS,1,24};
unsigned char *bmp;
bmp=(unsigned char *)malloc(MS*MS*3);
for(i=0;i<MS*MS;i++)
{
bmp[i*3+0]=0;
bmp[i*3+1]=0;
bmp[i*3+2]=0;
}
printf("Input rotate angle : ");
scanf("%s",fi);
t=atoi(fi);
for(i=40;i<=159;i++)
{
for(j=40;j<=159;j++)
{
bmp[(i*MS+j)*3+0]=0;
bmp[(i*MS+j)*3+1]=255;
bmp[(i*MS+j)*3+2]=255;
}
}
rotate(bmp,t);
printf("Input file name : ");
scanf("%s",fi);
if((fp=fopen(fi,"wb"))==NULL)
{
printf(stderr,"Error : file open[%s].\n",fi);
exit(1);
}
fwrite(header,2,13,fp);
fwrite(bmp,1,200*200*3,fp);
fclose(fp);
return 0;
}
void rotate(unsigned char *b,int t)
{
int i,j,x,y,x1,y1;
double th,si,co;
unsigned char *a;
a=(unsigned char *)malloc(MS*MS*3);
th=t*PI/180;
si=sin(th);
co=cos(th);
for(i=0;i<MS*MS;i++)
{
a[i*3+0]=0;
a[i*3+1]=0;
a[i*3+2]=0;
}
for(i=0;i<MS;i++)
{
y=i-MS/2;
for(j=0;j<MS;j++)
{
x=j-MS/2;
x1=x*co+y*si+MS/2+0.5;
y1=-x*si+y*co+MS/2+0.5;
if(0<x1 && x1<MS)
{
if(0<y1 && y1<MS)
{
a[(i*MS+j)*3+0]=b[(y1*MS+x1)*3+0];
a[(i*MS+j)*3+1]=b[(y1*MS+x1)*3+1];
a[(i*MS+j)*3+2]=b[(y1*MS+x1)*3+2];
}
}
}
}
for(i=0;i<MS*MS*3;i++)
{
b[i]=a[i];
}
free(a);
return;
}


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

Name: 管理人 [URL]  ..ハッカー(144,797ポイント)   Date: 2006/12/20(水) 12:17   No:3002     
Title: Re:毎度お世話になっています。今回は引数に関して。    
ご苦労様です。
Justyさん、ありがとうございます。

投稿するときソースは<pre>と</pre>で囲むと綺麗に字下げが表示されますよ。

<>は小文字で書いてください。


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



Name: コロン  ..ぴよぴよ(309ポイント)   Date: 2006/12/19(火) 13:35   No:2948       
Title: 時刻表示について    
はじめまして。
今、現在の時刻を表示しようとプログラムを動かそうとしていました。
そこで、「 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。」と
「外部参照 1 が未解決です。」なエラーが出ます。
プログラムの内容は下に記します。

#include <stdio.h>
#include <time.h>
int main()
{
time_t now = time(NULL);
struct tm *pnow = localtime(&now);

printf("%2d,%2d,%2d %d:%d:%d\n",
pnow->tm_year+1900,
pnow->tm_mon + 1,
pnow->tm_mday,
pnow->tm_min,
pnow->tm_hour,
pnow->tm_sec);

return 0;
}
動作環境はVisual Stadio 2005 C++です。
どうかわかる人がいましたら教えてください。


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


Name: Yuki  ..ぴよぴよ(499ポイント)   Date: 2006/12/19(火) 13:41   No:2949     
Title: Re:時刻表示について    
当方にVisual Stadio 2005がないので、動作確認をしたわけではないのですが、

>プロジェクト・プロパティー [リンカー] - [詳細] - [エントリーポイント] = [wWinMainCRTStartup] に設定する

と回避できるそうです。

>MFC をサポートする非コンソール・アプリケーションをビルドすると、このリンクエラーが発生するそうです。

参考URL:
http://www.xlsoft.com/jp/products/intel/compilers/ccw/91/Release_Notes.htm

「未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。」
でググったらヒットしました。


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

Name: 管理人 [URL]  ..ハッカー(137,941ポイント)   Date: 2006/12/19(火) 13:48   No:2951     
Title: Re:時刻表示について    
http://www.xlsoft.com/jp/products/intel/compilers/ccw/91/Release_Notes.htm

この辺にそれっぽいことが書いてあります。

たいていエラーがあると、そのキーワードを検索すれば解決しますよ。

http://www.google.co.jp/search?hl=ja&q=_WinMain@16+%E3%81%8C%E9%96%A2%E6%95%B0+___tmainCRTStartup+%E3%81%A7%E5%8F%82%E7%85%A7%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F&lr=


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

Name: 管理人 [URL]  ..ハッカー(137,957ポイント)   Date: 2006/12/19(火) 13:49   No:2952     
Title: Re:時刻表示について    
う、同じ回答すみません^^;



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

Name: コロン  ..ぴよぴよ(493ポイント)   Date: 2006/12/20(水) 11:33   No:2996     
Title: Re:時刻表示について    
Yukiさん、管理人さん、ご返答ありがとうございます。

>プロジェクト・プロパティー [リンカー] - [詳細] - [エントリーポイント] = [wWinMainCRTStartup] に設定する

親切なご回答ありがとうございました。なんとか実行することができました。

管理人さん
>たいていエラーがあると、そのキーワードを検索すれば解決しますよ。

そぉだったんですか!?エラーを検索のキーワードにするなんて…勉強になります。

Yukiさん、管理人さん、ご協力してください本当にありがとうございました。


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

Name: コロン  ..ぴよぴよ(527ポイント)   Date: 2006/12/20(水) 11:35   No:2997 解決!     
Title: Re:時刻表示について    
すみません。

マークを解決にしていませんでした…



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

Name: 管理人 [URL]  ..ハッカー(144,734ポイント)   Date: 2006/12/20(水) 12:16   No:3001     
Title: Re:時刻表示について    
>そぉだったんですか!?エラーを検索のキーワードにするなんて…勉強になります。

そうなんですよね。ドツボにはまってしまったとき自力でどれだけ抜け出せるかもまたその人のスキルだと思うので、試行錯誤することは、決して無駄じゃないはずです。

頑張ってください^^


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



Name: meigin  ..入門者(3,144ポイント)   Date: 2006/12/15(金) 15:44   No:2821       
Title: 計算    
こんにちは。

ファイルから読み込んで、命令を実行するというものを作りたいですね。

計算式をどうやって再現すればいいのか解らなくて困っているんです。

1+1とかなら簡単に解りますが、1+1*2*(1+4)のような
括弧や掛け算の優先順位とかがあると複雑になります。

・1行単位で扱っている。
・命令 > 変数名 > コメントの順に識別している。
・区切りは 半角空白とコンマだけ
・変数名の次は、数値又は文字列となっている。
・今の所は変数に代入しかできない。
・同じ変数名で型が違っても代入が可能。
・命令の引数は、変数かそのまま利用するのか、エラーかしか判別しない。
・コメントは区切りのない文字列及び数値の事です。
・命令や変数名の前にコメントを書くと変数扱いされてしまう。(意図しない結果になる)
・左上から右下へ順番通りに進む。
・変数名は日本語、英文字どちらでも良い(数値のみでも可能 しかし作動は不明)

現状はこんな感じです。

これ自体のソースは短いんですけど、
多重継承していて大量のファイルになってしまうんですよ。


簡単に考えるなら命令を作くれば良いだけですけど…。
計算式の方が見栄えが良いし分かり易いですよね。

考え方を教えて下さると嬉しいです。


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


Name: box  ..上級者(21,869ポイント)   Date: 2006/12/15(金) 16:27   No:2822     
Title: Re:計算    
四則演算の優先順位を満たし、カッコによる優先順位の変更に対応するには、
「数式の木(演算木ともいう)」について考える必要がありそうです。
例題として挙げられた1+1*2*(1+4)という式から数式の木を構築すると


/ \
1 *
/ \
* +
/ \ / \
1 2 1 4

という結果を得ます。
この木を「帰りがけ順」で走査すると、

1 1 2 * 1 4 + * +

となります。この書き方を「逆ポーランド記法」と呼び、
コンピュータで扱いやすくなります(「スタック」というデータ構造とマッチしている)。
また、逆ポーランド記法は数式を日本語読みすることと相性がよいです。
今回の例は
1に「1に2を掛けたものに、1に4を足したものを掛けたもの」を足す
と読めます。

任意の数式から、その数式に対応する「数式の木」を構築できれば、
後はしめたものです。
ただ、その「数式の木」を構築することがなかなか難しそうです。

いくつかのキーワードをちりばめました。
これらをもとに調べてみてはいかがでしょうか。

行ないたいこととずれている、もしくはすでにご存じの内容でしたら、
きれいさっぱり読み捨ててください。


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

Name: meigin  ..入門者(3,384ポイント)   Date: 2006/12/15(金) 23:48   No:2831     
Title: Re:計算    
boxさん ありがとう御座います。

条件分岐が難しくて、思案中です。

数値の次は演算子、
演算子が来たら数値を左へ

演算子に数値が来れば、
数値を右へ

演算子に演算子が来れば???
同等なら左へ

上位なら右へ

と思ったのですが。(合っているのか解らない)

ポインタがゴチャゴチャして木自体の構築がいまいち解らないんですね。

データーとポインタを2つ持ったクラスにどんどんnewで繋いで行くんですが……。
こんがらがってしまって、上手く繋げられないのです。

今は試行錯誤中です。


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

Name: box  ..上級者(22,112ポイント)   Date: 2006/12/16(土) 00:23   No:2832     
Title: Re:計算    
こちらでも調べてみました。
すると、普通の計算式→数式の木→逆ポーランド記法→計算
という手順の他に、数式の木を構築せずに
普通の計算式→逆ポーランド記法に変換しながら計算
という方法があることがわかりました。

計算用と演算子用の2種類のスタックを用意することと、
演算子に優先順位を設けることがポイントのようです。

混乱させてすみません。


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

Name: box  ..上級者(22,352ポイント)   Date: 2006/12/16(土) 00:47   No:2836     
Title: Re:計算    
開きカッコと閉じカッコの優先順位をどのように決めるか
(四則演算子の優先順位との関係をどうするか)がキモのようです。


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

Name: meigin  ..入門者(3,633ポイント)   Date: 2006/12/16(土) 01:25   No:2837     
Title: Re:計算    
boxさん

変換しながら計算ですか……。

2番目の演算子が同じ優先順もしくは下位なら前の2つを計算するで合っているのかな?


管理人さん

括弧の演算は一応考えてあります。

まず始めに、括弧を検索して対応しているか調べます。
中身だけ計算して一時的な変数に保持します。

そういう理由で括弧が最優先になります。
中身の優先順位だけ気にすればいいわけですね。



木の構造がいまいち解ってないので、
メモリリークという悲惨な結果しかできませんでした。
情けない。


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

Name: Justy  ..熟練のプログラマー(43,656ポイント)   Date: 2006/12/16(土) 03:10   No:2838     
Title: Re:計算    
ファイルから読み込んで、命令を実行するというものを作りたい
 このあたりは 2003年1月号のCマガの記事「コンパイラの作成」を読むとわかりやすいと思います。
 21ページに渡って解説があり、CDの中にサンプルもありました。

 逆ポーランドだけならそこらに売っているアルゴリズム書にも載ってる気がします。
 定番ですから。

 あとあんましテストしていませんが、()付きの逆ポーランド化&計算のサンプルです。
 やっつけなのであまり綺麗じゃないですが、参考にどうぞ。


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

Name: ま〜く  ..ぴよぴよ(290ポイント)   Date: 2006/12/16(土) 09:06   No:2841     
Title: Re:計算    
書籍ならドラゴンブックと呼ばれているコンパイラの本がありますね。(名前忘れました^^;)
これの最初の方に字句解析や構文木の作り方が書いてあって分かりやすいですよ。

以前遊びで作ったコードあるんですけどC++で作っちゃってるからだめですね^^;


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

Name: meigin  ..入門者(3,636ポイント)   Date: 2006/12/16(土) 14:16   No:2843     
Title: Re:計算    
Justyさん ありがとう御座います

想像以上に難しいですね。

符号と数字の識別は何処でやっているのか解らないのですが……。
簡単な事しか考えられないので思考が停止して頭から煙が。
色んな方法があるんですね。

うーん。


ま〜くさん
コンパイラですか……ハードルが高すぎて想像が付かないです。



取りあえず 木を作って 逆ポーランドにして 計算する
方法を取りました。

間違っていたら教えて下さい。
改善したら早くなるとか、別の方が良いとかありましたら
教えて下さると嬉しいです。


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

Name: Justy  ..熟練のプログラマー(44,036ポイント)   Date: 2006/12/16(土) 16:08   No:2845     
Title: Re:計算    
符号と数字の識別は何処でやっているのか解らないのですが
 is_opがオペレーションと数値を判別しています。
 isdigit()で数値であることを認識したら node構造体の is_opを偽にしています。
 それ以外で且つ ')'でなければ is_opを真にしています。


改善したら早くなるとか、別の方が良いとかありましたら
 本題からは少々外れてしまいますが、幾つか聞かせて下さい。

・ クラス Train/TrainExなどは STLの list/stackに置き換えられると思うのですが、使わない理由は何かあるのでしょうか。

・ これは課題とか学習目的のものでしょうか。それともゲームとかを製作していて、この手のスクリプトを実装しようとしているのでしょうか。


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

Name: meigin  ..入門者(3,889ポイント)   Date: 2006/12/16(土) 21:36   No:2853     
Title: Re:計算    
Justyさん

考えることは誰でも一緒ですね。
符号か数値かのフラグだったんですね。
木の右、左の類かと思っていました。


リストを作ったので、苦労した時間を大切にしたいので利用しているだけです。
STLを使わない理由は特にないですが、
無料のVC++2005にはSTLが無かったような記憶があるのでその名残です。


知っていれば応用の幅が広がるという面では学習目的です。
ゲームを作りたいと言うのが本音です。

単にスクリプトの機能をつけるのであれば、そう言ったものを利用すれば良いだけのことです。
即戦力にはなりますが、己の力とはなりません。

知識がないと出来なかったり、想像が付かないんですよ。
これをどうやって再現しているんだろうかとか
気になってたけど、失敗して出来ない。
それでも諦められないと言う執着心があって、
目標となっているわけです。

ゲーム制作はその過程も楽しまなければ良いものは出来ないと思っています。
知識を増やすというのは私にとって喜びなのです。
出来なかったことが出来た時も凄く嬉しいのです。


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

Name: Justy  ..熟練のプログラマー(44,616ポイント)   Date: 2006/12/16(土) 23:18   No:2868     
Title: Re:計算    
@meiginさん
木の右、左の類かと思っていました
 私のサンプルでは明示的に木の概念は出てこないので、右も左もなかったりします。


リストを作ったので、苦労した時間を大切にしたいので利用しているだけです
 なるほど、わかりました。


無料のVC++2005にはSTLが無かったような記憶があるのでその名残です。
 たしかあったはずでず。
 無いのは Windows専用のライブラリである MFC/ATLとかです。
さすがに C++を謳ったコンパイラで STLがないってのは・・・。


知っていれば応用の幅が広がるという面では学習目的です。
 なるほど。だとしたら出来合いのものは使わない方がいいですね。


それでも諦められないと言う執着心があって、目標となっているわけです
 これは重要であり、素晴らしいことだと思います。


出来なかったことが出来た時も凄く嬉しいのです
 とてもよくわかります。


間違っていたら教えて下さい。
 コンパイルが通らない(SetLeftNest()/SetRightNest()内に変数 nがない)というのはありますが、それを除いてもいろいろと挙動が変です。
 ツリーの左と右に分けようとしているのはわかるのですが、SetRightNest()などで mIndex->mpRightとかに既に別の要素が入っているのに newして上書きしたりしているので、前にセットした情報が消えてしまったりしています。

 このソースから手を入れるのはちょっと時間がかかりそうだったので、先のサンプルと meiginさんが添付されたものを融合した物を作ってみました。
 逆ポーランド化されていく仮定が順次表示されるようになっています。


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

Name: meigin  ..入門者(4,014ポイント)   Date: 2006/12/17(日) 00:40   No:2873     
Title: Re:計算    
Justyさん

凄い…。

ありがとう御座います。

整理した方が良いかなと思って、コピペして関数にしました。
voidではなくてconst strItem &nとしなければいけませんね。

たまたま、計算通りの結果が出ただけだったんですね。
テキストから読み込んで試したらスタックエラーで止まってしまいました。
考えが甘まかったです。


初めて見る書き方とか勉強になります。
理解するのに時間が掛かりそうです。


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

Name: Justy  ..熟練のプログラマー(44,959ポイント)   Date: 2006/12/17(日) 02:37   No:2876     
Title: Re:計算    
ありがとう御座います
 まだこれでも完全版ではなかったりします。
 -3とかの数値がこのままでは扱えません。
 更にコメントスキップ、変数対応、代入処理、比較と加えないといけない処理はまだまだありそうです。
 ともあれ、参考になれば幸いです。


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

Name: Justy  ..熟練のプログラマー(45,747ポイント)   Date: 2006/12/17(日) 06:40   No:2880     
Title: Re:計算    
-3とかの数値がこのままでは扱えません
 なんかプログラマとして負けた気分になってきたので、なんとなく完全対応してみました。

 今回は中身をがらっと変えて、BNF式から書き起こしてみました。
factor      ::= integer | '(' expression ')' | '+' factor | '-' factor

term2 ::= factor (('^' factor))*
term1 ::= term2 (('*' term2) | ('/' term2))*
expression ::= term1 (('+' term1) | ('-' term1))*

 expressionが解析開始で、" "(空白)はそれに続く、という意味で、
"|"はまたは、*はその前が0回以上繰り返す、という意味です。

 で、この式に当てはめてそのままプログラミングしたのがこの添付のソースです。
 今回はループではなく再帰で、且つ計算可能ならその場で計算していきます。
 ClTest_ki::parse_op()が計算の実行テンプレート関数で、実行内容を関数オブジェクトで指定します。

 この延長線上で考えていけば、比較・評価もやりやすいかもしれません。
 例えば、
expression2 ::= expression !(compare_op expression)

compare_op ::= "==" | "!=" | "<" | ">" | ">=" | "<";

な感じで。


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

Name: meigin  ..入門者(4,182ポイント)   Date: 2006/12/17(日) 10:58   No:2881     
Title: Re:計算    
Justyさん

朝早くからありがとう御座います。

試しに%を追加してみたら、エラー……。
ダブルはダメなんですね。
イントにすると成功しました。

これから比較とかのを頑張って追加しようと思います。


数値でも演算子でもないものは、命令、変数、不明な文字のいずれかになるわけですね。
parse_integerを改造すれば、変数に対応出来そうですね。

再帰は流れが見やすくて良いですね。


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

Name: meigin  ..入門者(4,117ポイント)   Date: 2006/12/17(日) 15:04   No:2886     
Title: Re:計算    
Justyさん

色々と勉強になります。

比較、!が追加出来ました。

間違っているのか不安なので添付しておきますね。


最終的にはこちらを使おうと思いますが、
失敗したものをほって前に進めないのでまともに動くように直そうと思っています。


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

Name: Justy  ..熟練のプログラマー(45,175ポイント)   Date: 2006/12/17(日) 16:05   No:2887     
Title: Re:計算    
試しに%を追加してみたら、エラー……
 std::modulus<>の実装はほんとに "%"演算子を使ってるだけですからね・・・。
 代わりに 自作の関数オブジェクトを作って double型で %演算子と同じ動きをするのを作れば、対応はできるはずです。


parse_integerを改造すれば、変数に対応出来そうですね
 はい、そうですね。
 integerの中で対応してもいいですし、別関数にしてもいいですが、そのあたりを修正すれば変数にも対応できます。


比較、!が追加出来ました
 お見事です!
 いくつか試しましたが、問題ないようです。


失敗したものをほって前に進めないのでまともに動くように直そうと思っています
 そうですね。
 頑張って下さい。


# 自分のコードを改めて見直して。
・parse_factor()の変数 sign_negは使われていないので不要でした。
・power_functor()自体がテンプレートになっていますが、doubleしか扱わないので
double専用の関数にしてしまった方がいいかもしれません。


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

Name: meigin  ..入門者(4,415ポイント)   Date: 2006/12/18(月) 23:20   No:2926     
Title: Re:計算    
Justyさん

ありがとう御座います。

ダブル専用でも問題ないですね。
イントにすると大問題でわり算の結果が変わってしまいますね。
%は使い道が無いので非推薦にしておきます。



試行錯誤の末に出来ました。
図に書いたとおりにプログラムを組んだら全く上手く行かず。
その図が間違っていたみたいで、並び替えの末に完成しました。
なんでそれが正しく動くのか解らないんですよ。

まず足し算から初めて、掛け算を加え、()に対応。


又間違っていたら大変だなと思いつつ添付しておきます。

変なのが入っていますが、test.cppがメインです。
実行するとテキストファイルを読み込んで計算します。
今の状態だと並び替えた数値や演算子が表示されます。

()は木に入れないんですね。
上に登る三つ又になっています。

ファイル読み込みのクラスは継承を外したのでぐちゃぐちゃになってしまいました。
これは関係ないものですので無視して下さい。


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

Name: Justy  ..熟練のプログラマー(46,544ポイント)   Date: 2006/12/18(月) 23:58   No:2927     
Title: Re:計算    
間違っていたら大変だなと思いつつ添付しておきます

 うーん、サンプルでついていたスクリプトは正しく計算できているようでしたが、

  1 + (2 - 3) * 4
 とか
  1 + (2 - 3) * (4 - 5)

 を計算すると間違った結果(それぞれ -9、6)が出ますね。
 ()があるとおかしくなるようです。


 それから

   1 + 2 - 3* 4
 のように 3と *の間に空白がない場合、4の数字の認識に失敗して演算結果が0になってしまっています。


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

Name: Justy  ..熟練のプログラマー(47,016ポイント)   Date: 2006/12/19(火) 00:50   No:2928     
Title: Re:計算    
 今回のプログラムでは影響はないとは思いますが、St.hの TrainExはいくつか問題を抱えているようです。
#include <iostream>

#include <crtdbg.h>
#include "St.h"

namespace {
void disp_trainex_container(St::TrainEx<int> &c){
using namespace std;
cout << "te : ";
for(int n = 0; n < c.Size(); ++n)
cout << c[n] << " ";
cout << endl;
}
}


int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF); // メモリリークのチェック
{
St::TrainEx<int> te1, te2;
for(int n=0; n<8; ++n)
te1.Push(n);
disp_trainex_container(te1); // 0〜7が順に表示される

te1.Swep(2, 5);
disp_trainex_container(te1); //! 7が2つある!

te1.Pop(1);
disp_trainex_container(te1); //! 数値が変わった?

te2 = te1;
} //! 落ちる
return 0; //! リークする
}


 //! の部分で挙動が想定(?)と違う挙動をするようです。


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

Name: meigin  ..入門者(4,426ポイント)   Date: 2006/12/19(火) 10:26   No:2935     
Title: Re:計算    
Justyさん

毎度毎度、申し訳ないです。

TrainExは、たびたび意図しない結果を出すのでその都度修正を行っています。

エラーの原因は、デストラクタで解放しているのでそれで発生していました。
同じアドレスになって、コピーではなく全く同じものを指していました。
te1を変更するとte2の値も変化してしまいます。

=を設定しましたのでエラーは無くなったと思います。

入れ替えは元となったクラスにそう書いてあったので信用してそのままにしていました。
一度もその関数を使わなかったので解りませんでした。
中身だけを入れ替えるように直しました。

読み込み管理は色々と問題があるので作り直す予定です。
計算は繋がっていても出来るようにしました。
その他は必ず半角空白かコンマが必要です。
なので = は半角空白で間を空けて下さい。

三度目の正直になって欲しいです。

色々とご指摘、助かります。


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

Name: Justy  ..熟練のプログラマー(47,425ポイント)   Date: 2006/12/19(火) 16:58   No:2964     
Title: Re:計算    
@meiginさん
TrainExは、たびたび意図しない結果を出すのでその都度修正
 先に TrainExなどのコンテナの完成度をある程度上げておいた方がいいかもしれません。
 そうしておけば、使っていて問題がおきたときに TrainEx側には問題ない、と確信できると思います。


=を設定しましたので
 代入オペレータを定義したのならついでに
・ 同じ変数同士の代入(a=a)への対応
・ *thisの 参照を戻す(a=b=cができるように)
・ コピーコンストラクタを定義

 もしておくといいと思います。
 結構 C++って奥が深く、面倒なんですよね・・・。


計算は繋がっていても出来るようにしました
 少し試してみました。かなり良い感じですね。
 ちゃんと変数も認識していますし、あとは負の数への対応くらいでしょうか。
 何にしても後少しです。頑張って下さい。


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

Name: meigin  ..入門者(4,573ポイント)   Date: 2006/12/19(火) 22:53   No:2980 解決!     
Title: Re:計算    
Justyさん

a = b = c
とか知りませんでした。
勉強になります。

負の数の対応も出来ました。
変数に符号は未対応です。
文字変数もあるので禁止にしていた方が何かと都合が良さそうなので。

これで完成形です。

これは不採用なんですけど。
木を組み立ててから計算しているので無駄が多いと思うので。

色々とありがとう御座います。


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



Name:  ..入門者(3,339ポイント)   Date: 2006/12/18(月) 20:38   No:2913       
Title: 文字列ソート    
いつも、お世話になっています。
本日もよろしくおねがいします。

問題:
ユーザに入力されるa~zまでの文字を含む文字列をアルファベット順に並べ替えるプログラムを作成せよ.

っというものです。

実行例:
kjgdruosdshnkl
ddghjkklnorssu

です。

私が作ったプログラムは、こんな感じです。
すっごく頑張りました^^;

#include <stdio.h>

#include <string.h>
#define n 8

void s_quick_sort(char *ss[],int top,int end){
char *key,*wk;
int i,j;

key=ss[(top+end)/2];
i=top-1;
j=end+1;
while(1){
while(strcmp(ss[++i],key)<0);
while(strcmp(ss[--j],key)>0);
if(i>=j)
break;
wk=ss[i];
ss[i]=ss[j];
ss[j]=wk;
}
if(top<i-1)
s_quick_sort(ss,top,i-1);/*左半分をクイックソート*/
if(j+1<end)
s_quick_sort(ss,j+1,end);/*右半分をクイックソート*/
}

int main(void){
int i;
char st[n][10]=("eee","bbb","ggg","fff","hhh","ccc","aaa","ddd");
char *p[n];

for(i=0;i<n;i++){
p[i]=st[i];
}

s_quick_sort(p,0,n-1);
for(i=0;i<n;i++){
printf("%s",p[i]);
}
return 0;
}


ちょっと、というかだいぶ違うのかなぁー。。
どーすればいいでしょうか??
教えてください。


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


Name: 管理人 [URL]  ..ハッカー(136,543ポイント)   Date: 2006/12/18(月) 20:45   No:2915     
Title: Re:文字列ソート    
こんにちは。頑張っていらっしゃいますね。

とりあえずぱっと見おかしいのが

char st[n][10]=("eee","bbb","ggg","fff","hhh","ccc","aaa","ddd");

ここで
正しくは

char st[n][10]={"eee","bbb","ggg","fff","hhh","ccc","aaa","ddd"};

です。

字下げが少しおかしいみたいですけど、エディタ何をお使いですか?
タブインデントを使うと綺麗にそろいますよ。

どこで躓いていらっしゃいますか?


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

Name: 管理人 [URL]  ..ハッカー(136,934ポイント)   Date: 2006/12/18(月) 20:59   No:2916     
Title: Re:文字列ソート    
2次元配列を使う必要ありませんよね?

答えを書いてしまうとこうなると思います。

#include <stdio.h>

#include <string.h>
#define n 256

void change(int i,int j, char x[ ]){//配列要素i番目とj番目の値を入れ替える
char t;
t=x[i] , x[i]=x[j] , x[j]=t;
}

void sort(int l, int r, char x[ ]){//lを一番左端の配列要素、rを一番右端の要素としてソートする。
int i,j;
char p;

i=l;j=r;
p=x[(l+r)/2];//ピボットの決定

while(1) {
while(x[i]<p)//左からピボット以上を探索
i++;
while(p<x[j])//右からピボット以下を探索
j--;
if(i>=j)//探索地点がぶつかったら終了
break;

change(i,j,x);//お互い発見した値をいれかえる
i++;
j--;
}
if(l<i-1)//左範囲が分割可能なら
sort(l,i-1,x);//左範囲を分割してソートを行う
if(j+1<r)//右範囲が分割可能なら
sort(j+1,r,x);//右範囲を分割してソートを行う
}

int main(void){
char p[n];

scanf("%s",p);

sort(0,strlen(p)-1,p);

printf("%s",p);

return 0;
}


http://dixq.net/sort.html

ここで紹介しているソースをそのまま使いました。

文字列の最後には\0がはいっていて、これはソートしてしまってはいけないので

strlenで取得した数字-1を渡しています。

どこか解らなかったら聞いてください。


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

Name: box  ..上級者(22,667ポイント)   Date: 2006/12/18(月) 21:29   No:2917     
Title: Re:文字列ソート    
> 文字列の最後には\0がはいっていて、これはソートしてしまってはいけないので
>
> strlenで取得した数字-1を渡しています。

strlen関数で取得する文字列長には、もともと終端の'\0'の分を含みません。
'\0'を含めてソートしてはいけないから-1した数値を渡しているのではなく、
長さnの文字列の場合、[0]〜[n-1]の要素に値が入っているから
sort関数の第1引数が0、第2引数がn-1なのです。
sort関数のコメントに
「lを一番左端の配列要素、rを一番右端の要素としてソートする。」と
書いているとおりです。


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

Name:  ..入門者(3,448ポイント)   Date: 2006/12/18(月) 21:36   No:2918     
Title: Re:文字列ソート    
素早い、返事ありがとうございます。

本当に頑張りました(笑)
お褒めのことば、ありがとうございます。

えっと。。。パソコンにLINUXが入ってるんで、自分で、打ってるんですけど・・・
見にくかったですよね??
見やすい、プログラミングの書きかたって難しいです><

boxさんも、ありがとうございます。
今から、頑張って理解します。
また、質問にきます。
そのときは、また、よろしくおねがいします。


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

Name: フリオ  ..ぴよぴよ(143ポイント)   Date: 2006/12/18(月) 21:39   No:2919     
Title: Re:文字列ソート    
 
 この場合は、
英文字それぞれの数を数えてその数づつアルファベット順に表示すればいい
ので、クィックソートを使うまでも無いです。


#include <stdio.h>
#include <ctype.h>

int main(void)
{
char *chars = "abcdefghijklmnopqrstuvwxyz";
int c, c_count[256] = {0,};

while((c = getchar()) != '\n') c_count[tolower(c)] ++;
for( ; *chars != '\0'; chars ++){
for( ; c_count[*chars] > 0; c_count[*chars] --){
putchar(*chars);
}
}
return 0;
}

 


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

Name: 管理人 [URL]  ..ハッカー(136,955ポイント)   Date: 2006/12/18(月) 21:42   No:2920     
Title: Re:文字列ソート    
boxさんのおっしゃるとおりです・・(_ _||)


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

Name: 管理人 [URL]  ..ハッカー(137,046ポイント)   Date: 2006/12/18(月) 21:56   No:2922     
Title: Re:文字列ソート    
>えっと。。。パソコンにLINUXが入ってるんで、自分で、打ってるんですけど・・・


OSはWindowsとリナックスしか使ったこと無いのでよくわかりませんけど、
プログラムを書くエディタならタブキーを押すと大抵インデントされると思いますけど、
どうでしょう?


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

Name:  ..入門者(3,488ポイント)   Date: 2006/12/18(月) 22:27   No:2923     
Title: Re:文字列ソート    
そーなんですかぁ??
一応、tabでもきれいには、なるんですけどねぇ。。。


そんな簡単な方法もあるんですねぇー!!!!
びっくりです。


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

Name: 管理人 [URL]  ..ハッカー(137,099ポイント)   Date: 2006/12/18(月) 23:03   No:2924     
Title: Re:文字列ソート    
フリオさん、そんな方法があるとは・・。
簡単ですね。
ホントプログラムは考えようでどうとにもなりますねぇ。


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

Name:  ..入門者(3,598ポイント)   Date: 2006/12/19(火) 10:42   No:2936     
Title: Re:文字列ソート    
えっと。。。もう一個、問題なんですが・・・・
「ユーザによって数値が入力されるたびに,それまで入力された全ての数値を昇順にソートして表示するプログラムを作成せよ.」

っていう、教科書の問題なんですが、これは、「再帰的クイックソート」とかそういうものなんですか??


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

Name: box  ..上級者(22,881ポイント)   Date: 2006/12/19(火) 10:54   No:2937     
Title: Re:文字列ソート    
> っていう、教科書の問題なんですが、これは、「再帰的クイックソート」とかそういうものなんですか??

ソートのアルゴリズムは何種類もあります。
必ずクイックソートを使わねばならない、というわけではありません。

なお、クイックソートのアルゴリズムはもともと再帰的であるため、
「再帰的クイックソート」という言い方は通常しません。

「数値が入力されるたびに」とのことですが、入力する個数の上限は決まっていますか?
個数の上限(例えば10個)が決まっていれば、その分の配列を定義しておいて
・配列の各要素に入力する
・入力終了後、配列の要素をソートする
というプログラムを書くことになります。

個数の上限が決まっていなければ、配列を直接定義することはできません。
もしかすると100個の数値を入力するかもしれないのに、[10]という配列では
足りないからです。
この場合は、別の考え方が必要です。


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

Name:  ..入門者(3,656ポイント)   Date: 2006/12/19(火) 11:00   No:2938     
Title: Re:文字列ソート    
上限はきまっていません。

999が入力されたら、終了するものなんですが・・・
この場合は、どうすればいいんでしょうか??


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

Name: box  ..上級者(23,005ポイント)   Date: 2006/12/19(火) 11:11   No:2939     
Title: Re:文字列ソート    
> 上限はきまっていません。
>
> 999が入力されたら、終了するものなんですが・・・

ということは、999という入力終了の合図があるまでは、
千個でも二千個でも(あるいは、もっとたくさん)入力する可能性がある、
ということですね。

このような場合、パッと思いつくのは「リスト構造」を使った実装です。
「リスト構造」や「自己参照型構造体」という言葉を聞かれたことはありますか?


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

Name:  ..入門者(3,700ポイント)   Date: 2006/12/19(火) 11:14   No:2940     
Title: Re:文字列ソート    
そうですね★
999が押されるまで、ずっとプログラムが働きますよね。

>「リスト構造」や「自己参照型構造体」という言葉を聞かれたことはありますか?
いいえ。。まったく聞いたことありません^^;
教えてもらえますか???


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

Name: box  ..上級者(23,082ポイント)   Date: 2006/12/19(火) 11:43   No:2941     
Title: Re:文字列ソート    
リスト構造を理解するには、ポインタの知識が欠かせません。
ポインタについてある程度ご存じであるという前提で話を進めてよろしいですか?

もし、ポインタのことをあまりご存じでないとすると、
リスト構造よりも先に、ポインタについて勉強していただかねばなりません。


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

Name:  ..入門者(3,715ポイント)   Date: 2006/12/19(火) 11:44   No:2942     
Title: Re:文字列ソート    
はい★ポインタは、もう学習済みです。
おねがいします。


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

Name:  ..入門者(4,205ポイント)   Date: 2006/12/19(火) 12:52   No:2943     
Title: Re:文字列ソート    
えっと、調べて、自分なりに作って見ました★^^;

こんな感じです↓↓

#include<stdio.h>

struct node
{
int value;
struct node *next;
struct node *prev;
};

struct node head;

int main(void)
{
struct node *new, *p;
int n;

head.next = NULL;
head.prev = NULL;

while(1){

printf("数字を入力せよ(999で終了)");
scanf( "%d", &n);

if(n != 999){
new = (struct node*)malloc( sizeof( struct node ) );
if( new == NULL ){
printf( "error\n" );
return 1;
}

new -> value = n;
new -> prev = &head;
new -> next = head.next;
if (new -> next != NULL)
head.next -> prev = new;
head.next = new;
for(p = head.next; p != NULL; p = p -> next)
printf("%d ", p->value);
printf("\n");
}
else break;
}
return 0;

}

でも。。。実行結果が。。
数字を入力せよ(999で終了)24
24
数字を入力せよ(999で終了)15
15 24
数字を入力せよ(999で終了)28
28 15 24
数字を入力せよ(999で終了)11
11 28 15 24
数字を入力せよ(999で終了)999

おかしいんです。。
3回目からおかしいです。。
どこがダメなんでしょうか???


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

Name: box  ..上級者(23,459ポイント)   Date: 2006/12/19(火) 13:11   No:2944     
Title: Re:文字列ソート    
> えっと、調べて、自分なりに作って見ました★^^;

ありがとうございます。
調べていただけて助かります。

> struct node
> {
> int value;
> struct node *next;
> struct node *prev;
> };

構造体の定義についてですが、今回の問題では「前のデータへのポインタ」
つまりprevメンバーを特に持たなくてもよいかもしれません。
もちろん、リスト構造を逆順にたどる必要が将来出てくることを見越してのことならば、
prevメンバーを持っておく必要があります。

> でも。。。実行結果が。。

実行結果をよくごらんになってください。
3回目からおかしいというより、入力したのとは逆の順番に
表示していることがおわかりになると思います。

つまり、今のプログラムでは、最初に入力した24を最後に表示し、
最後に入力した11を最初に表示するようになっています。
理由は、リスト構造にデータを挿入する際、今は必ず先頭に
挿入するようになっているためです。ここを、
「リスト構造を順に見ていき、現在着目している場所に格納している
データが、今回挿入しようとしているデータより小さければ、
現在着目している場所の次に挿入する」という風に
修正すればよいはずです。


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

Name:  ..入門者(4,229ポイント)   Date: 2006/12/19(火) 13:17   No:2945     
Title: Re:文字列ソート    
なるほど!!!

forの二重ループとか使うんでしょうか??


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

Name: 管理人 [URL]  ..ハッカー(137,688ポイント)   Date: 2006/12/19(火) 13:23   No:2946     
Title: Re:文字列ソート    
たんにこんなんじゃダメなんでしょうか^^;

#include <stdio.h>

#include <string.h>
#define N 256

void change(int i,int j, int x[ ]){//配列要素i番目とj番目の値を入れ替える
int t;
t=x[i] , x[i]=x[j] , x[j]=t;
}

void sort(int l, int r, int x[ ]){//lを一番左端の配列要素、rを一番右端の要素としてソートする。
int i,j, p;

i=l;j=r;
p=x[(l+r)/2];//ピボットの決定

while(1) {
while(x[i]<p)//左からピボット以上を探索
i++;
while(p<x[j])//右からピボット以下を探索
j--;
if(i>=j)//探索地点がぶつかったら終了
break;

change(i,j,x);//お互い発見した値をいれかえる
i++;
j--;
}
if(l<i-1)//左範囲が分割可能なら
sort(l,i-1,x);//左範囲を分割してソートを行う
if(j+1<r)//右範囲が分割可能なら
sort(j+1,r,x);//右範囲を分割してソートを行う
}

void disp(int num,int p[]){
printf("現在のソート結果 ");
for(int i=0;i<=num;i++)
printf("%d ",p[i]);
printf("\n");
}

int main(void){
int num=0,p[N];

while(1){
printf("Input ---> ");
if(scanf("%d",&p[num]) == EOF) break;
if(num>1) sort(0,num,p);
disp(num,p);
num++;
}
return 0;
}


  


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

Name: 管理人 [URL]  ..ハッカー(137,768ポイント)   Date: 2006/12/19(火) 13:33   No:2947     
Title: Re:文字列ソート    
char t;
になってました(_ _||)

int t;
に上記直しておきました。
さっきのだと256以上の数字を入力したらおかしくなってたはず。
やりたいことはこういうのとは違うんですか?


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

Name: box  ..上級者(23,648ポイント)   Date: 2006/12/19(火) 13:42   No:2950     
Title: Re:文字列ソート    
> たんにこんなんじゃダメなんでしょうか^^;

要素数の上限が決まっていれば、全く問題ありません。
ただ、配列を用いている限り、その配列の要素数を超える
入力ができないことはご存じのとおりです。

教科書に載っている「ユーザによって数値が入力されるたびに,
それまで入力された全ての数値を昇順にソートして表示する
プログラムを作成せよ.」という今回の問題で、
「入力する数値は最大256個とする」などの但書があれば、
リスト構造など持ち出すまでもないですが…。


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

Name: Yuki  ..ぴよぴよ(467ポイント)   Date: 2006/12/19(火) 13:51   No:2953     
Title: Re:文字列ソート    
realloc関数と、入力数を保持する変数を利用すれば、リスト構造に
しなくてもいけるのではないでしょうか。


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

Name: box  ..上級者(24,079ポイント)   Date: 2006/12/19(火) 13:59   No:2954     
Title: Re:文字列ソート    
> forの二重ループとか使うんでしょうか??

わかりやすそうなやり方は、
・for文やwhile文を使って、リスト構造の中を先頭から走査する
・走査中、現在着目している場所にあるデータと、
 今回挿入しようと思っているデータの大小関係を比較する(もちろんif文で)
・前項での比較結果により、データを挿入すべき場所がわかる
・データの挿入に伴うポインタの付け替えを適切に行ない、
 リスト構造中のデータがソートされた状態にする

データの挿入に伴うポインタ付け替えのイメージは下図のとおりです。
線がずれている箇所はご容赦ください。

【挿入前】

着目中の
データ
+--------+ +--------+
| next | ---------------------> | next |
+--------+ +--------+
| データ | | データ |
+--------+ 挿入する +--------+
データ
+--------+
| next |
+--------+
| データ |
+--------+


【挿入後】

着目中の
データ
+--------+ +--------+
| next | --+ +-> | next |
+--------+ | | +--------+
| データ | | | | データ |
+--------+ | 挿入する | +--------+
| データ |
| +--------+ |
+-> | next | --+
+--------+
| データ |
+--------+



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

Name: GPGA  ..上級者(16,134ポイント)   Date: 2006/12/19(火) 14:06   No:2955     
Title: Re:文字列ソート    
> realloc関数と、入力数を保持する変数を利用すれば、リスト構造に
> しなくてもいけるのではないでしょうか。
VectorにするかListにするかの差ですね。
両方作ると勉強になると思います。

効率で考えるならば、Vectorの場合コピーを行う必要があるため
数が多くなるほど、重くなってしまうのでリストのほうがよいと思います。


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

Name: box  ..上級者(24,235ポイント)   Date: 2006/12/19(火) 14:09   No:2956     
Title: Re:文字列ソート    
> realloc関数と、入力数を保持する変数を利用すれば、リスト構造に
> しなくてもいけるのではないでしょうか。

おっしゃるとおりです。
1個数値を入力するごとに、その時点での総個数分の領域をreallocして、
領域内の数値群をソート済の状態にしておけば、何もリスト構造にこだわる
必要はないですね。

>☆さん
よけいな手間を取らせてしまって、すみません。
まあ、今回はリスト構造の練習問題だと思って、
時間があれば取り組んでみてください。


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

Name: 管理人 [URL]  ..ハッカー(138,500ポイント)   Date: 2006/12/19(火) 14:10   No:2957     
Title: Re:文字列ソート    
#include <stdio.h>

#include <memory.h>
#include <stdlib.h>

void change(int i,int j, int x[ ]){//配列要素i番目とj番目の値を入れ替える
int t;
t=x[i] , x[i]=x[j] , x[j]=t;
}

void sort(int l, int r, int x[ ]){//lを一番左端の配列要素、rを一番右端の要素としてソートする。
int i,j, p;

i=l;j=r;
p=x[(l+r)/2];//ピボットの決定

while(1) {
while(x[i]<p)//左からピボット以上を探索
i++;
while(p<x[j])//右からピボット以下を探索
j--;
if(i>=j)//探索地点がぶつかったら終了
break;

change(i,j,x);//お互い発見した値をいれかえる
i++;
j--;
}
if(l<i-1)//左範囲が分割可能なら
sort(l,i-1,x);//左範囲を分割してソートを行う
if(j+1<r)//右範囲が分割可能なら
sort(j+1,r,x);//右範囲を分割してソートを行う
}

void disp(int num,int p[]){
printf("現在のソート結果 ");
for(int i=0;i<=num;i++)
printf("%d ",p[i]);
printf("\n");
}

int main(void){
int num=0,*p,*pp;

p = (int *)malloc(sizeof(int)*(num+1));

while(1){
printf("Input ---> ");
if(scanf("%d",&p[num]) == EOF)
break;
else{
pp = (int *)malloc(sizeof(int)*(num+1));
memcpy(pp, p, sizeof(int) * (num+1));
free(p);
p = (int *)malloc(sizeof(int)*(num+2));
memcpy(p, pp, sizeof(int) * (num+1));
free(pp);
}

if(num>1) sort(0,num,p);
disp(num,p);
num++;
}
free(p);
return 0;
}



こんな感じでいいような・・。

確かに毎回フリー、確保、コピーが無駄ですね。


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

Name: 管理人 [URL]  ..ハッカー(139,053ポイント)   Date: 2006/12/19(火) 14:26   No:2958     
Title: Re:文字列ソート    
☆さんへ、
一応私の書いたコードでよければ説明します。
ホントはもっと綺麗な書き方があるんでしょうけど、先ほど作ったコードを利用した方法では私にはこれしか思いつかないので。

まず、本当にソートに使用するpという配列を用意するため、
int *p;
でポインタを宣言します。
mallocでこのpに領域を確保させます。
まず最初は
int型の領域1つ分でいいので、

p = (int *)malloc(sizeof(int)*(num+1));

のnumが0ですからint型の領域一つ分つまりsizeof(int)*(num+1)だけpに確保します。

if(scanf("%d",&p[num]) == EOF) break;

ここは入力を受ける部分で、入力がEOFならループを抜けます。

EOFは入力中に ctrl + Z を押すとEOFとなります(環境によってはDとか)。

elseで行われる処理は終わらず継続するときの処理で、

まず、pの内容をppにコピーします。

これはpにもう一つ大きな領域を確保させるためであり、pはあらたに確保させるとき、freeで消えてしまうため、コピーをとっておかないといけないためです。

ppの領域をpと同じだけ確保し、

pp = (int *)malloc(sizeof(int)*(num+1));

pの内容をppにコピーします。

memcpy(pp, p, sizeof(int) * (num+1));

pを解放します。

free(p);

pに先ほどより1つ多い領域を確保させます。

p = (int *)malloc(sizeof(int)*(num+2));

pにppの内容をコピーします。

memcpy(p, pp, sizeof(int) * (num+1));

ppを解放します。

free(pp);

あとは、2回目のループからソートを行い、表示しているだけです。

どこかわからないところや、コードに不審な点があれば伝えてください。


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

Name:  ..入門者(4,275ポイント)   Date: 2006/12/19(火) 15:10   No:2959     
Title: Re:文字列ソート    
みなさん、どぉーも、ありがとーございます。。。

一応今回は、ソートの練習問題だったので、リスト構造のやりかたの練習をしてみます。


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

Name: 管理人 [URL]  ..ハッカー(139,400ポイント)   Date: 2006/12/19(火) 15:19   No:2960     
Title: Re:文字列ソート    
そういえばソートして表示って問題の言葉に捉われなければ、単純に比較してコピーするだけの方がずっと計算早いですね。

結局リストと同じことになりそうですけど。
リストの配列版というか

#include <stdio.h>

#include <memory.h>
#include <stdlib.h>

void disp(int num,int p[]){
for(int i=0;i<=num;i++)
printf("%d ",p[i]);
printf("\n");
}

int main(void){
int i,j,num=0,*p,*pp,x;
p = (int *)malloc(sizeof(int)*(num+1));
while(1){
printf("Input ---> ");
if(scanf("%d",&x) == EOF)
break;
else {
pp = (int *)malloc(sizeof(int)*(num+1));
memcpy(pp, p, sizeof(int) * (num+1));
free(p);
p = (int *)malloc(sizeof(int)*(num+2));
memcpy(p, pp, sizeof(int) * (num+1));
free(pp);
}
if(num>0){
for(i=0;i<num;i++)
if(p[i]>x) break;
for(j=num;j>=i;j--)
p[j+1]=p[j];
p[i]=x;
}
else
p[0]=x;
disp(num,p);
num++;
}
free(p);
return 0;
}


  


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

Name: 管理人 [URL]  ..ハッカー(139,252ポイント)   Date: 2006/12/19(火) 15:32   No:2961     
Title: Re:文字列ソート    
↑クリックで画像が拡大↑

ちょっと手元にパワーポイントとか絵を書いて説明できるものがないんで、
手書きの写真で説明します…;

汚い字ですみませんm(_ _)m

これは

8 11 13 21


と並んでいるときに

12が入力されたときに、どういう風に割り込んで、並べているか説明したものです。


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

Name: 管理人 [URL]  ..ハッカー(139,258ポイント)   Date: 2006/12/19(火) 15:43   No:2962     
Title: Re:文字列ソート    
う、みなさんのお話を見ずに投稿しているとreallocのお話が・・。
reallocは使ったこと無かったので思いつきませんでした。
mallocよりreallocを使った方がずっとスマートですね(_ _|||)


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

Name: 管理人 [URL]  ..ハッカー(139,494ポイント)   Date: 2006/12/19(火) 15:48   No:2963     
Title: Re:文字列ソート    
#include <stdio.h>

#include <stdlib.h>

void disp(int num,int p[]){
for(int i=0;i<=num;i++)
printf("%d ",p[i]);
printf("\n");
}

void sort(int *p,int num,int x){
int i,j;
for(i=0;i<num;i++) if(p[i]>x) break;
for(j=num;j>=i;j--) p[j+1]=p[j];
p[i]=x;
return ;
}

int main(void){
int i,j,num=0,*p,x;
p = (int *)malloc(sizeof(int)*(num+1));
while(1){
printf("Input ---> ");
if(scanf("%d",&x) == EOF) break;
else p=(int *)realloc(p,sizeof(int)*(num+2));
if(num>0) sort(p,num,x);
else p[0]=x;
disp(num,p);
num++;
}
free(p);
return 0;
}


reallocを使って書き直しました。
何度もすみません(_ _||)


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

Name:  ..入門者(4,353ポイント)   Date: 2006/12/19(火) 17:13   No:2965     
Title: Re:文字列ソート    
すごいですね。
わざわざ手書きまでしていただいて、すみません。
typedefを使えば、sortを何回もかかなくて、すむんですよね★
この前、教えていただきました!!


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

Name: 管理人 [URL]  ..ハッカー(139,517ポイント)   Date: 2006/12/19(火) 19:02   No:2966     
Title: Re:文字列ソート    
どのソートが早いか測定してみました。
新しいトピをたてたのでよければみてください。


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

Name:  ..入門者(4,485ポイント)   Date: 2006/12/19(火) 19:13   No:2967     
Title: Re:文字列ソート    
はい★ありがとうございます。

あと、もう一つ質問です。いいですか??

管理人さんに教えていただいたプログラムを、「999という数字が入力されたら、終了」という風にしたいんですけど、どのようにやればいいんしょうか??
どこに、その条件をいれるのかがわかりません。

お願いします。


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

Name: 管理人 [URL]  ..ハッカー(141,950ポイント)   Date: 2006/12/19(火) 19:20   No:2969     
Title: Re:文字列ソート    
if(scanf("%d",&x) == EOF) break;
ここの部分でループを抜けています。

入力がEOFならブレイクという意味です。
これを入力されたものが999ならブレイクにすればいいのです。
つまり、スキャンしてから、その値がつまりxが999ならブレイクです。


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

Name:  ..入門者(4,643ポイント)   Date: 2006/12/19(火) 19:22   No:2971     
Title: Re:文字列ソート    
if(scanf("%d",&x)==999) break;

でいいですか??


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

Name:  ..入門者(4,655ポイント)   Date: 2006/12/19(火) 19:36   No:2973 解決!     
Title: Re:文字列ソート    
できましたぁーーーー★

ありがとうございます★


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



Name: BRACE  ..ぴよぴよ(114ポイント)   Date: 2006/12/16(土) 11:43   No:2842       
Title: シューティングゲームの館    
シューティングゲームの館の13.敵の動作と判定で
12. 「敵」の概念と表示まではできたのですが13のサンプルで実行すると

main.obj : error LNK2019: 未解決の外部シンボル "void __cdecl EnemyCalcDisp(void)" (?EnemyCalcDisp@@YAXXZ) が関数 _WinMain@16 で参照されました。
C:\Documents and Settings\○○\My Documents\Visual Studio 2005\Projects\test\Debug\test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

というエラーがでるんですけど、どこを直したらいいのでしょうか


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


Name: Justy  ..熟練のプログラマー(44,062ポイント)   Date: 2006/12/16(土) 20:11   No:2848     
Title: Re:シューティングゲームの館    
エラーがでるんですけど、どこを直したらいいのでしょうか
 enemy.cppはコンパイル・リンク対象になっていますか?
 つまるところ、プロジェクトに enemy.cppを登録したかどうか、です。


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

Name: 管理人 [URL]  ..ハッカー(133,564ポイント)   Date: 2006/12/16(土) 21:44   No:2856     
Title: Re:シューティングゲームの館    
何かと複雑な構造の説明になってしまっているので、もしかしたら何かソースの掲示する順番がかわってしまっている可能性も否めませんので、一度調査してきます^^;

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

Name: 管理人 [URL]  ..ハッカー(133,702ポイント)   Date: 2006/12/16(土) 21:58   No:2859     
Title: Re:シューティングゲームの館    
あ〜、ホントですね!ソースコードがおかしい・・私のミスです><;

こんなに大きなミスがあるとは・・。

申し訳ないです。

EnemyCalcDisp関数があったり、

次の章から突然

EnemyCalc関数と

EnemyDisp関数とにわかれていたり、次の章では直っていたり・・。

何でこんな大きなミスしてるんだろう・・・。

ごめんなさい、すぐ直します・・;


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

Name: 管理人 [URL]  ..ハッカー(133,892ポイント)   Date: 2006/12/16(土) 22:30   No:2864     
Title: Re:シューティングゲームの館    
一応これで直ったと思うんですが、どうでしょうか?



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

Name: BRACE  ..ぴよぴよ(142ポイント)   Date: 2006/12/17(日) 00:03   No:2871     
Title: Re:シューティングゲームの館    
直りましたが、そうなってくると敵の移動パターンを増やすの直線とか円運動もおかしくなりませんか?

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

Name: 管理人 [URL]  ..ハッカー(134,305ポイント)   Date: 2006/12/17(日) 00:35   No:2872     
Title: Re:シューティングゲームの館    
おかしいところは一応全部なおしたつもりです。

そこだけおかしかったみたいで、関数名EnemyCalcDispをEnemyCalcと書いていたことが原因です。

なお、後の説明でかいてある部分にはきちんとEnemyCalcDispと書かれていました。

ソースとプロジェクトのダウンロード

でダウンロードしていただけるソースファイルにミスはありませんでした。

ほかに

EnemyCalcと書かれている部分が見つかれば教えてください。

ミスがありすみませんでしたm(_ _)m


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

Name: a.k.a.dRESSING  ..ぴよぴよ(350ポイント)   Date: 2006/12/18(月) 23:17   No:2925 解決!     
Title: Re:シューティングゲームの館    
できました
管理人さんありがとうございました


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



Name: nana  ..ぴよぴよ(633ポイント)   Date: 2006/12/14(木) 10:25   No:2754       
Title: Pari/GPからCへ変換・・・    
Pari/GPという計算ソフトを用いて作られたプログラムをCに変換できる人いませんでしょうか?
先日尋ねられたのですが、わたしはどちらも詳しくないので教えて頂きたいと思います。
元のプログラムは、、、

{
n=6;
g=matrix(n,n);
gs=matrix(n,n);
m=matrix(n,n);
u=matrix(n,n);
h=matrix(n,n);

c=0;

"====================step1====================";
g[1,]=[1,0,0,0,0,-21];
g[2,]=[0,1,0,0,0,-5];
g[3,]=[0,0,1,0,0,-10];
g[4,]=[0,0,0,1,0,-20];
g[5,]=[0,0,0,0,1,-24];
g[6,]=[0,0,0,0,0,49];

print("--------------------step1--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(msg[s,]));
print("");print("");

"====================step2====================";
gs[1,]=g[1,];
u[1,1]=1;
for(i=2,n,gs[i,]=g[i,];
for(j=1,i-1,uu=g[i,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[i,j]=uu/us;
gs[i,]=gs[i,]-u[i,j]*gs[j,]
);
u[i,i]=1;
);
m=u;

print("--------------------step2"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("M*GS=");
mgs*m*gs;
for(s=1,n,print(mgs[s,]));
print("");

i=2;
print("i=",2);
print("");
print("");

u=m;

"====================step3====================";
while(i<=n,
j=i-1;
while(j>0,
g[i,]=g[i,]-round(u[i,j])*g[j,]);
m[i,]=m[i,]-round(u[i,j])*m[j,]);
u[i,]=m[i,];
j=j-1;

print("--------------------step3"--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");print("");

);
if((i>1&&(gs[i-1,]*gs[i-1,]~>2*gs[i,]*gs[i,]~),
h[i,]=g[i,];g[i,]=g[i-1,];g[i-1,]=h[i,];
mi=i-1;
for(ii=mi,n,
gs[ii,]=g[ii,];
for(j=1,ii-1,
uu=g[ii,]*gs[j,]~;us=gs[j,]*gs[j,]~;u[ii,j]=uu/us;
gs[ii,]=gs[ii,]-u[ii,j]*gs[j,]
);
u[ii,ii]=1;
);
i=i-1,
i=i+1

);
m=u;

print("--------------------step3(b)--------------------");
print("G=");
for(s=1,n,print(g[s,]));
print("");
print("M=");
for(s=1,n,print(m[s,]));
print("");
print("GS=");
for(i=1,n,print(gs[i,]));
print("");
print("M*GS=");
mgs=m*gs;
for(s=1,n,print(mgs[s,]));
print("");
print("i=",i);
print("");print("");

);

print("====================Finish====================");
print("G=");
for(s=1,n,print(g[s,]));
print("==============================================");

}

ちょっと長いですがこういうプログラムです。
どうかお願い致します!


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


Name: box  ..上級者(20,326ポイント)   Date: 2006/12/14(木) 10:35   No:2755     
Title: Re:Pari/GPからCへ変換・・・    
MathematicaではなくてC言語に変換したいのですか?

http://okwave.jp/qa2600276.html


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

Name: nana  ..ぴよぴよ(732ポイント)   Date: 2006/12/14(木) 11:00   No:2756     
Title: Re:Pari/GPからCへ変換・・・    
mathematicaでもいいのですが、できればCでやってみたいと思いまして・・・。
最初はCを考えていたのですが、プログラムのCPUを考えたら、mathematicaの方が効率的なのかもしれない、、、とも思いました。
どちらかで実行できるのであればどちらでも構わないです!


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

Name: box  ..上級者(20,474ポイント)   Date: 2006/12/14(木) 14:01   No:2760     
Title: Re:Pari/GPからCへ変換・・・    
GPスクリプトをCのソースに変換するツール
gp2cというのがあるみたいです。あたしは使ったことありませんが…。
「gp2c」でググってみてくださいまし。


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

Name: nana  ..ぴよぴよ(781ポイント)   Date: 2006/12/14(木) 22:48   No:2785     
Title: Re:Pari/GPからCへ変換・・・    
試してみようと思ったのですが、よく分かりませんでした>_<
何か方法、もしくは変換できる方いらっしゃいませんでしょうか・・・?


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

Name: 管理人 [URL]  ..ハッカー(130,793ポイント)   Date: 2006/12/15(金) 01:53   No:2798     
Title: Re:Pari/GPからCへ変換・・・    
すみませんが、見たことがないです・・・。

もう拝見されてるとは思いますがboxさんのおっしゃっている部分で参考になりそうな
URLです。

http://www.kaynet.or.jp/~kay/misc/column/parigp3.html
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html


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

Name: nana  ..ぴよぴよ(837ポイント)   Date: 2006/12/15(金) 07:19   No:2801     
Title: Re:Pari/GPからCへ変換・・・    
ありがとうございます。
そのリンクは使えそうなのですが、問題は環境で、windows上で実行できないとだめなんです。。。
gp2cはunixでしかだめと書いてあったので。。


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

Name: Justy  ..熟練のプログラマー(43,399ポイント)   Date: 2006/12/15(金) 11:44   No:2813     
Title: Re:Pari/GPからCへ変換・・・    
 Windowsに Cygwinを入れれば動きませんか?

http://crocus.sci.kumamoto-u.ac.jp/physics/astro/fujimoto/home/cygwin.html
http://www.sixnine.net/cygwin/index.html
http://sohda.net/cygwin/


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

Name: mas  ..入門者(3,509ポイント)   Date: 2006/12/15(金) 18:38   No:2824     
Title: Re:Pari/GPからCへ変換・・・    
管理人さんが挙げた
http://www.math.toyama-u.ac.jp/~iwao/pari-gp.html
こちらの方にWindows用バイナリへのリンクがはってありますけど、それではだめですか?


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

Name: nana  ..ぴよぴよ(859ポイント)   Date: 2006/12/16(土) 20:03   No:2846     
Title: Re:Pari/GPからCへ変換・・・    
う”−−−ん、、、やっぱり動きませんでした。。。
変換は無理なんでしょうか・・・


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

Name: Justy  ..熟練のプログラマー(43,973ポイント)   Date: 2006/12/16(土) 20:07   No:2847     
Title: Re:Pari/GPからCへ変換・・・    
やっぱり動きませんでした
 何をしたけど、何が問題でどう動かなかったのでしょうか。


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

Name: nana  ..ぴよぴよ(894ポイント)   Date: 2006/12/16(土) 21:35   No:2852     
Title: Re:Pari/GPからCへ変換・・・    
installして手順通りにやってみたのですが、最初からつまづいて・・・
わたしのPCでは動かなかったのです。
もしかするとやり方が間違っていたのかもしれませんが。。。


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

Name: Justy  ..熟練のプログラマー(44,878ポイント)   Date: 2006/12/16(土) 23:42   No:2870     
Title: Re:Pari/GPからCへ変換・・・    
 これだけの情報では状況がよくわからないです。

 まずインストールしたのは Pari/GPでしょうか? gp2cでしょうか?

手順通りにやってみたのですが、最初からつまづいて・
 えーと、手順というのは公式サイトのインストール手順ですか?
 
 その最初というのは具体的には何をしようとしたのでしょうか?


わたしのPCでは動かなかったのです
 動かなかいというのは、動かせる状態にまではもって行けた、ということでしょうか??


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

Name: nana  ..ぴよぴよ(897ポイント)   Date: 2006/12/18(月) 19:16   No:2911     
Title: Re:Pari/GPからCへ変換・・・    
インストールしたのはPari/GPで、gp2cはDLしました。
DLの後に、公式サイトのインストール手順通りにやってみようとしたのですが、Pari/GP上で最初の項目からエラーが出てしまいます。
つまり、gp2cをインストール出来ていないという結果です・・・gp2cの解凍したところ止まりです。
これまでPari/GPを使ったことがないので意味がよく分かりませんでした。


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

Name: Justy  ..熟練のプログラマー(46,302ポイント)   Date: 2006/12/18(月) 21:51   No:2921     
Title: Re:Pari/GPからCへ変換・・・    
 やりたいの gpコードを cソースに直したいのですよね?
 まず必要なのは gp2cです。

 これを Windows上で使う場合、ビルドの為に Cygwinが必要です(Linuxなら不要)。

Cygwin 環境の構築:Cygwin Setupによるインストール
http://sohda.net/cygwin/setup.html

 このあたり(もしくは Cygwinでググって出てきたサイト)でも参考にして、まずこれをインストールして下さい。

 これが終わったら公式サイトの gp2cのインストール手順("1.1 Installing gp2c")をみながら、
tar.gzの解凍をし、configureによる環境チェックを経て、makeすればコンパイルできるはずです。

 configureの段階でエラーが出るような、大抵そのコマンドがインストールされていないということなので、その場合は Cygwin Setupで必要なモジュールを追加して下さい。

 ビルドが終われば後は
>gp2c xxxx.gp > xxxx.c

 と gpソースと出力ファイル名をリダイレクトで指定すれば出力されます。


f(a)=

{
local(x,y=1);
x=[1,[1,1],[1,a]];
while(x[if(a,3,2)]!=[1,y],y++;print(y));
print("end");
}
g(a)=
{
local(x,y=1);
x=[1,[1,1],[1,a]];
until(x[if(a,3,2)]!=[1,y],y++;print(y));
print("end");
}


 このような gpソースが

#include <pari/pari.h>


void
init_while(void) /* void */
{
return;
}

void
f(GEN a) /* void */
{
GEN x = gen_0, y = gen_1;
GEN p1, p2, p3; /* vec */
p1 = cgetg(4, t_VEC);
gel(p1, 1) = gen_1;
p2 = cgetg(3, t_VEC);
gel(p2, 1) = gen_1;
gel(p2, 2) = gen_1;
gel(p1, 2) = p2;
p3 = cgetg(3, t_VEC);
gel(p3, 1) = gen_1;
gel(p3, 2) = gcopy(a);
gel(p1, 3) = p3;
x = p1;
{
long l4;
GEN p5; /* vec */
for(;;)
{
if (!gcmp0(a))
l4 = 3;
else
l4 = 2;
p5 = cgetg(3, t_VEC);
gel(p5, 1) = gen_1;
gel(p5, 2) = gcopy(y);
if (gequal(gel(x, l4), p5))
break;
y = gaddgs(y, 1);
pariprintf("%Z\n", y);
}
}
pariprintf("end\n");
return;
}

void
g(GEN a) /* void */
{
GEN x = gen_0, y = gen_1;
GEN p1, p2, p3; /* vec */
p1 = cgetg(4, t_VEC);
gel(p1, 1) = gen_1;
p2 = cgetg(3, t_VEC);
gel(p2, 1) = gen_1;
gel(p2, 2) = gen_1;
gel(p1, 2) = p2;
p3 = cgetg(3, t_VEC);
gel(p3, 1) = gen_1;
gel(p3, 2) = gcopy(a);
gel(p1, 3) = p3;
x = p1;
{
long l4;
GEN p5; /* vec */
for(;;)
{
y = gaddgs(y, 1);
pariprintf("%Z\n", y);
if (!gcmp0(a))
l4 = 3;
else
l4 = 2;
p5 = cgetg(3, t_VEC);
gel(p5, 1) = gen_1;
gel(p5, 2) = gcopy(y);
if (!gequal(gel(x, l4), p5))
break;
}
}
pariprintf("end\n");
return;
}


 のように出力されます。

 で、このソースコードをCコンパイラでビルドするには Pari/GPが必要で、こちらは Windows用のものがあるのでさくっとインストールしてパスを通せば、コンパイルできるのではないでしょうか。


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



Name: テルル  ..ぴよぴよ(435ポイント)   Date: 2006/12/17(日) 23:12   No:2892       
Title: 構造体で…    
はじめまして!
学校の課題の構造体を用いたプログラムを作成しました。
範囲外番号を入力したときのエラーメッセージは表示できるのですが、
登録済みの番号を入力したときのエラーメッセージを
input_dataの中で処理しようと思っているのですが表示できません。
教えていただけませんか?



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

#define NAME_MAX 19
#define DATA_MAX 5
#define NO_MIN 1
#define NO_MAX 9999
#define BUF 256

typedef struct person
{
int no;
char name[NAME_MAX+1];
}Person;

void input_data(Person *);
void display_data(Person *,int);

int main(void)
{
int cnt;
Person member[DATA_MAX];

for(cnt = 0;cnt < DATA_MAX;cnt++)
{
input_data(&member[cnt]);
}

display_data(&member[0],DATA_MAX);

return 0;
}

void display_data(Person *pmem,int max_cnt)
{データの表示処理}

void input_data(Person *imem)
{
char buf[BUF];

while(1)
{
printf("\n");
printf("Input Number : ");
scanf("%d",&imem->no);

if(imem->no < NO_MIN || imem->no > NO_MAX)
{
printf("\nSorry.Input number %d - %d",NO_MIN,NO_MAX);
}
  else
{
break;
}
}

続く…


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


Name: Justy  ..熟練のプログラマー(45,839ポイント)   Date: 2006/12/18(月) 01:09   No:2897     
Title: Re:構造体で…    
 まず、現在の input_data()の仕様では番号の登録済み(重複チェック)はできません。
 input_data()には未入力の1つ分の Person情報しか情報が渡っていないからです。

 引数を input_data(Person *person, int index) と Person情報の先頭と有効な数(カレントのインデックス)を与える形に変更します。

 こうすることで input_data()内で Person member[DATA_MAX]; の全ての要素にアクセスできるようになります。

 当然 main()にある呼び出し元も

    for(cnt = 0;cnt < DATA_MAX;cnt++) 

input_data(member, cnt);

 のように、cntを与えます。


 あとは
Person* FindPersonFromNo(int no, Person *item, int max_cnt)

{
int i;
for(i=0; i<max_cnt; ++i, ++item)
{
if(item->no == no)
return item;
}
return NULL;
}

 こんな感じの noと同じ番号を持つ Person情報を検索する関数を作って、戻り値が NULLなら登録済みはないと判別できると思います。


#ちなみに入力した番号の登録済みチェックをするなら、数字以外が入力されたこともチェックするとプログラムが堅牢になると思います。


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

Name: テルル  ..ぴよぴよ(448ポイント)   Date: 2006/12/18(月) 16:45   No:2909 解決!     
Title: Re:構造体で…    
有り難うございました!
早速取りかかりたいと思います。


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



Name: satoshi  ..ぴよぴよ(889ポイント)   Date: 2006/12/15(金) 18:02   No:2823       
Title: プログラムの呼び出し    
こんにちは。
今、メインのプログラムで別のプログラムを呼び出して実行させたいんですケド、全然わかりません。
誰かわかる人がいたらご教授お願いします。
ちなみにC++です。


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


Name: 管理人 [URL]  ..ハッカー(132,536ポイント)   Date: 2006/12/15(金) 19:34   No:2825     
Title: Re:プログラムの呼び出し    
別のプログラムを呼び出すっていうのはほかの実行ファイルを実行させたいってことでいいんですか?

それでしたらシステム関数を使えばいいと思います。


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

Name: satoshi  ..ぴよぴよ(182ポイント)   Date: 2006/12/17(日) 13:28   No:2883     
Title: Re:プログラムの呼び出し    
はじめまして、管理人さん。返答が遅れてしまい申し訳ありません。
まさに、実行ファイルを実行させたいんですが実行ファイルからデータも欲しいんです。
Win32アプリケーションで作成したGUIに、Win32コンソールアプリケーションで作成したsocketプログラミングで受け取ったデータを出力したいんです。
こんなことってシステム関数で出来るんですか?
また、その関数を教えてもらえれば幸いです。システム関数で調べてみたんですが見当たらなくて‥
よろしくお願いします。


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

Name: box  ..上級者(22,515ポイント)   Date: 2006/12/17(日) 13:53   No:2885     
Title: Re:プログラムの呼び出し    
> こんなことってシステム関数で出来るんですか?

systemという名前の標準関数のことだと思います。
この関数で今回の希望が満たせるかどうかはわかりませんが…。


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

Name: Justy  ..熟練のプログラマー(45,493ポイント)   Date: 2006/12/17(日) 16:42   No:2888     
Title: Re:プログラムの呼び出し    
 アプリから別のアプリを呼ぶC言語標準関数は sysytem()ですが、各OS毎に専用の APIが用意されていることがありますので、そのどちらかを使ってみて下さい。

 で、データのやりとりは、同じマシン上にある2つのアプリ間というなら「プロセス間通信」でぐぐればいろいろと出てくるかと。

 まぁ最悪、ファイルに書き出してそれを読みとる、という方法でも出来なくはないです。


 状況がよくわかりませんが、そのコンソールアプリ内にある受信したデータを受け取る部分を dll/共有ライブラリ化して、GUI側からも呼べるようにしてはどうですか?
 その方が楽なのでは。


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

Name: satoshi  ..ぴよぴよ(988ポイント)   Date: 2006/12/17(日) 17:51   No:2891     
Title: Re:プログラムの呼び出し    
boxさん、Justyさん、ご返答ありがとうございます。

>Justyさん

>で、データのやりとりは、同じマシン上にある2つのアプリ間というなら「プロセス間通信」でぐぐればいろいろと出てくるかと。

プロセス間通信はやってみたのですが、いまいち使い方がよくわからなくて…


>そのコンソールアプリ内にある受信したデータを受け取る部分を dll/共有ライブラリ化して、GUI側からも呼べるようにしてはどうですか?

そんな方法があるんですね。無知ですみません。
そのやり方を詳しく書いてるところなどを知っていたら教えて下さい。
よろしくお願いします。


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

Name: satoshi  ..かけだし(1,087ポイント)   Date: 2006/12/18(月) 13:22   No:2904     
Title: Re:プログラムの呼び出し    
すみません。system関数を利用して、実行しようとしたんですが、うまく実行されません。

system(" \"C:\Program1\\client\\debug\\client.exe\" ");

このようにして記述しているのですが、間違った記述ですか?
ちなみに、コンパイル時の警告で「エスケープシーケンスとして正しく認識されませんでした。」と出ます。
どなたかわかる人がいたらご教授ください。


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

Name: keichan  ..初心者(8,391ポイント)   Date: 2006/12/18(月) 14:47   No:2905     
Title: Re:プログラムの呼び出し    
\"C:\\Program1\\Client\\debug\\client.exe\"
としてみてください。


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

Name: satoshi  ..かけだし(1,449ポイント)   Date: 2006/12/18(月) 15:16   No:2906 解決!     
Title: Re:プログラムの呼び出し    
keichanさん回答ありがとうございます。
実行することができました。ありがとうございます。

ところで、system()関数では実行ファイルを実行するだけでデータの受け渡しができませんよね?
Justyさんが仰られたようにdllを作成して呼び出せるようにしようとしているのですが、私には難しいです…

なんとか頑張ってみます。
やって出来なかったらまた質問させてもらいます。
みなさんご回答ありがとうございました。




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

Name: Yuki  ..ぴよぴよ(282ポイント)   Date: 2006/12/18(月) 15:42   No:2907     
Title: Re:プログラムの呼び出し    
socketプログラミングで受け取ったデータをファイルに出力するようにして、
起動側ではsystem()関数終了後、そのファイルを読んでデータをGetする
という仕組みではいけませんか?



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



Name: 努力中  ..ぴよぴよ(87ポイント)   Date: 2006/12/14(木) 21:49   No:2777       
Title: コマンドラインについて    
先輩が今授業で「コマンドライ」というものを扱っているらしく、来年同じ科目を履修しようとしていたので、自主的に先生に少し教えていただいた後、次のような課題をいただきました。

コマンドラインからのファイルの指定を利用して,read-b.txtから英文を読み込み,ファイル内にあるa〜z,ピリオド,カンマ,スペースのそれぞれの文字数をwrite-b.txtに書き出せ.ただし,大文字,小文字は区別しない. 
プログラムの読み込みに使うfopen fclose等をおそらく使うのであろうと予想し、考えていますが、さすがに先輩たちがやっているだけあって、ほとんど知識の無い初心者の自分には難しいです。 書き始めの部分に#include<stdio.h> 以外にほかにどんなものが必要なのでしょうか。 できれば途中までのプログラムを示していただければ幸いです。 よろしくお願いします


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


Name: 管理人 [URL]  ..ハッカー(128,757ポイント)   Date: 2006/12/14(木) 22:47   No:2784     
Title: Re:コマンドラインについて    
えぇと、努力中さんがどの程度プログラムの知識をもっていらっしゃるかで説明のしかたがかなり変わると思うので

一度、どの程度知っていらっしゃるか、教えてもらえませんか?

たとえば

1 stdio.h以外には何もインクルードしたことがありませんか?

2 コマンドラインからの入力は今までやったことがありませんか?

3 配列・ポインタについて一通り勉強されていますか?

4 文字列操作・ファイル操作について、勉強されていますか?


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

Name: 管理人 [URL]  ..ハッカー(129,391ポイント)   Date: 2006/12/14(木) 23:04   No:2787     
Title: Re:コマンドラインについて    
では、コマンドラインからご説明します。

#include <stdio.h>


int main(int argc,char *argv[]){
int i;
printf("引数の総個数 = %d\n", argc);
for (i = 0; i < argc; i++)
printf("%d番目の引数 = %s\n", i, argv[i]);
}


コマンドラインから入力を受けるとき、メイン文はこのように書き始めます。

int main(int argc,char *argv[]){

argcには引数の数が、argvにはそれぞれの文字列が・・とかいうよりまぁ実行結果を見てください。

このプログラムの実行ファイルをtest.exeとしましょう。Cドライブの直下にあるとします。

その時。test.txtを引数に持たせたいときはこのように書きますね。

C:\>test.exe test.txt

このように入力して実行したとき、どのような結果になるかサンプルを示します。

C:\>test.exe test.txt
引数の総個数 = 2
0番目の引数 = test.exe
1番目の引数 = test.txt

C:\>は最初から表示されていますから含まれません。
test.exe test.txtが自分の入力した部分ですね。
argvというのは2次元配列になっています。
argv[0]と示すと、argv[0][0]から成る配列の先頭アドレスを示します。
つまり
argv[0]にはtest.exeという文字列が入っている先頭アドレスが入っており、
argv[1]にはtest.txtという文字列が入っている先頭アドレスが入っており、
argcには何個入力の文字列があったか、その個数が入っています。
今回はtest.exeとtest.txtの2つがありますから「2」が入っています。

これでコマンドラインについてはいいでしょうか?


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

Name: 管理人 [URL]  ..ハッカー(129,622ポイント)   Date: 2006/12/14(木) 23:30   No:2790     
Title: Re:コマンドラインについて    
先に行っていいかどうかわからないですが、次の説明します。

コマンドラインから受け取った文字列を使ってファイルをオープンする方法。

先に説明したとおり、argcは2が入っていることが期待されます。

しかし2が入っていない場合がありますから、そのときは即終了させましょう。☆1

fopenによってファイルポインタを取得し、それが無効なら終了させます。☆2
読み込みをするので読み込み形式であるrで指定しましょう。

ここからファイル内容の処理を行います。

☆3で開いたファイルは閉じましょう。


#include <stdio.h>

#include <stdlio.h>

int main(int argc,char *argv[]){
FILE *fin;

if(argc!=2){//☆1
printf("引数の数が正常ではない\n");
return 1;
}

if((fin = fopen(argv[1], "r")) == NULL ) {//☆2
printf("入力ファイルオープンエラー\n");
return 1;
}


//ここにファイル内の操作


fclose(fin);//☆3
return 0;
}


ここまでいいですか?


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

Name: 管理人 [URL]  ..ハッカー(130,087ポイント)   Date: 2006/12/14(木) 23:46   No:2792     
Title: Re:コマンドラインについて    
まず、test.txtを作りましょう。

http://dixq.net/txt/test.txt

からダウンロードして、コンパイルするフォルダにいれてください。

読み込みについては上記に示したとおりです。

fgetc(fin)はfinで指定した部分から1文字とってくる関数です。

それをcに代入し、EOF(ファイルの終わり)なら終了します。

fputc(c,fout);

はさきほど格納したcを書き出しファイルように用意したfoutに書き込む関数です。

これをファイルの終わりまで続けると、結局同じファイルが2つ出来ます。


#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[]){
FILE *fin, *fout;
int c;

if(argc!=3){
printf("引数の数が正常ではない\n");
exit(1);
}

if((fin = fopen(argv[1], "r")) == NULL ) {
printf("入力ファイルオープンエラー\n");
exit(1);
}
if((fout = fopen(argv[2], "w")) == NULL ) {
printf("出力ファイルオープンエラー\n");
exit(1);
}

while ( (c=fgetc(fin)) != EOF)
fputc(c,fout);

fclose(fin);
fclose(fout);

return 0;
}



実行コマンドは

C:\>test.exe test.txt test2.txt


といった形で行ってください。
test.txtと同じ内容のtest2.txtが生成されます。


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

Name: 努力中  ..ぴよぴよ(287ポイント)   Date: 2006/12/15(金) 09:04   No:2803     
Title: Re:コマンドラインについて    
お返事が遅くなってしまい、まことにもうしわけありません。 丁寧な解説ありがとうございます。 自分は学校の授業では、まだプログラミングを履修しておらず、コンパイルやジャンケンゲームなどをかろうじてつくることができる、超初心者です。管理人さんが上げた4個の項目のうち2番3番4番に該当するとおもわれます。

引数の説明も一応先生におききしたのですが、管理人さんの説明のほうがわかりやすかったです


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

Name: 管理人 [URL]  ..ハッカー(131,137ポイント)   Date: 2006/12/15(金) 11:19   No:2810     
Title: Re:コマンドラインについて    
努力中さん、おはようございます^^

まだ履修していらっしゃらないのなら説明難しく無かったですか?
2次元配列とか配列の先頭アドレスとかって説明でわかりました?

もし配列やポインタがわからなければ、そこを重点的に勉強してからこの課題に挑むとよりよく解ると思いますよ^^


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

Name: 努力中  ..ぴよぴよ(197ポイント)   Date: 2006/12/15(金) 12:23   No:2816     
Title: Re:コマンドラインについて    
おはようございます管理人さん なんとか理解しはじめていけています。 今回のかだいで、引数などの数字系統の例題は教科書などにのっていたのですが、アルファベット系統のものがのっておらず、どうしようかと悩んでいますまた、スペースの区別などはどうすればいいのでしょうか

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

Name: 管理人 [URL]  ..ハッカー(132,311ポイント)   Date: 2006/12/15(金) 12:34   No:2817     
Title: Re:コマンドラインについて    
例えば、このようなプログラムは処理の意味がわかりますか?

#include <stdio.h>

int main() {
int i;
char str[20]="abcd ABCD aAbBcCdD ";
for(i=0;i<20;i++){
if(str[i]!=' ')
printf("%c",str[i]);
}
return 0;
}


このプログラムの意味がわかれば、その疑問も晴れるかと思います。

このプログラムはスペース以外を出力するプログラムです。

行いたい処理は具体的にどんな処理ですか?


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

Name: 管理人 [URL]  ..ハッカー(132,425ポイント)   Date: 2006/12/15(金) 12:41   No:2819     
Title: Re:コマンドラインについて    
また、文字コードについての知識も備えておけばよりよいでしょう。

#include <stdio.h>

int main() {
char x='1';
printf("%c %d\n", 'a' , 'a' );
printf("%c %d\n", 'a'+1, 'a'+1);
printf("%c %d\n", 'a'+2, 'a'+2);

printf("%c %d\n", x , x );
printf("%c %d\n", x+1 , x+1);
printf("%c %d\n", x+2 , x+2);

return 0;
}


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

Name: 努力中  ..ぴよぴよ(226ポイント)   Date: 2006/12/15(金) 20:17   No:2826     
Title: Re:コマンドラインについて    
丁寧なかいせつありがとうございます。管理人さんにしめしていただいた以下の式を引数のプログラムに置き換えるという感じでしょうか
#include <stdio.h>
int main() {
int i;
char str[20]="abcd ABCD aAbBcCdD ";
for(i=0;i<20;i++){
if(str[i]!=' ')
printf("%c",str[i]);
}
return 0;
}


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

Name: 管理人 [URL]  ..ハッカー(132,554ポイント)   Date: 2006/12/15(金) 20:37   No:2827     
Title: Re:コマンドラインについて    
スペースを除去したいのですか?


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

Name: 努力中  ..ぴよぴよ(370ポイント)   Date: 2006/12/15(金) 21:52   No:2828     
Title: Re:コマンドラインについて    
「コマンドラインからのファイルの指定を利用して,read-b.txtから英文を読み込み,ファイル内にあるa〜z,ピリオド,カンマ,スペースのそれぞれの文字数をwrite-b.txtに書き出せ.ただし,大文字,小文字は区別しない。」 という課題をいただいたので スペース ピリオード カンマ は避けては通れないみたいです。
   
先生からいただいたread-b.txtをひらいてみると英語がたくさん書いてありました


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

Name: box  ..上級者(21,971ポイント)   Date: 2006/12/15(金) 22:15   No:2829     
Title: Re:コマンドラインについて    
実行の仕方は、作成するプログラム名をprog.exeとすると、
prog read-b.txt write-b.txt <Enter>
となるようですね。

コマンドラインについてこれまで勉強してきた内容に基づいて、
上記の場合における
・コマンドライン引数の数
・各引数の内容
を求めてください。


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

Name: 管理人 [URL]  ..ハッカー(132,826ポイント)   Date: 2006/12/16(土) 00:26   No:2834     
Title: Re:コマンドラインについて    
>スペース ピリオード カンマ は避けては通れないみたいです

結局何をするのでしょうか・・・。
ファイルの内容をそのままコピーするわけじゃないんですか?大文字小文字は区別しないとなると・・。
どういういみだろう;


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

Name: box  ..上級者(22,290ポイント)   Date: 2006/12/16(土) 00:45   No:2835     
Title: Re:コマンドラインについて    
1)コマンドライン引数から入出力ファイル名を得る。
2)入出力ファイルをオープンする。
3)英字の数、ピリオドの数、カンマの数およびスペースの数をゼロで初期化する。
4)入力ファイルから1文字ずつを読んでいる間、以下の処理を行なう。
4-1)その1文字が英字(大文字、小文字)ならば、英字の数を1増やす。
4-2)その1文字がピリオドならば、ピリオドの数を1増やす。
4-3)その1文字がカンマならば、カンマの数を1増やす。
4-4)その1文字がスペースならば、スペースの数を1増やす。
5)英字の数、ピリオドの数、カンマの数およびスペースの数を出力ファイルに書き出す。
6)入出力ファイルをクローズする。
7)おしまい。


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

Name: 努力中  ..ぴよぴよ(499ポイント)   Date: 2006/12/16(土) 14:17   No:2844     
Title: Re:コマンドラインについて    
不鮮明な質問でみなさんに迷惑をかけてしまい本当にすいません。 今朝学校にいきプログラミング担当の先生にお聞きしてみたら boxさんの考え方で正解みたいでした。 「read-b.txtから情報を読み込んで最終的に英字の数、ピリオドの数、カンマの数およびスペースの数をwrite-b.txtファイルに書き出すんだよ」とおっしゃっていました。

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

Name: 管理人 [URL]  ..ハッカー(133,248ポイント)   Date: 2006/12/16(土) 21:18   No:2850     
Title: Re:コマンドラインについて    
あ、ごめんなさい!

>・・・ファイル内にあるa〜z,ピリオド,カンマ,スペースのそれぞれの文字「」をwrite-b.txtに書き出せ・・・

の 数 を読み飛ばしていました。
すみません、ちゃんと意味が通りますねm(_ _)m

文字コードについてのサンプルがご覧になりましたか?

文字コードはa,b,cから順番にzまで並んでおり、A,B,Cから順番にzまで並んでいます。

つまり、取得した1文字が小文字だと判断するには取得した1文字をcだとすると

if( c >= 'a' && c <= 'z' )

このように判定できます。

if( c >= 'A' && c <= 'Z' )

大文字の判定ならこうですね。この条件文で、文字数をカウントしていけばいいんだと思いますよ。

if( c >= 'A' && c <= 'Z' )
   count_a++;

こんな感じですね。

boxさんのおっしゃるように書いてみてください。


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

Name: 努力中  ..ぴよぴよ(695ポイント)   Date: 2006/12/16(土) 21:52   No:2857     
Title: Re:コマンドラインについて    
#include <stdio.h>
int main() {
char x='1';
printf("%c %d\n", 'a' , 'a' );
printf("%c %d\n", 'a'+1, 'a'+1);
printf("%c %d\n", 'a'+2, 'a'+2);

printf("%c %d\n", x , x );
printf("%c %d\n", x+1 , x+1);
printf("%c %d\n", x+2 , x+2);

return 0;
}

管理人さんに書いていただいたこの文字コードに小文字判定大文字判定を足していくかんじでしょうか


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

Name: box  ..上級者(22,489ポイント)   Date: 2006/12/16(土) 22:08   No:2861     
Title: Re:コマンドラインについて    
> 管理人さんに書いていただいたこの文字コードに小文字判定大文字判定を足していくかんじでしょうか

その前に、コマンドライン引数を正しく受け取ることから始めましょう。
一連の投稿を、最初から読み返してみてください。


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

Name: 管理人 [URL]  ..ハッカー(134,131ポイント)   Date: 2006/12/16(土) 23:11   No:2867     
Title: Re:コマンドラインについて    
私の書いた投稿の文章をよく読んでいただければ、そのような疑問はお持ちにならないと思います。

そのコードは文字コードを確認するだけのためのもので、全く、今作ろうとしているコードとは関係ないです。

コードはアルファベット順に並んでいることを確認していただきたかったのです。

もう一度きちんと上から読んでみてください。


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

Name: 努力中  ..ぴよぴよ(713ポイント)   Date: 2006/12/16(土) 23:33   No:2869     
Title: Re:コマンドラインについて    
すみませんでしたもう一度よみかえしてみます

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

Name: 努力中  ..ぴよぴよ(805ポイント)   Date: 2006/12/17(日) 17:50   No:2890     
Title: Re:コマンドラインについて    
よみかえしてみましたが、書くことはできませんでした。なにも知識のない1年生が2年生の学期末最終課題に興味本位で手を出したのが間違いでした。 アドバイスをくださったみなさん本当にすいませんでした

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

Name: 管理人 [URL]  ..ハッカー(135,128ポイント)   Date: 2006/12/18(月) 02:38   No:2899     
Title: Re:コマンドラインについて    
努力中さん、こんにちは。
なかなかお返事が出来ず、申し訳ないです。

こちらとしては、努力中さんが、どの程度C言語を理解されてらっしゃるのかがわからないので、どれくらい説明をすればいいのかわからないのです。

とりあえず、上の説明でわからないのでしたら「ここがわからない」といってもらえたら、わからない箇所の説明をしますし、似たような実装をしてくれといわれたらサンプルをお書きします。

とりあえず、どの辺を説明すればいいかわからなかったので、一通り全部説明したつもりです。

そこでわからないとなると、そのわからない箇所を教えてもらわないと説明のしようがないので。






という風に説明したので、ご自分でつなげて1234にしていただけたら完成するんですけど、わかりませんか?

一つ躓きだすと、全て躓いてしまう事ってよくあるんで、始めに答えを見てから自分で理解していくほうがいいかもしれませんね。

本当は、人の書いたプログラムというのは理解が難しいので、完成したプログラムを先にお見せすることはしたくなかったのですが。

プログラムのソースは少々長いですが、全く難しいことはしていません。

上記どおりのことをしているだけで、つなぎあわせただけです。

では、実際に作ってみましたので、見てください。

#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[]){
FILE *fin, *fout;
char c;
int st_A=0,st_a=0,st_space=0,st_else=0;

if(argc!=3){
printf("引数の数が正常ではない\n");
exit(1);
}

if((fin = fopen(argv[1], "r")) == NULL ) {
printf("入力ファイルオープンエラー\n");
exit(1);
}
if((fout = fopen(argv[2], "w")) == NULL ) {
printf("出力ファイルオープンエラー\n");
exit(1);
}

while ( (c=fgetc(fin)) != EOF){
if(c==' ')
st_space++;
else if(c>='a' && c<='z')
st_a++;
else if(c>='A' && c<='Z')
st_A++;
else
st_else++;
}

fprintf(fout, "スペース%d字\n小文字%d字\n大文字%d字\nその他%d字\n", st_space, st_a, st_A, st_else);

fclose(fin);
fclose(fout);

return 0;
}



実際に実行していないので、もしかしたらバグがあるかもしれませんが、見た感じ大丈夫だと思います。

次の投稿で注釈します。


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

Name: 管理人 [URL]  ..ハッカー(135,032ポイント)   Date: 2006/12/18(月) 02:45   No:2900     
Title: Re:コマンドラインについて    
#include <stdio.h>

#include <stdlib.h>

int main(int argc,char *argv[]){
//argcの使い方がわからなければ上の投稿を読み返してください。
//とりあえず、argv[1]に指定したファイル名1が、argv[3]に指定したファイル名3が入ります。
FILE *fin, *fout;
//ファイル情報を格納するためのファイルポインタ
char c;
//ファイルから1文字取得し格納するための変数
int st_A=0, st_a=0, st_space=0, st_else=0;//文字をカウントするための変数です。
// ↑大文字用 ↑小文字用 ↑スペース用 ↑その他用

if(argc!=3){//ファイル名が2つ記述されていなければ
printf("引数の数が正常ではない\n");
exit(1);
}

if((fin = fopen(argv[1], "r")) == NULL ) {//1つ目のファイルオープン処理
printf("入力ファイルオープンエラー\n");
exit(1);//ひらけなかったら終了
}
if((fout = fopen(argv[2], "w")) == NULL ) {//2つ目のファイルオープン処理
printf("出力ファイルオープンエラー\n");
exit(1);//ひらけなかったら終了
}

while ( (c=fgetc(fin)) != EOF){//ファイルから1文字取得。取得し終わったらポインタは1つ次に進む。
if(c==' ')//取得した文字がスペースだったら
st_space++;//スペースをカウントする。
else if(c>='a' && c<='z')//取得した文字が小文字だったら
st_a++;//小文字をカウントする。
else if(c>='A' && c<='Z')//取得した文字が大文字だったら
st_A++;//大文字をカウントする。
else//その他なら
st_else++;//その他をカウントする。
}

fprintf(fout, "スペース%d字\n小文字%d字\n大文字%d字\nその他%d字\n", st_space, st_a, st_A, st_else);
//変数のデータをファイルfoutに書き出す。
fclose(fin);//ファイルを閉じる
fclose(fout);//ファイルを閉じる

return 0;
}


わからない関数があればgoogleなどで直接検索すればだいたい解決します。

何かわからない部分があれば聞いてください。基本的に上の投稿を読み返したらわかるはずです。


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



Name: アイス  ..ぴよぴよ(120ポイント)   Date: 2006/12/15(金) 12:35   No:2818       
Title: 無題    
DXライブラリ置き場 使い方でBorlandC++ Compiler 5.5をインストールする場所
c:\borland\bcc55とはどこにあるのですか?


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


Name: 管理人 [URL]  ..ハッカー(132,468ポイント)   Date: 2006/12/15(金) 12:43   No:2820     
Title: Re:無題    
もともとあるのではなく、フォルダを作成するんですよ。
インストールするときに自動的に生成されるものです。
個別指定が出来るので、このように書かれているだけで、特別な操作をしない限り、
そのままフォルダは生成されます。


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

Name: アイス  ..ぴよぴよ(151ポイント)   Date: 2006/12/17(日) 17:36   No:2889     
Title: Re:無題    
ありがとうございます。
また、よろしくおねがいします。


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



Name: ふわりん  ..かけだし(1,207ポイント)   Date: 2006/12/17(日) 02:18   No:2875       
Title: 構造体についてお聞きしたいです。    
こんにちは。お久しぶりです。学校で構造体についての課題が出題されたのですが、授業を聞いてもイマイチ納得ができず、ここで質問させていただくことにしました。

以下に課題プログラムを示します。

#include <stdio.h>
struct nList{
int n;
struct nList*next;
};
struct nList*top;
main(){
int k;
struct nList *p,*p1,*p2,*p3;
top=NULL;
【while (scanf("%d",&k)>0){
p=(struct nList*)malloc(sizeof(struct nList));
p->n=k;
p->next=top;
top=p;
}】・・・・・・・@
p1=p2=top;
【if(p1==NULL) exit(-1);】・・・・・・・A
 k=p1->n;
while(p1->next){
if(k>p1->n){p2=p1;k=p1->n;}
p1=p1->next;
}
printf("%d\n",p2->n);
}






(1) プログラムのwhileブロック【】中の@を解説せよ。

(2) 【】中のAが必要な理由を説明せよ。

(3) このプログラムにデータとして

   6
5
2
1
4
.

を入力した。出力結果を示せ。




という課題です。

(1)は授業中に先生の話の内容のメモをした内容から、なんとか出来たのですが、

(2)の問題がわかりません。解説の程よろしくお願いします。

(3)の問題は、与えられたものを入力した結果は"1"となりました。

できれば、なぜこのような結果になったのかもよろしくお願いします。

お忙しいところ、申し訳ありませんが、よろしくお願いします。

 


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


Name: 管理人 [URL]  ..ハッカー(134,452ポイント)   Date: 2006/12/17(日) 04:00   No:2878     
Title: Re:構造体についてお聞きしたいです。    
リストの問題ですね。

http://www9.plala.or.jp/sgwr-t/c/sec15-5.html

ここを読むとよくわかりますよ。


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

Name: Justy  ..熟練のプログラマー(45,236ポイント)   Date: 2006/12/17(日) 04:41   No:2879     
Title: Re:構造体についてお聞きしたいです。    
【】中のAが必要な理由を説明せよ
 p1が NULLかどうかをチェックして、そうならプログラムを強制終了させていますね。
 ということはなぜ p1が NULLだとプログラムを止めなければならないかを考えればいいと思います。
 その行を削ったらどうなるかを考えてみたり、試したりしてはどうでしょうか。

このプログラムにデータとして
 最後の while文の中で p2->nの値がどう変化していくか、printfするなり、デバッガで追うなりして観察してみて下さい。
 それで直ぐにわかると思います。


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

Name: ふわりん  ..かけだし(1,270ポイント)   Date: 2006/12/17(日) 13:29   No:2884 解決!     
Title: Re:構造体についてお聞きしたいです。    
管理人様、 Justy 様ありがとうございます。

構造体は自分にとってはまだ難しい分野なので、理解できるように頑張りたいと思います。


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



Name: 管理人 [URL]  ..ハッカー(132,115ポイント)   Date: 2006/12/15(金) 12:12   No:2815       
Title: 笑える検索エンジン(雑談板)    
ここに来てくださる方はいろんな経路で来て下さってるんですね。

特にこういう経路で来て下さっている方がいらっしゃるのにはつい笑いました(笑

http://search.yahoo.co.jp/search?p=C%B8%C0%B8%EC%A4%AC%A4%A2%A4%EB%A4%C8%A4%A4%A4%A6%A4%B3%A4%C8%A4%CFB%B8%C0%B8%EC%A4%C3%A4%C6%A4%A2%A4%EB%A4%CE%A1%A9%A1%A1%A4%BD%A4%CE%C4%CC%A4%EA%A4%C7%A4%B9%A1%A3&x=0&y=0&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1

何でこんなキーワードでトップに来るのか、Yahooの検索システムにも笑えます(笑


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


Name: ダッシュ  ..入門者(3,766ポイント)   Date: 2006/12/16(土) 21:17   No:2849     
Title: Re:笑える検索エンジン(雑談板)    
こんばんわ。ダッシュです。

なんだかしばらく来ない間にこのページどんどん進化してますね。しかもいつの間にか一日のアクセス数1000越してるし。これも管理人さんの一途な努力の賜物ですね。


これって、確か、管理人さんが教えてくれたC言語入門のページに書かれてあった文章ですよね。でもなぜそれを検索する必要があったんでしょう?謎です。


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

Name: 管理人 [URL]  ..ハッカー(133,476ポイント)   Date: 2006/12/16(土) 21:41   No:2854     
Title: Re:笑える検索エンジン(雑談板)    
お〜〜こんばんは!ダッシュさん、お久しぶりです^−^

お元気でしたか〜^^

受験勉強大変でしょうけど、頑張ってくださいね〜☆

ほかにも面白いのありますよw

http://www.google.co.jp/search?hl=ja&q=%EF%BC%A3%E8%A8%80%E8%AA%9E%E3%80%80%E5%AE%BF%E9%A1%8C%E3%80%80%E4%B8%81%E5%AF%A7%E3%81%AB%E8%AA%AC%E6%98%8E%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%EF%BC%81&lr=

丁寧に説明してくれ!って言われても(笑)

また、以前みたいに、いきぬきに気軽に来て下さいね〜♪


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

Name: ダッシュ  ..入門者(4,002ポイント)   Date: 2006/12/16(土) 21:54   No:2858     
Title: Re:笑える検索エンジン(雑談板)    
この人、相当イラついてたんでしょうね。気持ち分かります。でもこのサイト見つけたんだったら、きっとそれも解消したでしょうね。

>>また、以前みたいに、いきぬきに気軽に来て下さいね〜♪

ううっ。ありがとう御座います。最近、受験への焦りでなかなか書き込めませんでした。高校の間はこんな感じでしか来れないと思いますが、大学になったら、もっと頻繁に来るつもりです。

実を言うと明日からは修学旅行なのです。そこで、お恥ずかしい話ですが楽しみで「取るもの手につかず」状態なのです。かといって、寝るのには早いし・・・。


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

Name: 管理人 [URL]  ..ハッカー(133,797ポイント)   Date: 2006/12/16(土) 22:00   No:2860     
Title: Re:笑える検索エンジン(雑談板)    
修学旅行なのですか〜〜!!

大学でサークルにはいらなかったら人生最後の友達との団体旅行になりますよ〜!

個人で行ったり、会社の慰安旅行だったりとは全然違うでしょうからね^^

私の時は北海道でスキーでした!!

ホント今でもいい思い出です〜^^

お土産話楽しみにしてますよ〜♪

どこいくんですか?


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

Name: ダッシュ  ..入門者(4,062ポイント)   Date: 2006/12/16(土) 22:16   No:2862     
Title: Re:笑える検索エンジン(雑談板)    
管理人さんと同じく北海道です。スキーと周回があるのですが、僕は周回にしました。all観光です。

数時間後に空の上にいると思うとなんか不思議な気分ですね。空港での手荷物検査が少し心配です。


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

Name: 管理人 [URL]  ..ハッカー(133,877ポイント)   Date: 2006/12/16(土) 22:29   No:2863     
Title: Re:笑える検索エンジン(雑談板)    
そういえば、そういう話いつかしましたっけ?

いや〜私の思い出話をしてたらあくる日になりそうなのでやめますw

私の時は確か2万までが小遣いだったけど、4万位もっていって、2万使って帰ったおぼえが(結局一緒w)

何かと規制されると違反したくなるのが高校生なんですよねぇw

夜中は、4時位までポーカーや大富豪やってましたねぇ。最初は100円がけだったのに、最後2000円がけして(5,6人でやってたから勝ったら1万)それ最後私がかってめちゃ儲けた覚えがありますw

・・って結局話ししてるし^^;

楽しんできてくださいね〜^^


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

Name: ダッシュ  ..入門者(4,364ポイント)   Date: 2006/12/16(土) 22:49   No:2865     
Title: Re:笑える検索エンジン(雑談板)    
うおお、楽しそうww

うちの学校にはうざい体育教師がいるんでそいつの目をいかに欺くかがポイントです。

そういえば以前、管理人さんからヤバイ生物教師の話を聞きましたが、この体育教師もやばいですよ。生徒がなんかしたら、大声出してキレる癖に、自分は体育の授業時間女子ばっか見てますからね。まあ、見てるだけなら、勘違いということもあるんでしょうけど。授業中、男女別れて行動してるんですが、男子は勝手にやらせておいて女子のチームに入って遊んでますから。(女友達に聞いてみたら、キモがられてました(笑))こいつにだけは、説教されたくないんで、注意しながら、悪行を・・・。

そういえば、修学旅行から帰って一週間もしたら、もう大阪行きです。京都どこに行こうかまだ迷ってます。管理人さんのアドバイスから清水が有力です。


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

Name: 管理人 [URL]  ..ハッカー(134,009ポイント)   Date: 2006/12/16(土) 22:53   No:2866     
Title: Re:笑える検索エンジン(雑談板)    
>にはうざい体育教師がいるんでそいつの目をいかに欺くかがポイント

なんでどこの高校も同じなんでしょうねw

私達の時も、部屋から部屋への移動は

・見張り役
・誘導役

を2人用意して、移動していましたよw

10時頃消灯とか早すぎw

しかしそんな教師に説教されたくないですねぇ^^;


修学旅行に、大阪旅行とは忙しいですね〜^^

すみません、私、ちょっと夕飯食べに出かけてきます。

旅行楽しんできてください(*^ー゜)ノ


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




 
[ 1 , ... ]
 
 
管理者画面   RSS   + Powered By 21style +