ぼるじょあがC/C++の宿題を片づけますYO! 18代目

このエントリーをはてなブックマークに追加
1ぼるじょあ ◆yBEncckFOU
(・3・)エェー C++房のぼるじょあですYO!
わからない宿題を片づけますYO!

【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
 問題文などの省きはやめ、エラーなどは適切に書きましょう
 全文を書いてしまうか、分かりやすくまとめましょう。

・後になって問題につけたしをするのはやめましょう。
 解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html

【歴代スレは>>2-10
2デフォルトの名無しさん:03/12/14 22:16
3デフォルトの名無しさん:03/12/14 22:26
ぼるじょあuzeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee!!!!!!!!!
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)
大金先生かもぉ〜ん。
ぼるじょあかよ。。。回答者一家はどこにいった?
宿題がわからなければ,適宜,対応します.
期限前に来室してください.

          | |
   ( ・∀・)  | | ガガッ
  と    )  人
    Y /ノ  <  >__Λ∩
     / )   .人/`Д´)/ ←>>5
   _/し' /<  >__Λ∩
  (_フ彡 / V`Д´)/  ←>>7
             /
10デフォルトの名無しさん:03/12/15 04:43
age
>>1
お久しぶりです。PC用語位ちゃんと使え委員会です。
とりあえず。17代目の終わりのほうの「ファイル出力と画面出力を行う」にレス

void dfputc(int c, FILE *fp)
{
fputc(c, fp);
fputc(c, stdout);
}

fprintf()でも似たようなことができますが、stdarg.hとか使うんで、漏れには難しいです。
14デフォルトの名無しさん:03/12/15 20:17
>>13
fprintfを作るならまだしも、使うだけならstdarg.hなんて必要ないぞ。
15c99:03/12/15 20:24
#define hoge(fp, ...) (fprintf(fp, __VA_ARGS__), fprintf(stdout, __VA_ARGS__))
>>14 素直にめんどくさかったと言い直します。ごめんよ。

#include <stdio.h>
#include <stdarg.h>
void dfprintf(FILE *fp, const char *fmt, ...)
{
va_list arg;
va_start(arg, fmt);
vfprintf(fp, fmt, arg);
vfprintf(stdout, fmt, arg);
va_end(arg);
}
17ガウスの消去法:03/12/15 20:43
ガウスの消去法の宿題で前進消去と後退代入をつかったC言語のプログラムなのですが

#include <stdio.h>
#define N3   /*連立一次 N元方程式 */

main()
{
int i,j,k;
double a[N] [N+1]={ {3,2,1,10},{2,5,2,18},{1,4,1,12} };
double d;


この続きをやってくれませんでしょうか? −=は使わないでやって頂きたいです
>>17
まずは宿題の全文をそのまま見せてください。
答える人は問題文もヒントに組みますから。
また、答えてから、条件の付け足しがあると、スレが荒れますので、
-=を使わない以外に条件があれば、それを書いていただけますか?
19デフォルトの名無しさん:03/12/15 20:51
scanf文でint関数のデータを入力して
入力された数値だけ、繰り返す文を教えてください。
#include <stdio.h>
void main(void)
{
int a,b;
scanf("%d",&a);
for(b=0;b<=a;b++)
では無理でした。
20デフォルトの名無しさん:03/12/15 20:56
>>16
"v"fprintfじゃねーか
for(b=0; b<a; b++)
そうですね.>>20
ここは私には居心地がわるいので、これから寄らないことにしますね。
>>19
}
2419:03/12/15 21:25
レスありがとうございます。
例えば↓
#include <stdio.h>
void main(void)
{
int a,b,c;
c=0;
scanf("%d",&a);
for(b=0; b<a; b++){
c=c+1;
}
printf("c=%d \n",c);
}

を実行すると・・・
10
c=10
と、本来なら55か45になるはずなんですが、どこが間違ってるんでしょうか?
25デフォルトの名無しさん:03/12/15 21:26
c=b+1;
>>24
まず、>>19から読みとれる範囲では、全く正常に動作している。
それから、「55か45」になるということは、繰り返し回数について理解していない証拠。


そして、>>24の文からすると、繰り返しとは何の関係もないc=c+1; が間違ってる。
27ガウスの消去法17:03/12/15 21:41
>>18
変数名はそのままで-=を使わなければかまわないです。
28デフォルトの名無しさん:03/12/15 21:52
>26のいうとおり「55か45」なんて
あほな言い草はないな。

でもそれを大目に見ていうとループの中は

0+1
1+1
2+1・・・
を十回やるだけだよ。
だから10になる。

1を足すからいけないんだ。
2919:03/12/15 22:00
>>26,28
すいません、0から始まるものと不等号の組み合わせの繰り返しが、今ひとつなんです。
>>28
ようやく意味が判りました。ヒントもありがとうございます。

3時間悩んでた自分が悲しい。
レスくれた方々ありがとうございましたm(_ _)m
>>29
へなちょこ御用達「printfデバッグ」
for(b=0; b<a; b++){
c=c+1;
printf("a:%d, b:%d, c:%d\n",a,b,c);
}
とすりゃ,アホでも体感できる。
3119:03/12/15 22:29
>>30
こんな事ができたとは・・・感動です。
これからのプログラムに使わせてもらいます。m(_ _)m
30さん、親切ですね。
「55か45」が気になって眠れない・・・
1+2+3+4+5+6+7+8+9 = 45
1+2+3+4+5+6+7+8+9+10 = 55
だろ。
c = c + b;
>>ガウスの消去法17
だから問題文をそのままのせろって言われてるの見えないの?
符号付き整数型の範囲を標準ヘッダから適当な値を印字することと、
直接計算することとの双方で書け。
符号付き整数の表現法は、2の補数だけと限定せず、
1の補数や単に符号ビットを持つ場合でも動くようにせよ。

標準ヘッダから適当な値を印字することは以下のようにして出来たのですが、
#include <limits.h>
#include <stdio.h>

int main(void)
{
printf("int: min %d, max %d\n", INT_MIN, INT_MAX)
return 0;
}

直接計算する方法がわかりません。
よろしくお願いします。
3617:03/12/15 23:21
ガウスの消去法のプログラムを作成し方程式を解け
ただし変数名等については、以下の通りにする

#include <stdio.h>
#define N3   /*連立一次 N元方程式 */

main()
{
int i,j,k;
double a[N] [N+1]={ {3,2,1,10},{2,5,2,18},{1,4,1,12} };
double d;

で習ってない記号は使ったらいけないので、-=とvoid、return、voidは使ってはいけません
>>35
int i=0,j=0;
while(1) {
j = i++;
if ( !(j < i) ) { printf("int.max=%d\n",j); break; }
}

こんなのしか思いつかなかった。
37
if(!(j<i))よりif(j>=i)と書こうよー
>>35
符号付き整数型のビット数から求めるのかな。
前スレの>>990はteeコマンドを作りたかったのかな?
#include <stdio.h>

void tee(const char *filename) {
  FILE *fp;
  int c;

  if ((fp = fopen(filename, "w")) != NULL){
    while((c = getchar()) != EOF){
      fputc(c, stdout);
      fputc(c, fp);
    }
    fclose(fp);
  }
}

int main(int argc, char *argv[]) {
  if (argc == 2)
    tee(argv[1]);
  return 0;
}
ずるっこ、ちゅーかなんというか。
unsigned int ui_max = -1; /* 型変換の値の一致&無符号型は2の補数表現だから、ui_maxの全ビットは1になる */
int si_max = ui_max >> 1; /* 最上位ビットが0になるから、符号付き整数の最大値 */

んで、最大値は求められるだけれど。
最小値がこまっちんぐ。
int si_min = -ui_max; /* 2の補数以外ではこれでOK */
int si_min = -ui_max-1; /* 2の補数だとこれでOK */

んー。だめじゃ。最小値がわからん。
オーバーフローさせないと、無理なんでしょうか。
規格に詳しい人、符号付き整数のオーバーフローってOKなんですか?
あ、ボケてました。
int si_min = -si_max; /* 2の補数以外 */
int si_min = -si_max-1; /* 2の補数 */
前スレではダメとか言ってた人が居たような…
>>42
マイナスでうまくいくの?
1 << (sizeof(int)*CHAR_BIT-1)とかはダメ?
46デフォルトの名無しさん:03/12/16 00:03
>>41
#include <limits.h>
int si_min=INT_MIN;
符号ビットって最上位と仮定してもいいんだろうか。
>>46さんは>>35をよんでくらはい。
>>47
>>45でいいかなーと思ってたんだが、だめかな?
3ビットの符号型整数を考えてみる。
非負の数は2の補数、2の補数、符号ビットがついただけの表現みんな、おんなじ
0(000) 1(001) 2(010) 3(011)
負数の表現だと
2の補数
-1(111) -2(110) -3(101) -4(100)
1の補数
-0(111) -1(110) -2(101) -3(100)
符号ビットがついただけの表現
-0(100) -1(101) -2(110) -3(111)
ちっと、厄介だねぇ。
あと、符号付き整数のオーバーフローは規格上、未定義ね。
>>47
2の補数なら必然的にそうならない?あ、エンディアンとかは無視してね。
52デフォルトの名無しさん:03/12/16 00:18
long型じゃだめ?
53デフォルトの名無しさん:03/12/16 00:27
longでもいいならこれで。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main()
{
char s[1002]="-ZZZZZZZZZZZZZZZZZZZZ";
long lmin;
int i;

for(i=0;i<49;i++){
lmin=strtol(s,NULL,36);
if(errno==ERANGE)
break;
strcat(s,"ZZZZZZZZZZZZZZZZZZZZ");
}
if(errno==ERANGE)
printf("LONG_MIN: %ld\n",lmin);
else
printf("見つからなかった\n");

return 0;
}
limits.hを使わんのならこんな感じ。

int min;
int max = (~0U) >> 1;
int sv = -1;
unsigned int uv = -1;
if (memcmp(&sv, &uv, sizeof(int)) == 0) {
min = -max-1;
} else {
min = -max;
}

・・・センセはこういう解答を想定してるのかなぁ。
なんか、答えてて、自信が無い。
>>54
二の補数でないとsvとuvのビットパターンが異なるの?
56デフォルトの名無しさん:03/12/16 00:48
Cにかぎった質問でなくもうしわけないのですが
複数の値(a[i])から最小値を検索するアルゴリズムで、簡単に思いつくのが
min=a[0]; for (i = 1; i <= 10; i++) { if (data[i] < min) min = data[i];}
だと思うのですが,min=a[0]と変数に初期値を与えることの出来ないような場合は
どの様な方法がありますか?

>>56
min にとても大きい値を入れておく。
58デフォルトの名無しさん:03/12/16 00:50
>>56
なんで与えられないの?
if(~max == -max)/*一の補数*/
{
min = -max;
}
else if(~max + 1 == -max)/*二の補数*/
{
min = -max - 1;
}
else/*単に符号ビットを持つ場合*/
{
min = (~max | max);
}
int min,i,j,k;

for (i = 0; i <= 10; i++) {
for (j = 1; j <= 10 - 1; j++) {
if (data[j-1] > data[j] ) { k = data[j-1]; data[i] = k; }
}
}
min = data[0];
とか?



62デフォルトの名無しさん:03/12/16 01:00
>>59
聞きたいのはunsigned int uv=-1は必ずUINT_MAXになるのかということ。
そうとは決まっていなくて、-1と同じビットパターンのままunsigned intにするのなら1の補数表現だろうが2の補数表現だろうがsvと同じになるでしょ。
>>56
そういうのはループ構成,構造化がまずいだけだろ。
自分のオツムが硬いだけと認識しやがれ。
>>59 んーじゃあ、こうやって回避しときましょ。
unsigned int uv=-1;

unsigned int uv = 0;
uv--;
>>56
for(i = 0; i < 10; i++) { min = std::min(data[i], data[i] + 1); }
とか

std::min_element(data, data + 10);
とか
>>35です。
ありがとうございました。
>>60さんのものがわかりやすかったので、使わせていただきます。
67デフォルトの名無しさん:03/12/16 01:27
>>56
言語上の仕様です。。。
6867:03/12/16 01:28
ミス。
>>58です。
69デフォルトの名無しさん:03/12/16 01:30
>>67
言語上の仕様・・・?
ここはC/C++のスレなんだけど、それ以外の言語なの?
7069:03/12/16 01:36
ああ、一行目の「Cにかぎった・・・」か。
71デフォルトの名無しさん:03/12/16 01:37
正確にはプログラムではないのですが、そのようなアルゴリズムは
ないのでしょうか?初期値を与えられませんが、当然for文中などで代入は出来ます。
72デフォルトの名無しさん:03/12/16 01:37
追記 min = a[1]みたく
すみません言葉足らずですがa[i]のとりうる範囲はあらかじめ制限されています。
あ、なんか自分でも思いつきそうな気がしてきました。
int min;
for(i = 0; i < 10; i++)
{
if(data[i] < data[i+1])
min = data[i];
else
min = data[i+1];
}
ううん、わかった人はなぜわかった?
C だろうが C++ だろうが、
min=a[0];
という代入がなぜできない?
宿題をやってる人へ

コンパイルが通ったけど結果がおかしいときはデバッガで1行づつトレースして、
変数の値が思ったとおりに変わっていることを確認しましょう。



宿題を出す人へ

デバッガがすぐ使える環境で演習をしましょう。run より先に step を教えるぐらいで。
やはり統合環境が吉かと。

TDDもいいけど。
キーがばかでかくて、値を覚えとくメモリがもったいないとか。
>run より先に step を

先生!分かりません。何ですかそれ。
M-x g d bでいいでつか?>>76
min=0;
for(i=1; i<=10; ++i) if(data[i]<data[min]) min=i;

data[min]が最小(ってことなのか?)
81デフォルトの名無しさん:03/12/16 04:05
UNIX上でCのソースをVC++でビルドしました。
UNIXではmakefileでコンパイルして、不具合なく動作していました。
VC++で、単純にビルドできなかったため、エラーが無くなるように少し書き換えた後、
実行すると、「問題が発生したため、d3find1.exe を終了します。 ご不便をおかけして申し訳ありません。」
となり、デバッグさせようとすると、「ハンドルされていない例外はd3find1.exeにあります: 0xC00000FD: Stuck Overflow。」となります。
さらに、ソースファイルの検索ということで「CHKSTK.ASMのパスを入力してください」とありますが、”CHKSTK.ASM”には心当たりがありません。
なにかよい方法があればよろしくおねがいします。
8281:03/12/16 04:08
「UNIX上で"書いた"Cのソース」の間違いです
83デフォルトの名無しさん:03/12/16 04:09
>>81
StuckじゃなくてStackでしょ。
1MB以上の大きなauto配列(つまり関数内でstaticをつけないでつくったもの)をつくっていない?
ソース見せてくれると、わかるかもしれない。
8581:03/12/16 04:14
>>83
auto配列というのは、
void mh_cal(double kk, double att, double dly, double eh[][24], double jxyz[][9])
なんかのeh[][24]とかってやつですか?
↓あたりにソース全部をさらすというのも手。
ttp://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
87デフォルトの名無しさん:03/12/16 04:16
>>85
int main()
{
int a[1024]; /* ←こういうの */
}

もしくは無限ではないがスタックが溢れるほどの深い関数の再帰呼び出しがあるか。
そのどちらかじゃないかな。
8881:03/12/16 04:21
ちょっと良くわかりませんので、結構ありますが、
ttp://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
に置いてみます。
>>81
とりあえず、
double ev[16][24],eh[16][24],mar, att, dly, kk, nl, nl0, ll, db, fre, plus;
double jxyz[GMAX][9], hsol[GMAX7P][GMAX7PP], vsol[GMAX9P][GMAX9PP], nm[1][1], norm[15000], xy[20], jxr[15000][3], jxi[15000][3], jyr[15000][3], jyi[15000][3], jzr[15000][3], jzi[15000][3], xr[15000][3], yr[15000][3], zr[15000][3];
double u_lmt=2.0, l_lmt=-2.0; /* $BB8:_NN0h$N2>Dj(B */
char fvname[30],fhname[30],filename[30],filecal[30];

static double ev[16][24],eh[16][24],mar, att, dly, kk, nl, nl0, ll, db, fre, plus;
static double jxyz[GMAX][9], hsol[GMAX7P][GMAX7PP], vsol[GMAX9P][GMAX9PP], nm[1][1], norm[15000], xy[20], jxr[15000][3], jxi[15000][3], jyr[15000][3], jyi[15000][3], jzr[15000][3], jzi[15000][3], xr[15000][3], yr[15000][3], zr[15000][3];
static double u_lmt=2.0, l_lmt=-2.0; /* $BB8:_NN0h$N2>Dj(B */
static char fvname[30],fhname[30],filename[30],filecal[30];

>>83=>>87さん、ソース見ないで、よくわかりますねぇ・・・
9081:03/12/16 05:06
>>89
ありがとうございます。
staticについて少し勉強してみます。
9181:03/12/16 05:12
>>87, 89
恐らく解決しました。
ありがとうございました。
92aar:03/12/16 09:32
#nsupdate
>update add (名前) TTL IN A (IP)
>send /改行(update要求)
>quit
あるトリガーをうけとったら上記のようにAレコードの書き換えを
Cで実現させたいのですが、わかる方お願いします。
意味不明。
妙な括弧や俺用語を使わずに平の日本語を書いてみ。
それはC/C++ではなくDBの問題ではないのかな
>>92
system()からperlをキックし,perlで書き換えろ。
その後,kill()でbindにHUP送れ。

こういうことじゃねーの?
>>95
再起動は必要としないようにしているんじゃない?
こんにちわ。
今学校の課題で「C++を使ってゲームを作れ」というのがでているんですが、
実は私、さっぱりプログラミングがわかりません。
何でこんな授業とってしまったのかわからないのですが、後の祭りです(汗
どなたかブロック崩し程度のレベルでいいので作っていただけないでしょうか?
進級がかかっている真面目なお願いです。
何も知らない初心者は数当てゲームでも作ってなさい。
>>97
「ブロック崩し程度のレベル」のゲームは、全くの初心者が作るには難しすぎます。
>>98が言うように、数当てゲームなど作ってみるのが簡単でしょう。

古典的な数当てゲーム。
1. 1〜1000までの整数をランダムに生成する。
2. 数字を入力させる。
3. 入力された数字と、1.で生成した数字を比較し、
  等しければ「正解」、より大きければ「もっと上」、より小さければ「もっと下」などと表示する。
4. 正解でなければ2.に戻る。
5. これまでに入力した回数が、10回より上なら、「もっと簡単に当てる方法があります」と表示する。
標準入力からテキストファイルを読み込み、
行を辞書順に並べ直して標準出力に出力しなさい。

[指定事項]
バブルソートや挿入法は使用しない。
行数に制限を設けてはいけない。

という問題においてlist,getlineを使用して
テキストファイルを[string s]で定義した"s"に
読み込むまではできたのですが、その後がわかりません。
sortを使うのはなんとなくわかるのですが…
教えてください。
>>100
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <iterator>

int main()
{
    std::string s;
    std::vector<std::string> v;
    while(getline(std::cin, s))
        v.push_back(s);
    std::sort(v.begin(), v.end());
    std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}
102100:03/12/16 17:36
>>101
私が作った部分をさらします。
ifstream fin;
fin.open("1.c");

if(fin.fail()){
cout << "file not found\n";
exit(1);
}
string s;
list<string> l;
list<string>::iterator i;

while(!fin.eof() && !fin.fail()){
getline(fin,s);
}

キーボード入力ではないんですが、101さんのプログラムを
付け加えてもできませんでした。申し訳ないです。
標準入力はどこにいった?
>>102
おいおい、標準入力と書いてあるじゃないか。
105100:03/12/16 17:47
>>102,103
作成したプログラム自体をプログラムにかけるので
直接読み込むファイルを指定してます。
標準入力のことを考えなきゃいけないことすっかり忘れてました。
106100:03/12/16 17:48
>>103,104の間違いです
107100:03/12/16 17:48
>>103,104の間違いです
>>105
お前のコードは捨てろ。
しかし,自己厨な言い分だな,オイ。
ん?それとも,日本語が不自由なだけなのか?
109100:03/12/16 18:16
すいません、理解できました。
言葉が足らず不快感を与えてしまったことは
謝ります。どうもすいませんでした。
101様、ありがとうございました。
110109:03/12/16 19:32
>>108
調子のんな不細工
なんか少しこないあいだにぼるじょあにのっとられたの?
         「う〜〜っ」
  ∧_∧    ∧ ∧    ∧_∧
 ( ・3・ )   (・3・)    ( ・3・ )
 ( つ⊂ )   (つ⊂)   ( つ⊂ )
  ヽ ( ノ   ( ( )    ヽ ( ノ
 (_)し'     U U'    (_)し'


        「ぼるじょあ♪」
  ∧_∧    ∧ ∧    ∧_∧
 ∩ ・3・)∩∩ ・3・)∩ ∩ ・3・)∩
  〉    _ノ ヽ    _ノ  〉    _ノ
 ノ ノ  ノ   て ,) )   ノ ノ  ノ
 し´(_)    U´ ヽ⊃  し´(_)
113デフォルトの名無しさん:03/12/16 21:14
英語50点、数学49点、国語83点、理科90点、社会67点
 
この学生の最高点を表示するプログラムを表示しなさい。

わかります??
114デフォルトの名無しさん:03/12/16 21:14
>98-99
HIGH&LOWよりHIT&BLOWのが好きだ。
凝ろうと思うとどこまでも作りこめるし。
116デフォルトの名無しさん:03/12/16 21:25
32bitのCRCコードを作成する宿題がわかりません。
過去ログに16進数のやつがあったのですが、見てもよくわからなくて。
2進数での乱数を入力し、2進数でのコード作成とのことです。
すみませんが教えてください。お礼は出世払い(体で)…(ぉ
生成多項式はx^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+
x^7+x^5+x^4+x^2+x^1+x^0
です。
>>116
・・・・・・(ぉ、はやめてくれ。
>>116
『C言語によるアルゴリズム辞典』にCRCのコードある。
そのうち、初心者の質問を答える側になっておくれ。
>>113

#include <stdio.h>

int main() {
printf("#include <stdio.h>\n\nint main() {\n");
printf("char *name[5] = { \"英語\",\"数学\",\"国語\",\"理科\",\"社会"\};\n");
printf("int score[5] = { 50, 49, 83, 90, 67 };\nint i,max,max_score;\n");
printf("max = 0;max_score = score[0];\nfor(i=0;i<5;i++) {\n");
printf("if (max_score < score[i] ) {\nmax = score[i];\nmax = i;\n}\n}\n");
printf("printf(\"最高点の教科:%%s 点数:%%d\\n\",name[max],max);");
printf("return 0;\n}\n");
return 0;
}
動くかどうかは知らんが、こんな感じか?
なんでprintfにはいってんだ?と思ったら最高点を表示するプログラムを表示するのか。
変わった問題を出す先生やね>>113
エスケープシーケンスの使い方が泣けてくるつД`)
オツ>>119
>>119
\"理科\",\"社会"\};\n");

\"理科\",\"社会\"};\n");

だな。しかしほんとにこんなんでいいのか>>113
自分自身のソースファイルを出力するプログラムを書け。
宿題ではないので、パズル程度にどうぞ。
124デフォルトの名無しさん:03/12/16 22:27
>>124
スレタイも読めんのか
126デフォルトの名無しさん:03/12/16 22:33
>>125
一応プログラミングなんですけど。
127デフォルトの名無しさん:03/12/16 22:34
>>119〜121
ありがとうございました!ほんと変わった先生ですw
>>119
バグってるぞ
printf("if (max_score < score[i] ) {\nmax = score[i];\nmax = i;\n}\n}\n");
printf("printf(\"最高点の教科:%%s 点数:%%d\\n\",name[max],max);");

printf("if (max_score < score[i] ) {\nmax_score = score[i];\nmax = i;\n}\n}\n");
printf("printf(\"最高点の教科:%%s 点数:%%d\\n\",name[max],max_score);");
129デフォルトの名無しさん:03/12/16 22:37
>>124
PDFはやめて
ここに問題文をコピーして
130デフォルトの名無しさん:03/12/16 22:43
スマソ。
PDFをコピーする方法が分からないんですけど。
>>130
お前のPCにはキーボードがないのか?見ながら打ち込め。
>>123
#include<stdio.h>
main(){
FILE *fp;
int c;
fp = fopen(__FILE__,"r");
while( EOF != (c = fgetc(fp)) )putchar(c);
fclose(fp);
}
…だめ?
133デフォルトの名無しさん:03/12/16 22:47
ttp://cc2.ce.nihon-u.ac.jp/~inui/kamoku/practical-programming-2003/2003-10_file/
ここにあるやつの宿題なんです・・・
なるほど。
136デフォルトの名無しさん:03/12/16 22:49
宿題の内容がよく分からないんですよ・・
>>PDFの人
期限過ぎてる&組むプログラムがフォートラン90なんで、
ネタだろ?
fortranはスレ違い
139デフォルトの名無しさん:03/12/16 22:52
>>137
今週出題された宿題なんです。
助けてください!
140デフォルトの名無しさん:03/12/16 22:55
>>137
本当ですよ!!
スレちがい。ここでその問題に答える人は居ない。


というか答えるべきではない。
期限は12月22日 9:00か。よかったな、あと6日だぞ。
他人が困ってるのを眺めてるのがこんなに楽しいとはw(・∀・)
144143:03/12/16 22:58
なんだ、あと6日もあるのか。ちぇ。
145デフォルトの名無しさん:03/12/16 23:00
>>141
fortranの宿題を解いてくれるスレ、ここにありますか?
心優しいお方、教えてくださいませ!
>>145
探してみたんだが…スレ一覧で fortran を探すとわずかに1 つある。
あとは gcc スレを探してみるとか…

http://pc2.2ch.net/test/read.cgi/tech/1071506396/
とりあえずスレ誘導してもらうか問題解いてもらうかはこっちでどーぞ。
147デフォルトの名無しさん:03/12/16 23:13
>>146
さんきゅー!
148デフォルトの名無しさん:03/12/16 23:14
http://pc2.2ch.net/test/read.cgi/tech/1068351911/

宿題丸投げでも、閑散としたFortranスレには丁度良いネタかも。
両方に丸投げしちゃってるよ
しかしあのPDFの資料みづらいな
あーあ。マルチポストしちゃったか。可哀想に>>PDFの人
151デフォルトの名無しさん:03/12/16 23:22
>>149
いっつも印刷するんですよあの資料を。
でも普通高校を卒業したおいらには難しく(ry
さて、大金センセのときのように、メール出しとくかね。
こんなカンジでOK?

To: inuinu@日大.jp
Subject: 宿題についての問い合わせ

今週出題された宿題なんです。
いっつも印刷するんですよあの資料を。
でも普通高校を卒業したおいらには難しく
宿題の内容がよく分からないんですよ・・
助けてください!

---
URL http://pc2.2ch.net/test/read.cgi/tech/1071407728/
>>152
ネタにしてももうちょっと頭使おうよ。
大金センセイの人には、遠く及ばなかった。すまん。
質問者のレベルに合わせたつもりだったのだが。
なんも工夫がないね。汚してゴメン。
すれ立てるまでもない質問スレでいきなり宿題やってくれなんて言うとは思わなかったよ…(涙
キーボードから任意の数だけデータを入力させるためにはどうしたらいいでしょうか?

例えば、任意の数だけ入力したら、入力したデータの平均値やら分散を求めるといった感じです。
動的に領域を確保
受け取るんじゃなくて入力でしょ>>157
最初にデータ数を受け取ってその数だけループを回す。

int c;
int cmax;
scanf("%d",&cmax);
for(c=0;c<cmax;++c) {
switch( getchar() ) {
case EOF:
break;
/* ... */
}
}
159デフォルトの名無しさん:03/12/17 02:41
「データを2分木に挿入する場合に様々な工夫(アルゴリズム)が考えられて
いる。それらについて調べ、レポートで説明しなさい。」
参考になるホームページとかあったら一緒に教えてくれるとありがたいです。

>>159 参考になるホームページとかあったら一緒に教えてくれるとありがたいです。
普通は参考になるページだけ聞くモンです。

平衡木 AVL木 B木(B tree) B*木 (B star tree)
あたりで検索。

書籍なら『定本Cプログラマのためのアルゴリズムとデータ構造』
に解説&コードがある。
161デフォルトの名無しさん:03/12/17 05:02
>>118
ありがとうございます。本屋さんで調べてみますね。

>>117
(ぉ は控えますw失礼致しました。
wも同様。
ま、それは置いといて、>>118のソースコードは
公式のサポートページから落とせるはず、ぐぐってみるがよろし。
ぼるじょあむかつく
164デフォルトの名無しさん:03/12/17 08:31
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=163
↑のソースに、
1) 引数で指定したk番目の後ろにノードnを追加する関数insertを追加。
void insert(struct node *p, struct node *n, int k)
(2) (1)で追加されたソースコードの構造体nodeの構成を以下のように改良し、
改良された構造体nodeにあわせて、ノード追加や表示などの各関数の処理の修正をする。

struct node{
char name[30];
int age;
struct node *next;

(3) (2)で修正されたプログラムを、以下のような、名前と年齢がスペースで区切られて記述された
データファイルを読み込んでリストを作成するように改良する。

Takeshi 40
Mansei 38
Gikomonar 30

(4) 指定された年齢と一致するデータを全て表示する関数findallを再帰的呼び出しを用いて作成して追加
void findall(struct node *p, int age)
(5) n番目とm番目のノードを交換する関数exchangeを追加。
void exchange(struct node *p, int n, int m)
(6) n番目の後ろにあるノードを削除する関数removenodeを追加。
void removenode(struct node *p,int n)
(4〜6は2や3で改良されたプログラムに追加していく。)

構造体のしくみがイマイチよく分かりません。
どうかこの問題をお願いいたしします。m(__)mm(__)m
(できればソースと一緒に詳しい解説を添えてくれればありがたいです)
>>164
>(できればソースと一緒に詳しい解説を添えてくれればありがたいです)
無茶言わないでください。
int型の関数int strtoi(const char *str)を使用して、
「入力した文字列を整数に変換する」という
妙なプログラムを何方か代書して頂けませんでしょうか?
自分でも一応4時間近く取り組んだのですが、どうしても無理ぽなので…。

たとえば、「23」という文字列を入力すると、数字として「23」が
表示される、という具合らしいのです。
下に自分の作ったものを載せておきますので、何方かご教授プリーズです。
やたら見映えの悪いものになってしまいますた…。
#include<stdio.h>

unsigned str_length(const char str[])
{
unsigned len=0;

while(str[len])
len++;

return(len);
}


int strtoi(const char *str)
{
while(*str=='\0'){
if(*str=='0'){
return(0);
}
else if(*str=='1'){
return(1);
}

else if(*str=='2'){
return(2);
}
else if(*str=='3'){
return(3);
}

else if(*str=='4'){
return(4);
}

else if(*str=='5'){
return(5);
}

else if(*str=='6'){
return(6);
}

else if(*str=='7'){
return(7);
}
else if(*str=='8'){
return(8);
}

else if(*str=='9'){
return(9);
}

else if(*str=='-'){
return(0);
}
}
int main(void)
{
char str[40];
int strlen;

printf("数字文字列を入力して下さい:");
scanf("%s", str);

strlen = str_length(str);

printf("%d", strtoi(str));

return(0);
}
171166:03/12/17 10:37
あ、str_lengthは、長さとって
mainでそのブンだけforで関数呼び出せば良いのかと思って作ったやつです。
すごい回りくどくてスイマセン。
こんな具合か?

#include <stdlib.h>

int strtoi(const char* str){
int ret_val = 0;
for( ;*(str) != '\0';++str ) {
ret_val * = 10;
ret_val += atoi( *str );
}
return ret_val;
}
>>166
#include <stdio.h>
#include <ctype.h>

int strtoi(char *s)
{
int n = 0;

while (*s != '\0' && isdigit(*s)) {
n = n * 10 + *s++ - '0';
}
return n;
}

/* main()はあなたが作ったもの */
174172:03/12/17 10:50
スマン。atoiはまさしくその処理を行う関数だ(藁
atoi(*str)

(*str - '0')
になおしてくれ
質問です。
8パズル(http://www.neuro.ie.niigata-u.ac.jp/sotu-kudou/node10.html
をC言語でプログラミングしないといけないんですが、
最初っから全く分かりません・・・
途中まででも良いので教えて頂けないでしょうか?
別に解くとこまでやらなくていいんだよね?
ニューラルネットがどうとか書いてあるし。

static int board[3][3];とやって、中に1から8と0を入れる。
パネルを1枚移動させる関数(引数:方向)、
あとニューロン学習と答え合わせのために、
盤面状態と答えとの距離を計算する関数を適当に作る…
盤面を出力する関数もあっていいかも
ニューラルとかニューロンとかを
大学時代に同じ研究室の奴が研究してたんだが
確か人間の脳味噌を模倣するような学習能力だっけ?
神経だろ
179デフォルトの名無しさん:03/12/17 19:11
>>165
じゃあ解説はいいので、教えてください。m(__)mm(__)m
180デフォルトの名無しさん:03/12/17 19:29
(5-7)^((2+2)*(10/2))
のような式をコマンドラインで入力させて
答えを出力するプログラムを作ってください。
おねがいします。
>>180
簡単なインタープリタだね
182デフォルトの名無しさん:03/12/17 20:00
>>180 前スレで作った気がする
前スレより
864 デフォルトの名無しさん 03/12/12 22:07
宿題の課題は、C言語で電卓のプログラムを作ることです。
解いて欲しい式は、
(5-7)^(64/((3+1)*2))
です。
お願いします。
185182:03/12/17 20:14
作るだけ作って、そのまま捨てた気もしてきた。
質問です。一人用ポーカーのプログラムなんですが
5枚引いて、いるカード、いらないカードを選んで
役判定もするような形にするんですが
基本的な物を作ってからまったく解らないので教えていただきたいのです。

用語解説
トランプ(cards)切り札のこと
スート(suit)
ランク(rank)
手札(hand)一組のトランプのこと
山札(deck)
用意(prepare)
配る(deal)
シャッフル(shuffle)
表示

*一番上に「一人ポーカー」と書いてあります
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html#1

長々と長文すいません。お願いしますm(__)m
>>186
>基本的な物を作ってからまったく解らないので教えていただきたいのです。
。。。何を教えればいいのやら。

とりあえず処理の流れとかかね。
0.現在の手札を保持する変数を作っとけ。
1.いるカード、いらないカードを選ぶ。
  ポーカーなら、不必要なカードを選択させるほうがよいだろう。
  手札の表示の際に番号でも付けて、その番号を入力させる。
  該当する番号のカードを捨てることにして、-1などの特異値で終了。
2.捨てたカードの枚数だけ補充。
3.役判定する。役判定は、各役に対して、手札が該当しているかを順に調べる。
188180:03/12/17 21:32
どうやら、うちの学校のやつが同じ宿題を頼んだみたい・・・

どうもすいませんでした。
189muro:03/12/17 23:24
C言語で数当てゲームのプログラムのつくり方を教えてください。
スコアの計算と総スコア表示と終わりを聞くようにしなければならないみたいです。
スコア計算の基準はkijun = ( int )( log( MAX ) / log( 2 ) )でやるみたいです。
シンプルなので全然構いません!おねがいします。
190デフォルトの名無しさん:03/12/17 23:26
宿題というよりC++の質問なんですけど、プログラムを書いてビルドして実行すると
別の小さな黒い画面に実行結果がでます。そして、レポートで実行結果が必要なので
この実行結果をコピーしたいんですが、コピーの仕方を教えてもらえませんか?

お願いします。
・・・
>>190
ctrl+alt+del
キャプチャで画像として取り込む。
>>190
上のボタン
今日はゲームが多いな

>>190
コマンドプロンプトのこと?
それなら右クリック→範囲指定→選択→右クリック
>>190
連載:Windows 2000コマンドライン徹底活用 
第2回コマンド プロンプト入門(その2) -- 3.コマンドウィンドウにおけるコピーと貼り付け
http://www.atmarkit.co.jp/fwin2k/operation/command002/command3.html
197デフォルトの名無しさん:03/12/17 23:44
C++で実行画面の結果のコピーの仕方を教えてもらえませんか?
198デフォルトの名無しさん:03/12/17 23:46
197ですが>190の者です。すいません。画面が止まってて書き込み失敗したかと思ってもう一回かいてしまいました。
申し訳ありませんでした。
あと190に答えてくれたみなさん、ありがとうございました。
>>189
数当てゲームと一口に言っても、種類は山ほどあるのだが。
200muro:03/12/18 00:14
基本にのっとった感じで条件に当てはまっていればどんなものでも構いません!
数あてゲームってこんな感じでしたっけ?
#include <stdio.h>

int joke(void);

int main(void)
{
printf("1〜4の数字を思い浮かべてください。コンピュータがあなたが思い浮かべた数を当てます\n");
printf("思い浮かべたら、Enterキーを押してください\n");
getchar();
printf("あなたが思い浮かべた数字は%dですね?\n", joke());
return 0;
}




int joke(void)
{
return (2 << 7) / 123 + !0;
}

/* 条件にあってないが */
日本語が変>>201
1〜4のうち、好きな数字をひとつ思い浮かべてください。
だ。
203164:03/12/18 01:03
前半3問だけでいいんで・・・m(__)m
>>203
急いでいるのですか?
>200 (=>189)
⊂⌒~⊃。Д。)⊃
落ち物パズル作ってください!といわれた場合、どういうものを作る?
テトリス系、ぷよ系、ぱずるだま、ヨッシーの卵?山ほどあるというのはそういう事だ。

スコア計算の方法が決まっている以上、ルールは指定されてるだろ?
問題文ぐらいちゃんと読んでくれ。
206164:03/12/18 01:20
>>204
はい・・・今日までには何とか完成させておきたいのです。
普通の線形リストじゃないの?
>>206
いや。皮肉だったのだが、いやぁお付き合いしたくないですな。

くわしいことは前スレ 869にまとめがある。
http://pc2.2ch.net/test/read.cgi/tech/1070469896/869
>>166
int strtoi(const char *str)を作れって

{ int n; return (str && sscanf(str,"%d",&n)==1)?n:0; }

ってな事でOK?
1次元整数型配列を用意。(要素数は任意)
キーボードから任意個の整数データを入力。
入力されたデータの@最大値A最小値を求めて画面表示。

ただし、@とAの処理について条件を満たす関数を作成せよ。

@はint max(int *, int)
第一引数は配列アドレス、第二引数はデータ数、返り値は最大値。

Aはint min(int *, int)
    第一引数と第二引数は@と同じで、返り値は最小値。


条件の通りに関数が全く作れない状況で困っています。
どなたか宜しければお願いします。
211デフォルトの名無しさん:03/12/18 04:30
>>164
誰かやるだろうと思ってずっと放っておいたが、
結局誰もやらないようなので、(6)まで全部やってみた。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=170
ところでちょっと意外だったのは
(5) n番目とm番目のノードを交換する関数exchangeを追加。
が、案外複雑でいろいろな「トラップ」がしかけられていた事。
これ、もうちょっときれいに書ける奴はいないか?
void exchange(struct node *p, int n, int m){
struct node *np, *mp, tmp;
int i, d;

if(!(d = n - m))
return;
else if(0<d)
n -= d, m += d;
for (np = p, i = n; i -- ; np = np->next)
assert(np != NULL);
for (mp = np, i = m - n; i -- ; mp = mp->next)
assert(mp != NULL);
tmp = *np;
*np = *mp;
*mp = tmp;
mp->next = np->next;
np->next = tmp.next;
}
int max(int *x, int y) {
int tmp = x[--y];
for (; y-- ;) if (tmp < x[y]) tmp = x[y];
return;
}
int min(int *x, int y) {
int tmp;
if (y < 2) return x[0];
tmp = min(x+1, y-1);
return x[0] < tmp ? x[0] : tmp;
}
>>212
>tmp = *np;
>*np = *mp;
>*mp = tmp;
それは「ノードを交換」とは言わんだろ。
んー。よくわからんが、
mp : m番目の要素
np : n番目の要素
m_prev : m-1番目の要素
n_prev : n-1番目の要素
だとすると、
m_prev->next = np;
n_prev->next = mp;
tmp = mp->next;
mp->next = np->next;
np->next = tmp;
か?
>>215
mとnの差が1しかないときに正しく動くか不安。
>>213
whileを覚えよう
int foo( void *x1, void *x2 ) {
 return *(int*)x2-*(int*)x1;
}

int max( int *x, int y )
{
 qsort( x, y, sizeof(int), foo );
 return x[0];
}

int min( int *x, int y )
{
 qsort( x, y, sizeof(int), foo );
 return x[y-1];
}
219164:03/12/18 08:40
>>211
ありがとうございます。
実行してみたんですけど、
入力して実行結果を表示させるには、例えば何を入力すればいいでしょうか?
>>218
> int foo( void *x1, void *x2 ) {

void *じゃなくてconst void *
>>219
どういう結果を表示させたいのか分からんから
何ともいえない・・・
222164:03/12/18 08:59
>>221
>>164にすべて・・・・
>>222
画面にデータを入力したあと、CTRL-Zを押してみな。

って事が分かっていないのか?
やっぱり何が分かっていないのか分からん。
224164:03/12/18 09:10
Chinko 90
Manko 50
Omeko 47
[ 0][insert 123][Chinko 90][Manko 50][Omeko 47]
[insert 123]
[ 0][Chinko 90][insert 123][Manko 50][Omeko 47]
[ 0][Chinko 90][insert 123][Omeko 47]
-- Press any key to exit (Input "c" to continue) --

こんな風に出てきました。
一番左の0ってのは・・・?
>>224
>一番左の0ってのは・・・?
このソースの元の設計が悪いため、リストの最初に
必ず無駄なノードを入れなくてはいけない(0番目のデータ)。
それが表示されているだけ。

どうやら本当によく分かっていないようだから、ついでに補足しておく。

>[ 0][insert 123][Chinko 90][Manko 50][Omeko 47]
[ 0][Chinko 90][Manko 50][Omeko 47]
の0番目の後に[insert 123]を追加した結果

>[insert 123]
年齢が123と一致するデータを全て表示した結果

>[ 0][Chinko 90][insert 123][Manko 50][Omeko 47]
1番目と2番目のノードを交換した結果

>[ 0][Chinko 90][insert 123][Omeko 4]
2番目の後ろにあるノードを削除した結果
9つの入力された文字を逆から表示させるプログラムを出来るだけ簡単な方法で作ってください。

>>226
※入力された文字が順に配列cに入っているものとする。

for ( i = 8; i >=0 ; i--) putchar(c[i]);
175で同じ学校の人が質問してるみたいですが
自分も全く分からないので助けてください。プログラムお願いします。

1〜8まで数字が書いてある8つの正方形の駒が3×3の空間に置いてある。
空白部に駒を滑らせて入れる操作を繰り返して下の図の終了状態を作りたい。
これを解くプログラムを作成しなさい。
初期状態      終了状態
2 8 3 1 2 3
1 6 4 8 4
7 5 7 6 5

お願いします!




>>226
>出来るだけ簡単な方法で作ってください
ほぼ正解です。100点満点中80点ぐらい。
ただし、勉強を始めて1週間目くらいの女子中学生を演じれば
もっと簡単に作れます。
230228:03/12/18 12:05
すいませんずれました。

初期

二 八 三
一 六 四
七 白 五

終了
一 二 三
八 白 四
七 六 五

これでお願いします。
白は空白部分のことです。
>>228

六を下にずらす。
八を下にずらす。
二を右にずらす。
一を上にずらす。
八を左にずらす。

これじゃだめなんだろうね・・・。
232前スレの681です:03/12/18 13:49
前スレで817さんが書いてくれたコードなのですがVectorを使わずにやる方法ってないでしょうか?817さんごめんなさい、どうしても最下部のwhileの中が私の頭では理解できませんでした。
#include <iostream>
#include <queue>
#include <stack>
int main(){
int MAX_DEPTH;
char array[100];
cin >> array;
cin >>MAX_DEPTH;
std::queue<char> base;
for(const char *ptr=array;*ptr;++ptr){base.push(*ptr);}
std::stack<char> comb;
std::vector<int> count(MAX_DEPTH,0);
int depth=0;
while(1){
for(;depth<MAX_DEPTH;++depth){
comb.push(base.front()); base.pop();
}
for(std::stack<char> tmp(comb);!tmp.empty();tmp.pop()){std::cout<<tmp.top();}
base.push(comb.top()); comb.pop(); --depth;
std::cout<<' ';
while( ++count[depth] == (strlen(array) - depth) ){
if(depth==0) goto end;
count[depth]=0;
base.push(comb.top()); comb.pop(); --depth;
}
}
end:
std::cout<<endl; return 0;
}
>>230
空白をどう扱うかわからんが3×3のarrayを使って
swapさせればいいんでね?
初期状態が固定なのか任意なのかによって、
だいぶ難易度がちがう
>>228

とりあえず、アルゴリズムも糞もないプログラムならできたぞ。
とてもここで見せられるソースじゃないが。
>>228
初期状態が任意の場合は1手毎に空白の移動可能な
全てのパターンについての木構造を組み立てて行けば良いのだろうけど・・・
とても解けそうに無い配置や以前と同じ配置になるような
部分の木は切り捨てないと遅いだろうなぁ・・・オーダが指数関数になってまう。
237教えてください。:03/12/18 18:19
整数nとr(n>r)を入力して、組み合わせ数n_C_rを求めるプログラムを求めよ。
ただし、n<=rの時は入力しなおすようにすること。nの最大値は10くらいに
すること。
階乗計算では、再帰関数をうまく利用すること。ちなみに、
n_C_r = n!/((n-r)!r!) です。

教えてください。
>>232
再帰版のは理解できたのか?
そのstack版は再帰版と1:1の対応を持っていて、
最初のforで再帰の底まで潜り、
最後のwhileで再帰を戻ってくる。

また、"stack"と"depthを添字とするvector"は相互に置換可能で
vector[depth] → stack.top()
++depth → ++depth; stack.push(0)
count[depth]=0; --depth → --depth; stack.pop()
という関係で置き換えられる。
>>237
int factorial(int i) {
return i == 1 ? i : i * factorial( i - 1);
}
とりあえず、再帰を使った階乗計算。
問題:
西暦を入力し、その年に13日の金曜日がある場合、「ジェイソン」と表示するプログラムを作成

条件:
関数は作成不可
基本的にループはforを使う

明日提出の宿題なんですが、よろしくお願いします。
>>240
不可能
242240:03/12/18 19:54
>>240 補足
main関数以外に関数を作るのは不可ということです。
>>243
へぇ〜そうなんだ。じゃあ、
int main() {
int year;
printf("西暦を入力:");
scanf("%d",&year);
printf("ジェイソン\n");
return 0;
}
でいいわけだ。
245デフォルトの名無しさん:03/12/18 20:31
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=32
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=33
上、他の人作
下、上のを参考に自作

上はもちろんちゃんと動くのですがほぼ真似したはずの下がちゃんと動きません。
今考えられる大きな違いは、関数名、i++と++i、forとwhile、C主体とC++主体、ぐらいです。
動かない理由を教えていただけたらと思います。
>>245
++i と i++ の違いがわかってないんじゃない?
>>245 とりあえず、ここと思う点を見つけてみた。くだらないミスと思われるが。
元:
void trypiece( int x, int y )
{
...
for( ; p->name == name; ++p ) { // ←
if( !ispieceok( x, y, p ) )
continue;
pieceset( x, y, p );
used[i] = TRUE;
return;
}
...
}
改造版:
void search(int x,int y)
{
...
for(; p->name ==name; p++) /* ← */
if(!set_ok(x, y, p))
continue;
piece_set(x, y, p);
used[i]=true;
return;
...
}

>>246
for文のincrementにしか使ってないように見えたので、それはないと思う。
248164:03/12/18 20:44
>>225
ありがとうございます。

一番左の0を何とか改良して消さないとな・・・
249245:03/12/18 20:47
>>246
多分分かってないと思います、i++が使ってから増やして、++iが増やしてから使うとしか覚えてません
前に、確認のために色々やってみましたが良く分かりませんでした。
>>247
レスありがとうございます、ちょっと試してみます
250245:03/12/18 20:51
>>247
あ、出来ました・・・カッコ忘れるとは恥ずかしいミスでした・・・
ありがとうございました。
>>232
再帰版とスタック版の対応付けがわかりやすいよう、新しく起こした。
vector→stackも置換済。しかし、stackは遅いぞぅ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=30
253681:03/12/18 23:05
>>238,252
ありがとうございます。もう一度、よーく順を追って
考えて見ます!!
文字列を入力してポインタ変数を使用して降順にならび替えて表示するのがよくわかりません
ポインタ変数をどうやって使えばいいんでしょう?
宿題は全文を書いてください
文字列を入力してポインタ変数を使用して降順にならび替えて表示する
というのが問題です
a[0] = 5
a[1] = 49

 ‥   
のような30個の整数を入力データファイルに用意して
合計を求めるプログラムを作成するという問題です。
よろしくお願いします。30個の整数を入力データファイルは
ただ書けばいいいのでわかるんですが、その合計を求める
プログラムがわかりません。

int sum(int* data,,unsigned size) {
int ret_val = 0;
unsigned i = 0;
for( ;i<size;++i)
ret_val = data[i];
return ret_val;
}

int main(){
int data[30];
int sum_of_data;
/*入力部分*/
sum_of_data = sum(data,sizeof(data)/sizeof(data[0])
}
259デフォルトの名無しさん:03/12/18 23:22
>>257
いや、おまえだけじゃないけどな、あれだ。

ナニがしたいんだかわかんねーよ。

っとすまん
>sum_of_data = sum(data,sizeof(data)/sizeof(data[0])
sum_of_data = sum( data, sizeof(data)/sizeof(data[0]) );
>>257
一つ聞くが入力データファイルは
5 49 ..
のような整数列だよな?
a[0] = 5
a[1] = 49
とか書かれてないよな?
まさかと思うが
>>258
ありがとうございます!

>>261
そうです
今年の単位がかかった課題なんですが、どうも詰まってしまいます。

・ふたつの数の四則演算をする電卓プログラム
算用数字と+-*/以外の文字を入力する、またはゼロの除算をすると「エラー」と表示させる、
float、if、else等を使った簡単な構造のもの

というものです。お願いします…。
そうですかそうですか
だ、ダメですか…?
>今年の単位がかかった
とか書くと、うずうずする人も多いんじゃない?
「初心者です」に通ずるものもあるな。
ああ、なるほど…('A`)
>>263 はいw
#include <iostream>

int main() {
char op;
float n, m;

std::cin >> n >> op >> m;

bool error = false;
if (op == '+') n += m;
else if (op == '-') n -= m;
else if (op == '*') n *= m;
else if (op == '/') {if (!(error = (m == 0))) n /= m;}
else error = true;

if (!error) std::cout << n << endl;
else std::cout << "error" << endl;

return 0;
}
>>268
大感謝、どうもありがとうございます。
首の皮がつながりそうです。(´∀`)
>>269
C++の宿題だったのね・・・
マジレス。
ファイルビットのチェックしないと
きちんと数値変換が成功したのかわからないので
問題の要件を満たさない。

あと気になったんだが数値と演算子以外が入力されたらって
入力は整数のみなのか?(除算あるから答えは整数にならんが)
小数点にしろ科学表記にしろ数値以外が入ると思うのだが
こういうレベルの課題で、エラーチェックをまともにやってるのは滅多に見ないよ。
「数値」であって「数字」ではないから、別にいいんじゃね?
>>271
今度はマジレスですか。そうですかそうですか
if (op == '+') n += m;
else if (op == '-') n -= m;
else if (op == '*') n *= m;
else if (op == '/') {if (!(error = (m == 0))) n /= m;}
else error = true;

switch(op) {
case '+': n+=m;break;
case '-': n+=m;break;
case '*': n*=m;break;
case '/': if( fabs(m) < EPSILON ){ n/=m;break;}
default: error = true;

推奨。switchはif else 羅列でも別にいいけど
m==0 は許せん。
十分小さい正の値EPSILONを設定して判定しないといつまで経ってもtrueになる。
>>274
でさ、その勢いで入力チェックも回答したらどうよ?
ふむ。なんかなぁ。
面白そうなのは、ニューラルネットで探索ってのかな。
でも、理屈を理解するのに時間がかかりそうだから、ちょいとパスですわ。
std::cin >> n >> op >> m;
の後ろに
if( std::cin.fail() )
error = true
error = true ってかこんな場合はオペレータの処理に行く必要はないな。
エラー処理ブロックにif else でも gotoでも使って即刻飛んでくれ。
278268:03/12/19 01:53
>>274
いろいろどもです。ひとつ意図していないつっこみいただいたので質問です。

>十分小さい正の値EPSILONを設定して判定しないといつまで経ってもtrueになる。
m == 0 ってやっちゃうのは、そんなに許せないものですか?
279268:03/12/19 01:56
s/意図/想定/
浮動小数点数型の内部表現ってのは完全に実数をエミュレートできてない。
詳しくは説明しないけどたとえば
1.0 == 0.9 + 0.1
が成立するとは限らない世界なんだな。
だから一致判定する場合は
( a == b ) でなくて
( fabs(a - b) < EPSILON )とし
差が十分小さいかどうかで判定してやる必要がある。
あとこの条件に対しては「いつまで経ってもtrueにならない」の間違いな。スマン
281デフォルトの名無しさん:03/12/19 02:06
>>257
#include <stdio.h>
int main(vod)
{
int a[0]=5. a[1]=49,,,,,,,,a[29]=6;
sum=0;
for(i=0;i<30;i++) sum+=a[i];
printf("合計=%d", sum);

return 0;
}

宣言は
int a[30]={5,49,,,,,,,,,,,,,6};
の方がスマート。
天然か?>>281
データはファイルから読み込むんだぞ? 初期化してどうする。
283デフォルトの名無しさん:03/12/19 02:18
2次方程式ax2(2乗)+bx+c=0の係数a,b,cを与えて解x1,x2を
解の公式で求める関数kaiを作りなさい。ただし、a=0なら
「a=0デス」と表示して終了。また、判別式dが負なら「キョスウカイ」と
表示して終了するものとする。返却値はx1,x2を求めたられたとき
1、求められなかったとき0を返すものとする。各数値はfloat型とする。

これを解いて下さい。出来れば数学関数は使わずにお願いします。
284デフォルトの名無しさん:03/12/19 02:22
yahooに自動で接続してオークションサイトから特定データを引っ張ってくる方法を
考える。。。

なんだこの宿題。まったくわからんw
285268:03/12/19 02:26
>>280
この場合もそういう格好にしておかないといけない理由がよくわからないんです。

2.2250738585072014e-308 より小さい値などは 0 と一致してくれるんですけど。。。
↑うちの環境の DBL_MIN
>>284
そういうネタ1年くらい前にどこかのスレで聞いたような気がするよ
287デフォルトの名無しさん:03/12/19 02:40
>283
解の公式で解を求めると言うより問題を読む限り判別式を求めるプログラムじゃない?
返り値が0と1ってね。。。
288デフォルトの名無しさん:03/12/19 02:49
>283とりあえず問題にそって
x1とx2の値を計算しないって納得いかないけどね。
int kai(float a,float b,float c)
{
float i=b*b-4*a*c;
if(a==0){printf("a=0です\n");return 0;}
if(i<0){
printf("虚数解です。\n");
return 0;
}
else{
return 1;
}
}
>>285
返信が来るとは思わなかった。まじめに答えようか
それは int 型の 0 をdouble(今はfloatだが)にキャストした結果がDBL_MINになったからだな。
今回の場合、というのがどこまで限定しているのかわからないが、
その「一致してくれる」という結果は
const double dzero = 0;
float fa = 0;
if(dzero == fa) /*faはdoubleに格上げされる*/
のような演算で容易く崩れてしまうほど脆いものであって
迂闊に期待していいものではない。

実際問題、(1.0/(2.5-2.5))のような入力を
受け入れるとなるだけで黄色信号だ。……これも今回の範囲ではないがな。

ともかくファイルから 0 や 0.0 と入力した場合にも
同じくDBL_MINに変換されるという保障があるのなら
「この場合」
つまり
「入力ストリームから直接変換した値とプログラム中のリテラルとの比較」
においてはそう書いても構わないんじゃないか?
>>289
ああ、スマン。
両方に 0 が入ってる場合は一致する可能性の方が高いな。
もっと違った例の方がよかったわ
きっとx1,x2はポインタで渡して格納させるつもりなんだろ?

あといつも気に入らないんだがなんで式の判定や計算と表示を一つの関数でやってしまうんだろ?
普通分けるだろ
つーか>>289では
doubleにおけるゼロとDBL_MINが等しいような書き方だが違うな。
正しくはDBL_MIN以下の数と0が
両方ともdoubleのゼロに変換された、だな。
結構あやしいこと書いてる。
うぶQすまん。
C言語の浮動小数点演算に関する、よい資料はありません?
書籍でもURLでもいいので教えてください。
さて判定部分はできてるわけだがときに>>283よ、
解の公式は言えるか?
sqrtが数学関数ってわかってるか?
お前は俺達にsqrtをわざわざ自作しろと言っているんだぞ?
そんなことするくらいなら初めから
数値計算で近似解求めろと言われた方がマシだわ。
>出来れば数学関数は使わずにお願いします。
出来ないことはないが、sqrt()を組むよかライブラリ使うほうが素直。
>>294-295
newton 法のコーディングなんて5,6行ですむのでは?

「printf() を使わずにお願いします」と言われているのならともかく、
騒ぐほどの問題でもないと思われ。
297デフォルトの名無しさん:03/12/19 05:04
>>296
ではお願いします。
冬になって、理屈屋が多くなった?
前はけっこうコードが出てくることが多かった気がする。
ちゅーか、答えを出してる人に、いちゃもんつけてるだけな気もする。
>>297
>ではお願いします。
・・・ハァ、下らねぇ。
これで納得するか?

double Sqrt(double x){double s,l;
if(x>0){if(x>1) s=x; else s=1; do{l=s; s=(x/s+s)/2;}while(s<l); return l;}
if(x)fprintf(stderr,"error\n"); return 0;}
>>299
無理矢理一行にしても納得できるわけがありません。
>>300
嫌なら20行でも30行でも好きなだけ勝手に展開すれば?
>>301
>>296
> newton 法のコーディングなんて5,6行ですむのでは?
>>302
はぁ? だから何?(w
>>303
5,6行で書けと言っているんだよ。
ただし無理矢理行数を減らさないようにしてだ。
>>251もその気になれば6行まで縮められるな。
>>304
頭に血が上っているのは分かるが、2ch とはいえ、仮にも文章に残るのだから、
傍目から見て恥ずかしい書き込みするのはやめとけ。
2,3日して冷静になった後読み返すと、自分でも恥ずかしくなるぞ。

ま、人間は皆そういう馬鹿をやって成長していくんだろうけどな。
>>306
恥ずかしいのはあんたの方だろ?
自分でできないことを平気で言うんだから。
ちなみに俺は294でも295でもなく、あんたが簡単に書けると言っていることや「騒ぐほどの問題でもないと思われ。」と言っていることに反論しているわけでもない。
んー。やっぱ、俺はここで、もうプログラム書くのやめよかね。
ちょっと書けるものは書いておこうかとも前は思ったんだが。
なんだかねー。
>>304
>5,6行で書けと言っているんだよ。
>ただし無理矢理行数を減らさないようにしてだ。

あのなぁ、プログラミングテクニック云々以前に、
まずはこんな子供っぽい発言をしないように矯正した方がよいかも。
もし自分でこの文章を「子供っぽい」と感じないなら、
もう何も言うことはない(って自分で理解してたらそもそもこんなレスしないか)。

そういえば、最近の子供達ってまだ「何時何分何曜日、地球が何回廻った時」って
フレーズを使っているのだろうか?
>>309
5,6行は言い過ぎだったと認めない方が子供っぽいと思う。
>>309
お前・・・・2、3日でできると言ってやらないタイプだろ?
外野もじゃんじゃん煽ってクレ。
313デフォルトの名無しさん:03/12/19 07:16
宿題も自分でできない、だだっこさん。
ダダこねる子に教えちゃう、あまやかしさん。
横から、言いがかりをつける、からかいさん。
それに反応しちゃう、つられさん。

見てるぶんには楽しいぞ。もっとやれ!
宿題も自分でできない、だだっこさん。>>283
ダダこねる子に教えちゃう、あまやかしさん。>>294
横から、言いがかりをつける、からかいさん。>>296
それに反応しちゃう、つられさん。>>297

こんなところか
315甘やかしさん:03/12/19 08:12
なんか火付け役になっちまったんで責任取る。
double sqrt(double y,double x, double e){
double dx;
if( y<0 || e<0 ) { fprintf(stderr,"ERROR!"); return 0.0F; }
while( ( dx = (x*x-y)/(2*x) ) > e || dx < -e ) x -= dx;
return x;
}
absすら使えないってんで条件式が横に長いが、これが限度か。
3行目を1行にまとめるのは無理矢理だって思うのなら
そこを2行に延ばす代わりに
dxを全部式に展開して変数宣言なくしてくれ。
つーか正直俺はあんな言い方してきた奴が
あんなまわりくどいコード書いたことの方に面食らったんだが。
つーかエラーがあったらそのまま初期解を返す仕様にしちゃえば
while節をelse節の中にぶち込むことで
複数のリターン文なんて醜悪なものを撤廃できるね。
たたき台にしてももっとまともなものを出して欲しかったよw
>>315
これしきのコードをいじくり廻して得意げになるのはやめてくれ。
みっともない。しかも改悪だし。

たとえば引数 x が 0 だったらどうする? とかさ。
319デフォルトの名無しさん:03/12/19 09:45
z[1]=V1[N-1]+R*V2[N]
z[2]=V1[N-2]-L[2][1]*z[1]
z[3]=V1[N-3]-L[3][1]*z[1]-L[3][2]*z[2]
z[4]=V1[N-4]-L[4][1]*z[1]-L[4][2]*z[2]-L[4][3]*z[3]


z[N-1]=V1[N-(N-1)]-L[N-1][1]*z[1]-L[N-1][2]*z[2]…L[N-1][N-2]*z[N-2]+R*V2[0]

といった計算をCでプログラムしたいのですが誰かよろしくおねがいします。
ちなみに、R…ある値(定数) V2[0],V2[N]も値がきまっています。

320デフォルトの名無しさん:03/12/19 09:52
>>319
行末にセミコロンをつければコンパイルは通るぞ。
321デフォルトの名無しさん:03/12/19 09:53
ああもちろん変数宣言はして
おまいら7行スレにでも逝ってくれ。
323デフォルトの名無しさん:03/12/19 13:27
http://www.j.dendai.ac.jp/~mouri/prog2/exe/11/
c言語でおながいします。提出すぐなんです。
おまいらまったり汁!良い年を迎えようではないか!
>>323
すみません、無理です。
次の方、おねがいします。
326デフォルトの名無しさん:03/12/19 13:44
>>323
11-a

FILE *openCommandlineFile(int argc, char **argv)
{
FILE *fp;
if(argc<2){
fprintf(stderr,"ファイル名を指定して下さい\n");
return NULL;
}
else if(argc>2){
fprintf(stderr,"引数が多すぎます\n");
return NULL;
}
fp=fopen(argv[1],"r");
if(!fp){
perror(argv[1]);
return NULL;
}
return fp;
}
327デフォルトの名無しさん:03/12/19 13:47
文字数を数えるのか・・・
改行コードの変換は考えなくていいのかな。

>>323
11-a

FILE *openCommandlineFile(int argc, char **argv)
{
FILE *fp;
if(argc<2){
fprintf(stderr,"ファイル名を指定して下さい\n");
return NULL;
}
else if(argc>2){
fprintf(stderr,"引数が多すぎます\n");
return NULL;
}
fp=fopen(argv[1],"r");
if(!fp){
perror(argv[1]);
return NULL;
}
fseek(fp,0L,SEEK_END);
printf("文字数は%ldです。\n",ftell(fp));
rewind(fp);
return fp;
}
328デフォルトの名無しさん:03/12/19 13:56
実行結果を見る限りUNIXだからいいかぁ
>>323
11-b
FILE *openCommandlineFile(int argc, char **argv)
{
int nc,i,c;
long offset;
FILE *fp;
if(argc<2){ fprintf(stderr,"ファイル名を指定して下さい\n"); return NULL; }
else if(argc>2){ fprintf(stderr,"引数が多すぎます\n"); return NULL;}
fp=fopen(argv[1],"r");
if(!fp){ perror(argv[1]); return NULL; }
do{
printf("位置: ");
scanf("%ld",&offset);
}while(offset<0);
do{
printf("文字数: ");
scanf("%d",&nc);
}while(nc<0);
fseek(fp,offset,SEEK_SET);
for(i=0;i<nc&&(c=fgetc(fp))!=EOF;i++)
putchar(c);
rewind(fp);
return fp;
}
329デフォルトの名無しさん:03/12/19 14:10
>>323
11-c

void kadai11c(FILE *fp)
{
char offset[256];
int nc,i,c;
while(1){
printf("位置: ");
fgets(offset,sizeof offset,fp);
if(*offset!='+'&&*offset!='-'&&!isdigit(*offset))
return;
printf("文字数: ");
scanf("%d",&nc);
if(nc<0)
return;
fseek(fp,strtol(offset,NULL,10),isdigit(*offset)?SEEK_SET:SEEK_CUR);
for(i=0;i<nc&&(c=fgetc(fp))!=EOF;i++)
putchar(c);
rewind(fp);
}
330323:03/12/19 14:15
どうもありがとうございます。本当に助かりました。
質問なのですが連結リストを使って
int remove_from_head();というのを作るとき

int remove_from_head()
{
ListNode* temp = head;
int value = head -> data;
head = head->next;
delete temp;
return value;
} こういう風になるとすると、もしint remove_from_tail();

を作るなら同じように
int remove_from_tail()
{
ListNode* temp = tail;
int value = tail-> data;
tail = tail->next;
delete temp;
return value;
}
でいいのでしょうか??
あともう一つなのですが、int add_to_tail()
だったら
int add_to_tail()
{
ListNode* temp = tail;
int value = tail->data;
tail = tail->next;
new temp;
return value;
}
で、よいのでしょうか??
headやtailがどっから来てどこへ消えてるのか分からんのだが、

int remove_from_tail()
{
tail = tail->prev;
tail->next = NULL;
}

int add_to_tail()
{
tail = tail->next = new ListNode;
}

こんな感じにならんか。

ちゅーかソースが断片的すぎて、抽象的に書いてるだけなのか
そのコードをそのままコンパイルする気なのかすらワカンネ
>>333
ありがとうございます。コンパイルはしません。
ただ、明日、テストがあるのですが紙に連結リストの
コードを書くからそれにint removefromhead(), int removefromtail();
int addtohead(), int addtotail(); を書き加えろという問題だそうです。
紙に書かせるという時点でえ?って感じなのですが・・・。
>>331で最初に書いたremovefromhead()は先生がヒントといって
くれたものです。
>>331-332
ListNode クラスの定義を公開しない限り、誰もまともに答えられる訳が無いだろ。

>>333
>headやtailがどっから来てどこへ消えてるのか分からんのだが、
new や delete が再定義されているという好意的な解釈はいかが?
ListNodeの定義くらい書け。
new temp;って何をしているつもりだ。
headとtailはどこにあって、どこから参照されるんだ。
>>334
>>>331で最初に書いたremovefromhead()は先生がヒントといって
>くれたものです。
それは先生のネタか、若しくは先生自体がネタ。
338デフォルトの名無しさん:03/12/20 00:56
あ、あの教えてもらってもよろしいですか。お願いします

プログラムと表は
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html
「【汎用】質問するときソースを貼るスレ」に張ったのでお願いします

表1はヨーロッパのオリンピック予選出場国名とそのオッズをまとめたものです。

課題3
フランス、ロシアは敗退しました。
この結果、表2のような最新のオッズになりました。
プログラムを修正し、優勝オッズの低い順に表示するプログラムにしてください。

課題3をお願いします。(_ _(--;(_ _(--; ペコペコ
>>338
俺の勉強不足なだけかも知れんが、このままじゃぁ何をやりたいのかよくわからん。
書いてみるから、ちと待たれ。
>>338
とりあえず、「ソース貼るスレ」に貼っといた。
過去に作ったプログラムを流用して書いたから、要求を100%満たしてはいないけど、ヒントにはなると思われ。
>>338
あ、あと、このプログラム、随分無駄な部分があるかも知れん。それから、コメントは全部いんちき英語だけど、頑張って読んでくれ。
342338:03/12/20 11:29
341さんほんと返信ありがとうございますです。がんばってみます
343いなむらきよし:03/12/20 14:57
キケー!

  \ | /   サイタマ?
   / ̄\
 ─( ゚ ∀ ゚  ┼ ┼
   \_/
  / | \
失礼します。C言語で宿題が出たんですが、問題の意味がよく分かりません。

char型配列s1,s2を用いて、s1には姓名(フルネーム)を、s2には姓だ
けを表示させるプログラムを作成せよ。ただし、s2に関してはstrcpy()を
用いること。

という問題なんですが、どういうことをやればいいんですか?
>>345
そんなもん、問題出した奴にきけ。

心配するな。 その問題文は誰が読んでも意味不明だ。
347デフォルトの名無しさん:03/12/20 18:57
>345
強引にstrcpy()を使えってことか?
出題者はアフォ
そんな汚いプログラムを書くようなやつを育ててどうする。
348345:03/12/20 19:37
やっぱりそうですか・・・意味不明ですよね。
漏れの読解力がないのかと思ってたんですけど
ちょっと安心しました。つっても今度の月曜に
出さなきゃまずい・・・
349デフォルトの名無しさん:03/12/20 19:40
宿題です。誰か助けてください。

立体 Queen 問題

8 X 8 X 8 の立体チェスボード上で
縦横斜め計26方向に動ける Queen を考える。
それらを互いに取り合うことが出来ないように出来るだけ多く
配置したいのだが、最大いくつまで置く事が出来るだろうか?

また、その組み合わせの数はいくつか?
350347:03/12/20 20:08
>345
ちょっと考えてみたが困難でどうだ?
#include <stdio.h>
#include <string.h>
#define max 20
int main()
{
char s1[max],s2[max];
int i=0;
fgets(s1,max,stdin);
while( *(s1+i) != ' '){i++;}
i++;
strcpy(s2,s1+i);
printf("%s",s1);
printf("%s",s2);
return 0;
}
351345:03/12/20 20:37
>>350
ど〜も〜!動きました。でも見たことないのがあるんですよね。

fgets(s1,max,stdin);

これはなにをやるものなんですか?
352デフォルトの名無しさん:03/12/20 20:53
>>349
65536通り
これ結構むずかしいね。お前らにはムリかも。
353デフォルトの名無しさん:03/12/20 20:58
>>352
とりあえずソースとかうpしてください。
お願いします。
354デフォルトの名無しさん:03/12/20 21:16
2次元の配列を用意し、行の数m(m<10)と列の数n(n<10)を入力する。次に
m行、n列のデータを入力する。結果は、以下に示すように右回りの渦巻き
のように出力する。

0 1 2 3 4
10 11 12 13 14
20 21 22 23 24

0 1 2 3 4 14 24 23 22 21 20 10 11 12 13

助けてください!! お願いします。
Cの宿題です。

ユーザーに何個か値段を(好きな数だけ)入力させ
それらを合計し消費税を含めた値段を表示させるプログラムを作れ。

例 ユーザーが100 100 200と入力してENTERを押すと「420円です」
というように表示させる物です。

お願いします。
>>355
#include <stdio.h>

int main(void)
{
int i, sum = 0;
while(1)
{
printf("値段を入力して下さい。0で終了。:");
scanf("%d", &i);
if(i == 0)
break;
sum += i;
}
sum = sum + (sum * 0.05);
printf("「%d円です」", sum);
}
357347:03/12/20 22:07
>351
fgets(s1,max,stdin);は文字をs1にstdinからmax個だけ入力する関数です。
scanf("%s");と働きはにてますが、違う所があります。
スペースも改行文字も文字列に格納されてしまいます。
そして必ず最後には'\0'のヌル文字が入ります。
例えばキーボードから
exampleと入力してエンターキーをおします。
するとs1には
s1[0]=e,s1[1]=x,...s1[6]=e,s1[7]='\n',s1[8]=`\0`と格納されます。
因みにstdinはキーボードからと思ってもらっていいです。
358345:03/12/20 22:17
なるほど。ありがとうございました。これでぐっすり眠れます。
>>349
単純なやり方。さて、答えが出るのに何年かかるでしょうか…? (w
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=31
>>359
ありがとうございます。
でも実時間で結果が出る奴をお願いします。
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24

0 1 2 3 4 14 24 23 22 21 20 10 11 12 13

これが右回りの渦巻き?
c言語の整数専用の足し算電卓
  キーの押し間違えは考慮しない
  = が入力されたら終了(計算)
  WHILE文を使って作る

お願いします。
363355:03/12/21 01:18
>356さん
レス遅れてすいません。。

ありがとうございます!!
このようにして作るんですね。
大変勉強になりました。重ねて御礼申し上げます。
本当にありがとう。
>>362

#include <stdio.h>

int main(void)
{
int num, sum = 0;
char ope;

while(1)
{
num = 0;
scanf("%d", &num);/*=が入力されてもここはスルーされる*/
scanf("%c", &ope);/*数字が入力されてもここはスルーされる*/

sum += num;
if(ope == '=')
break;
}
printf("%d", sum);
return 0;
}
365>>354:03/12/21 01:57
/* 以下のm,nは仮 */
int m=5,n=3;
int tbl[10][10]={
{ 0, 1, 2, 3, 4},
{10,11,12,13,14},
{20,21,22,23,24}
};
int flg[10][10]={0};
int d; /* 0, 1, 2, 3 */
int dH[4]={ 1, 0,-1, 0};
int dV[4]={ 0, 1, 0,-1};
int i,j;
/* flgセット */
for(i=0; i<n; ++i) for(j=0; j<m; ++j) flg[i][j]=1;
/* 右回り */
d=i=j=0;
while(flg[i][j]){
printf("%2d ",tbl[i][j]);
flg[i][j]=0;
if(j+dH[d]<0 || m<=j+dH[d] || i+dV[d]<0 || n<=i+dV[d]) if(d<3) ++d; else d=0;
if(flg[i+dV[d]][j+dH[d]]==0) if(d<3) ++d; else d=0;
i+=dV[d];
j+=dH[d];
}
putchar('\n');
遅くなったけど。。。>>289さん、どうもありがとう。

そうする根拠もわかったのですっきりしました。
Cの問題です。

データ(6,3,9,5,7)を小さい順に並べ変えるプログラムを作りなさい。
データは1次元配列 int w[5] に初期値と設定して処理すること。

どなたかこの問題をお願いします。。
368デフォルトの名無しさん:03/12/21 06:57
>367
#include <stdio.h>
int main()
{
int i,j,swap;
int w[5]={6,3,9,5,7};
for(i=4;0<i;i--){
for(j=i;0<j;j--){
if(w[j]<w[j-1]){
swap=w[j];
w[j]=w[j-1];
w[j-1]=swap;
}
}
}
for(i=0;i<5;i++){printf("%d ",w[i]);}
return 0;
}
369デフォルトの名無しさん:03/12/21 07:10
368です。間違いました。
眠くて頭がほうけてたみたいです。。。
370デフォルトの名無しさん:03/12/21 07:13
正しくはこちらです。
#include <stdio.h>
int main()
{
int i,j,swap;
int w[5]={6,3,9,5,7};
for(i=4;0<i;i--){
for(j=i;0<j;j--){
if(w[i]<w[j-1]){
swap=w[i];
w[i]=w[j-1];
w[j-1]=swap;
}
}
}
for(i=0;i<5;i++){printf("%d ",w[i]);}
return 0;
}
371367:03/12/21 08:26
レス遅くなってすいません

>368さん本当に助かりました
ありがとうございますm(_ _)m
>>370
人間が無駄に数えるのやめようよ。つーか、寧ろやめろ。
幾ら宿題だからって、メンテナンス性の悪いコードを書く習慣をつける必要はないだろ?
>>373の言うことももっともだが、>>372の突っ込みももっともだと思うなぁ。
「寧ろやめろ。」は余計だとしても。


・・・と思ったら、int w[5]と要素数をわざわざ書いているのは367が指定しているからじゃないの?
それならsizeofくらいは使いたいなぁ
376デフォルトの名無しさん:03/12/21 15:29
こんばんわ

*
**
***
****

上記のように、数字nを入力したぶん階段上に*を表示するプログラムを教えて下さい
同じclassオブジェクトを数個生成した場合、
そのオブジェクトがメンバ関数を持っているとメモリを余計に食うということはありますか?
class CLS{
int i;
public:
void func();
};

CLS cls[4];
普通の質問っぽいですが問題ででました。
>377
virtualメンバ関数ならばvtblの分だけ大きくなる場合がある。
(virtualメンバ関数がたくさんあるからといって、その分だけ大きくなるわけではない。)

普通のメンバ関数の場合は、通常は大きくならないはず。
#include<stdio.h>

void star_fuckin_light(int n){

if(n > 0){
putchar('*');
star_fuckin_light(n-1);
}
}

int main(void){
int n;

printf("n:"); scanf("%d",&n);
star_fuckin_light(n);
printf("\nFuck'in light!\n");
return 0;
}
>>377
sizeof演算子を使って試してみろ、って言う宿題じゃないのか?
381デフォルトの名無しさん:03/12/21 16:17
>>379

それじゃ

*
**
***
****

こう表示しないんじゃ・・・
>>381

>>379 ではないが

#include<stdio.h>

void star_fuckin_light(int n){

 int p,i;
 for(p=1; p<=n; p++){
  for(i=1; i<=p; i++){
   putchar('*');
   }
  putchar('\n');
 }
}

int main(void){
 int n;

 printf("n:"); scanf("%d",&n);
 star_fuckin_light(n);
 printf("\nFuck'in light!\n");
 return 0;
}

これでよかろう。
383379:03/12/21 16:48
あ・・・ネタでしかも勘違いしてた。
俺のバカ関数をあえて使うと

int main(void){
int i,n;

printf("n:"); scanf("%d",&n);
for(i=1;i<=n;i++) {
star_fuckin_light(i);
putchar('\n');
}
printf("\nFuck'in light!\n");
return 0;
}
#include <stdio.h>
int main()
{
int i,j,data;
printf("number?");
scanf("%d",&data);
for(i=1;i<=data;i++)
{
for(j=0;j<i;j++)
putchar('*');
putchar('\n');
}
}
385デフォルトの名無しさん:03/12/21 17:09
ガウスの消去法の宿題で前進消去と後退代入をつかったC言語のプログラムなのですが

#include <stdio.h>
#define N3   /*連立一次 N元方程式 */

main()
{
int i,j,k;
double a[N] [N+1]={ {3,2,1,10},{2,5,2,18},{1,4,1,12} };
double d;


この続きをやってくれませんでしょうか? −=は使わなければどうやってもかまいません
>>387
そのHPを見たのですが、−=の意味がわからないんです。習っていないので
>>374
5だとか4だとか、書く必要のある場所は一つもないね。
>>388
a-=1; は、a=a-1; と同じ。
a-=b; は、a=a-b; と同じ。

似たような働きをする演算子に、+=、 /=、 *=、 %=、 <<=、 >>=、 &=、 ^=、 |=ってのもある。
a -= 10

a = a - 10
と同じ意味
>>388
っていうか、演算子の意味ぐらい自力で理解しろよと小一時(ry
>>388
そのくらい調べるのもいい勉強になるね。
釣れた
ありがとうございました
>>382
関数名にワラタ
c++でフの文字が大量に出てくるということは何がいけないですか?
>>397
VC++を使っているなら、Releaseでコンパイルすれば出なくなる。
#が、根本的な問題は別にある。
399デフォルトの名無しさん:03/12/21 18:23
>>397
VC++はデバッグモードでコンパイルすると、初期化していないauto配列は全て0xCCで埋めるという仕様だったはず。
0xCC=Shift_JISの'フ'
文字列はちゃんと終端させませう、というC++コンパイラからの伝言でつ。
>>400
そんないいかたないじゃないか。
>>399
>0xCC=Shift_JISの'フ'
ハァ?
>402
そんないいかた止めナよ。
>>402
違った?
実は2chでそういう書き込みを見ただけなんだけど。
http://www2u.biglobe.ne.jp/~fukase/let-code.html

ああなるほど。半角カタカナはShift JISに含まれないのね。
C言語の宿題です。

方程式ax^2+bx+c=0の実数解を画面表示するプログラム作成をせよ。
ただし、条件を守る事。

係数a,b,cは実数型として、キーボードから入力する。

関数の条件:プロトタイプ:int solve(float, float, float, float *, float *)

第1引数:x^2の係数 
第2引数:xの係数
第3引数:定数項
第4引数:第1解へのポインタ
第5引数:第2解へのポインタ
返り値:解の個数

関数から返り値と係数aの値を利用して画面表示を適切に変化させること。

以上です。どなたかよろしくお願いします・・。
半角カタカナなど存在しないのです。
>>406
floatを使うのはナンセンス。
まして引き数に使うのは大変危険。
なぜならば、関数をOldStyleで定義するとfloatと書いてもdoubleと解釈されるから。

宿題としては、解を求めるプログラム自体が既出なので割愛。
#まぁ、どっかの嬉しがり屋が書いてくれるだろうし。
>>408
そうですか、でも条件として指定されているので・・。
レスありです。
410デフォルトの名無しさん:03/12/21 22:43
いよう、真夜中の宿題だぜ

西暦n年m月x日は、そのとしの1月1日から数えて何日となりますか?
うるう年も考えて、プログラムしなさい

実行例
2003年1月7日
1月1日から数えて、6日後です
411406:03/12/21 23:46
自己解決しました。
>>411
何が自己解決だ。
みんなの力を合わせたからできたんじゃないか。
そりゃあ、おまいさんが自分だけでできたと
思い自己陶酔に浸るのはかってだよ?
だけど協力してくれたみんなのことも
考え、お礼を述べるのが筋じゃないだろうか
そりゃあ、所詮はネット、所詮は2ちゃんなのかもしれないよ?
でも、そういうところにだって心を求めたっていいじゃないか
だって俺達人間だもの、俺なんかまちがったこと言ってるか?
413デフォルトの名無しさん:03/12/22 00:07
#include<stdio.h>

main(){

int n;

while(1){
printf(">>1\n");
printf("良スレ乙\n");

}
}
>>410 K&R p.135 day_of_year()
>>413
(・3・) エェー どういたしましてだYO
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)
>>413
・main()の戻り値の方が指定されていないのでintとみなします。
・main()の戻り値がありません。
・while()内の条件式は定数です。無限ループにはfor(;;)を利用しましょう。
・使用されていない変数nは無視されます。
・連続するprintf()は一文でまとめられます。文字列の連結を利用しましょう。
C++です
タッチタイピングソフトで、キー押しつづけたときでも一回しか入力できないように(キーリピートを防止)したいんですが。
どんなプログラムにしたらいいでしょう(´・ω・`)
>>418
system("xset r off");
>>418
キーリピートしてもいいと割り切るのも手。
>>417
>・while()内の条件式は定数です。無限ループにはfor(;;)を利用しましょう。

いくらなんでもこれは余計なお世話だろ。
while( 1 ) でまずい理由はあるか?
不変はダミってコンパイラに怒られなかったっけ?
>>421
厳密に言えば、
while(1)にすると、毎回1がtrueかどうかチェックするからオーバーヘッドが出るなぁってだけで
別に今はその程度なら気にならないし、好みの問題だと思う
>423
バカ。
カバ
>>421
お前、人のコードに文句たれる前に
まず自分をなんとかしろよ。
int main() {
while (1) ;
}
上のそうすのこんぱいるけっか。
L2:
jmp L2
なんかさー。
本筋と関係ないイチャモンが多いぞ。
明らかに解答者がメンドクなるよーな横槍やめよーや。
やるなら、具体例を出して、こっちのがいいって言おうや。
分かって書いてる人でも、解説は面倒だってワカラン?


荒らしでやってるなら、効果的だね。
んじゃ、>417を例に。
>413はこう書いたほうがいいと>417は言ってるらしい。
#include<stdio.h>
int main()
{
 for (;;) {
  printf(">>1\n"
      "良スレ乙\n");
 }
 return 0;
}
果たして
>while(1)にすると、毎回1がtrueかどうかチェックするからオーバーヘッドが出るなぁってだけで
等といっている人に回答をもらって喜ぶ香具師はいるのだろうか?
>>422
for(;;)にすると条件式がありませんと警告を出すコンパイラもあります。
んじゃー、もうひとつ
mainの引数を省略したとき、return文は省略しても良い(C++)
引数?
435デフォルトの名無しさん:03/12/22 12:02
サーバープログラムの問題なのですが

・プロトコルはTCP
・クライアントから複数同時接続が出来る
・Winsock2を使う
・クライアントが接続したら、ログインコマンドを受信しIDとIPをリストに保管する
0001<ID>CR<PASS>CRLF
・クライアントから別のIDの問い合わせが来たら対応したIPを返す。
0002<ID>CRLF

こういうの作って頂けませんか?
>>435
その変なプロトコル、以前どこかで質問してたろ?

・ログインコマンドってなに?
・別のIDの問い合わせってなに?
・001<ID>CR<PASS>CRLF 特に最初の3桁の意味
437435:03/12/22 12:26
>>436
始めの4バイトがコマンドです。
0001がログインコマンド、0002がIP問い合わせのコマンドです。
ログインの時に接続ごとにユーザーIDとIPを登録するようにして、
問い合わせコマンドで、指定したIDのIPを返すようにしたいんです。

>>436
ネットワークプログラミングスレッドだな。
いくつかレスがついたが無視
439435:03/12/22 12:54
>>438
え!?
あの後スレ落ちませんでした?
あのスレ見てましたけど・・・

カチュが読めないって言うんですけど…

#あのスレに書いた人同じガッコの人かな?
鯖の応答プロトコルが規定されていないようだが。
アルファベット文字列を入力して、使われた文字の個数を調べて次のように表示させるプログラムを作りたいのですが、
よろしくお願いします。

入力
aaaaabbbccccdde
出力
a:5 b:3 c:4 d:2 e:1 f:0 g:0
h:0 i:0 j:0 k:0 l:0 m:0 n:0
o:0 p:0 q:0 r:0 s:0 t:0 u:0
v:0 w:0 x:0 y:0 z:0
最も使われた文字のひとつは:a
このスレにいる人って専門学校の人が多いのかな?
>>441
前スレ見ろ。
半角二次元のロリスレに時々現れるのは
本物のぼるじょあですか?
>>444
(・3・) エェー 名前欄に「ぼるじょあ#ぶるじょあ」って書けば
          キミも今日から ぼるじょあ◆yBEncckFOU だYO!
446デフォルトの名無しさん:03/12/23 13:40
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)
447デフォルトの名無しさん:03/12/23 13:55
標準入力からテキストファイルを読み込み、
単語を検出して辞書順に並べ、出現頻度を標準出力に出力する。
C++でよろしくおねがいします

実行例

入力

int i;
for(i=0;i<MAX;i++){
a[i]++;
}

出力

MAX: 1
a: 1
for: 1
i: 5
int: 1

整数を10個入力して配列に格納し、その中で3で割り切れる個数を
出力するプログラムを作成せよ。配列を使用すること。

という問題なのですが、「3で割り切れる個数を出力する」ということを
するにはどのようなプログラムを作ればいいのでしょうか?
>>439
昨日の朝、java宿題スレでその宿題見たぞ。
機嫌の良かった俺がプロトコル推測してソース書いて張ってやったのに……。

JavaじゃなくてC++の宿題だったのかYO! ヽ(`Д´)ノウワアァン!
>>448
//(・3・) エェー 「3で割り切れる個数を出力する」ってのは、こんな感じだYO!
int sande_warikireru_kosuu = 0;
for (int i = 0; i < 10; i++) {
 if ((input[i] % 3) == 0) {
  sande_warikireru_kosuu++;
 }
}
printf("3で割り切れる個数:%d", sande_warikireru_kosuu);
>>447
どこかで見たような。

>>448
count = 0;
for(i=0;i<10;i++) if ( a[i] % 3 == 0 ) ++count;
printf("%d\n",count);
>>448

if( (array[i] % 3) == 0 ) count++;
453448:03/12/23 14:40
>>450-452
即レスありがとうございます
     (・3・) 

    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)

     (・ω・) 

     ('・ω・`) 
455デフォルトの名無しさん:03/12/23 15:00
半径rを入力し球の表面積sを求めて表示するプログラムを作りなさい。
ただしπ=3.14159265
また数値はe変換仕様を使う。
また以下の数値を使い計算値を確認せよ。
6278000
0.01
10の-5乗

よろしくお願いします。
>>447
前スレくらいで出てた、テキストファイルを標準入力から行ごとに読み込んで
それを辞書順に、ってやつを改変すればできるんでない?
行ごと→単語ごとにして、後は単語の出現頻度ををカウントして表示するだけでしょ。
単語の出現頻度をカウントするプログラムソースなら
数冊のアルゴリズム本を読めば、たぶん載ってると思うし。

とか言いながら、現在は精神的余裕皆無のため、パス。冬休みうらやましぃー。
458456:03/12/23 15:15
ああ、+<>{};とかの記号は省かなきゃならないのか。
昼飯食いながらやろうと思ったけど、やっぱパス。
459457:03/12/23 15:20
>>457だと、
__cplusplus

log10
を単語とみなさないな。
適宜修正してくれ。
>>455
s = 4.0 * pi * r * r;
とか、そういう部分の話か?
(・3・)(・ω・)(・ε・)(・m・) エェー ぼるじょあブラザースがお答えするYO
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)

     (・ω・)
     (・ε・)
     (・m・)
(・・) 3 気にしなーい
うんちく君は消えたのかな?
465あい:03/12/24 01:04
1+3+5+8+13+21・・・
の法則にしたがって足し算を行い、10万を超えるまでの
回数との値を表示するプログラムです。
ただし、
足し算の合計が5の倍数の時は、7を加える
4の倍数の時は、10を引く
3の倍数の時は、3で割る
倍数が重なった時は、大きい倍数の法則だけを採用。

わかりません。教えてください。お願いします。
もし良かったら、どうしてそうなるのかを少し教えてくれたら嬉しいです(^^)
466あい:03/12/24 01:12
>>465
C言語です。お願いします<(_ _)>
>1+3+5+8+13+21・・・
1+1+2+3+5+8+13+21…ではないのか

a(n)=a(n-1)+a(n-2)
a(n)=a(n-1)+n
469あい:03/12/24 01:36
>>467
私の書いたのであっています。
この法則は、前の2つの数を足すのかな?と考えてみたのですが
3だけはおかしいですよね・・・よくわからないんです
470あい:03/12/24 01:37
朝起きたら、宿題終わっているといいなあ(^^)
471あい ◆CfadTIdcd2 :03/12/24 01:41
>>470
これは私ではありません。IDないとすぐ偽者出る・・・
気にしすぎでしょうが、トリップ付けておきます。
>465
よくわからんのだが、
1+3の時点で合計は4の倍数だから、10引いて次は-6なのか?
>>469
ということで、私が法則だと?
矛盾が多すぎる。
この問題出した教官晒し上げちまえ。
>>465
#include <stdio.h>
int main(void)
{
int before, current = 3, next = 5, sum = 1, count = 1;
while(sum < 100000){
++count;
sum += current;
before = current;
current = next;
next = before + current;
if((sum % 5) == 0){
sum += 7;
continue;
}
else if((sum % 4) == 0){
sum -= 10;
continue;
}
else if((sum % 3) == 0){
sum /= 3;
continue;
}
}
printf("%d回かかりました\n", count);
printf("値は%dになりました\n", sum);
return 0;
}
暇だからやってみたよ
>>441
int p,max,c,tbl[256]={0};

while((c=fgetc(stdin))!=EOF) ++tbl[c];

max=tbl['a']; p='a';
printf("%c:%d ", p, tbl[p]);
for(c='b'; c<='z'; ++c){
if(max<tbl[c]){ max=tbl[c]; p=c; }
printf("%c:%d ", c, tbl[c]);
}
printf("\n最も使われた文字のひとつは:%c",p);
暇だからやってみたよ
478デフォルトの名無しさん:03/12/24 11:08
C++を使って、要素[5]の中で-の値があれば-で一番0に近い値
-の値が無ければ最も小さい値
を表示するシンプルなプログラムを作りたいのですが
どんなプログラムになります?
struct absless{
bool operator()(int x, int y) const
{return (abs(x) < abs(y)); }
bool operator()(double x, double y) const
{return (fabs(x) < fabs(y)); }
};

T *r = std::min_element( &d[0], &d[5], absless() );
std::cout << *r << std::endl;

といったところか。
適当な関数オブジェクト作ってstd::sort
481478:03/12/24 11:46
>479-480

有難う御座います
額面どおりとると-2と1では-2優先になるんだけど。
絶対値が最小とはちがうの?
483478:03/12/24 11:55
>>482

最小とは違うんです・・・
つまりこうだな。
struct comp {
template<typename T>
bool operator(const T& lhs, const T& rhs) {
return (rhs * (lhs-rhs) < 0);
}
};
んで、適当なコンテナvに
min_element(v.begin(),v.end(), comp());
485478:03/12/24 12:28
>>484

有難う御座います
>>484では不完全。
比較する2項が異符号の場合は常にtrueが返ってしまう。
if( lhs * rhs > 0 )
return (lhs - rhs) > 0;
else
return lhs > 0;
lhs が 0 で rhs が負の場合は問題だが
その場合の処理が指定されてないので略す。
487478:03/12/24 15:05
>>486

有難う御座います
0の場合を忘れてました
0があれば0を表示する・・・でした
#include <iostream>
#include <numeric>
#include <limits>
template<typename T>
struct nval_first_compare {
bool operator()(const T& lhs, const T& rhs) const {
const T mlt = lhs * rhs, eps = std::numeric_limits<T>::epsilon();
if( mlt > eps ) // is positive
return ( lhs * (lhs - rhs) < eps );
else if( mlt < -eps ) // is negative
return lhs < eps;
else // is zero
return std::abs(lhs) < std::abs(rhs);
}
};
int main(void) {
double v[] = { 1.0,57.3,14.6,-3.5,0.003}; //T == double/int?
const std::ptrdiff_t size = sizeof(v)/sizeof(v[0]);
std::cout << *std::min_element( v, v+size, nval_first_compare<double>() ) << std::endl;
return 0;
}
eps = std::numeric_limits<T>::epsilon();
if( mlt > eps ) // is positive

↑これって、Tがintでも大丈夫?
490478:03/12/24 16:06
>>488

有難う御座いました
>>489
整数型なら 0 が返るから問題ないと思うけど。
492デフォルトの名無しさん:03/12/24 19:24
スレ違いかもしれませんが、画像処理の事で
ヒストグラム平滑化の方法について教えてください。
お願いします。
http://pc2.2ch.net/test/read.cgi/tech/1054545005/
スレ違いな上にマルチか?
つーか以前にも似た質問見た記憶があるぞ
>>491
そうだったのか。ありがとう。
495455:03/12/25 06:21
>>460
返事遅くなりました。
面積を求める公式はできたのですが、
数値として0.01や10e-5を入れたときに
e+xxxの値がおかしなものになってしまうのです。
>>495
具体的な数値を上げるよろし。
#といいつつ私は出勤するので後は知らん。
>>495
入力部分のコード見せてみて。
498デフォルトの名無しさん:03/12/25 18:24
ポーカーのプログラムなんとなくつくってるんだけど
int card[52]; //ハート0-12 スペード13-25 クラブ26-38 ダイヤ39-51(ジョーカーはなし)
手持ちのカードは持ってれば1なければ0
お前ら、ちょっとストレート判定のアルゴリズム考えてくんねーかな。
499デフォルトの名無しさん:03/12/25 18:30
>>498
マークと数字の情報を個別に持てばいいのに。
ワークエリアを用意して、手札の値の13の剰余を格納する、手札の値が0(=エース)だったら13を別に追加しておく。
出来上がった配列をソートして各要素の差が1ならストレート
あ、嘘だ、エースの処理は適当に追加してくれ
502 :03/12/25 19:08
>>499
う〜ん確かにそっちのほうが良かったかも。
>>501
参考になった。ありがd;
/* 何番の数字の札を 何枚持っているか テーブルにセット */
for(i=0; i<14; ++i) num[i] = 0;
for(i=0; i<5; ++i) ++num[(hands+i)->rank];
num[13] = num[0]; /* 'A'は'K'の次でもあるので 14番目の札ともする */

last = 0; /* ストレート判定用 最後に見つかったカードの数字 */
for(last=13; last>=4; --last)
if(num[last]!=0) break;

if(last>=4
&& num[last-1]==1 && num[last-2]==1 && num[last-3]==1 && num[last-4]==1)
/* 最後に見つかったカードより4つ前迄連続してあればストレート */
>>503
おお、コードさんくす!

'A'の場合は"A 2 3 4 5"かどうかも調べナイト
>>505
ん?試してないけどいいんじゃないの?
ストーレートの可能性があるのはlastが4以上のときで
lastがぎりぎりの4のときnum[3]〜num[0]で判定してるから
数字のA〜5で判定したことになってるんじゃないの。
>>506
"10 J Q K A"を先に調べたら止めちゃってんだろが、ヴォケ
>>507
確かにそうかもしれないが
ヴォケはいいすぎだなw
>>503を改良して
for(last=13; last>=5; --last)
if(num[last]!=0) break;

if(last>=5
&& num[last-1]&& num[last-2]&& num[last-3]&& num[last-4])
straight = 1;
else if(num[0]&&num[1]&&num[2]&&,num[3]&&,num[4])
straight = 1;

これでいいかな。
510デフォルトの名無しさん:03/12/26 18:38
10 J Q K Aってストレートになるの?
なる、「ロイヤルストレート」
512509:03/12/26 22:11
for(last=12; last>=4; --last)
if(num[last]!=0) break;

if(last>=4
&& num[last-1]&& num[last-2]&& num[last-3]&& num[last-4])
straight = 1;
else if(num[11]&&num[10]&&num[11]&&,num[12]&&,num[13])
straight = 1;

よく考えたら
例外の[13]のほうをelseで出したほうがいいな。

ミスった。
>>510
エースハイのストレートだろ。
515510:03/12/27 00:19
ふーん。
じゃあ1の他に14もエースと見なせばうまく書けるんじゃないの。
516515:03/12/27 00:24
おっと、それはできないか。
>>447
お前、必修なだけあって必死だな。

と、同じ大学の学生見つけてみたり。
んで、何で俺もこのスレにいるのか、と。
>>447
++でなくて、普通のCでよけりゃ、標準入力どころかファイルでの処理が可能
しかも、資源が許す限り何万語でも可能。さらに、辞書順+出現頻度順に
ソートまでしてくれるってのがあるけど。

解答にはならないけど、ヒントにはなるかもしれない。
つーか>>447のはC++ならmultiset使えばほとんどの作業やってくれるんだが。

typedef multiset<string> Dict;
typedef Dict::iterator DIter;

Dict dict(
(istream_iterator<string>(cin))
istream_iterator<string>()
);

ここまでで標準入力から読み込んだ単語が辞書順に並んで dict にストアされている

これを利用して辞書順で”単語: 頻度”の形式で
各単語を出力するには色々方法あるけどたとえば

DIter iter1, iter2;
for(iter1=dict.begin();iter1!=dict.end();iter1=iter2) {
iter2 = dict.upper_bound(*iter1);
cout << *iter1 << ":\t" << distance(iter1,iter2) << '\n';
}
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=33
分割して書いたので、とりあえずZIPでまとめてみた。
521457:03/12/27 14:18
>>457は無視ですかそうですか(´・ω・`)
>>521
すべてに返事が返ってくるとおもってはいけない。
なぜなら、そいつにしてみれば答えさえあれば
あとのことはどうでもいいから。プログラマらしい
考え方じゃないか。そいつにとってはお礼などは
冗長でしかないんだよ。だからそいつを攻めること
はできないんだが、なんなんだろうこの虚しさは。
>>521が礼を欲しがっている様には見えんのだが…
524デフォルトの名無しさん:03/12/27 19:33
ネタ歓迎
簡単なゲームプログラムを作っているのですが、パラメータ設定と
ダメージ算出がどうもバランスが取れません
AttackとDefenceの2つの値から算出し、属性効果でx2/x1/x0.5となる
のですが、何かいい計算方法はありませんか?
たとえばCivilization2のばあい。
AttackerのAttack値とDefencerのdefence値を用いる。たとえば
補正済み値が15:3なら、乱数振って15/18で攻撃側の攻撃成功、
3/18で防御側の逆襲成立。成功した側の火力値相当を相手の
HPから差し引く。これをどちらかのHPが0になるまで続ける。
たとえば、HP=5, 火力値=1としてやってみたらどうか。
ていうか>>525はC/C++の宿題なのかと小(ry
休み入ったからか静かになったな
1) Cで、ある日から○日後は何月何日になるかを求める場合はどのようにするのでしょうか?
 例. '03.12.15の1日後 '03.12.16
 例. '03.12.15の10日後 '03.12.25
2) Cで、開始日と終了日の間の日数を求める場合はどのようにするのでしょうか?
 例. '03.12.15と'03.12.15の間は1日
 例. '03.12.15と'03.12.25の間は11日
>>528
西暦1年1月1日からの経過日数を出すのが一番簡単かな?

1)は基準日の経過日数を出して○日足して日付を逆算
2)はそれぞれの経過日数を出して引いて1足せばOK

経過日数計算するときにうるう年に注意。
>>528
普通はtime.hをインクルードしてその辺のライブラリ関数を利用する。
どちらの例も、適当に関数を仕立てておけば後々便利だろう。
>529のような阿呆な仕様の場合は、適用範囲を厳密に仕様化しておくこと。
#まさか西暦1年12月31日が存在すると思うような馬鹿はいないと思うが。

尚、このスレの趣旨通りにそういう関数を作れというなら作るに吝かではないが
大掃除の最中故、今夜までは無理だな。
a - b = ( a - o ) - ( a - o )なんだから
数値計算一般の問題さえクリアすればそれほど問題はないのでは?
初心者へのアドバイスとしては>>529の方が適切だし。

そもそも適用範囲の問題はどんな実装をしても発生するわけで
第一に考慮すべきは桁あふれの問題。
time.hの計算は秒まであるし年は二桁だし1970年始まりだしで
そういうことを言い出したらこのライブラリ自体適切な選択かを考えなきゃいけなくなる。
localtime 時間値の分解された現地時刻への変換
mktime 分解された時間の基準時点からの通算時間への変換

difftime 2つのカレンダ時刻値の差の算出

を使え
>>457
C++に詳しいわけでもなく、ここに乗ったソースを動かしてみてるだけだけど
GCC使って457のソースでコンパイルエラーでましたよ。
なんか俺のやり方が間違ってるのかな。
エラー文は下記の通り。

Word.c: In function `class istream & operator >>(istream &, Word &)':
Word.c:24: no matching function for call to `basic_string<char,string_char_trait
s<char>,__default_alloc_template<false,0> >::push_back (char &)'
Word.c:36: no matching function for call to `basic_string<char,string_char_trait
s<char>,__default_alloc_template<false,0> >::push_back (char &)'

|3・) アルェー こんな所にもスレがあったNO〜
|ノ
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)
>>533
g++3.2(MinGW)で通ったが。
w.xpr.push_back(c);(2箇所)

w.xpr += c;
にしても駄目?
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・)<エェーン ボク 気難しい人にいじめられてるYO
538533:03/12/29 17:39
>>536
その通りにしたら通りました。ありがとう。
エディタにもこういう機能を実装してくれたら便利そうですね。
英文やプログラムのスペルミスの修正なんかに使えそう。
その場合は頻出度順に並べ替えられたらもっと便利かな。

俺はCをさわり程度覚えただけだから
このスレのプログラムを動かしてみては感動してます。
>>538
エディタからそのプログラムを動かせばいいんでない?
unix系のエディタなら外部プロセスを起動して結果を利用するのは常識だよ。
0から9までの整数をランダムにm個(0≦m≦3)発生させ、配列x[m-1]に格納する。
次に0から9までの整数をランダムにn個(0≦n≦3)発生させ、配列y[n-1]に格納する。
ただし、配列xと配列yに格納する数字はかぶってはならない。

こんなプログラムなのですが。よろしくおねがいします。
541暇人 ◆YyshEvSH/k :03/12/29 20:41
>>540
配列宣言x、y
繰り返し(
乱数発生
xに格納

繰り返し(
乱数発生
xに入っているかチェック
xに格納


こんな感じ?
>>540
mまたはnが0の場合、論理的に破綻するのだがいいのか?
>>540
問題が変。
>>540
出された宿題を字句通り書き写してみてくれ。

>>541
後半の繰り返し、xに格納するのか?
#注意力なさ過ぎ
10要素の配列に0から9の値を格納して、配列をランダムにシャッフル。
指定された数だけ先頭から順に持ち出してくる。
546暇人 ◆YyshEvSH/k :03/12/29 21:01
>>544
間違えた、yだよ
547暇人 ◆YyshEvSH/k :03/12/29 21:02
>>545
どうやって配列をシャッフルするんだよ!
配列の意味をわかってないだろ
//a[0]〜a[9]に順に0〜9を入力
for(i=0;i<10;i++)
a[i] = i;

//適当な回数シャッフルする。
for(i=0;i<100;i++){
r = rand() % 10;
temp = a[r];
a[r] = a[9-r];
a[9-r] = temp;
}
//mを決めてa[]からm個入れる
m = rand % 4;
for(j=0;j<m;j++)
x[j] = a[j];
//nを決めてa[m]からn個入れる。
n = rand % 4;
for(k=0;k<n;k++)
y[j] = a[m+n];

アルゴリズムはこんな感じでいいんでねーの。
549548:03/12/29 21:05
r = rand() % 10;

r = rand() % 5;
でいいか。
550548:03/12/29 21:07
ミス発見
最後に
y[j] = a[m+n];

y[j] = a[m+k]
551548:03/12/29 21:09
何度もスマソ。
y[k] = a[m+k]
swap(a[r],a[9-r])でシャッフルした事になるのか?
俺なら
r=(rand()%5)*2;
s=(rand()%5)*2+1;
swap(a[r],a[s]);
とするな。
553548:03/12/29 21:21
>>552
あ、二箇所ともランダムで決めないとだめか。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
 int x[10],y[10],a[10];
 int r,s,m,n,i,temp;

 srand((unsigned)time(NULL));
 for(i=0;i<10;i++) //a[0]〜a[9]に順に0〜9を入力
 a[i] = i;
 for(i=0;i<100;i++){ //適当な回数シャッフルする。
  r=(rand()%5)*2;
  s=(rand()%5)*2+1;
  temp = a[r];
  a[r] = a[s];
  a[s] = temp;
 }
 m = rand() % 4; //mを決めてa[]からm個入れる
 for(i=0;i<=m;i++)
  x[i] = a[i];
 n = rand() % 4; //nを決めてa[m]からn個入れる。
 for(i=0;i<=n;i++)
  y[i] = a[m+1+i];
 for(i=0;i<=m;i++)
  printf("x[%d]=%d ",i,x[i]);
 puts("");
 for(i=0;i<=n;i++)
  printf("y[%d]=%d ",i,y[i]);
 return 0;
}

バグ修正。
555554:03/12/29 21:59
余計なとこまでいじってた。↓に戻す。
m = rand() % 4; //mを決めてa[]からm個入れる
for(i=0;i<m;i++)
x[i] = a[i];

n = rand() % 4; //nを決めてa[m]からn個入れる。
for(i=0;i<n;i++)
y[i] = a[m+i];

for(i=0;i<m;i++)
printf("x[%d]=%d ",i,x[i]);
puts("");
for(i=0;i<n;i++)
printf("y[%d]=%d ",i,y[i]);
なんか必死な人がいるな
557554:03/12/29 22:02
>>556
俺は548ではないよ。
必死に答えようとしてるのは立派な事だ。
>554 は良い人だと思う。
配列のシャッフルって、俺ならこんな感じにするんだが。

/* 配列のシャッフル */
void shuffle(int a[], int n)
{
 int randn(int n); /* 0以上n未満の乱数を返す関数 */
 int i, j, tmp;

 for (i = n; i > 1; i++) {
  j = randn(i);
  tmp = a[i];
  a[i] = a[j];
  a[j] = tmp;
 }
}
>>559
何の冗談だ?
>>559
突込みどころ満載だな。
・forの第1項が変。
・forの第3項も変。
・jの算出方法が変。
下の連立1次方程式の解を
Gaussの単純消去法を使う方法と、
Gauss-Jordanの掃き出し法を使う方法の両方で求めたいのですが、
x + 5y + z = 2
3x + 4y + = 2
9x + 10y + 4z = 8
C言語を用いてこの解を求めるプログラムをつくると
どうなるのですか?教えてください。
>>559
このパターンでやるなら、

/* 配列のシャッフル */
void shuffle(int a[], int n)
{
 int randn(int n); /* 0以上n未満の乱数を返す関数 */
 int i, j, tmp;

 for (i = 0; i < n-1; i++) {
  j = randn(n - i) + i;
  tmp = a[i];
  a[i] = a[j];
  a[j] = tmp;
 }
}
だと思うが。
そもそも配列のシャッフル自体が意味がない
配列とはそういう目的に使うものじゃないし

やるなら初めから乱数埋め込むかリストにする方がよっぽどシンプルだ
まぁ、宿題なんだから仕方ないけど・・・

>>562
昔、学校の数値計算法でやったなー
>>559
>>563
a[n]かa[0]が必ず元の値と異なるから、かなり偏ったシャッフルになるね。
(>>559のfor第3項はi--のtypoと解釈した。)

>>562
double a[3][3]={{1,5,1},{3,4,1},{9,10,4}};
あとはたのむ。
>>559
for (n--; n > 0; n--) {
j = randn(n+1);
tmp = a[n];
a[j] = a[n];
a[n] = a[j];
}
もとのままだと、配列の末尾+1の要素にアクセスしてしまう。
これだけレスがついているのに
返事を1つもしない>>540
素晴らしい人格の持ち主だなw。
568教えてください:03/12/30 16:54
C言語を勉強中の者です。演習問題が分からなくて困ってます.助けてください。
@以下のプログラムを作成してください。
パラメータとして、2つの数値を与える。
2つの数値を比較し、大きい方をコンソールに出力する。
大小比較部は、関数をしようとすること。

A以下のプログラムを作成テストしてください。
パラメータとして3ツの数値を与える。
大小比較部は、関数をしようすること。
テスト仕様書を作成すること。
使用する標準関数を以下のものを使用する。
printf()
atoi()

B以下のプログラムを作成、テストしてください。
標準ファイルから入力されたデータの文字数をコンソール表示する。
(空白や改行も1文字とする。)
標準ファイルから入力されたデータの行数をコンソールに表示する。
標準ファイルから入力された単語の数をコンソール表示する。
(空白は2個以上ある場合もあるので注意すること。)

まじわからないです。2ちゃんの優秀な皆様よろしくお願いします。
569教えてください:03/12/30 16:56
もうひとつあります。
問題
入力された受験者の氏名と、テストの得点を読み込み構造体に格納する。
格納した、氏名と得点をコンソールに表示する。
最後に全体の平均点も出力する。

出力イメージ
% average
please input name&score
tomoko 80
yuko 65
takuya 55
kahoru 70
satoshi 60
masaki 95
mina 50
CTL+D
******name**********score*****
  tomoko 
  yuko 
  takuya 
  kahoru 
  satoshi 
  masaki 
  mina 
*****heikin**********67.9
%
出力イメージと全く同じにしなくてもよい。
できれば解説つきでお願いします。(泣き)
>>568
1)
#include <stdio.h>
#include <stdlib.h>
int max(int a, int b)
{
if(a > b) return a;
else return b;
}
int main(int argc, char **argv)
{
printf("%d\n", max(atoi(argv[1]), atoi(argv[2])));
return 0;
}
2) 意味不明
double larger(double *x , double *y)
{
 double *p,*q;
 *p= *x<0 ? -sqrt(-*x) : sqrt(*x);
 *q= *y<0 ? -sqrt(-*y) : sqrt(*y);
 if(*p>=*q)
  return *p++;
 else
  return *q++;
}
パラメータとして3ツの数値を与える。
3つの数値を比較し、最大の物をコンソールに出力する。
大小比較部の関数を定義すること。
テスト仕様書を作成すること。
以下の標準関数を使用する。
printf()
atoi()

かな。
>>568
3)
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    int nchar=0, nline=1, nword=0;
    int c;
    int in_word = 0;
    while((c = getchar()) != EOF)
    {
        nchar++;
        if(c == '\n')
            nline++;

        if(in_word && isspace(c))
            in_word = 0;
        if(!in_word && !isspace(c))
        {
            in_word = 1;
            nword++;
        }
    }
    printf("文字数:%d\n行数:%d\n単語数:%d\n", nchar, nline, nword);
    return 0;
}
574教えてください:03/12/30 17:22
みなさん解説つきでお願いします。
>>574
>>572は合ってますか?
解説することが見あたらないほど簡単なプログラムなんだが・・・
>571
なるほど、intとは限らないわけですね。
目からうろこが落ちました。
感激です。
ありがとうございました。
>>569
#include<stdio.h>
#include<string.h>
typedef struct {
char name[20];
int score;
}UNCO;

int main(void){
UNCO unco[100];
int i=0,k,goukei=0;

//name とスコアを入力する。EOFかiが100以上になったら終わり。
//scoreの合計を計算しておく。
printf("please input name&score \n");
while(scanf("%s %d",unco[i].name,&unco[i].score)!=EOF&&i < 100){
goukei+=unco[i].score;
i++;
}
//名前スコアを順番に表示
for(k=0;k<i;k++){
printf("%s%d\n",unco[k].name,unco[k].score);
}
//要素数はi(またはk)なのでgoukeiをiで割る。平均は少数になること
//があるのでdoubleにキャストしておく。
printf("heikin %f",(double)goukei/i);
return 0;
}
579578:03/12/30 17:49
#include<string.h> はいらない。
580562:03/12/30 20:07
どなたか、>>565の続きをお願いできますでしょうか?
できればなのですが、ピボット操作をつけていいただくとありがたいのですが・・・
よろしくお願いいたします。m(__)m
>>580
さんざん、既出だが、『C言語によるアルゴリズム辞典』に連立式の解法がある。
ソースコードもあるし、公式サポートページから落とせる。
582dsfsd:03/12/30 22:39
2次元配列を使用して、5人分の名前をローマ字でキーボードから入力して、
その文字をabc順にしなさい。
例;
入力
1人目:sai
2人目:mako
3に目:aiako

結果
1人目:ais
2人目:akmo
3に目:aaiko
char name[5][128]={0};
int num,i;
printf("入力\n");
for(num=0; num<5; ++num){
printf("%d人目:",num+1);
if(fscanf(stdin,"%s",name[num])!=1) break;
}
for(i=0; i<num; ++i) sort(name[i]);
printf("\n結果\n");
for(i=0; i<num; ++i) printf("%d人目:%s\n", i+1, name[i]);



sortは適当に
void sort(char *data)
{
int len,i,j;
char tmp;
len=strlen(data);
for(i=0; i<len-1; ++i)
for(j=i+1; j<len; ++j)
if(*(data+i)>*(data+j)){
tmp=*(data+i); *(data+i)=*(data+j); *(data+j)=tmp;
}
}
とかで
>>583
なんだか、おかしいぞ。
いや問題勘違いしてたごめん。
/* 配列のシャッフル */
void shuffle(int a[], int n)
{
 int randn(int n); /* 0以上n未満の乱数を返す関数 */
 int i,j,tmp;

 for (i = 0; i < n; i++) {
  j = randn(n);
  tmp = a[i];
  a[i] = a[j];
  a[j] = tmp;
 }
}
だと思うが。
2点ともランダムで決めるより、片方だけランダムで
決めるやりかたは、計算は後者のほうが速いだろうけど
ランダム性はどっちのほうがいいんだろう。
いや、計算が早いってことはランダム性もいいって言うことに
なるのかな?
そこまで煮詰めるとなると、rand()の中身も気になるね。
>>587
普通は
int random(int num); /* 0 から (num-1) の間の整数の乱数を生成 */
void Shuffle(int t[],int m){int n,h; while(m>1) n=random(m),h=t[--m],t[m]=t[n],t[n]=h;}
だと思うが。

「2点ともランダムで決める」ってのは恐らく >>554 みたいな奴のことを指しているのだろうが、
こんなのはお話にならない。
これではどんな優秀な乱数生成器を使用しても、内部で無限にシャッフルを繰り返さない限りは
配列内の均一な分布は望めない。
それに対し上記の方法なら、乱数生成器さえ妥当ならば、
1回の走査で「原理的に均一な分布」にシャッフルされた配列が得られる。

それより >>564
>そもそも配列のシャッフル自体が意味がない
というのが激しく気になる。

お前、正気か?
>590
564は、配列はオリジナルのままで、添字の方をシャッフルしろと言いたいのではないかな。
data[index[m]]で、data[]には手をつけずにindex[]を0..n-1のランダム整数に設定する。
関数が引数の内容を書き換えるのを嫌って、可能な限り避ける人は珍しくないね。
>>591
>564は、配列はオリジナルのままで、添字の方をシャッフルしろと言いたいのではないかな。
そういう好意的な解釈では、↓の説明がつかない・・・

>やるなら初めから乱数埋め込むかリストにする方がよっぽどシンプルだ
593562:03/12/31 12:44
>>581
おおそうなのですか?
ありがとうございます。
594デフォルトの名無しさん:03/12/31 13:01
Windows NT などのコマンドで tree というのがあるのですが
この tree コマンドを C のリカーシブコールを使って書こうと
思っているのですが tree を再現したソースなどを置いている
サイトなど知りませんでしょうか ? ソースがなくても参考になる
サイトなら何でもいいので知っている方がいたら宜しくお願いします。
それは宿題なのかと、来年になるまで問い詰めたい。

で、とりあえず「リカーシブコール」なんて難しい単語じゃなくて、
「再帰」で検索しれ。

簡単に言えば、
1.ディレクトリ名を表示
2.指定したディレクトリ内の一覧を取得
3.一覧の中にサブディレクトリがあれば→そのディレクトリに対して再帰呼び出し

という流れだ。とりあえず実行したディレクトリのファイル一覧を表示できるようになるのが、
最初の関門だな。
1は「指定したディレクトリ名を表示」にしてくれ。
>>594
 最初から欲張ると完成できないから、極力単純化するように。
 まずはツリー表示のロジックを無視して、一覧を取得することだけ
考えなさい。
 ツリー表示については、それが出来てから質問すると、きっと
良い答えが返ってくるでしょう。
再帰不能
大晦日に宿題で困ってます。救いの手を。Cです。

毎月少しずつ貯金し、目標額に何年何ヶ月で達するかのプログラム。
注意1:目標額、月々の貯金学を入れるようにする
注意2:月々の変化を表示(利息は12ヶ月ごとの残高につくものとする)

利息は次の通りである
0.35%(2年まで)
0.45%(4年まで)
0.40%(6年まで)
0.55%(8年まで)
0.60%(10年まで)
0.50%(11年目以降)
//入出力は省略。
//年月基数に注意。

unsigned int year,month,dyear;
double sum=0,monthly,aim,interest[6]={1.0035,1.0045,1.0040,1.0055,1.0060,1.0050};
for(year=0;year<MAXINTEGER,sum<MAXDOUBLE/2;year++){
 dyear=year>=10 ? 5: year/2 ;
 for(month=0;month<12;month++){
  sum+=monthly;
  if(sum>=aim) break;
 }
 sum*=interest[dyear];
}

でも、解は一意に決まるから、一発で逆算する方法もあるんだろうなぁ
>>600
先輩〜!やってくれてありがたいんスが俺たちはまだ簡単なことしかやってないんで
一部理解できないです。
もうちょっと簡単になりませんかね?出来る人から見たら回りくどくても・・・
先生も俺がこんなん提出したら明らかに疑うしw
>for(year=0;year<MAXINTEGER,sum<MAXDOUBLE/2;year++){
ここは、for(year=0;sum<aim;year++){
でええのではないのか?
603600:03/12/31 21:33
>601
dyear=year>=10 ? 5: year/2 ;
は、
if(year>=10)
 dyear=5;
else
 dyear=year/2;
と同じ。
MAX何とか は、その型の最大値を超えないようにする為の閾値。
他はOK?
>602
monthly==0の時無限ループになる
おい、お前ら、大晦日にプログラムなんて
完全に負け組みでつよ?
605600:03/12/31 21:46
ごめん。
for文の第2項は","じゃなくて"&&"でつないでね。
>>603
メモ帳開いて教科書見ながら理解しようとしてるっす!
でもunsignedとかinterestとか、教科書にすらのってない_| ̄|○
ifは習ったっす!whileとかも習ったんすけど・・・
もうちょっと原始的にならんですか?俺バカ杉ですまんです。
>>605
&&は「かつ」って意味っすね!教科書のってますた!
>>604
漏れは負け組みでつが、こんな漏れのために考えてくれてる先輩たちはいい人っす!!
>>606
unsignedは符号なしを意味する
interestはあきらかに変数名だから習うとかそういう話ではない
ひょっとして配列をやってないとか。
そもそも、何の本を教科書として使用しているのかというのが気になる
漏れも学生だが、「プログラミング言語C」と「Cプログラマのためのアルゴリズムとデータ構造」
を使ってる。当然ながら前者は誰でも読んだと思うのだが。
「入門ソフトウェアシリーズ@ C言語」っす!
わかりやすい教科書だと思うんすが俺の見方が悪いらしく・・・すまんです
612デフォルトの名無しさん:04/01/01 01:59
講師から配布された実行ファイルと同じように動作するプログラムを作る、
という宿題の場合、web上にその実行ファイルを上げて、
それをここに居る方々に見て貰って、回答して頂くという方法を取っても良いのでしょうか?
613デフォルトの名無しさん:04/01/01 02:08
>>612
上げないでその動作を説明した方がいいですよ。
>>612
その講師が許せばw
615デフォルトの名無しさん:04/01/01 02:44
ここにソースと実行ファイルを置きました↓
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=171

文献データベースっぽいものを作る課題です。
配布された完成見本の実行ファイルのようになれば良いそうです。
文献データは全てFD内に作られる「book.txt」に保存、それを使って処理するようなシステムです。

今の時点では「メイン」と「登録」は一応動くと思います。
「検索」「修正」はやりかけで何かいっぱい書いてありますが出来ていないので消して構いません。
「削除」「表示」はFDの開閉以外は全く手付かずです。

検索・修正・削除・表示のプログラム部分をどう記述すれば良いか教えてください。
お手数お掛けしますが宜しくお願いします。
与えられたファイルの中の文字を使われている文字数順に、文字と文字数を出力しなさい。但し、日本語と空白以外の文字は全て数えることとします。


入力:
This is a pen.
出力:
i: 2
s: 2
T: 1
h: 1
a: 1
p: 1
e: 1

よろしくお願いします。
n: 1
.: 1
>>616
言語は?
>>447との関係は?
>>618
case sensitiveなわけね。

>>617
>>447は単語単位。
619616:04/01/01 18:28
訂正が…


入力:
This is a pen.
出力:
i: 2
s: 2
T: 1
h: 1
a: 1
p: 1
e: 1
n: 1
.: 1

>>617
言語はCです。>>447は関係ないです。

文字を取り込むところまでは大丈夫なのですが、それ以降が上手くできなくて
久々にプログラムを暴走させました(´・ω・`)
この問題は何回も出ているのでレスしたくない(有名な事実)。
>>620
詳細キボンヌ。
冗長でハードだがこんなもんで十分だろ
#include <stdio.h>

int ucounts['Z'-'A'] = { 0 };
int lcounts['z'-'a'] = { 0 };

void print(int counts[], char startc ,int size) {
int i;
for(i=0;i<size;++i)
if( counts[i] > 0 )
printf("%c %d\n", startc+i, counts[i] );
}
int main(void) {
int c;
while( ( c = getchar() ) != EOF ) {
if( c >= 'A' && c <= 'Z' )
++ucounts[ c -= 'A' ];
else if( c >= 'a' && c <= 'z' )
++lcounts[ c -= 'a' ];
}
print(lcounts,'a','z'-'a');
print(ucounts,'A','Z'-'A');
return 0;
}
それだと
数が多い順に表示になっていないと思われ。
出力例を見ると "."も数えているようだから、面倒だな。
>但し、日本語と空白以外の文字は全て数えることとします。
ということは、日本語文字の判別もするのか・・・
単純な方法としては、出てきた文字の最大頻度freqmaxを求めておいて、
for(i=freqmax;i>0;i--){
for(c = {'a' to 'z' , 'A' to 'Z'} )
if(counts[c] == i) printf("%c %m",c,i);
}

この場合、O(256文字*freqmax回程度の計算回数)の計算量程度なんで
これでもいいんだが、やはりリスト構造を使った方がスマート・・・・・・
C++ なら std::map を使えば一瞬なんだがなあ……。
連想配列から作ってソートを0から作るとなると面倒というかやる気がしない。

そして使用する言語がCだということ(あなたが知っておくべき事実)
>>625
それだと入力順に表示されない罠。
なんで>>454はそんな必死なの?
630629:04/01/01 20:37
>>454はなんで
そんな必死なの?
1度ならず、2度も誤爆してしまったバカな漏れ。
つまり安定ソートが必要……って事は qsort も使えないのね。
マンドクサイ

>>629-630は何をそんなに必死なの?
宿題レベルにしては意外とやっかいだなこれ。
せめてアルファベットのみのアルファベット順表示
なら楽なのにな。
>>628
あぁー、じゃあ構造体を使って
struct {
char value;
int freq;
} c_count[255];
記録するのが簡単のような飢餓。
日本語と空白は除くとあるがギリシャ文字とかはどうするんだ
それと文字コードを特定してないって事はUnicodeもありかよ
そこまでを環境依存しないコードにするって結構めんどくね?
連想配列の実装と頻度順の安定ソートはそれほど手間じゃないが
”日本語と云々”が気になるんだよね。
'&'や'^'を含めた文字コード全部って意味なら構わないんだけど
そうじゃないなら厄介だし問題の情報が不足気味。
糞問にケテーイ。
s-jisだけど、別スレで1バイト2バイト混在で文字数数えてたよ。
http://pc2.2ch.net/test/read.cgi/tech/1072212403/393-396
半角の英数字と記号で良いんじゃない?
海外掲示板用オフラインリーダーを作るスレ
http://pc2.2ch.net/test/read.cgi/tech/1072883528/

海外でよく使われていうる掲示板スクリプト
専用のオフラインリーダー作って下さい。

必要な条件はID、PASSを管理できること、
OpenJaneみたいな三面型の見た目。
簡単にローカライズできるように言語ファイルを採用
643641:04/01/02 22:47
ホントだ……って正規表現スレかよ! 何の課題なんだホントの話
新年早々マルチ糞かよ... ショボーン
>>641
だいぶ前に既出の問題なのに、このスレを無視して他スレにマルチって……
ネタでやってるようにしか思えん。

ネタじゃないとしても、これだけいろいろな所で丸投げしているってことは
こいつは課題の意味自体を全く理解していないっぽい。
647646:04/01/03 01:38
って、全部コピペかよ。
こんなことしたら誰も答えないってわかりきってるのに。
648デフォルトの名無しさん:04/01/03 07:35
Cの質問です。丸投げですみません

<基本部>
国語の点数を入力して、その合計点を求めなさい。対象人数は5人とする。
点数入力時に入力促進メッセージを表示する。
入力する国語の点数が正答範囲(0〜100点)の場合は
合計点を求める操作をする。非正答範囲の場合は合計点には加えない。
合計点表示には「国語合計点=」という題目を付記してから表示する。


ここまでは
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=172
にアップしました。
次からの課題の部分が問題なんです。
649デフォルトの名無しさん:04/01/03 07:36
>>648の続き
次の機能を追加せよ

(1)
正答範囲の点数を入力した学生数から平均点を求めて、その値を表示する。
表示には「平均点=」という題目を付記して表示する。
同様に学生数も「人数=」という題目をつけて表示する。
全員が非正答範囲の場合は「計算できません」というメッセージを表示する。

(2)
正答点数から最高点と最低点を求める機能を追加する。
求めた最高点を最低点を表示する。

(3)
非正答範囲を入力した場合、2回まで再入力可能にする。
3回目も不適切な点を入力した場合は合計点・平均点の
計算対象から省く処理を追加する。
2回までの不適切な点を入力した場合のエラー表示文
  →「適切な点を再入力してください」
3回目も不適切な点を入力した場合のエラー表示文
  →「集計から外します」


よろしくお願いします。
>>648-649
で、問題はわかったが、お前はその問題のどの部分が判らないのかが俺には判らないんだが
ぜんぶやってくださいということでは。
>>650
丸投げって書いてるぞ。ちゃんと嫁。
苦労の末、やっとこのザマなんですけど、
1、簡単な足し算、引き算、掛け算、割り算を順不同で80問出題する。
2、出題した80題の問題をテキストに出力する。
っていうプログラムを作りたいんです。
これじゃ、まだ足し算、引き算、掛け算、割り算を単純に80問出題しただけなんです。ソースもきたないし・・・。

#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
main(){
int i;
srand( (unsigned int) time(NULL) );

printf("\n足し算\n");
for(i=0;i<5;i++)
printf("%d+%d=  %d+%d=  %d+%d=  %d+%d=  \n",rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1);
printf("\n引き算\n");
for(i=0;i<5;i++)
printf("%d−%d=  %d−%d=  %d−%d=  %d−%d=  \n",rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1,rand()%19+1);
printf("\n掛け算\n");
for(i=0;i<5;i++)
printf("%d×%d=  %d×%d=  %d×%d=  %d×%d=  \n",rand()%9+1,rand()%9+1,rand()%9+1,rand()%9+1,rand()%9+1,rand()%9+1,rand()%9+1,rand()%9+1);
printf("\n割り算\n");
for(i=0;i<5;i++)
printf("%d÷%d=  %d÷%d=  %d÷%d=  %d÷%d=  \n",rand()%4+1,rand()%4+1,rand()%4+1,rand()%4+1,rand()%4+1,rand()%4+1,rand()%4+1,rand()%4+1);

printf("\n");
getch();
return 0;
}
どうぞ、私にご教授ください。
>>649
入力ループは 正答範囲の人数5人ではなく、非正答範囲の人数も含めて5人 でいいんだよな?
int kokugo,cnt,t_kokugo;
int num,min,max,retry;
min=100+1; max=0-1;
num=t_kokugo=0;
printf("*** 国語得点の集計プログラム ***\n");
for(cnt=0; cnt<5; ++cnt){
printf("国語の点数=");
retry=2;
do{
scanf("%d",&kokugo);
if(0<=kokugo && kokugo<=100) break;
if(--retry) printf(" 適切な点を再入力してください=");
else printf(" 集計から外します。\n");
}while(retry);
if(0<=kokugo && kokugo<=100){
t_kokugo=t_kokugo+kokugo;
if(min>kokugo) min=kokugo;
if(max<kokugo) max=kokugo;
++num;
} }
printf("国語合計点=%d点\n",t_kokugo);
if(num<0) printf("平均点は計算できません\n");
else{
printf("平均点=%d点\n",t_kokugo/num);
printf(" 人数=%d人\n",num);
}
if(min>=0) printf("最高点=%d点, 最低点=%d点\n",max,min);
else printf("最高点,最低点は不明です\n");
>>653
もまえのプルグルム リダイレクト テキスト
656スマソ:04/01/03 11:55
>>654
if(max>=0) printf("最高点=%d点, 最低点=%d点\n",max,min);
だね
657653:04/01/03 12:05
>>655
リダイレクトテキスト?
よく分からないんですけど・・・
>>653
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>

int main() {
int i = 0;
char *opstr[4] = { "+","−","×","÷" };
char *filename = "output"; /* 手抜き:ファイル名固定 */
FILE *fp;

srand( (unsigned int) time(NULL) );

if((fp = fopen(filename,"w")) != NULL) {
while(i++ < 80) fprintf(fp,"%d %s %d =\n",rand()%19+1,opstr[rand()%4],rand()%19+1);
fclose(fp);
} else {
printf("!file %s cannot open!\n",filename);
}
return 0;
}

>>657
コマンド > ファイル名
659653:04/01/03 12:16
>>658
スゴイです!
どうしてそんなにコンパクトになるのか不思議なくらい・・・

ありがとうございました。
660最凶VB厨房:04/01/03 12:52
わぃもつくってみたどー。
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
int main(void)
{
srand((unsigned int)time(NULL));
int i;
int j;
int k;
const int numtate=5;
const int numyoko=4;
const int max=19;
const char* enzanshi="+-*/";
const char *fname ="problem.txt";
FILE *fp;
if((fp = fopen(fname,"w"))!=NULL)
{
for(i=0;i<4;i++)
{
for(j=0;j<numtate;j++)
{
for(k=0;k<numyoko;k++)
{
661最凶VB厨房:04/01/03 12:53
fprintf(fp,"%2d%c%2d=\t",rand()%max+1,enzanshi[i],rand()%max+1);
printf("%2d%c%2d=\t",rand()%max+1,enzanshi[i],rand()%max+1);
}
fprintf(fp,"\n");
printf("\n");
}
}
fclose(fp);
}
return 0;
}
662スマソ:04/01/03 12:55
>>654
0割りするぞゴルァ

if(num<=0) printf("平均点は計算できません\n");
としる
>>661
なんでファイルと標準出力に分けて表示するの?
その2つの同じ物出力したいなら rand() を毎回呼び出したらが変わっちゃうし
そんな馬鹿なやり方はしない。
664最凶VB厨房:04/01/03 12:58
あららw。申し訳
身長・体重のデータを入力すると肥満度を計算するプログラムを作成せよ。
身長・体重を表す際、double型のメンバー2つ(身長:height/体重:weight)を
持つ構造体を用いる。また、肥満度は次式で計算できる。
666665:04/01/03 13:51
(体重[kg])/(身長[m])^2

ちなみに18.56-25が標準。25を超えると肥満傾向。
18.5未満だと痩せすぎ。

実行結果例

身長・体重を入力してください。
身長[cm]:180
体重[kg]:80
あなたの肥満度は24.69です。



途中で切れてごめんなさい
どなたかおながいします
667最凶VB厨房:04/01/03 14:19
#include <stdio.h>
struct ningen
{
double weight;
double height;
};
int main (void)
{
struct ningen b;
double r;
double himando;
printf("身長・体重を入力してください。\n");
printf("身長[cm]:");
scanf("%lf",&r);
b.height=r/(double)100;
printf("体重[kg]:");
scanf("%lf",&r);
b.weight=r;
himando=b.weight/b.height/b.height;
printf("あなたの肥満度は%2.2lfです。\n",himando);
if(himando<18.56)
printf("やせすぎじゃね?\n");
else if(himando<=25)
printf("標準っぽぃぜ?\n");
else
printf("肥満傾向らしいぜ?\n");
return 0;
}
//適当
668653:04/01/03 14:21
>>658さんのに手を加えて、ファイル名を指定できるようにしてみたんですけど、コレでいいんですよね?

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

int main() {
int i = 0;
char name[64];
printf ("ファイル名=");
scanf ("%s",&name); /* ファイル名指定 */
char *opstr[4] = { "+","−","×","÷" };
char *filename = name;
FILE *fp;

srand( (unsigned int) time(NULL) );

if((fp = fopen(filename,"w")) != NULL) {
while(i++ < 80) fprintf(fp,"%d %s %d =\n",rand()%19+1,opstr[rand()%4],rand()%19+1);
fclose(fp);
} else {
printf("!file %s cannot open!\n",filename);
}
return 0;
}
>>667
素朴な疑問。
何故scanf()で直接構造体に代入しないでrなんて意味不明な名前の一時変数を使う?

あー、それからprintf()のフォーマット指定子で%lfなんてのは間違いだから。
670665:04/01/03 14:24
>>667
I really thank you!
671665:04/01/03 14:29
>>669
構造体に直接代入するようにしても動きました。ありがd。
672最凶VB厨房:04/01/03 14:31
>>669
コンパイルエラーで弾かれた。
勘違いだったようだが。

Cは全然知らん。
673デフォルトの名無しさん:04/01/03 14:41
『標準入力からテキストファイルを読み込み、単語を検出して辞書順に並べ、出現頻度を標準出力に出力しなさい。』
って宿題があるのですが分かる方お願いします。ソースプログラムから単語を検出するのですが、コマンド
プロンプトからファイル名を入力すれば、実行する形にするみたいです。
あと、検出に正規表現とかそういうのを使っていたと思うのですが・・・ 

CでもC++でも、自分全く分からない房なのでお願いします。

ま た か
>>673
マルチポスト+荒らしか?
先ずは検索してみてから問え。
ま た だ な
最初からここにきてればまだよかったろうに。
だいたい「単語」の定義が不明なのにオートマトンとか正規表現とか適当なこと書くなよ。
>>668

int main() {
int i = 0;
char filename[64];
char *opstr[4] = { "+","−","×","÷" };
/* char *filename = name; ←こんな わけわからんこと しなくても いいよ。 */
FILE *fp;

printf ("ファイル名=");
scanf ("%s",filename); /* ファイル名指定 */
>>668
よくない

char name[64];
scanf ("%s",&name);
&を使わないか&name[0]


char *filename = name;
意味が無い
かぶった
681デフォルトの名無しさん:04/01/03 15:01
>>675
マルチポスト+荒らしではない。検索したんだよ!だから聞いてるんだ(糞
>>677
単語=ソースプログラムに出てくるfor intとかのこと
>>681
本物?

君は俺の確認してるだけで6スレに同じ質問を投下している。
これをマルチポストと言わず何と呼ぶ?

何の答えになってない。
単語の定義を聞いてる。
for と int だけ検出すればいいのか?
惜しい。実に惜しい。
もう少しがんばって検索しなされ。
684668:04/01/03 15:11
あ、なるほど。
二回も代入する必要はないですね。。。

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

int main() {
int i = 0;
char filename[64];
char *opstr[4] = { "+","−","×","÷" };
printf ("ファイル名=");
scanf ("%s",filename);
FILE *fp;
srand((unsigned int)time(NULL));

if((fp = fopen(filename,"w")) != NULL) {
while(i++ < 80) fprintf(fp,"%d %s %d =\n",rand()%19+1,opstr[rand()%4],rand()%19+1);
fclose(fp);
} else {
printf("!file %s cannot open!\n",filename);
}
return 0;
}

コレで完成です!!(たぶん)
ありがとうございました。
685デフォルトの名無しさん:04/01/03 15:14
>>682
とりあえず、その解釈で間違っていないでつ。
解答を元にさらに自分でいじるヤツは久しぶりだな。
ちなみにもう少し厳密には return 0 はプロセスの正常終了なんで
fopen が失敗した場合の処理では return -1 みたいにした方がよい。
>>686
普通は負の値は返さないよ
return 1でいいよ
>>687
686じゃないんだが、-1を返さないのには何か訳があるの?
"not 0"はみんな一緒と思ってたんだけど、まずいんだろうか。
まぁ慣例って事で
691668:04/01/03 15:26
"0"と"-1"の違いがよく分からないのですが、実行結果は同じですよね?
(両方試してみましたが、変わらなかったです。エラーを起こしたときに変わるのかもしれないけど・・・)

"0"がいいとか"-1"がいいとか言うのって、コンパイラによっても変わるものなのでしょうか?
というか、EXIT_SUCCESSと、EXIT_FAILUREを使えばいいような。
まあ、スレ違いなんで。
つーかそこまで拘るんなら数値そのまま返したりせずに
#include <stdlib.h>
return EXIT_FAILURE;
とか使うな。
親プロセスがある前提で終了コードを使い分ける場合は全部これじゃあかんけど。
694689:04/01/03 15:28
>690
なるほど。ありがとー。
これから心がけます。
OS
>>682
とりあえず。こんな感じで。あなたが望んでる処理とは遠いですけど。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main(int,char* argv[])
{
  map<string,int> mp;
  ifstream in(argv[1]);
  string str;
  while(in){
    in>>str;
    mp[str] += 1;
  }
  map<string,int>::iterator iter = mp.begin();
  while( iter != mp.end() ){
    cout<<iter->first<<' '<<iter->second<<endl;
    ++iter;
  }
  return 0;
}
おっと、#include<fstream>忘れてた。
あ、ちなみに動作確認してないですから。あしからず。
>>689
main からの return や exit で
EXIT_SUCCESS と EXIT_FAILURE 以外が返された場合の
振る舞いって規格では処理系依存だった気がする。
つーかコマンドラインで実行して戻り値を気にしたいのは
シェルスクリプトとかバッチで使う時だ
700デフォルトの名無しさん:04/01/03 15:40
>>696
神だぁ〜とりあえずやってみます。どうもありがとうございますた。
>>697
operator[] で作成される場合は
デフォルトコンストラクタが value を 0 に初期化してくれることを期待してるんだろうけど、
std::pair がデフォルトコンストラクタを定義していない環境もあったりするんで
find して初期化処理を分けてやった方が行儀がいいと思う(若干高速だし)。
で、結論としてはmain()から負の値を返すのは阿呆と言うことで。
703701:04/01/03 15:45
find じゃないね lower_bound だ
>>702
EXIT_FAILUREが負の処理系もあるぞ。
705最凶VB厨房:04/01/03 15:48
Cの人は大変ですな・・・。
>>702
負値だからじゃなくて SUCCESS/FAILURE 以外が困るって話では。
俺はシェルスクリプトとかから呼ぶ前提で作ったプログラムで
に戻り値使い分ける場合は正負でおおざっぱに分ける場合もある。

それとも「負値だから」って理由で処理系が困る場合ってあるの?
そもそも EXIT_FAILURE が常に非負という保証はなかったと思うんだけど。
まぁ慣例って事で
>>706
ひっしだな
JISより引用
>(前略)最後に、制御をホスト環境に戻す。statusの値が0又はEXIT_SUCCESSの場合、成功終了(successful
>termination)状態を処理系定義の形式で返す。statusの値がEXIT_SAIKUREの場合、失敗終了(unsuccessful
>termination)状態を処理系定義の形式で返す。それ以外の場合、返される値は処理系定義とする。(後略)
>>709
EXIT_SAIKUREって何だよw
偽物掴まされてないか?
>>710
typoですた。(´・ω・`)
>>710
見ることしかできないようにしてあるから、多分手で打ったんだろう。
しかし打っているときに気づかないものか。
厳密には
スクリプト処理する場合なんかであるプロセスの結果によって処理分岐したくても
0 (EXIT_SUCCESS) 以外を返すのはまずいってこと?
それとも振る舞いからすれば親プロセスも「処理系」に含んでいいのかな。
実際に異なる値を返して困ることはそうないと思うけど不安が残るな……。
714702:04/01/03 16:54
書き方悪かったね。
マクロでない負の値を返す理由がないってことで。

ちなみにOSによっては負の値を返されるとコマンド処理系が
エラー処理して鬱陶しいと言う例もある。
#Winで言うと異常終了ダイアログみたいなものが出やがる。

それに、コマンド処理系が負値を扱えない場合も多いだろうしね。
#例えばMS-DOSでは-1を返してもErrorLevel255と扱われる。
>>713
unix類似のコマンド処理系では、0を正常1を異常とするケースが多いが、
例えばgrepコマンドの結果は1がNotFoundで2が異常だったりする。
だからこそEXIT_SUCCESS/EXIT_FAILURE以外は処理系依存なわけだね。
うーん、
unix みたいにプロセスを組み合わたりスクリプト処理することが当然の環境では
あるサブプロセスの戻り値に対して処理系が勝手にエラー処理を挿入してくるという事態は考えにくいんだけど。
たとえプログラム自体がポータブルで
スクリプト処理の仕組みを端末が備えていても
プログラムの戻り値のせいで環境依存になってしまう可能性は否定できないってことになるのか。
プログラムを単体で動かす段階から進んで、
他のプログラムやスクリプトで操作しようと言うなら、
処理系定義の挙動を利用するのは必要だし、そうすべきだと思う。
どっちにしろ、宿題レベルではないだろう。これ以上やるならスレ変えよう。
スマソ。
大体結論も出たようなので去ります。
つきあってくれた人ありがd
(・3・) アルェー ぼるじょあスレなのにぼるじょあイナイC
(・3・) エェー 呼んだ?
ぼるじょあだからのか、冬休みだからなのか、質問が少ないですね。
そろそろ、質問も増えるのかねぇ。
strtokの使い方がいまいちわかんないです。
誰か適当に書いて説明しやがって下さい。
char data[]="ab,c,d,ef,g";
char *p;

p=strtok(data,","); // 最初に,が書いているところまでの文字を指す

printf("%s",p); // ab
p=strtok(NULL,","); // 次に,が書いてるところまでポインタ移動
printf("%s",p); // c

以下略。
>>725
デリミタとマッチした文字がナル文字に置換されてる点に
一切触れないのは何かの罠ですか?
ネタっぽく書いたが本当に知りたかった罠。
>>726
詳細キボンヌ。
>>673は面白がって荒らしてるだけでしょ。
>>727
本当に知りたいのならなぜ>>724のMSDNを読んでないんだ?
説明読むより簡単な例を見たほうが
わかりやすい罠。
イメージをつかんでから、説明書を
読んだほうが定着しやすいと思っている罠。
>説明読むより簡単な例を見たほうが
お前リンクすら開いていないだろ。
>>731
そんなことない罠。
>>648-649です。
遅レスになってしまいましたが、ありがとうございました。助かりました
>>732
人に教えを請う態度じゃねぇな
死ねや
>>734
熱くなるなよくそプログラマー。質問が少ないというから適当に
話題出しただけだ。
バカが開き直りやがった(ワ
>>736
なんでそんなえらそうなの(プ
釣られすぎ。
余所でやれ余所で。
>>1を読んで、宿題ドゾー。面白い問題だといいな。
#include<stdio.h>
int main(void){
printf("hello world")
return 0;
}


なぜかコンパイルでエラーがでます。
なぜでしょうか?
741668:04/01/03 23:49
覚えたてですけど・・・
;
が抜けてるんじゃないんですか?
おい!>>741
>>740>>739に対するネタだ!
マジレスしてはいかん!
743668:04/01/04 00:04
ごめんなさい。
本当に分からないのかと思った・・・
自分も、よく「;」が抜けてるんで。
冬休みのレポートでちと悩んでます。
問題の部分だけ取り出すと

#include<stdio.h>
int f_open(char *,FILE *);

int main(void){
FILE *out;
if(f_open("a.txt",out))
out=stdout;
fprintf(out,"Hello.\n");
printf("end.\n");
return 0;
}

int f_open(char *s,FILE *out){
int n=0;
if((out=fopen(s,"w"))==NULL) n=-1;
return n;
}

"a.txt"を""にすると想定通り全部標準出力してくれますが
"a.txt"だとファイルは作ってくれますが中は空で、
fprintfでエラーになってるのか"end."も出ません。
f_open部分もmain()に入れた方がいいのでしょうか?
というか「out=stdout;」はやめた方がいいですか?
>>744
関数f_open()において、outの生存期間に注意せよ。
関数でfopen()した場合、その戻り値を更に上位に戻すには
関数の戻り値をFILE *にするか引き数としてFILE **を渡して
書き込んでやる必要がある。
ポインタの値を変更したければポインタのポインタを使う。
FILE* を pFILE とかに置き換えて考えてみれ。

#include<stdio.h>
int f_open(char *,FILE **);

int main(void){
FILE *out;
if(f_open("a.txt",&out))
out=stdout;
fprintf(out,"Hello.\n");
printf("end.\n");
return 0;
}

int f_open(char *s,FILE **out){
if( (*out=fopen(s,"w"))==NULL )
return -1;
else
return 0;
}

つーかこんな薄いラップの関数を作る意味があんま見えないんだけどね
それと、fopen が成功した場合はきちんと fclose しないとよくないね。
stdout が入ってる場合は自前で fclose はしないけど。
748744:04/01/04 04:15
>>746 のを組んでみたらうまくいきました

実際は数値計算(400行くらい)で数値計算部分はうまくいったのだけど
出力部分で40-50行くらいの関数があってどうにか分割できないかと
あれこれやってて>>744みたいなとこで分割できないか考えてたんです。

>>745-747 dクス
open を関数化したなら close も関数化して面倒見るのが行儀なんだが
そうすると stdout がちょっと問題なんで俺ならこんな感じにするかな。
やっつけだけど。

FILE* f_open(const char* file_name) { // ”何らかの”有効なファイルディスクリプタが返る
FILE* ret_fp;
if( ( ret_fp = fopen(file_name,"w") ) != NULL )
return ret_fp;
else
return stdout;
}

void f_close(FILE* fp) {
if( fp != stdout)
fclose(fp);
}

int main(void) {
const char file_name[] = "a.txt";
FILE* out = f_open(file_name);
fprintf( out, "Hello.\n" );
f_close(out);
printf("end.\n");
return 0;
}
>>749
stderrは?
>>750
どこに stderr がいるのかわからん。

>>748の発言からするに、数値計算の結果を出力する先として
通常はファイルを用いるがそれができなかった場合は代わりに標準出力に出したい、
という事情だと推測されるんだが。
abcdをdcbaと表示するプログラム
アドレス操作で配列を1つしか使わずにという
問題なのですがどうかよろしくおねがいします。
ループすれば?

for(len=strlen(str)-1; len>=0; --len)
putchar(str[len]);
アドレス操作とか言ってるぐらいだからchar*を使って欲しいんだろ
?? *(str+len) って事?
756最凶VB厨房:04/01/04 12:32
#include <stdio.h>
int main()
{
char *c="abcd";
char *p=&c[3];
for(int i=0;i<4;i++)
{
printf("%c",*p);
p--;
}
return 0;
}
char *p=&c[3];
for(int i=0;i<4;i++)

3 とか 4 とか止めとけ(w
758最凶VB厨房:04/01/04 12:41
ほぃ。
#include <stdio.h>
#include <string.h>
int main()
{
char *c="abcd";
char *p=&c[strlen(c)-1];
for(int i=0;i<strlen(c);i++)
{
printf("%c",*p);
p--;
}
return 0;
}
char *c="abcd";
char *p;
for(p=&c[strlen(c)-1];p>=c;--p)
putchar(*p);
#include <stdio.h>

int main(){
char c[]="abcd";
char *p;
for(p=c+strlen(c)-1;p>=c;p--){
printf("%c",*p);
}
return 0;
}
せめて、これくらいは。
761デフォルトの名無しさん:04/01/04 13:28
"*"を個数分表示するcのプログラムおしえて

 5  って入力されたら
 ***** って出力去れる感じで
762最凶VB厨房:04/01/04 13:32
#include <stdio.h>

int main()
{
int input;
scanf("%d",&input);
for(int i=0;i<input;i++)
{
printf("*");
}
return 0;
}
>>762
thx!
void asterisk(int n)
{
 char ast[][255]={"","*","**","***","****","*****","******",\
  "*******","********","*********","**********","***********",\
  "************","*************","**************","***************",\
  "****************","*****************","******************",\
  "*******************","********************","*********************",\
  "**********************","***********************",};
 sprintf(ast[n]);
 return;
}
>>764
n > 23 の時に破綻する。
>>765
そんなことよりもっと重大な問題があるだろ。
767764:04/01/04 13:43
>765
よくぞ数えたな。
その根気を大切にな。
768764:04/01/04 13:47
>766
よく見つけたな。
その注意力を失うなよ。
769752:04/01/04 14:01
答えてくださった皆さんありがとうございました。
void putnchr(char c,int n)
{
while(n-- > 0) putchar(c);
}

void asterisk(int n)
{
putnchr('*',n);
}
771超初心者的存在:04/01/04 14:09
C++です。
4バイト整数を引数として、その整数値を16進数で表示する関数を作れ
ただし、戻り値はないとする。

もうだめぽ。お暇な方よかったらお願いします
void
773最凶VB厨房:04/01/04 14:20
#include <iostream>
using namespace std;

void hoge(int guhihi);
int main(void)
{
hoge(4294967295);
return 0;
}
void hoge(int guhihi)
{
printf("%x",guhihi);
return;
}
774最凶VB厨房:04/01/04 14:21
あw
>773
おお、1バイトでも2バイトでも8バイトでもいけるな。すごいな。
hage(char *fb)
{
 printf("%x",(fb[0]<<24)+(fb[1]<<16)+(fb[2]<<8)+fb[3]);
 return;
}

キャストしてね。
777776:04/01/04 14:35
こっちのほうがよかった。

hage(char *fb)
{
 printf("%02x%02x%02x%02x",fb[0],fb[1],fb[2],fb[3]);
 return;
}

キャストしてね。
>>771
#include <iostream>
#include <iomanip>
using namespace std;

void print(long val) {
cout << hex << setfill('0') << setw(8) << val;
}
779超初心者的存在:04/01/04 14:42
>>776さん、ありがとうございます!
つーか、たまにはお前らが宿題出せよ。
問題
「コマンドラインから指定されたテキストファイルの内容を行単位で読み取り、
コマンドラインで指定した桁数で改行し、標準出力に出力するプログラム、
FOLDを作成しなさい」

・第一引数にテキストファイル名、第二引数に折り返す桁数を指定する。
 (FOLD ファイル名 折り返す桁数)
・折り返す桁数は1以上80以下の整数とする。
・行が、折り返す桁数以下の文字数で改行されている場合は、そのまま出力する。
・コマンド引数が指定されていない場合、想定している書式と異なる場合は、
 適切なメッセージを標準エラー出力に出力し、終了する。
・テキストファイルが存在しない場合や処理できない場合、
 適切なメッセージを標準エラー出力に出力し、終了する。
・テキストファイルの内容は、印字可能文字および空白文字、復帰改行文字のみとする。
(テキストファイルにマルチバイト文字が存在することは考慮しなくても良い)
>>781
疑問点
・桁数として1未満が指定された場合の処理は?
・タブ文字はそのまま出力するのか? その場合「桁数」はどう扱うのか?

代案
・リダイレクトやパイプ処理の点から、入力テキストは標準入力から受け取る方がいいかも。
・上と関連して、そもそも桁数未指定や不正な桁数が入力された場合は
 元テキストのまま出力した方がソフトで使い勝手がよいのでは?
 あるいは、桁数の上限に制限があるのなら
 その値をデフォルトの折り返し桁数として用いてもよいのでは?


>>782
・桁数として1未満が指定された場合の処理は?
→想定していないコマンド引数が指定されたとする。
・タブ文字はそのまま出力するのか? その場合「桁数」はどう扱うのか?
→タブ文字はテキストファイル中に存在しないことを条件とする。

・リダイレクトやパイプ処理の点から、入力テキストは標準入力から受け取る方がいいかも。
・上と関連して、そもそも桁数未指定や不正な桁数が入力された場合は
 元テキストのまま出力した方がソフトで使い勝手がよいのでは?
→宿題なので、使い勝手は考えてませんですた。。。
つまり、基本的なファイル処理とテキスト処理が出来ることを主眼においてるわけで。
784>>782版:04/01/04 20:36
#include <stdio.h> // get/putchar()
#include <stdlib.h> // atoi()
#include <ctype.h> // isprint(), isspace()

const int COL_MIN = 1;
const int COL_MAX = 80;
const int COL_DEFAULT = 80;

int print_line(int col_size) {
int col;
int c;
for ( col = 0 ; col < col_size && ( c = getchar() ) != EOF && c != '\n' ; ++col )
if( isprint(c) )
if( isspace(c) )
putchar(' ');
else
putchar(c);
return c;
}

int main(int argc, char** argv) {
int col_size;
if ( argc < 2 || ( col_size = atoi( argv[1] ) ) < COL_MIN || col_size > COL_MAX )
col_size = COL_DEFAULT;
while( print_line(col_size) != EOF )
putchar('\n');
}
785デフォルトの名無しさん:04/01/04 22:09
お願いします、プログラムがまだ漠然としか分かってないもので、どうすると良いか分かりません(´ω`)

C++で、引数の文字列をメッセージとして表示する整数値入力のための関数を作りなさい 
ただし戻り値は入力した整数とする

例えばmain関数において  a=kansuu("整数を入力汁");
と呼び出すと、実行時に   整数を入力汁  
というメッセージが出力され、キーボードからの入力がmain関数内の変数aに渡される、というものです
表示の仕方と数字の入力の仕方を調べなさい。
>>785

int input(string str) {
int i;
cout << str;
cin >> i;
return i;
}
>>785
入力も出力もふつうは一番最初に習うことだろ。
「漠然と」なんて中途半端な保身考えるから反感買うんだよ。

int input_int( const char* str ) {
int i;
std::cout << str;
std::cin >> i;
return i;
}
789デフォルトの名無しさん:04/01/05 01:53
さて、今日から仕事はじめは訳だが。
>>789
正月ボケしとるなあ。
>>789
翻訳業ですか
792デフォルトの名無しさん:04/01/05 05:27
おはよう。789です。ネタになって、新年からうれしい。

実は、言われて気付いた。
今日もなんか、ミスしそうで、鬱。
793デフォルトの名無しさん:04/01/05 14:01
すいません演習問題がわかりません。教えてください
以下のプログラムを作成、テストして下さい。
・入力された受験者の氏名と性別テストの得点を読み込み構造体に格納する。
・男女別の平均点をだし、その平均点を基準とした合格、不合格のデータを各人の構造体に格納する。
・男女別に合格者の氏名と合格点をコンソールにひょうじする。

出力イメージ

%goukaku
please input name & sei(f or m) & score
tomoko f 80
yuko f 65
takuya m 55
kohoru f 70
satoshi m 60
masaki m 95
mina m 50
CTL+D
***goukaku ( male )***
masaki 95
***goukaku ( femail )***
tomoko 80
kahoru 70
%
出力イメージとまったく同じにしなくてもよい
以上宜しくお願いします。
794デフォルトの名無しさん:04/01/05 14:04
もう一問あるんです。
@以下のプログラムを作成、テストして下さい。
・入力された文字列をワークにコピーする関数を作成する。
・入力された文字列と、ワークをコンソールに出力する。
出力イメージ
% copy
hello!
in ―――> hello
out ―――> hello
%
出力イメージとまったく同じにしなくてもよい

出力イメージとまったく同じにしなくてもよい
2chの優秀なプログラマーのみなさんよろしくお願いします。
795デフォルトの名無しさん:04/01/05 14:05
これもわかりません(泣き)
A以下のプログラムを作成、テストして下さい。
・10個の入力した整数データ配列の中から、指定したデータを探し、その添え字を表示する関数を作成する。
・出力イメージ

% tansaku
5
3
10
8
15
7
20
1
14
28
tansaku key−> 7
7 ――> 6
%

本当に宜しくおねがいします。
796NOT 793-795:04/01/05 14:28
すみません、どうしても分からないことがあるのでここにすがってみます。

■標準入力から不定長の文字列を取り出し、逆に表示しなさい。
(マルチバイト文字が壊れるが、それは考慮しない)

EOFまで1バイトずつgetcで読んでは確保してを繰り返せば出来そうですが
stringなどSTLを使ってもっとスマートに出来ないものでしょうか。
色々考えたのですがどうにもうまくいかなくて、よろしくお願いします(´・ω・`)
797デフォルトの名無しさん:04/01/05 14:30
たびたびすいませんこれで最後です。
B以下のプログラムを作成、テストして下さい。
・文字列sの中から文字列tが含まれているかどうかを調べる関数を作成する。
・ただし文字列sの中で、文字列tの始まる位置を返し、含まれない場合は、−1をかえすようにする。
出力イメージ
%index
s―――> aababcb
t―――> abc
3
%

出力イメージとまったく同じにしなくてもよい

@以下の仕様でプログラムを作成、テストして下さい。
・medio.txt(予め用意する)をリードし、社員名部分のみを一覧表示する。
・レコードバッファは、構造体にすること。
・テスト仕様書を作成すること
・仕様する標準関数を以下のものを使用する。
・fopen( )・fread( )・fclose( )・sizeof( )・printf( )

A以下のプログラムを作成テストして下さい。
・パラメータとして社員Noを与える。
・meibo.txt(予め用意する)をリードし、該当する社員名を表示する。
・レコードバッファは、構造体にすること。
・テスト仕様書を作成すること。
・使用する標準関数を以下のものを使用する。
fopen( )・fread( )・fclose( )・sizeof( )・printf( )・memcmp( )
以上優秀な2Chの皆様宜しくお願いします。
>>793
・入力する受験者の数は上限ありでもいいのか?
・平均点を基準に合否判定だが、平均点以上が合格、未満が不合格でいいのか?
・上記の判定は、男女別に行うのか(男子の点数は女子の合否に全く影響しない)?
>>794
・「ワーク」とはなんだ?別の記憶領域にコピーするという理解でいいのか?
>>795
・指定したデータが見つからなかった場合の処理は?
・出力例では、7に対して6が表示されているが、添字は1ベースなのか?
799デフォルトの名無しさん:04/01/05 14:45
>>798さま
すいません演習をそのままコピーしたので、後はおまかせという形でお願いしたいのですが。
勝手いって本当に申し訳ありません。
あと一問ありました(泣き)。
A以下のプログラムを作成、テストしてください。
・パラメータとして、3つの数値を与える。
・3つの数値を比較し、大きい順にコンソールに出力する。
・大小比較部は、関数を使用すること。
・テスト仕様書を作成すること。
・使用する標準関数を以下のものを使用する。
・printf()
・atoi()
細かいことはわたしもわかりませんのでお任せいたします。
>>796
こんなのは?遅いけど。
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
std::string input;
getline(std::cin, input, '\0');
std::reverse_copy(input.begin(), input.end(), std::ostream_iterator<char>(std::cout));
}
>>794
#include <stdio.h>
#define BUFSIZE 80

void copy(char *to,char *from) {
/* strcpy(to,from); */
while( (*to++ = *from++) != '\0' );
}

int main() {
char buf[BUFSIZE];
char workbuf[BUFSIZE];

gets(buf);
copy(workbuf,buf);

printf("in ----->%s\n",buf);
printf("out----->%s\n",workbuf);

return 0;
}
>>795
#include <stdio.h>

int main() {
int i,a,array[10];
for(i=0;i<10;i++) scanf("%d",&array[i]);
printf("tansaku key->");
scanf("%d",&a);
for(i=0;i<10;i++) {
if( array[i] == a) {
printf("%d --> %d\n",a,i /* +1 ? */ );
break;
}
}
/*if(i==10) printf("value %d not found \n",a);*/
return 0;
}
803デフォルトの名無しさん:04/01/05 16:08
>>801さま早速の解答ありがとうございます。
優秀なあなたたちだけがたよりでございます。
こころより感謝をもうしあげます。
>>793
ごちゃごちゃだが一応できた。
#include<stdio.h>
#include<string.h>
typedef struct {
  char name[20];
  int sei;
  int score;
  int goukaku;//合格なら1を入れる。
}DATA;
int main(void){
  DATA data[100]={0,};
  char buf[100];
  int i=0, k, sum_m=0, sum_f=0, num_m=0, num_f=0;
  double ave_m, ave_f;
  puts("please input name & sei(f or m) & score");
  while(fgets(buf,100,stdin)!=NULL){
    sscanf(buf,"%s %c %d",&data[i].name,&data[i].sei,&data[i].score);
    if(data[i].sei=='m'){ sum_m+=data[i].score; num_m++;}
    else if(data[i].sei=='f'){sum_f+=data[i].score; num_f++;}
    i++;
  }
  if(num_m!=0)ave_m=(double)sum_m/num_m;
  if(num_f!=0)ave_f=(double)sum_f/num_f;


805続き:04/01/05 16:43
  for(k=0;k<i;k++){
    if(data[k].sei=='m'){
      if(data[k].score>=ave_m) data[k].goukaku=1;}
    else if(data[k].sei=='f'){
      if(data[k].score>=ave_f) data[k].goukaku=1;}
    else printf("入力エラー:%s\n",data[k].name);
  }
  puts("***goukaku ( male )***");
  for(k=0;k<i;k++){
    if(data[k].sei=='m'&&data[k].goukaku==1)
      printf("%s %c %d\n",data[k].name,data[k].sei,data[k].score);
  }
  puts("***goukaku ( female )***");
  for(k=0;k<i;k++){
    if(data[k].sei=='f'&&data[k].goukaku==1)
      printf("%s %c %d\n",data[k].name,data[k].sei,data[k].score);
  }
  return 0;
}
>>804-805
俺の作りかけの奴とほとんど同じだった(fgets,sscanf含めて)・・・処分してきまつ。。。
>>804
while(fgets(buf,100,stdin)!=NULL){
一応、最大値チェックとか、
while(i<100 && (fgets(buf,100,stdin)!=NULL)){

>>804-805
nbsp の後は、; をつけてね。

2ch ブラウザーなら、行頭のスペースもちゃんと表示できるはずだし。
そのままコピペするとまずいけど、全角のスペースでもいいかと。
>>808
;つけるのとつけないのとどう変わるの?
>>809
ie以外だと&nbspと表示されることがある。
OpenJane Doeとかね。
>>809
本来は、&nbsp; まで書いて、はじめて空白となる。;を省略しても空白に見えるのは、HTMLパーサの柔軟性のある構文解析のおかげ。
>>810 >>811
なるほど、そうだったのか。
気をつけるよ。
813デフォルトの名無しさん:04/01/05 20:26
さーて、冬休みもおわりだねー♥
この課題がわからないので教えて!Cでお願いします

英文のテキストファイルを入力し、その中に出てくるアルファベット
(大文字と小文字は区別しない)の出現度数と割合を求め、割合の大
きい順にソートし、「*」を使って割合のグラフを表示するプログラ
ムの作成をする。ただし構造体(アルファベット文字、度数、割合)
を使うこと。以下のように出力せよ。
文字 度数  割合  
E 68 17.2% *****************
>>814
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=34

あまりチェックしてないので、まずかったら直してね。
>>815
まずかったので直しますた。
817816:04/01/05 22:58
#include <stdio.h>
#include <ctype.h>

struct t { int c; int num; float unused; } tbl['z'-'a'+1];

int cmp(const void *a, const void *b) {
 int av =((struct t*)a)->num, bv = ((struct t*)b)->num;

 if (av > bv) return -1;
 else if (av < bv) return 1;
 return 0;
}

int main() {
 int total = 0, c, i, j;
 float x;

 for(i = 0; i <= 'z' - 'a'; i++) tbl[i].c = i + 'a';

 while((c = getchar()) != EOF)
  if (isalpha(c = tolower(c))) total++, tbl[c-'a'].num++;
 qsort(tbl, sizeof(tbl)/sizeof(tbl[0]), sizeof(tbl[0]), cmp);

 for(i = 0; i <= 'z' - 'a'; i++){
  x = (100.0*tbl[i].num)/total;
  printf("%c %4d %7.3f ", tbl[i].c, tbl[i].num, x, (int)x);
  for(j = (int)x; j > 0; j--) putchar('*'); putchar('\n');
 }

 return 0;
}
819818:04/01/05 23:16
#include <stdlib.h>がたりない & printf() の引数がちょっと余計だたーよ。
820デフォルトの名無しさん:04/01/06 02:07
main(){
int i,j=0,n1=10,n2=20;

for(i=n1; i<=2; ++1){
j=j+i;
}
printf("%d\n", j;
}

ここで出力される値は 10〜20までの加算値165ですよね?
ループは11回で合ってますか?



821デフォルトの名無しさん:04/01/06 02:10
スミマセン!訂正です

main(){
int i,j=0,n1=10,n2=20;

for(i=n1; i<=n2; ++1){
j=j+i;
}
printf("%d\n", j);
}

ここで出力される値は 10〜20までの加算値165ですよね?
ループは11回で合ってますか?



for(i=n1; i<=n2; ++i) だったとして
j=10+11+...+19+20だにょ
>>821
for(i=10,i<=20,i++)
じゃダメなんですか?
だめだ (w
>>821
自分で簡単に確かめられることを質問するな。
もっと端的に、コンパイルくらいしてみろ。
++1でエラーになるはずだ。

>>823
i++でも++iでもこの場合は大差ない。
が、まずは一文字変数はやめよう。
>>821
main(){
int i,j=0,n1=10,n2=20;

for(i=n1; i<=n2; ++i){
printf("(debug)i=%d\n", i); /* ←ここの出力が何回になるか、自分で調べてみよう */
j=j+i;
}
printf("%d\n", j);
}
>>825 おいおい(w
>>827
言いたいことははっきりとどうぞ。
なにか私にミスがあったのなら参考にさせてもらおう。
尚、くだらない議論に耳を貸す気はないので念のため。
829827:04/01/06 02:22
823 :デフォルトの名無しさん :04/01/06 02:14
for(i=10,i<=20,i++)
^^^^^^^^^^^^^^^^^^^
これは何?
830828=825:04/01/06 02:25
>>827
あーなるほど、セミコロンでなくカンマだったか。
見事につられてしまったようだね。指摘感謝。
831823(初心者):04/01/06 02:30
   ||     ⊂⊃
   ||    ∧ ∧
   ||    (  ⌒ ヽ
 ∧||∧   ∪  ノ
(  ⌒ ヽ 彡  V
 ∪  ノ  フワーリ
  ∪∪
うーむ。1文字変数ヤメレかぁ・・・。
1文字で済ましたほうがいいかなぁと思うのも結構ある。
a 配列
a, b 2つの変数が区別できればいいとき。
c 文字
d 差分値(普段、使わない)
i, j, k ループ変数
k 係数
n 要素数
p ポインタを(その関数内でポインタが1つしか出てこないとき)
s, t 文字列
u, v, w 数式で使うこともあり。(普段、使わない)
x, y, z 座標を表すとき
区別をつけないでいいときは、上のものを使うかなぁ。
for(temporaryLoopCounter=0; temporaryLoopCounter<10; ++temporaryLoopCounter)
などとやっている奴はバカだと思うが?
関数内とか局所的にしか使わない変数は1,2文字かなぁ

宿題クラスのソースで20字以上の変数使われまくったら
採点する方が泣くぞ
では逆に1文字変数をやめたほうがいい例 >>821を使って。
jはsumに変えたほうがいいね。
あと、n1, n2 → start/begin, end か first, last か min, max とかかなぁ。
(lastやmaxが最後+1って意味で使われることも多い)

for (i = first; i <= last; i++) {
sum += i;
}
836鉄拳:04/01/06 03:34
こんな変数はカエレ
abcdefghijklmnopqrstuvwxyz
abcdefghljklmnopqrstuvwxyz
abcdefghiiklmnopqrstuvwxyz
837821:04/01/06 03:42
レスありがとう!
いとこの宿題を手伝っていた時の問題ですた。丸写し。
  (for文の ++1は ++i の間違い ゚_゚;
10年前にプログラマだった漏れは固まってしまいますた。

確かに1文字変数とか ++i とか見慣れない記述が大杉。
他にも難問だらけですわ。
作った香具師のセンス悪いな。
でも久々のCは楽しい
>>836 芸が細かいね。

友人が変なプログラム書いてたなぁ。
3目ならべ(tic-tac-toeとかマルバツといか言われてるやつ)の各マスの状態を
a, b, c, d, e, f, g, h, iって変数名にして、しかも大域変数。
んで、入力は文字列。入力判定は次のような感じ
if (strcmp(inputbuf, "a") == 0 || strcmp(inputbuf, "A") == 0) {
if (a == 0) {
a=1;
} else {
printf("そこには置けません\n");
}
} else if (strcmp(inputbuf, "b") == 0 || strcmp(inputbuf, "B") == 0) {
/* ご想像どおり */
} /* 延々つづく */
出力部&思考部も面白い書き方してました。AA, BB, ..., II っていう変数もあったな。(こっちはローカル変数だった)
おいちゃん、見て吐きそうになったソースはハジメテだたよ。
10人分の電話番号を登録
そのデータ(名前と電話番号)を並び替えて2分探索で検索できるようにしてください
データを並び替えないで逐次探索で検索しなさいという問題はできたので
一応載せておきます

#include<stdio.h>
#include<string.h>

int main(void)
{
int i,j=0;
int tel[10] = {123,234,345,456,567,678,789,890,901,912};
char *name[] = {"c","r","y","w","k","a","z","n","d","e"};
char namae[256];

printf("kensaku 1moji nyuryoku = ");
scanf("%s",namae);

for (i=0;i<=9;i++)
if(strcmp(namae,name[i])==0)
{
printf("%c %d\n",*name[i],tel[i]);
j = 1;
}
if(j!=1)
printf("%s ha arimasen\n",namae);
}
>>839 こんな時間にご苦労さんだねぇ。
構造体って習ってます?
qsortとbsearchを使うのは反則?
842839:04/01/06 13:08
>840 構造体は習いました
>841 授業ではそのプログラムは習いませんでしたが
教科書には載っているので使ってもいいと思います
>>842
名前は1文字のみでいいのか?
電話番号はintでいいのか?
どうでもいいが、対話入力式でローマ字で喋られると読みづらくて仕方ない。
インチキでも英文の方が読みやすくないか?
コンピュータがカタカナで喋ってた時代を思い出してある意味微笑ましいけど。
>>844
ええはなしだけど、スレ違い
printf("k\ae\an\as\aa\ak\au\a \a1\am\ao\aj\ai\a \an\ay\au\ar\ay\ao\ak\au\a \a=\a \a");
環境によってはえらく迷惑なコードだ
848839:04/01/06 15:26
>>843
できれば名前は一文字ではないプログラムでお願いします

>電話番号はintでいいのか?
これの意味がよく分からないんですが
最も的確と思われるものを使用してくださって構いません
>>846
これを入れてコンパイル・実行するだけで、もうまわりが殺伐とした雰囲気に。

仕事場でなくてヨカタ。
どなたかお願いします。
英文が書かれたテキストファイルを入力して、
単語の出現回数をカウントし、出現回数の多い上位3個の単語名と出現回数を出力。

一応すべての単語名と出現回数を出力するだけのものはできたんですが・・・。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define SEPARATOR " \n\t\".,?!" /* 単語を区切る文字 */
#define TABLESIZE 1000 /* word_tableの大きさ */

struct word_count{
char *word; /* 単語 */
int count; /* 頻度 */
};
851850続き:04/01/06 15:35
int main(void)
{
FILE *fp;
struct word_count word_table[TABLESIZE]; /* 単語と頻度を格納する配列 */
char buf[256], *token;
char FileName[16];
int i, j = 0, find;

printf("入力ファイル名 >>> ");
scanf("%s", FileName);
if((fp = fopen(FileName, "r")) == NULL){ /* ファイル入力にエラーが生じた場合 */
printf("file open error!!\n");
exit(1);
}

while(fgets(buf, 256, fp) != NULL){
for(i = 0; i < 256; i++)
buf[i] = tolower(buf[i]);
token = strtok(buf, SEPARATOR);
for(; token != NULL; token = strtok(NULL, SEPARATOR)){
find = 0;
/* 一致する単語を見つけた場合 */
for(i = 0; i < j; i++){
if(strcmp(token, word_table[i].word) == 0){
word_table[i].count++;
find = 1;
break;
}
}
852850続き:04/01/06 15:35
/* word_table中に一致する単語がなかった場合 */
if(find == 0){
word_table[j].word = (char *)malloc((strlen(token) + 1) * sizeof(char));
strcpy(word_table[j].word, token);
word_table[j].count = 1;
j++;
}
}
}
fclose(fp);

for(i = 0; i < j; i++){
printf("%s .. %d\n", word_table[i].word, word_table[i].count);
}

return 0;
}
>>850
int compare_int(int l, int r)
{
if(l < r) return -1;
else if(l == r) return 0;
else return 1;
}
int count_cmp(const void *p, const void *q)
{
return -compare_int(((const struct word_count *)p)->count, ((const struct word_count *)q)->count);
}
と定義しておいて、mainの最後で
qsort(word_table, j, sizeof(struct word_count), count_cmp);
で並べ替えて、word_table[0〜2]を表示すればよい。
>>848
>電話番号はintでいいのか?
というのは、例えば、日本の場合市外局番は0から始まるけど、
int型ではそれを表現する手段がないし、
桁数によっては容易にintの限界を突破するよん、ということ。
>>839
/* qsort bsearch使用*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX_NAME 255
#define MAX_TELNO 24
#define NUM_RECORD 10
typedef struct { char name[MAX_NAME]; char telno[MAX_TELNO]; } RECORD;

int compar(const void *p1,const void *p2) {
RECORD *r1=(RECORD *)p1,*r2=(RECORD *)p2;
return strcmp(r1->name,r2->name);
}

int main(void) {
RECORD key,rec[NUM_RECORD] = {
{"Claude","*1"},{"Robert","*2"}, /* 名前,電話番号(2chでは書かない) */
{"York","*3"},{"Walter","*4"},
{"Karen","*5"},{"Andy","*6"},
{"Zen","*7"},{"Nancy","*8"},
{"Donald","*9"},{"Erie","*10"}};
RECORD *result;

qsort(rec,NUM_RECORD,sizeof rec[0],compar);
printf("Input search word = ");
gets(key.name);
if((result = (RECORD *)bsearch(&key,rec,NUM_RECORD,sizeof rec[0],compar)) != NULL) printf("%s %s\n",result->name,result->telno);
else printf("%s not found\n",key.name);
return 0;
}
標準入力からユーザの入力を受け付ける
その内容が、数字の1〜5の間であればループ脱出
0であった場合、メッセージを吐いて再度入力を促す
6以上であった場合、メッセージを吐かずに再度入力を促す
文字列であった場合、メッセージを吐かずに再度入力を促す
改行・タブ・空白は無視する

どうにもうまく出来ません。どなたか助けてください。言語はCです。
857839:04/01/06 16:18
>854
なるほど、よく分かりました

最初の0を表示させるには電話番号を文字列として扱うということでしょうか?
形式はどちらでも構わないと思います
>>856
妙な宿題だなあ。

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

int main() {
char buf[256];
int i;

while(1) {
puts("なんか入力すれ↓");
gets(buf);
if (sscanf(buf,"%d",&i) != 1) continue;
if(1 <= i && i <= 5) break;
if(i==0) puts("(´д`)<メッセージ");
}
return 0;
}
>>857
>>855では、文字として扱ってるね。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1060403548&res=40

この連立方程式のプログラムをピボット操作をして方程式を解けるように改良したいのですが、どうすればいいかわかりません。

どうかよろしくお願いします。
861856:04/01/06 17:07
>>858
ありがとうございます
創造設計の演習で、パーツとして欲しかったんです。

ついでといっては何ですが、質問があります
・BCCでusleep()みたいな動きをする関数ってありますか?
・forループなどで文章を連続表示させるときに、カウンタの値を変数名に
くっつけることは出来ますか?
ex.)
i=0からi=5までのforループで、表示したい変数名が
xxxx_0 から xxxx_5 まである
printf("%s\n",xxxx_○)
○をカウンタとして使用している値にしたい
出来るでしょうか?どなたか教えてください
>>861
>xxxx_0 から xxxx_5 まである
>printf("%s\n",xxxx_○)
あ、それオレも知りたい。。。
何故配列を使わないのか禿げしく疑問
864856:04/01/06 17:15
>>863
既に配列をつかってまして
char * test_0[] = {"test1","test2","test3","test4"}
char * test_1[] = {"test5","test6","test7","test8"}
みたいになってるんです
何故配列の配列を使わないのか禿げしく疑問
>>861-862
本気でやりたいなら、
Boost.Preprocessor
http://www.boost.org/libs/preprocessor/doc/index.html
を検討しれ
867850:04/01/06 17:31
>>853
ありがとうございます!

でも上位3個のうち出現回数が同じ単語が複数あった場合、
それらもすべて出力するようにしたいんですが、それはどうすればいいんでしょうか?
例えば
i .. 3
am .. 2
a .. 2
man .. 1
woman ..1
のような具合で。

最初に言っておかないですいません。
>>867
#include <limits.h>

int curcount = INT_MAX, rank=0;
for(i=0; i<j; i++)
{
    if(word_table[i].count < curcount)
        if(++rank >= 3) break;
        else curcount = word_table[i].count;
    printf("%s .. %d\n", word_table[i].word, word_table[i].count);
}

これくらいなら力ずくでも何とかなるだろ。
869850:04/01/06 17:57
>>868
すばやい解答ありがとうございました。

870839:04/01/06 18:18
>>855
遅くなりましたが
誠にありがとうございました
871JUMBO:04/01/06 18:23
はじめまして☆
この問題が分からないのでお願いします!!
((>_<))
{ある整数を入力したときの約数を求め、これらの和を計算するプログラムを作成せよ。
ただし、約数とはある数を割り切ることができる整数のことである。}
こんなんです・・・お願いします!!
>>871
#include <stdio.h>
int main(void)
{
printf("0\n");
return 0;
}
((>_<))
>>872
#include <stdio.h>
int main(void)
{
printf("1\n");
return 0;
}
では?
>>874
たとえば6の約数は
-6, -3, -2, -1, 1, 2, 3, 6
で、総和は0じゃ内科?
>>875
ああ、総和なのか。総和総和
>>871
#include<stdio.h>
//1とその数自身も含む。
int main(void){
int n,i,sum=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
if(n%i==0)sum+=i;
printf("sum:%d\n",sum);
return 0;
}

1を含めたくないならi=2
その数自身を含めたくないならi<n
に調整しる。

int floor(double d);
戻り値 : 整数
引数 d : 倍精度実数

という条件で入力した実数の床を求めるプログラムを
c++ でやるにはどうすればよいのでしょうか?
880JUMBO:04/01/06 19:23
どうもありがとうございました。
あの、printf文を用いた表現にしたいんですけど
その場合はどうゆうふうにしたらいいですか?
>>880
どういう意味だ?
>>880
coutとかは一切使っていないprintf文だと思うんだが・・・
#include <stdio.h>
#include <stdlib.h>
void main(void) {
int n,i,j,k;
double b, a[32][33];

/* 行列の大きさをセット */
printf("1次連立方程式の解を求めます。\n");
printf("何元の連立方程式にしますか?\n n=");
scanf("%d",&n);

if(n > 32 || n < 1) {
puts(" n の値は1〜32までです。\n");
exit(1);
}
/* 方程式の入力 */
printf("方程式の係数を入力してください。\n");
for(k=0;k<n;k++)
for(j=0;j<n+1;j++) {
printf("a[%d][%d]=",k,j);
scanf("%lf",&a[k][j]);
}
>>883の続き

/* 前進消去 */
for(k=0;k<n;k++) {
/* ピポットを1にする */
b = a[k][k];
for(j=0;j<n+1;j++) a[k][j] /= b;
/* ピポット行よりも下の行について */
for(i=k+1;i<n;i++){
/* ピポットと同じ列を0に */
b = -a[i][k];
for(j=0;j<n+1;j++) a[i][j] += (b*a[k][j]);
}
}

/* 次に後置代入 */
for(k=n-2;k>=0;k--) {
for(j=k+1;j<n;j++)
a[k][n] -= (a[k][j] * a[j][n]);
}
/* 答を表示 */
printf("Gauss単純消去法による解\n");
for(i=0;i<n;i++)
printf("x[%d]=%lf\n",i,a[i][n]);
}

↑ピボット操作を可能にするには前進消去の部分を改良すればいいんでしょうけど、
どうすればいいかわかりません・・・
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/index.html#1

1)データ入力
>名前と年齢を入力し、現在保存されている名前と比較して新しければ新規に保存する。
保存去れている名前と同じならば、年齢データを更新する。
データは年齢順にリストされる。
2)データ削除
>名前を入力すると、その名前と一致したデータを削除するようにする。
一致しない場合は「ありませんでした」と出力してメニューに戻る
3)データ検索
>名前を入力し、一致するデータの名前と年齢を印刷する。
4)データ覧印刷
>年齢層順(リストの先頭から)名前と年齢の印刷をする。
名前データの比較にはstrcmp()関数を使う。

上記のプログラムを改良して1~4に合うプログラミングを作ってください。
>>885
URLは、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=173
のように、該当レスに直接飛べるようにしといてください。。。
887885:04/01/06 21:01
>>886
ああ!すみませぬ。。。
問題がたくさん供給されてうれしい。
889フセチー:04/01/06 23:50
while(1){
printf("フセチー=");
gets(name);
if(strcmp(name,"")==0) break;
printf("ヌッホ・");
gets(buf); tosi=atoi(buf);

wkdata=(struct person *)malloc(sizeof(struct person));
if(wkdata==NULL){
printf("・皈筵・ホハン、ヌ、ュ、゙、サ、n");
exit(1);
}

...化けとる(ヌッホ)
フセチーは名前
891885:04/01/07 00:20
書き直しました。更に付けたしもしてみました。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=174
case2,3がわかりません。
892フセチー:04/01/07 01:38
while(1){
printf("\n1)データ入力 2)データ削除 3)データ検索 4)データ一覧印刷 0)終了\n");
do{printf(">>"); gets(buf); sw=buf[0];}while(sw<'0' || '4'<sw);
if(sw=='0') break;
if(sw=='4'){ put(start); continue; }
printf("名前="); gets(name); if(strcmp(name,"")==0) break;
wp=find(start, name);
if(wp && sw=='3'){ printf("%s %d\n",wp->name,wp->age); continue; }
if(wp && sw=='2'){
printf("削除?(y/n)"); do{gets(buf);}while(buf[0]!='y' && buf[0]!='n');
if(buf[0]=='y'){ del(&start, name); continue; } }
if(wp==NULL && (sw=='2' || sw=='3')){
printf("[%s]と一致するデータはありませんでした\n",name); continue; }
printf("年齢="); gets(buf); tosi=atoi(buf);
if(wp){ wp->age=tosi; continue; }
wkdata=(struct person *)malloc(sizeof(struct person));
if(wkdata==NULL){ printf("メモリを保存できません\n"); exit(1); }
strcpy(wkdata->name,name);
wkdata->age=tosi;
wkdata->next=NULL;
add(&start,&wkdata);
}


詰めちゃってスマソ (続く)
893フセチー:04/01/07 01:39
void put(struct person *start)
{ struct person *wp;
for(wp=start->next; wp!=NULL; wp=wp->next) printf("%s %d\n",wp->name,wp->age);
}
struct person *find(struct person *start, char *name)
{ struct person *wp;
for(wp=start->next; wp!=NULL; wp=wp->next) if(strcmp(name,wp->name)==0) return wp;
return NULL;
}
void del(struct person **start, char *name)
{ struct person *wp,*tmp;
for(wp=*start; wp->next!=NULL; wp=wp->next)
if(strcmp(name,(wp->next)->name)==0){ tmp=(wp->next)->next; free(wp->next); wp->next=tmp; break; }
}
void add(struct person **start, struct person **wkdata)
{ struct person *wp;
for(wp=*start; wp->next!=NULL; wp=wp->next) if((*wkdata)->age<(wp->next)->age) break;
(*wkdata)->next=wp->next; wp->next=*wkdata;
}


どうかな?(ヌッホ)
ヌッホ
895885:04/01/07 01:58
>>892

swでエラーになりました。
何ででしょう?
>>895
int sw;
を関数の先頭部分で宣言してください。ヌッホ
897896:04/01/07 02:02
あ、intじゃねえや、
char sw;
ね。ヌッホ
898885:04/01/07 02:07
>>893

どのあたりにそのプログラムを入れればいいのでしょう?
899885:04/01/07 02:12
>>897
6行目でエラーが出ました。
printf("名前="); gets(name); if(strcmp(name,"")==0) break;

swは何故char何ですか?
>>898
みんなまとめてmain()の前でどうでしょ。ヌッホ
>>899
元ソースの、
char nama[30]=" ",buf[10]; /* nama ってなんやねん */
の行を、
char name[30]=" ",buf[10];
に直してください。ヌッホ

902885:04/01/07 02:19
>>900
In function 'mein': というエラーが出ました。何故でしょう?
903BZ:04/01/07 02:23
悩んでます。
化学反応のBZ反応の2次元反応拡散方程式の
x-y平面上でのシミュレーションプログラムを誰か教えてください。(C言語)
904885:04/01/07 02:23
>>900
メニューの2,3,4を実行すると「もう一度入力してください」になります。
905885:04/01/07 02:24
>>901
本気で間違ってました。直して実行してみます。
906885:04/01/07 02:30
>>901
wp=find(start,name); でエラーが出ました。
俺が宣言場所間違ってるのか?(汗
>>885
どこに何をいれればいいか、が解ってないわけだ。
>>892の部分は、あんたが書いたwhile文と完全にすげ替える。
>>893の部分は、>>892で追加された処理を行う関数で、main関数より前に配置する。
・・・のだが、こんなくだらんことでレス消費しても仕方ないので、
完全版のソース(フセチー氏作のソースの動作のまずいところを修正しますた)を上げておくので、
参考にして動作を把握してください。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=36
908885:04/01/07 02:38
>>907
ありがとうございました。
ちゃんと回りましたので、あとは自分で検証しておきます。
909フセチー(本物):04/01/07 12:27
みなさん乙
特に907(ヌッホ)
>903
本気で取り組むと宿題というより卒論クラスな気がしないでもない。

拡散である以上セルオートマトン以外の方法はしんどい。
検索したところB-Z反応シミュレーションのための方程式がちゃんとあるらしいのでそれで。
911デフォルトの名無しさん:04/01/07 18:32
質問です。
5割る3を実行したとき1.7と割り切れない数を有効数字2桁で表示できる
C言語のプログラムを教えてください。
以上宜しくお願いします。
>>911
void f(int a, int b, FILE *stream)
{
fprintf(stream, "%.2g", (double)a / b);
}
913デフォルトの名無しさん:04/01/07 18:41
ニュートン法を用いて、
方程式 x^2 - exp(x) - 2 = 0 の数値解(近似解)を
求めるC言語のプログラムを教えてください。
xを与えるとf'(x)を返す関数と、xを与えるとf(x)を返す関数を作る。
これらを用いて、ある近似値x[n]を与えるとひとつ良い近似値x[n+1]を返す関数を作る。
whileで誤差の大きさを判断しつつ3つめの関数を繰り返す。

ソースは過去ログでもgoogleでもいくらでも出てくる。
(・3・) アルェー せっかくぼるじょあスレなんだからぼるじょあ#セV8cLFセz
かぼるじょあ#ぶるじょあでぼるじょあになってYO
(・3・) アルェー トリップよくわかんないYO
    _, ,_  パーン
 ( ‘д‘)
   ⊂彡☆))3・) >>ぼるじょあ
918デフォルトの名無しさん:04/01/07 20:17
演習問題で出されたものなのですが、

元金Sと利率R%、年数Nを入力し、複利の元利合計TOTALを計算し、出力するプログラム
をつくりなさい。元利合計の計算はTOTAL=S(1+R/100)^Nである。

#include <stdio.h>
main()
{
int S,R,N,TOTAL;

printf("元金、利率、年数を入力してください\n");
scanf("%d %d %d", &S, &R, &N);
TOTAL=S*(1+R/100)^N;
printf("TOTAL=%d\n", TOTAL);
return(0);
}

Rを0.5のような小数にすると値がおかしくなるのですが、分かる方教えてください。
Rをdoubleにする。
920918:04/01/07 20:30
>919
Rをdoubleにしたんですけど下のようなエラーが出でしまいました。

error C2296: '^' : 不正な左オペランドです。

#include <stdio.h>
main()
{
int S,N,TOTAL;
double R;

printf("元金、利率、年数を入力してください\n");
scanf("%d %lf %d", &S, &R, &N);
TOTAL=S*(1+R/100)^N;
printf("TOTAL=%d\n", TOTAL);
return(0);
}
^ はXORです。
「'⊇ フーン
923デフォルトの名無しさん:04/01/07 20:54
#include <stdio.h>
#include <math.h>

#define FUNCTION(x) ((x) * (x) - exp(x) - 2)
#define DERIVATIVE(x) ( 2 * (x) - exp(x))

int main(void)
{
double ans1 = 0, ans2 = 0;

do {
ans2 = ans1;
ans1 = ans1 - ( FUNCTION(ans1) / DERIVATIVE(ans1) ) ;

printf("ans ..%.20g\n", ans1);
} while (fabs(ans1 - ans2) > 1e-15);

return 0;
}
924918:04/01/07 21:50
>921
調べてみたら^使えないみたいですね。

>923
#include <math.h>を加えてpow使うんですよね。
いろいろやってみたら出来ました。ありがとうございました。
>>924
>>923はおまいに対するレスではないわけだが・・・なぜか解ったようなので別にいいか。
926デフォルトの名無しさん:04/01/07 22:07
>>925
おいおい(w
927BZ:04/01/07 22:10
>>910
どうも。
がんばってみます。
お願いします。

char型の128個の配列を2つと2つのポインタ変数を用意して、
それぞれの配列の先頭アドレスをポインタ変数に代入し、
そのポインタ変数を使ってキーボードから2つの文字列をそれぞれのchar型配列に入力し、
はじめに入力した文字列の直後に次に入力した文字列を代入していくプログラムを作成してください
>>928
#include <stdio.h>
#include <string.h>
int main() {
char str1[128],str2[128];
char *p1 = str1 ,*p2 = str2
gets(p1); gets(p2);
strcat(p1,p2);
return 0;
}
とか、そういうわけではないんだよな?
930デフォルトの名無しさん:04/01/08 00:37
まだ専門に入って間もないんで、長くなっても良いんで
自分でも理解できるように分かりやすく組んでもらえるとありがたいです。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1027870433&res=175
931デフォルトの名無しさん:04/01/08 01:20
プログラムではなく、アルゴリズムの問題なのですが・・・。
もしよければお願いします。

クリスマスと言えばサンタクロース.サンタさんは背中に大きな袋を背負ってよい子の家を回り,クリスマスプレゼントを渡します.
最近のよい子はいろいろなプレゼントを欲しがるので,プレゼントの重さも価値もさまざまです.
サンタさんと言えども,袋に入れて背負うことのできる袋の重さには限界があります.でも,サンタさんは,その袋に詰めることのできる価値ができるだけ最大になるように,プレゼントを袋に入れたいと思っています.
さて,サンタさんが背負える重さ以内でプレゼントを袋に詰めるとき,その袋の中のプレゼントの価値を最大にするためにはどのような方法でプレゼントを選択すれば良いでしょうか.
サンタさんにとって悩ましいこの問題を解くアルゴリズムを考えなさい.
>>931
(・3・) エェー ナップザック問題で調べてYO
ナップザック問題というのですね・・・。
どうも失礼いたしました(´ω`;;)
934フセチー:04/01/08 03:00
>>931 遺伝的アルゴリズム(GA)でも調べるが良い(ヌッホ)
935デフォルトの名無しさん:04/01/08 13:37

#include <stdio.h>
typedef struct{
char name[20];
int score;
}TOKUTEN;
int main(void){
TOKUTEN tokuten[100];
int i=0,k,goukei=0;

memset(&tokuten[0],0x00,(sizeof(TOKUTEN)) * 100);
printf("please input name&score \n");
while(((scanf("%s %d",&tokuten[i].name[0], &tokuten[i].score))!=EOF)){
goukei+=tokuten[i].score;
printf("[%d] [goukei = %10d] [tokuten = %10d]\n",i,goukei,tokuten[i].score);
i++;
if ( i == 100)
{
break;
}
}
printf("*************name***********score*****\n");
for(k=0;k<i;k++){
printf(" %s%d\n",tokuten[k].name,tokuten[k].score);
}
printf("*************heikin**********%.1f\n",(float)goukei/i);
printf("%\n");
return 0;

}

936デフォルトの名無しさん:04/01/08 13:40
>>935のプログラムを下記のようにきれいにnameとscore、平均の文字、数値
を揃えて表示させるにはどこをどのように修正させればよいのか教えてください。
2ちゃんの優秀な皆様宜しくお願いします。
<実行結果>
please input name&score
kitamura 100
[0] [goukei = 100] [tokuten = 100]
takei 98
[1] [goukei = 198] [tokuten = 98]
ishigami 87
[2] [goukei = 285] [tokuten = 87]
CTL+D
*************name***********score*****
kitamura    100
takei      98
ishigami     87
*************heikin***********95.0
%
>>936
どのように表示させたいかが明白ではないけれど、
printf("%17s %15d\n",tokuten[k].name,tokuten[k].score);
こんな感じか。

あとstdlib.hをインクルードした方がよい。
または、このコードではmemsetは不必要なので、削除するとか。
>>936
・floatは使うな。必要ならdoubleにcastしろ
・この場合はwhileよりもforが妥当
・memset()は不要。どうしてもクリアしたいならsizeof tokutenにするべき

>>940
はぁ?って感じなんだが。汎用のテンプレートでも作れってのか?
942掛下:04/01/08 17:56
ふむ。
>>940
とりあえず1だけ。

#include <algorithm>
#include <iterator>
#include <functional>

template <typename Bi, typename Cmp>
void select_sort(Bi first, Bi last, Cmp cmp)
{
    for(; first != last; ++first) /* 1 */
    {
        Bi min = first; /* 1-1 */
        Bi cur = first;
        for(++cur; cur != last; ++cur) /* 1-2 */
            if(cmp(*cur, *min))
                std::swap(cur, min); /* 1-2-1 */
        std::iter_swap(min, first); /* 1-3 */
    }
}

template <typename Bi>
void select_sort(Bi first, Bi last)
{
    return select_sort(first, last, std::less<std::iterator_traits<Bi>::value_type>());
}
944デフォルトの名無しさん:04/01/08 19:00
よろしくお願いします!
キーボードから自然数 n を読み込んで、 '*' を用いて
高さが 2n-1 のダイヤモンドを実行例のように表示しなさい。

実行例

$ ./a.out
1
*
$ ./a.out
3
*
***
*****
***
*
$ ./a.out
5
*
***
*****
*******
*********
*******
*****
***
*
945944:04/01/08 19:03
すいません。上で実行図が三角形になってますが
ダイヤモンドです!
お願いします
>>944
#include <stdio.h>

void putcn(char c,int n) {
while(n-- > 0) putchar(c);
}

void print_diamond(int n) {
int i,spc,height = 2*n-1;
for(i=1;i<=height;i++) {
spc = n - i; if(spc<0) spc = -spc;
putcn(' ',spc);
putcn('*',height - spc*2);
putchar('\n');
}
}

int main() {
int n;
scanf("%d",&n);
print_diamond(n);
return 0;
}
948デフォルトの名無しさん:04/01/08 19:56
すいません>>795ので質問したものです。
>>802の解答をいただいた方のプログラムを実行したところ。下記のように
7のtansakuをすると5番目と表示、5のtansakuをすると0番目と表示されて
しまいます。教わっていただいて大変恐縮ですがどこをなおせばよいのか
わかりません。どこをなおせばよいかわかる方おしえてください
% tansaku
5
3
10
8
15
7
20
1
14
28

tansaku key−> 7
7 −−> 5番目× 7−−>6番目○
%

>>948
だから、わざわざ>>798で、添字は1ベースなのか、と訊いてたのにな。
添字はCでは0から始まるので、その出力は(添字を出力しろという問題に対して)
正しい。

>>802の出力部分のコメントに書いてあるけど、単純に1を足せ。
どこかに双方向リストの典型的な例みたいなものありませんか?
>>950
次スレよろ〜
953デフォルトの名無しさん:04/01/08 21:08
@n個の整数a1,a2,・・・aNを入力の引数として、小さい順(昇順)に並べて結果を
戻す外部サブルーチンsort(a)を作成する。nは個数、aは整数が入ってる配列である
だだしアルゴリズムは選択法を使う。
Aキーボードからデータを入力しそのデータが偶数か奇数かを判別して、奇数なら奇数
偶数なら偶数と出力するプログラムを作りなさいまた0が入力されたら終了するようにしなさい。
出来ればこの行で何をしているという説明があれば幸いです。
よろしくお願いします
954950:04/01/08 21:27
立てれなかったので↓の人おねがいしまつ
955デフォルトの名無しさん:04/01/08 21:32
よし!
956デフォルトの名無しさん:04/01/08 21:34
またぼるじょあでいいの?
>>953
/* 過剰説明付き選択ソート */
void selectsort(int a[],int n) { /* 引数aは並び替える配列 nは配列長 */
int i,j,key,min; /* 整数型変数i,j,key,minを宣言する */
for(i = 0;i < n - 1;i++) { /* 要素を順に着目していく */
min = a[i]; /* とりあえず着目している要素を最小値とする */
key = i; /* 最小値の要素の添字 */
for(j = i + 1;j < n;j++) /* 着目する要素より後の要素について */
if(a[j] < min) { min = a[j]; key = j; } /* より小さい値があれば最小値を更新 */
a[key] = a[i]; /* 着目する要素の値を最小値のある要素に入れ */
a[i] = min; /* 着目する要素の値は最小値とする(つまり、交換する) */
}
}
/* 過剰説明付き奇偶判定 */
#include <stdio.h> /* 標準入出力ライブラリ用ヘッダを読み込む */

int main() { /* main関数 */
int i; /* 整数型変数iを宣言する */
while(1) { /* 条件が真の間繰り返す。条件が1なので、無限に繰り返す */
printf("数字を入力してください\n"); /* メッセージを表示 */
scanf("%d",&i); /* 変数iに標準入力からの入力を数値に変換して代入する */
if( i % 2 == 0) /* iの値を2で割ったときの剰余が 0 なら */
printf("%dは偶数\n",i); /* iの値は偶数であると表示し、*/
else /* そうでなければ */
printf("%dは奇数\n",i); /* iの値が奇数であると表示する */
if(i == 0) break; /* iの値が0と等しければ、while文から脱出する */
}
return 0; /* main関数から戻る */
}

・・・コメントの方が数倍時間がかかったので、
以後、ソースから処理内容を読みとれるよう努力してください。
>>957
ワロタ 逆に分かりにくいw
「ぼるじょあ」やめないか?
960953:04/01/08 22:03
ありがとうございました。これはCでいいんですよね?
このスレでぼるじょあの回答はこれだけ。
>>450
>>932
>>960
FORTRANとかCOBOLとかPascalとかJavaとかに見えるとしたら、
病院に行った方がよい。

ざっと見てみると、何も書いてなけりゃ、当たり前だが、Cで書いてるな。
963デフォルトの名無しさん:04/01/08 22:25
コンパイルをすると
964963:04/01/08 22:29
すいませんミスりました

コンパイルをすると
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 124: 依存関係にある型限定子 'Zahyou' に 'value_type' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 125: 依存関係にある型限定子 'Zahyou' に 'difference_type' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 126: 依存関係にある型限定子 'Zahyou' に 'pointer' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 127: 依存関係にある型限定子 'Zahyou' に 'reference' という名前のメンバー型がない(関数 main() )
エラー E2404 c:\Borland\Bcc55\include\rw/iterator.h 128: 依存関係にある型限定子 'Zahyou' に 'iterator_category' という名前のメンバー型がない(関数 main() )
*** 5 errors in Compile ***
となってしまいます。Zahyouは構造体です。
依存関係にある型限定子の意味がわからず、なぜこのようなエラーがでてしまうのでしょうか
教えてください。

965デフォルトの名無しさん:04/01/08 22:31
966デフォルトの名無しさん:04/01/08 22:38
お願いします.c言語です。

標準入力から1〜26までの数字をひとつ読み込む。 その後英文を読み込み、
読み込んだ数字をシーザー暗号の鍵として 英文を暗号化し、
出力するプログラム
を作成しなさい。

シーザー暗号とは、数字を鍵としてアルファベットをずらす
することで暗号化を行なう暗号で、古代ローマの
ジュリアス・シーザー が考案したといわれてい
る。
例えば鍵が"1"なら、 "A"->"B", "B"->"C",..."Z"->"A",
"a"->"b", "b"->"c",..."z"->"a" となる。鍵が"2"なら、
"A"->"C", "B"->"D",... となる。
>>964
なぜソースを書かないのか?
ってか宿題スレには適当でない予感。
968963:04/01/08 22:42
PC初心者板で聞いて見ます。
すいませんスレ違いでしたTT
>>968
なんでそんなに板違いが好きなの?
>>963
おそらく些細なミスだと思うんだが・・・
>>966
#include <stdio.h>
#include <ctype.h>

void caesar_angou(FILE *fin, int key, FILE *fout);

int main(void)
{
int key;
if (scanf("%d", &key) != 1) {
exit(2); /* 最初にキーが無い */
}
caesar_angou(stdin, key, stdout);
return 0;
}

/* シーザー暗号 */
void caesar_angou(FILE *fin, int key, FILE *fout)
{
int c;
while ((c = fgetc(fin)) != EOF) {
if (isupper(c)) {
c = (c - 'A' + key) % 26 + 'A';
} else if (islower(c)) {
c = (c - 'a' + key) % 26 + 'a';
}
fputc(c, fout);
}
}
次の公式(フェアフィールドの式)を関数numberOfDaysを使わないで
作成する。 紀元1年1月1日からy年m月d日までの日数 1月、2月は前の年の13月、
14月と見なす。

dd=365*y+[y/4]-[y/100]+[y/400]+[{306*(m+1)}/10]+d-428

計算[ ]はガウス記号(小数以下切捨て>



よろしくお願いします。
int y = 2003,m=1,d=8,dd;

if(m <=2) { y--; m += 12; }

dd = 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;

こんなんか?
ぼるじょあスレは嫌いなんで、次スレは別の名前にして欲しかった。
long days(int y, int m, int d)
{
if (m < 2) {
m += 12;
y--;
}
return 365L*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
}
あ、先こされた(^^;;
>>973
>>974
ありがとうございます!
976デフォルトの名無しさん:04/01/09 18:11
Cってか数学のこんな質問でも良いのですか?

モンテカルロ法を使って半径1のD次元球の体積Vを求めるプログラムを作ること。
授業で説明した円(2次元球)の面積(円周率)を求めるプログラムを参考にして下さい。

プログラムの仕様は以下のようなものであること。
乱数を生成する関数は自ら作成するか、言語に標準で用意されているも のを利用すること。
次元の数D、点の数N、乱数の種SEEDは標準入力(キーボード)またはGUIで入力できるこ と。
求めた体積Vの値を出力すること。
作ったプログラムを使用して、Dが2、3、5、10のそれぞれの場合について体積V が点の数Nの増加とともに一定の値に近づいていく様子を数値とグラフを用いて確かめること。
>>976
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define rnd() (1.0 / ((RAND_MAX + 1.0)) * rand())

double MonteCarlo(unsigned int dimension,unsigned long n) {
unsigned long i,j,hit=0;
double random,work;

for(i=0;i<n;i++) {
work=0;
for(j=0;j<dimension;j++) {
random = rnd();
work += random * random;
}
if (work < 1.0) hit++;
}
return pow(2,dimension) * ((double)hit / n);
}

int main() {
unsigned int d,seed;
unsigned long n;
printf("input >dimension number seed\n>");
scanf("%u%lu%u",&d,&n,&seed);
srand(seed);
printf("\nV=%f\n",MonteCarlo(d,n));
return 0;
}
/* エラー、乱数の質については考慮していない */
MT法を使えばもあべたですか?
>>978
モンテカルロ法においては。
980カオル:04/01/13 19:37
C教えてください!1ケ月のバイト代計算プログラムの作成
1日8〜24時までバイトができると仮定し、何月かを入力後、各日のバイト開始時間およびバイト時間を入力し、1ケ月のバイト代を計算するプログラムを作成すること
(休憩時間は考えない)
ただし、8〜18時までは時給750円、22時までは800円、24時までは935円とする。また、1年において、1月、3月、5月、7月、8月、10月、12月は
31日、4月、6月、9月、11月は30日、2月は28日とする。
981カオル:04/01/13 19:38
C教えてください!1ケ月のバイト代計算プログラムの作成
1日8〜24時までバイトができると仮定し、何月かを入力後、各日のバイト開始時間およびバイト時間を入力し、1ケ月のバイト代を計算するプログラムを作成すること
(休憩時間は考えない)
ただし、8〜18時までは時給750円、22時までは800円、24時までは935円とする。また、1年において、1月、3月、5月、7月、8月、10月、12月は
31日、4月、6月、9月、11月は30日、2月は28日とする。
982デフォルトの名無しさん:04/01/13 19:40
>>980
知らん
983デフォルトの名無しさん:04/01/13 19:41
>>981
知らん
984デフォルトの名無しさん:04/01/13 19:45
C教えてください。学生10人の国語、数学、英語のデータをあらかじめ用意し、学生それぞれに国語、数学、英語の点数を表示し、さらに合計点および平均点(整数値)を表示し、また、各教科の平均点(整数値)および最高点を表示するプログラム
二次元配列を使用すること
   国語  数学  英語
1: 56  71  67
2: 84  91  62
3: 71  86  67
4: 92  94  84
5: 71  90  96
6: 66  54  78
7: 70  79  78
8: 62  55  62
9:100  51  62
10: 81  61  89
985デフォルトの名無しさん:04/01/13 19:47
Cお願いします。キーボードから10個の値(正の整数)を入力し、その合計を求め、表示するプログラム ただし合計を求める方法には、次のような条件がある。
・奇数はそのままの値を足す
・偶数は2で割った値を足す
10個の値を入力するためにはfor関数をしようする
986デフォルトの名無しさん:04/01/13 19:57
>>982-983
素人の出る幕じゃない
#include<stdio.h>
int numberOfDays(int, int, int);
main(void){
int y, m, d, yy, mm, dd, days;

printf("存在しない日付は入力しないで下さい。\n");
printf("正しくない答えが出力されます。\n");
printf("生年月日を入力してください。\n西暦何年(1900年以降)?\n");
scanf("%d", &y);
printf("何月?\n"); scanf("%d", &m);
printf("何日?\n"); scanf("%d", &d);
printf("存在しない日付は入力しないで下さい。\n");
printf("正しくない答えが出力されます。\n");
printf("現年月日を入力してください。\n西暦何年(1900年以降)?\n");
scanf("%d", &yy);
printf("何月?\n"); scanf("%d", &mm);
printf("何日?\n"); scanf("%d", &dd);
days = numberOfDays(yy, mm, dd) - numberOfDays(y, m, d);
printf("生まれてから今日で%d日目です。\n", days);
}
int numberOfDays(int y, int m, int d)
{int dd;
if ( m == 1 || m == 2){
m = m+12;
y--;}
dd = 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
return(dd);}

これを参考にして紀元1年1月1日からy年m月d日までの日数を求めよ。
ただし関数numberOfDaysを使わないで作成する。
お願いします。
>>987
int days(int y, int m, int d)

if ( m == 1 || m == 2){ m = m+12; y--;}
return 365*y+y/4-y/100+y/400+306*(m+1)/10+d-428;
}
>>985
#include <stdio.h>
int main(void)
{
int data, sum = 0, i;
for (i = 0; i < 10; i++){
printf("%d個目のデータを入力して下さい:", i + 1);
scanf("%d", &data);
if ((data & 2) == 0)
sum += data / 2;
else
sum += data;
}
printf("合計は%dです。\n", sum);
return 0;
}
990デフォルトの名無しさん:04/01/13 21:12
ある集団の試験の結果を配列に入力した後,以下を出力するプログラムを作成せよ.
 平均点と標準偏差
 各個人の得点とその偏差値得点
ただし,負の数値を入力したときに実行を終了するものとせよ.
データ x に対する偏差値得点(deviation score)
 y は平均をμ,標準偏差をσとしたとき以下で計算できる
 y = 50 + 10(x – μ)/σ
得点は,予め20個程度のデータが入っているファイル
(たとえばinput.txt)を作成して,キーボードの入力の代わりとせよ

が根本的にわからず困ってます。助けてください・・・。
991デフォルトの名無しさん
助かります。有難うございます。やってみます。