C/C++の宿題やらせてください。おながいします

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
ついでに今はJavaと基本情報もやっている。
わからない宿題若しくは処理があったら私にやらせてくださいm(_ _)m
3代目(前スレ): http://pc2.2ch.net/test/read.cgi/tech/1041992392/l50
2代目: http://pc3.2ch.net/test/read.cgi/tech/1039772622/l50
宿題手伝いますYO!!: http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50
>>1
乙。
ねえねえ早速で悪いんだけど、前スレの>>988さんの書かれたプログラム
だけど、なかなか答えが出ないよ。かなり時間がかかるの?
4前スレ988:03/02/13 03:45
>>3
すまんな、ヘタレなプログラムで(w
おれも実行してみてるんだがぜーんぜん答えがでてこんのよ。
効率悪すぎるのか、はたまたバグいりなのか…
× おながいします
○ おがないします
#include <stdio.h>
#include <stdlib.h>
#define MAXN 15
int inuse[MAXN];int main(void){
int i, j, k, l, m;int n, o, p, q;int r, s, t;int u, v;int w;
for (i = 1; i <= MAXN; i++) {inuse[i - 1] = 1;for (j = 1; j <= MAXN; j++) {
if (inuse[j - 1]) continue;inuse[j - 1] = 1;for (k = 1; k <= MAXN; k++) {
if (inuse[k - 1]) continue;inuse[k - 1] = 1;for (l = 1; l <= MAXN; l++) {
if (inuse[l - 1]) continue;inuse[l - 1] = 1;for (m = 1; m <= MAXN; m++) {
if (inuse[m - 1]) continue;inuse[m - 1] = 1;
n = abs(i - j);if (inuse[n - 1]) goto lbl10;inuse[n - 1] = 1;
o = abs(j - k);if (inuse[o - 1]) goto lbl9;inuse[o - 1] = 1;
p = abs(k - l);if (inuse[p - 1]) goto lbl8;inuse[p - 1] = 1;
q = abs(l - m);if (inuse[q - 1]) goto lbl7;inuse[q - 1] = 1;
r = abs(n - o);if (inuse[r - 1]) goto lbl6;inuse[r - 1] = 1;
s = abs(o - p);if (inuse[s - 1]) goto lbl5;inuse[s - 1] = 1;
t = abs(p - q);if (inuse[t - 1]) goto lbl4;inuse[t - 1] = 1;
u = abs(r - s);if (inuse[u - 1]) goto lbl3;inuse[u - 1] = 1;
v = abs(s - t);if (inuse[v - 1]) goto lbl2;inuse[v - 1] = 1;
w = abs(u - v);if (inuse[w - 1]) goto lbl1;inuse[w - 1] = 1;
printf("%d %d %d %d %d\n", i, j, k, l, m);
printf(" %d %d %d %d\n", n, o, p, q);printf(" %d %d %d\n", r, s, t);
printf(" %d %d\n", u, v);printf(" %d\n", w);inuse[w - 1] = 0;
lbl1:inuse[v - 1] = 0;lbl2:inuse[u - 1] = 0;lbl3:inuse[t - 1] = 0;lbl4:inuse[s - 1] = 0;
lbl5:inuse[r - 1] = 0;lbl6:inuse[q - 1] = 0;lbl7:inuse[p - 1] = 0;lbl8:inuse[o - 1] = 0;
lbl9:inuse[n - 1] = 0;lbl10:inuse[m - 1] = 0;
}inuse[l - 1] = 0;}inuse[k - 1] = 0;}inuse[j - 1] = 0;}inuse[i - 1] = 0;}return 0;}
7行スレじゃないけど、圧縮しました。実行してみて下さい。
8前スレ988:03/02/13 03:54
>>6
うわ、速い。やっぱおれのにバグあるのか…
(´・ω・`)
>>4
了解です。もう少し走らせてみます。
>>8
バグ取れたらぜひ見せてくださいねー。面白そうなアルゴリズムだから。
俺のは思いっきり力技で書きますた。
11前スレ988:03/02/13 04:34
>>10
なんとか解読してみた。引き算やった結果が既に使われてる数字かどうかで枝刈りしてるのね。

おれがやったのは、全部のパターンを生成してチェックしてる。
だからチェックする回数は最悪で15!=1307674368000回もチェックしなきゃならん。
そりゃ遅いよ…

コードはちったあ綺麗かもしらんが、使い物にならんわこれ(汗

しかもチェックする関数にバグがあった。配列の添え字が全部ひとつずつ大きかった。
最初に書いたコメントに引きずられたらしい。
1212:03/02/13 06:47
#include <stdio.h>
#include <stdlib.h>
#define LINE 5
#define MAXN 15
int x[LINE][LINE];
int use[MAXN+1];

void show(void){
 int i, j;
 for(i = 0; i < LINE; i++){
  for(j = 0; j < LINE - i; j++)
   printf("%d ", x[i][j]);
  printf("\n");
 }
}
1312:03/02/13 06:47
void test(void){
 int i, j, k, l, n;
 for(i = 1; i < LINE; i++){
  for(j = 0; j < LINE - i; j++){
   n = abs(x[i-1][j] - x[i-1][j+1]);
   if(use[n] == 1){
    x[i][j] = n;
    use[n] = 0;
   }else{
    for(k = 1; k <= i; k++){
     for(l = 0; l < LINE - k; l++){
      if(k != i || l != j){
       n = x[k][l];
       use[n] = 1;
      }
     }
    }
    return;
   }
  }
 }
 show();
 for(i = 1; i < LINE; i++){
  for(j = 0; j < LINE - i; j++){
   n = x[i][j];
   use[n] = 1;
  }
 }
}
1412:03/02/13 06:48
void put(int pos, int k){
 int j;
 x[0][pos] = k;
 use[k] = 0;
 if (pos == LINE - 1) test();
 else {
  for (j = 1; j <= MAXN; j++)
   if (use[j]) put(pos + 1, j);
 }
 use[k] = 1;
}

int main(void){
 int k;
 for(k = 1; k <= MAXN; k++) use[k] = 1;
 for(k = 1; k <= MAXN; k++) put(0, k);
 return 0;
}
1512:03/02/13 06:58
http://www.sra.co.jp/people/miyata/algorithm/genperm.txt
の1で順列作って、そっから枝狩りしてまふ

#define LINE 7
#define MAXN 28
にしたら終わらねぇ(д
1612:03/02/13 07:24
void test(void){ //すまんが訂正
 int i, j, k, l, n;
 for(i = 1; i < LINE; i++){
  for(j = 0; j < LINE - i; j++){
   n = abs(x[i-1][j] - x[i-1][j+1]);
   if(use[n]){
    x[i][j] = n;
    use[n] = 0;
   }else{
    for(k = 1; k <= i; k++){
     for(l = 0; l < LINE - k; l++){
      if(k == i && l == j) return;
      n = x[k][l];
      use[n] = 1;
     }
    }
    return;
   }
  }
 }
 show();
 for(i = 1; i < LINE; i++){
  for(j = 0; j < LINE - i; j++){
   n = x[i][j];
   use[n] = 1;
  }
 }
}
H8マイコンを使って30分のダウンタイマーを作りたいんですが、
ぜんぜんわかりません。
言語はC++です。
お願いします。
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
int que[MAX];

int check(int top, int next){
 int i,j,num,next_next;
 num=next-top-1;
 for(i=0;i<num;i++){
  que[next+i]=abs(que[top+i]-que[top+i+1]);
  for(j=0;j<next+i;j++){
   if(que[next+i]==que[j]) return -1;
  }
 }
 next_next=next+num;
 if(next_next<MAX){
  return check(next,next_next);  //再帰
 }else{
  for(i=0;i<MAX;i++){
   printf("%d ",que[i]);
   if(i==4||i==8||i==11||i==13) printf("\n");
  }
  return 0;
 }
}
int main(int argc, char* argv[])
{
 int i,j,k,l,m;

 for(i=1;i<=MAX;i++){
  que[0]=i;
  for(j=1;j<=MAX;j++){
   if(j==i) continue;
   que[1]=j;
   for(k=1;k<=MAX;k++){
    if(k==i||k==j) continue;
    que[2]=k;
    for(l=1;l<=MAX;l++){
     if(l==i||l==j||l==k) continue;
     que[3]=l;
     for(m=1;m<=MAX;m++){
      if(m==i||m==j||m==k||m==l) continue;
      que[4]=m;
      if(!check(0,5)) return 0;
     }
    }
   }
  }
 }
 return -1;
}
遅くなったけど、せっかく作ったんでおれも貼っとこ。
#include <stdio.h>
#include <stdlib.h>

#define N 7
#define MAX (N * (N + 1) / 2)

int number[MAX + 1];
int triangle[N][N];
2120:03/02/13 11:54
void recursive(int n)
{
  int i, j, d;
  if (n < N) {
    for (i = 1; i <= MAX; i++) {
      if (number[i] == 0) {
        triangle[0][n] = i; number[i] = 1;
        for (j = 1; j <= n; j++) {
          d = abs(triangle[j - 1][n - 1] - triangle[j - 1][n]);
          if (number[d] == 0) {
            triangle[j][n] = d; number[d] = 1;
          } else {
            break;
          }
        }
        if (j > n) recursive(n + 1);
        for (j -= 1; j >= 0; j--) number[triangle[j][n]] = 0;
      }
    }
  } else {
    for (i = 0; i < N; i++) {
      for (j = 0; j < i * 2; j++) putchar(' ');
      for (j = i; j < N; j++) printf("%2d ", triangle[i][j]);
      putchar('\n');
    }
  }
}
2220:03/02/13 11:54
int main(int argc, char* argv[])
{
  recursive(0);
  return 0;
}
2320:03/02/13 11:56
>>20
直してなかった…
× #define N 7
○ #define N 5
どうもありがとうございました^^
25デフォルトの名無しさん:03/02/13 12:26
char one[1024];
char two[1024];
char one_two_buf[1024];

printf("データ1を入力してください\n");
scanf("%s",&one);
printf("データ2を入力してください\n");
scanf("%s",&two);

sprintf(one_two_buf, "%s %s)", one, two);

というプログラムでは、
『one』と『two』にスペース入りの文字列は入力できないんですか?
one_two_bufに『赤 青 緑 …』というように入れたいのですが
『one』に『赤 青』
『two』に『緑』
という感じでoneにスペースで区切って文字列を入力すると
『赤』がoneに、『青』がtwo に入ってしまうようで、

scanf("%s",&two);

の行が実行されません…

スペース入りの文字列を入力できる関数はあるのですか?
ぜひご教授ください
お願いします
2625:03/02/13 12:31
すみません

誤:sprintf(one_two_buf, "%s %s)", one, two);
正:sprintf(one_two_buf, "%s %s", one, two);

です
>>25
gets?
2825:03/02/13 12:47
エラーメッセージで

the `gets' function is dangerous and should not be used.

と表示されるのですが…
危ないから使うな、って言われてるんですか…?
>>28 んだ
>>28
Cの中の人からのメッセージだ。
中の人などいない!
char buf[254+8];

fread(buf, sizeof(buf), stdin);
>>28
Yes.

getsはバッファーオーバーフローの危険性があって、
その危険性をどんなにプログラム上で工夫しても
回避することが出来ないんだよ。
固定長で行数不定のテキストファイルの内容を1行を1配列に最後(EOF)まで
格納するにはどうしたらいいんでしょうか?
変数に格納した後、その中身を比較したいんですが、ここで詰まってしまいますた。
(例)
ABCDEF123456 ⇒TMP[1]
BCDEFG234567 ⇒TMP[2]
CDEFGH345678 ⇒TMP[3]
  :
助けてください。おながいします。
>>34
行数をまずカウントし、行数分の配列をmalloc。
rewind()して読み直す。
>>34
質問の意図は汲めるが意味がよくわからん
>>25
・scanf()は正しい仕事をしている。
"%s"は空白を区切りと見做す仕様だ。
喩え入力の途中であろうが、文字列が確保できたらそこで終了してしまい、
残りの入力は読み取られないままになる。
#そして次回のscanf()で入力されるわけ。

・gets()は問題が色々ある。
fgets()で置き換え可能なので、行単位の入力でいいのならfgets()を勧める。
但し、改行コードも読みこまれていることに注意。

そして、どちらかというと擦れ違い。
H8にタイマーのプログラムを入れたんですが、
LCDに表示させるにはどうしたらいいですか?
>>38=17?
>>59辺りでできてたりして。
40前スレ985:03/02/14 02:00
ありゃ。もう出来ちゃってたか。
とりあえず、>>6だけコンパイル・実行してみたけど、速い!お見事!
ツリーにして再帰〜とか漠然と考えていたんだけど、なるほどねぇ・・・

前スレ1000の誘導もお見事でした。
>>38 LCD制御は別のICでしょ? そのICのコマンドレジスタと
データレジスタは内蔵RAMではないどこかの番地にマップされてる?
たとえばはINITでいくつかコマンドを送ってLCDを表示状態にして、
インターバルタイマで1秒を作り、その割込処理で時刻を加算して、
時刻をhh:mm:ssとかに編集してLCDのデータレジスタにその文字を送る
とかやりたいわけ?
>>38は制御系スレに行った方がいいかもね。
43前スレ925:03/02/14 20:32
遅れましたが970サンクスです。
44前スレ963:03/02/15 12:45
遅くなりましたがありがとうございました。
もう1つ質問なのですが
このような動作をするプログラムを作るにはどうすればいいでしょうか。

例えば ○○○left○○right○○○(○は空白) と入力すると

left○○○○○○○○right と出力される

文字列の2つの単語を画面の行の両端に表示するプログラムを
作りたいのですがどうすればいいのでしょうかお願いします。

>>44
前スレの問題とほとんど同じだろ
回答例を理解してないのか?
>>45
もちついてー もちついてー

#include <stdio.h>

#define GAMEN_NO_SIZE (80)

int main(){
int i;
char left[GAMEN_NO_SIZE],right[GAMEN_NO_SIZE],line[GAMEN_NO_SIZE+1];
scanf("%s",&left);
scanf("%s",&right);
for(i=0;i<GAMEN_NO_SIZE;i++)
line[i]=' ';
line[GAMEN_NO_SIZE]='\0';// 文字列の終端を意味する
for(i=0;i<strlen(left);i++)
line[i]=left[i];
for(i=0;i<strlen(right);i++)
line[GAMEN_NO_SIZE-strlen(right)+i]=right[i];
printf("%s",line);
}


>>46
仕事なら落第。
>>47
ごめん、こんな問題を出す学校の宿題ならエラー処理要らないかと(藁)
それにここに聞く人がそれほどレベルの高いコードを貰っても、
理解できないと思うので、中学生レベル程度の組み方っす。

えーっとぉ、この場合想定されるエラーと、あと減点対象は、
・変数名や定数名の付け方
・入力される文字列の長さ判定 strlen(left)+strlen(right) <= 画面サイズ であるかの判定
・っていうかfor文使わなくても、strcpyがあるでしょ!

こんなもんですかね?
49デフォルトの名無しさん:03/02/16 07:26
やらせろ!
50デフォルトの名無しさん :03/02/16 09:56
もうしわけないですが
ご教授願います

時間処理なんですが、
time( &long_time );
として現在時刻を取得したんですが、
この時間を10分おきに更新していく処理がほしいんです。

具体的に言いますと、
2002/12/23 14:09:45 というデータがあるとしたら、
ループの中で
2002/12/23 14:19:45
2002/12/23 14:29:45



と一年分を文字列変数に入れる
(longでもいい)
処理ルーチンがほしいのですが

よろしくお願いします。
>>46
突っ込みどころが満載過ぎるが、取りあえず
scanfに文字配列を渡すときに&を付けるのは止めような。

>>50
time_tは単純な積算秒数であって、普通に加減算できるよ。
10分なら600秒だから、
now += 600;
とすれば10分後の値が得られる。
>>46
仕事なら擦れ違い
long_time += 10min;
54デフォルトの名無しさん:03/02/16 10:06
>53
それだと、年月日まで自動更新されるんでしょうか
>>48
>○○○left○○right○○○
(入力された筈の)rightの右側の空白の運命やいかに。

エラー処理は兎も角、一文字ずつコピーするのとループで毎回strlen()するのは如何な最中と。
>>54
だから、time_tは(1970/1/1からの)「積算秒数」なの。
年月日時分などのデータを別々に持ってる訳じゃないのよ。
四則演算ってのはそういうこと。

57デフォルトの名無しさん:03/02/16 10:12
>51
>53
どうもありがとうございました。
oracle で時間を更新する手段もあったらしいですが
そんな難しく考えないほうがよかったですね
>>54
time_t型は1970年1月1日からの秒数だと言ってるだろう。
>>51を読んだのか?
>>58
>>57は読んだのか?
積算秒数による表示って
うるう秒がある現在では不正確にならないのカナ?
>>60
おまえは役に立たん
>>61
言っている意味がわかりません。
63デフォルトの名無しさん:03/02/16 11:45
how can I draw circles in win32?
この場合はonじゃないのか? と言ってみるテスト
いやofだろう。と言ってみるテスト
>>63 inならこんな感じかな.
printf("win32win32win32win32win32\n"
"win32 win32\n"
"win32 ○ win32\n"
"win32 win32\n"
"win32win32win32win32win32\n");
onならこうか?
printf("     ○\n"
"win32win32win32win32win32\n"
"win32           win32\n"
"win32           win32\n"
"win32           win32\n"
"win32win32win32win32win32\n");
68デフォルトの名無しさん:03/02/16 12:05
you guys suck.
useless.
if you don't know how, just say so.
losers
ネタスレ化記念アゲ
>>68
SO
>68
You must be search at this page.

http://www.google.co.jp/

This page is in at your aim.
> This page is in at your aim.
この英文は正しいの?
>>60
アナログコンピュータ使え
>72
載るっていう単語で
和英辞典を引け
>>74
その和英辞典ですか?
7675:03/02/16 13:18
×その和英辞典ですか?
○どの和英辞典ですか?
aim I am man.
アイ キャン スパーク イングリッシュ
つっこむならまず
> You must be search
だろ(w
しったか厨房し市ね
このスレをなんだと思ってる
infoseek翻訳

あなたはこのページに探索であるに違いありません。

http://www.google.co.jp/

このページは、あなたの目標に中にあります。
>81
まさか そんな役だと思ってないよな?
┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓┏━┓
┃一┃一┃一┃二┃三┃四┃五┃六┃七┃八┃九┃九┃九┃┃六┃
┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃萬┃┃萬┃
┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛┗━┛
/ヘ;;;;;
';=r=‐リ 充分、九連宝燈だと思うが。
ヽ二/
>>82
ではあなたが訳してみましょう。
85デフォルトの名無しさん:03/02/16 15:43
だれか>>71を役して
もういいよ その英語の話は
だめだ。間違いをそのまま放置してはいけない。
エラー訂正符号がないので訂正できません。
>87
じゃ 御前がやれ
模範解答見せてくれよ
>>89 模範解答

あなたはこのページに探索であるに違いありません。

http://www.google.co.jp/

このページは、あなたの目標に中にあります。
How can I draw circles with Win32 APIs.
You'd better search at this site.
There you'll get it!!
新たなる疑問。そこはwithでいいのか!?
93デフォルトの名無しさん:03/02/16 16:29
>>92
いいだろ。
APIで手段と考えればwith
Win32で環境や基盤と考えればinやon
どれも間違いではないだろう
ofじゃダメなのか?
circles with APIs
APIによって円を
circles in APIs
APIの中に円を
circles on APIs
API上で円を
circles of APIs
APIの円を
ウセロ、アフォ共
98デフォルトの名無しさん:03/02/16 20:39
質問です

ランダム関数randですが
最大幅65535ですか

これ、最大幅9999になるような
方法はないでしょうか
ifで淘汰する方法以外のを探してます
99デフォルトの名無しさん:03/02/16 20:43
>>98
rand() % 9999
rand(9999)
とかは?
101デフォルトの名無しさん:03/02/16 20:54
>>98
randで出てきた数値の10000のあまりを求めるとか?
102デフォルトの名無しさん:03/02/16 21:23
>>99
>>100
>>101
どうもありがとうございました
rand() % 9999
なんて書く奴は素人
いやはや面白い。いや愉快痛快。結構結構。
105640:03/02/16 22:58
>>103
rand()の乱数としての性質がどうだろうとも、
% 9999 なんてやっちゃった日には、全体のランダム性が狂うからね。
640はわすれてくだちい...
>>103
>>105
ではrand()が0からRAND_MAXの充分に特性のよいランダムと仮定して
0からkの均一なランダム関数を作成せよ
>% 9999 なんてやっちゃった日には、全体のランダム性が狂うからね。
そうなの?ふつうに0-9998までの乱数がでてきそうだけど
あ、最大値が65535なんだね。
>>108
処理系にもよるけど、rand() の返す下位ビットはあまりランダムでない事が
ままあるらしいから、なるべく % ではなく / を使って上位ビットを使う
ようにしたほうがいいという話があった。
そういう問題ではない
これも定期的にでるネタやなぁ…
>>110
そういう問題じゃない。話を簡単にするためにRAND_MAXが8で、
0〜6の乱数が欲しいとしよう。そのときに、
rand() % 5
とやったらどうなる? 一応、rand()が理想的な乱数を返すと仮定して、
それぞれの数字が出る確率を求めてみようじゃないか。
rand()  rand()%5
0     0
1     1
2     2
3     3
4     4
5     0
6     1
7     2
0,1,2の出る確率はそれぞれ 2/8
3,4の出る確率はそれぞれ1/8
だろ。偏っちゃうじゃないか。だから剰余で乱数を求めちゃいけない。
114113:03/02/17 01:08
う。途中で数字を弄くったらなんか変になった。
でも、言いたいことはわかるよな。な。スマン

0〜6の乱数が欲しいとしよう(×)
0〜4の乱数が欲しいとしよう(○)
while((x = rand()) > k));
return x;
停止性の証明は?
k>RAND_MAXの時は?
> 停止性の証明は?
rand() 関数は 0 から RAND_MAX の間の疑似乱数整数を返す。

> k>RAND_MAXの時は?
0<=k<=RAND_MAX のときのみ使用すれば問題ない。
118レイホウ@6歳:03/02/17 10:15
Borland C ビルダーのリファレンス

#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i;
randomize();
printf("0 から 99 までの 10 個の乱数\n\n");
for(i=0; i<10; i++)
printf("%d\n", rand() % 100);
return 0;
}

えいめ〜ん
>>118
リファレンスマニュアルのサンプル?
一様乱数と書いてなければ間違ってはいないんじゃない?
#妥当かどうかは兎も角も。
120レイホウ@6歳:03/02/17 11:25
>>119
rand()で検索して
使用例のとこをそのまま転載

えいめーん
例えば、
0〜5の乱数値を得られるときに、
0〜3の乱数が欲しかったら、

0〜3 使う
4〜5 やり直す

で、いいんじゃない?
>>121
何を的外れなことを言ってるんだ?
だれも>>113につっこまないのね
>>98
(int)((dobule)rand() * (double)9999 / (double)65535)

ネタですよ。
>>123
つっこまなくてもみんなわかるだろうと思って…
説明して
試しに
RAND_MAXが32767の環境で
printf("%d\n", rand() % 10000);
した出力を集計してみた。
予想通り、2767を境に出現頻度が数割変わった。
printf("%d\n", (int) ((double) rand() * 9999 / RAND_MAX));
にしたら、そのような境界条件はないものの、ここのばらつきが増えた気がする。
>>127
それで、何を訴えたいの?
どっちみち、rand()は性能悪いなぁと。
ったりめーだ。こんぴうたには所詮擬似乱数しか発生させられないのよ。
rand() / (RAND_MAX / 最大値);
>>127
剰余じゃなくて、10000以上になったらやりなおせばいいだろ?
無駄が多いなら2の累乗の剰余で減らしといて。
ifで淘汰とかやり直しって言ってるのってアフォか?
乱数っていう意味わかってるの?
134127:03/02/17 18:04
>>132
仕事では
drand48() * 10000.0
みたいにしている。
>>133
randが完全な乱数ならそれで確率は全く同じになるだろ?
6面ダイスで4面ダイスの代わりをするときにそうするだろ?
>randが完全な乱数なら
その前提がそもそも間違ってる
>>136
突っ込みの方向が明後日に向いとるな
誰か一昨日のほうを向いてバランスを取れ。
 よしきた。
          ∧_∧
    ∧_∧  (´<_`  ) 意味が違うと思うぞ、兄者。
   (´く_` ) /   ⌒i
   /   \     | |
  /    / ̄ ̄ ̄ ̄/ |
__(__ニつ/.Gateway./ .| .|____
    \/____/ (u ⊃


じゃあ、振り直し以外で
6面ダイスを4面ダイスとして使う方法を
いってみろ

・訂正・
randが(最大値までの範囲内において)完全な乱数なら
141デフォルトの名無しさん:03/02/17 19:48
お休み中の宿題で、英単語を変化させるプログラムを作れときたのですが、うまく出来ません。
どうかご教授願えませんでしょうか?

原形の単語を入れる→複数形
          未来形
          過去形(それぞれ無いなら原形のまま出力)
という感じです。
不規則変化もあるので、dic作ってそれ以外は文字列の単語のラストや母音で変化でしょうか?
>>141
それでいいんじゃない?
文字列の検索そのものは、strchr()で、FILEから検索だと思うのですが、ラストの文字やその二つ目を検索するにはどうすればいいか教えてもらえないでしょうか?
二重検索(?)はあまり理解していないので。
それと、検索し終わった後の処理の仕方も。

前文サゲ忘れてました、すみません
144デフォルトの名無しさん:03/02/17 20:20
c++暦2ヶ月です。Borland使用しています。
今作っているもので、saveボタンを押すとNumberofStudents1のテキストボックス
から入力された生徒数を読み取り、
courses[0].student_number = atoi(NumberofStudents1->Text.c_str());
clearボタンでテキストボックスを空欄に戻し、loadボタンで先程入力された生徒数
をもう一度NumberofStudents1に表示させたいのですが、
NumberofStudents1->Text = courses[0].student_number;
ではもちろんloadできません。違うfanction内で得た情報を使用する場合、どのよう
にしたらよいのでしょうか?初心者質問ですみませんが、わかる方教えて下さい。
145デフォルトの名無しさん:03/02/17 20:22
国籍なき脱北者に在留資格(NHKニュース)
http://www.nhk.or.jp/news/2003/02/14/k20030214000149.html

政府は14日の閣議で、北朝鮮を脱出して日本に戻っている人たちの中に、
日本国籍を持たない人もいるとしたうえで、こうした人たちが、日本で暮ら
せるよう事情に応じて適切な在留資格を与えているとする答弁書を決定し
ました。


【政治】国籍なき脱北者に在留資格−政府
http://news2.2ch.net/test/read.cgi/newsplus/1045221402/

674 :名無しさん@3周年 :03/02/15 12:19 ID:u/yKFIsD
まあ、ここで文句いう前に 国に文句言え。以下直に御意見板に行く。
年令、メアド等書きたく無いのは書かなくても大丈夫。

首相官邸「ご意見募集」
http://www.kantei.go.jp/jp/forms/goiken.html


65 :名無しさん@3周年 :03/02/14 20:42 ID:iHggbG5E
http://www.e-pon.net/project/2ch/asia/

俺、もうメール送った。
みんなもやってくれ。


28 :名無しさん@3周年 :03/02/14 20:23 ID:ECrhI8Fb
>北朝鮮を脱出して日本に戻っている人たちの中に、日本国籍を
  持たない人もいるとしたうえで、
なんで日本国籍を持たない人が”戻って”くんのよ?
>>144
全体像が見えないと応え難いかと。
coursesをグローバルにおけばいいような気はするけど。
>>143
1行ずつ読みこんで処理をすると仮定して、
char *pBuffer; /* 行バッファ */
char *pWord; /* 単語 */
size_t len; /* 行の長さ */
・行内から特定の単語を探す。
strstr(pBuffer, pWord);
単語が見つかれば見つかった場所が返される。

・行の先頭の文字を出力
printf("%c\n", pBuffer[0]);

・行の最後の文字を出力
len = strlen(pBuffer);
printf("%c\n", pBuffer[len ? len - 1 : 0]);

・行の最後から2文字を表示(但し2文字に満たない場合は短くなる)
printf("%s\n", pBuffer + len >= 2 ? len - 2 : len - 1);

このくらいあればヒントになるかな。
148144:03/02/17 21:02
>>146
どうもありがとうございます。
coursesはグローバルになっていると思うのですが・・・
これはコースが3つあり、その一つ一つのコースに4人以下
の生徒がいるという設定です。header fileには
#define NAMESIZE 20
#define SSNSIZE 9
enum eGender { UndefinedGender=-1, Male, Female };
enum eStatus { UndefinedStatus=1, Freshman, Sophmore, Junior,
Senior, Other };
struct Student
{
char first_name[NAMESIZE+1];
char last_name[NAMESIZE+1];
char SSN[SSNSIZE+1];
eGender gender;
eStatus status;
int scores[4];
};

struct Course
{
struct Student students[3];
char course_name[NAMESIZE+1];
int student_number;
};
で、cppのincludeの下に
Student students[3];
Course courses[2];
といれました。これでよいのでしょうか?
>>143
辞書に登録するとき、単語のスペルを逆順に登録する。
    study -> yduts
文字列の1文字目と2文字目が、自動的に
単語の後ろから1文字目、2文字目になる。

ウマー!
>6面ダイスを4面ダイスとして使う方法
頂点が8個在るから、それぞれに番号をつけて、
振って上に来た頂点の番号の二分の一を取る。
注:底が三角錐の入れ物に振る。
>6面ダイスを4面ダイスとして使う方法
それはもちろんできる。1/4=0.13(6進)で有限小数だから
>>140
さいころを2回振り、1回目に出た数と2回目に出た数を
覚えておき、以下の表にしたがって変換する。

例) 1回目に "3"、2回目に "5" が出た場合、
    (3,5)->2
4面体さいころを1回振って "2" が出たものとして扱う。

(1,1)->1; (1,2)->1; (1,3)->1; (1,4)->1; (1,5)->1; (1,6)->1;
(2,1)->1; (2,2)->1; (2,3)->1; (2,4)->2; (2,5)->2; (2,6)->2;
(3,1)->2; (3,2)->2; (3,3)->2; (3,4)->2; (3,5)->2; (3,6)->2;
(4,1)->3; (4,2)->3; (4,3)->3; (4,4)->3; (4,5)->3; (4,6)->3;
(5,1)->3; (5,2)->3; (5,3)->3; (5,4)->4; (5,5)->4; (5,6)->4;
(6,1)->4; (6,2)->4; (6,3)->4; (6,4)->4; (6,5)->4; (6,6)->4;
>>150
「三角錐」は余りうまくないという罠。
ほらあれだよ剣山なんかの上で振れば良いんだよ
155143:03/02/17 22:37
147さん,149さん本当にありがとうございます。
何とかやってみたいと思います。
明日の午前中までに報告します。
タコ助が
昔、「n(=4,6,8,12,20)明太ダイスを何回か振って、
1からmの値をとる一様乱数を1個得られるnとmの条件を求めよ」
という問題があったのを思い出した。
158デフォルトの名無しさん:03/02/18 02:32
行列の固有値を求めるプログラム
を作ってください
固有値ってたすき掛けのやつだっけ?
>>158
ヤコビ法でも使え。
>>159
それは行列式では? 
http://tl.cs.chubu.ac.jp/~pesu/src/matrix/
ほれ、ヤコビ法のリンク貼ってやったぞ。
>>140
コンピュータ乱数はサイコロとは違うんだよ。
そんなこともわからないのかい(プ
分かっているからこそ「完全な乱数なら」と但し書きしてるんだと思うが。
むしろ「頂点が8個あるから」とかネタで返してるヤシに突っ込めよ。
みんなが一つずつ馬鹿さを持ち寄ってきた結果
流れがわけわかんないことになってるスレはここですね。
そうですね。
わたしは馬鹿さを二つ持ってきた、その一つをおまえにやろう
>>166
なんかその台詞スゲェかっこいい!
乱数が欲しかったらランダムマスターを使えって。
http://www2.toshiba.co.jp/efort/market/rmaster/index_j.htm
ランダムシードは駄作?
ランダム・ハジル イイ(・∀・)!!
ランダムスレート
マスタードシード
ストライクランダム
フリーダムランダム
ガンダムシード
175デフォルトの名無しさん:03/02/18 18:23
#include <stdio.h>
#define N 8
int main (void){
int i, j;
static char a[N] [N+1]={
{"********"},
{"********"},
{"*000000*"},
{"*00**00*"},
{"****00**"},
{"***00***"},
{"**00****"},
{"********"}}, b[N] [N+1];

for(i=0; i<N; i++){
for(j=0; j<N; j++)
b[j][N-i-1]=a[i][j];
b[i][N]='\0';
}
for(i=0; i<N; i++)
printf("%s\n", b[i]);
return 0;
}
↑の"7"を変形(90、180度回転、左右反転)させたいんですが、180度と左右反転
がわかりません。このソースでは90回転してまつ。どなたか、他2つの処理を
教えてください・・・(´・ω・`)
176デフォルトの名無しさん:03/02/18 18:28
>>175
>b[j][N-i-1]=a[i][j];

b[j][N-i-1]=a[j][i];
にしてみな。
>>168
/dev/random 使うからいらね
それに最近のx86 CPUにはそれと同じ機能が備わっている罠
178デフォルトの名無しさん:03/02/18 23:09
実数の加減算を行うプログラムを作れ。
例123.45+67.89=191.34
ただし入力には、getchar()を使い、char型として1文字ずつ受け取る。
解釈できない文字が含まれた場合、それが入力された時点でそこまでの計算するものとする。
できなければエラーを表示して打ち切りでもよい。冒頭の0をゆるしてもよい。
scanfやatoi関数など既存の関数は使わないこと。

意味不明、焼肉定職
>>167
ものすごくどうでもいい話だが、>>166
「ウルトラマン」最終回のゾフィーの台詞が元ネタと思われる。
30代後半の奴が複数いると思われる
やっぱ世代が違う話題だったのか。
182デフォルトの名無しさん:03/02/19 19:03
ある処理の時間を計測するために以下のようなプログラムを作ってみました
しかし、これだと1秒単位の秒数しか計測できません
コンマ以下の時間も表示させたいのですが、どのようにすればいいのでしょうか?
tp_start とかの定義にdoubleとかがついていれば
printfで %f を付けるなどの方法がありそうなのですが、
調べてみたところ tipe_t、という定義でしか載ってなく、
その通りにやったのでコンマ以下を表示させる方法が思いつきません
教えてください

void time_keisoku()
{
time_t tp_start, tp_end;/* 応答速度計測 */

printf("\n応答時間計測開始.....\n\n");
time(&tp_start);/* 処理開始時間取得 */

// 処理

time(&tp_end);/* 処理終了時間取得 */
printf("\n応答時間計測終了\n");

printf("応答時間は %ld 秒です\n", tp_end - tp_start);
}
>>182
移植性の高い方法は存在しない。
UNIXを使っているのなら、gettimeofday()あたりで。
Windowsであれば、GetTickCount()などで。
ただし、あまり高い精度は期待しないこと。
単純に処理を10000回とかループするような方法が取れるのなら、
そのほうがいいのでは。

>>182
マルチタスクのOSで
その方法は無意味。
OSの機能かプロファイラを使うのが正解
185d:03/02/19 23:30
逆ポーランドがちょいわからない。↓どっかおかしいのかな?
charstack[15];/* スタック */
charans[15];/* 出力用変数 */
charwork[15] = "X=(a+b)*(c-d)";

void poland( void )
{
inti, j = 0, n = 0;

for(i = 0; work[i] != '\0'; i++) {
switch ( work[i] ) {
case '=':
if(j == 0) {
stack[j] = work[i];
j++;
}
else {
for(; j != 0; j--) {
ans[n] = stack[j - 1];
n++;
}
stack[j] = work[i];
}
break;
case '(':
stack[j] = work[i];
j++;
break;
186d:03/02/19 23:31
case ')':
for(; stack[j - 1] != '('; j--) {
ans[n] = stack[j - 1];
n++;
}
j--;
break;
187d:03/02/19 23:31
case '+':
case '-':
case '*':
if(stack[j - 1] == 'X' || stack[j - 1] == 'a' || stack[j - 1] == 'b' || stack[j - 1] == 'c' ||
stack[j - 1] == 'd') {
ans[n] = stack[j - 1];
n++;
j--;
stack[j] = work[i];
printf("%c\n\n\n", stack[j]);
}
else {
stack[j] = work[i];
j++;
}
break;
default:
stack[j] = work[i];
j++;
break;
}
}
/* スタックの残り要素を取り出し */
if(j != 0) {
for(; j != 0; j--) {
ans[n] = stack[j - 1];
n++;
}
}
}
解析するの面倒だったんで、こんなの組んでみた。ご参考に。
#include <stdio.h>
void assign(void);
void expr(void);
void term(void);
void factor(void);

char input[15] = "X=(a+b)*(c-d)";
char input_count = 0;

char get(void) { return input[input_count++]; }
void unget(char c) { input_count--; }
void put(char c) { putchar(c); }

void assign(void)
{
  char c;
  factor();
  c = get();
  if (c == '=') {
    expr();
    put(c);
  }
}
void expr(void)
{
  char c;
  term();
  c = get();
  while (c == '+' || c == '-') {
    term();
    put(c);
    c = get();
  }
  unget(c);
}

void term(void)
{
  char c;
  factor();
  c = get();
  while (c == '*') {
    factor();
    put(c);
    c = get();
  }
  unget(c);
}
void factor(void)
{
  char c;
  c = get();
  if (c == '(') {
    expr();
    c = get();
    if (c != ')') puts("syntax error");
  } else if (c == 'X' || c == 'a' || c == 'b' || c == 'c' || c == 'd') {
    put(c);
  }
}

int main()
{
  assign();
  return 0;
}
fgetsで読み込んだデータを3次元配列に格納したいのですがどうすればいいでしょうか?
ファイルのデータは
748
324
56
37
987
68
のように3桁の数字になってます
192デフォルトの名無しさん:03/02/23 22:38
どういう風に格納されるの?
説明不足スマソ
画像のデータなんで40*30のサイズとして
a[40][30][3](x座標、y座標、RGBの画素)
の配列に格納したいです
194≠191:03/02/23 22:50
例えば、
748なら、7 - 4 - 8 と分けて、matrix[7][4][8]=1
とかいうこと?
でもそれなら56とか68はどう解釈するんだろう?
なお、この場合はfgetsしたデータをsscanfで解釈する、という
方法でできます。
195≠191 && ≠192:03/02/23 22:55
おーい、よく分からないよぉー

データファイルの値は何を意味するの?
3桁がそれぞれRGBを意味するの?
196191:03/02/23 22:55
ごめ、さらに説明不足か
数字適当に書いたので…
例えば
12
15
244
78
65
21

だったら
a[0][0][0]=12
a[0][0][1]=15
a[0][0][2]=244
a[1][0][0]=78
a[1][0][1]=65
a[1][0][2]=21
って感じにするってこと
x座標を(0,0)から(39,0)までいったら次に(0.1)から(39,1)までいって
最後は(39,29)
197≠191 && ≠192:03/02/23 23:10
こんな感じ。3重配列を使います。

#include <stdio.h>

#define IMG_WIDTH 40
#define IMG_HEIGHT 30
#define IMG_COL_FACTOR 3

int main(){
FILE *fp;
char a[IMG_WIDTH][IMG_HEIGHT][IMG_COL_FACTOR];
int x,y,c;

fp=fopen("data.dat","r");
for(y=0;y<IMG_HEIGHT;y++){
for(x=0;x<IMG_WIDTH;x++){
for(c=0;c<IMG_COL_FACTOR;c++){
char temp[1024];
fgets(temp,1024,fp);
sscanf(temp,"%d",&a[x][y][c]);
}
}
}
fclose(fp);
}
198≠191 && ≠192:03/02/23 23:11
for(y=0;y<IMG_HEIGHT;y++){
for(x=0;x<IMG_WIDTH;x++){
printf("(");
for(c=0;c<IMG_COL_FACTOR;c++){
printf("%3d",a[x][y][c]);
}
printf(")");
}
printf("\n");

読み込めたか見るには、これをfcloseの後にでも挿入してください。
3つ読み込むループを
30回まわして、それを40回まわせばいいんじゃない?
3次元配列の大きさ変わるの?
200191:03/02/23 23:37
>197&198
ありがとうございます。試してみます

>199
かわらないです
201191:03/02/23 23:43
実行時にメモリがwrittenになることはできませんでしたとでますが…
>>201
char a[IMG_WIDTH][IMG_HEIGHT][IMG_COL_FACTOR];
じゃなくて
char ***a;
みたいな定義しとらんか?
203191:03/02/24 00:25
sscanf使ったことが無いのでこれをもとに

#include <stdio.h>

#define IMG_WIDTH 40
#define IMG_HEIGHT 30
#define IMG_COL_FACTOR 3

void main(){
FILE *fp;
int a[IMG_WIDTH][IMG_HEIGHT][IMG_COL_FACTOR];
int x,y,c;

fp=fopen("data.dat","r");
for(y=0;y<IMG_HEIGHT;y++){
for(x=0;x<IMG_WIDTH;x++){
for(c=0;c<IMG_COL_FACTOR;c++){
char temp[4];
*fgets(temp,5,fp);
a[x][y][c]=atoi(temp);
}
}
}
fclose(fp);

atoiのほうつかったら動いたようです。。
sscanf()使うなら、intの一時変数を利用すればいいね。
つまり、
sscanf(temp,"%d",&a[x][y][c]);
じゃなくて
int tmpVal;
sscanf(temp, "%d", &tmpVal);
a[x][y][c] = tmpVal;
>char temp[4];
>*fgets(temp,5,fp);
って…
fgets(temp, sizeof(temp), fp);
にするべきだし、エラーチェックも忘れずに。
207197.5ぐらい:03/02/24 23:11
>>204
あらら?ごめんなさい、gccでは動作を確認したんだけど。
むぅー これじゃ動かないのか……

>>191
あとは、206さんの言う通り
fgetsの2つめの引数は、「何文字読み込むか」ということなので、
sizeofで「何文字まで入るか」を宣言したほうがスマートです。

一応、読み込んだ数値が0未満または256以上だったら「n行目のデータが不正です」とか
表示してやるといいかも。
>>207
char変数の場所をintのポインタとして渡すとint境界を跨ぐ格好になるので
CPUによっては致命的なエラーになりうる。それに、配列の最後を
アクセスするときに領域を飛び出してしまう。
なので、コンパイラを問わずやってはいけない。
209デフォルトの名無しさん:03/02/25 20:43
文系学校の初歩的な宿題なのですが、どうしても解けず困っています(;´Д`)
お力お貸しください、、

[1] 正の整数nと実数データx[0], x[1],…….,x[n-1]をキーボードより読み込み、
平均より大きい値を出力するCプログラムをつくりなさい。

[2] 実数xと0以上の整数yをキーボードより読み込み、
xのy乗(xの値をy回掛算する)を計算し、結果を出力する
Cプログラムをつくりなさい。
>>209
[1]はなにを元に平均を出すの?

[2]
#include <stdio.h>
#include <math.h>
int main()
{
double x;
int y;
scanf("%lf %d",&x,&y); /* 宿題ならscanfで十分 */
printf("%f",pow(x,y));
return 0;
}
211210:03/02/25 20:48
あ、nは配列の個数か。
[1]
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
double d,sum=0.0;

scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%lf",&d);
sum+=d;
}
printf("%f\n",sum/n);
return 0;
}

213212:03/02/25 20:55
あ、#include <stdlib.h>はいらない。
>210 >212
うわぁありがとうございます。゜°(´Д`)°゜。
単位に関わる宿題だったので本当に困っていました、
ありがとうございました!!
>>214
多分>>210>>212じゃ、まじめにやれっていわれるぞ(藁
平均点を出力しちゃだめだろ。
>>216
そうだった(藁
書き直す
#include <stdio.h>
#include <stdlib.h>

int main()
{
double *x,sum=0.0,ave;
int i,n;

scanf("%d",&n);
if(!(x=malloc(n*sizeof(double)))) return 1;
for(i=0;i<n;i++){
scanf("%lf",x+i);
sum+=x[i];
}
ave=sum/n;
for(i=0;i<n;i++)
if(x[i]>ave)
printf("%f\n",x[i]);
free(x);

return 0;
}
多分もう見ていないな・・
はっ、今見ました、
お手をわずらわせてすみませんです、、( ´Д⊂ヽ
221207:03/02/25 22:01
>>208
あまり気にしないでそういうことをしていました。
今後の参考にさせていただきます。
222名無しさん@Emacs:03/02/25 22:34
>>209
[1]
#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <functional>

int main()
{
 std::vector<double> x;
 std::copy(std::istream_iterator<double>(std::cin),std::istream_iterator<double>(), back_inserter(x));
 double average = std::accumulate(x.begin(), x.end(), 0.0) / x.size();
 std::remove_copy_if(x.begin(), x.end(), std::ostream_iterator<double>(std::cout, "\n"),
           std::bind2nd(less_equal<double>(), average));
}

[2]
#include <iostream>
#include <cmath>

int main()
{
 double x;
 unsigned int y;
 std::cin >> x >> y;
 std::cout << std::pow(x, y);
}

とかっての出すと[2]はともかく[1]は講師がどう出るか見てみたいな(w
と思ったら「Cプログラム」か…
223デフォルトの名無しさん:03/02/25 22:57
>>222
C++か、まぁ「じゃあこのプログラムの説明して」
っていわれて困窮するのが落ちだな
Cだ!
>>222のプログラム提出したら根性あるね
226222:03/02/26 13:17
今更ながら整数nを読んでなかったので修正
#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <functional>

template <typename T>
class read_stream
{
private:
  std::istream& is_;
public:
  read_stream(std::istream& is) : is_(is) {}
  T operator()()
  {
    T value;
    is_ >> value;
    return value;
  }
};
int main()
{
  unsigned int n;
  std::cin >> n;
  std::vector<double> x(n);
  std::generate(x.begin(), x.end(), read_stream<double>(std::cin));
  double average = std::accumulate(x.begin(), x.end(), 0.0) / x.size();
  std::remove_copy_if(x.begin(), x.end(), std::ostream_iterator<double>(std::cout, "\n"),
                      std::bind2nd(std::less_equal<double>(), average));
}
227222:03/02/26 13:22
これからはちょくちょくこのスレをC++オナニーコード練習場にさせて頂くかもしれま
せん(ワラ
228222:03/02/26 13:33
ちなみに boost を使うともうちょっと簡単(?)になる。

#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>
#include <functional>

#include <boost/lambda/lambda.hpp>
#include <boost/iterator_adaptors.hpp>

int main()
{
  unsigned int n;
  std::cin >> n;
  std::vector<double> x(n);
  std::for_each(x.begin(), x.end(), std::cin >> boost::lambda::_1);
  double average = std::accumulate(x.begin(), x.end(), 0.0) / x.size();
  std::copy(boost::make_filter_iterator(x.begin(), x.end(), std::bind2nd(std::greater<double>(), average)),
            boost::make_filter_iterator(x.end(),   x.end(), std::bind2nd(std::greater<double>(), average)),
            std::ostream_iterator<double>(std::cout, "\n"));
}
>>209の[1][2]は両方とも「キーボードより」と書いて有るので
標準入力から読むのは間違いなのだが、移植性の高い方法が
存在しない罠。
230デフォルトの名無しさん:03/02/26 21:07
>>229
そうやって教師にかみつく生意気な生徒は落第させられます。
ま、先生より知識があったとしても、知らないふりをしていた方が
可愛がられるという罠。
禿親父に可愛がられなくとも一向に構わんが
落第はいやん。

233デフォルトの名無しさん:03/02/26 21:41
以下に示すsomethihg()の機能を述べよ

struct element{
 char data;
 struct element *next;
}

void something(struct element *l){
 struct element *p,*w;
 p=NULL;
 while(l->next!=NULL){
  w=p;
  p=l->next;
  l->next=p->next;
  p->next=w;
 }
 l->next=p;
}
>>233
単方向リスト
>>233
struct element型へのポインタを受け取り、何も返さない。
>>233
実験してみたが、lが指す次のstruct element型のデータがリストの
最後に持って行かれるようですね。
1)somethihgは「以下に示」されていない
~
2)l->next以降の要素(末尾のNULLを除く)の並び順を逆転させる。

238デフォルトの名無しさん:03/02/26 22:49
>>234->>237
レスありがとうございます。

簡単に(抜けてました)延べよなので
リスト上の要素の順序を逆にする機能
でいいですよね?

>>237
>1)somethihgは「以下に示」されていない
すみません。
明日の再試あるんですが、こんなとこでつまづいてるんで同様してたようです。

>>238
不安なら確認しる。Cコンパイラは入れてないの?
240デフォルトの名無しさん:03/02/27 00:09
>>233
っていうか。今どきvector<string>くらいつかえよ。
>>240
あのソースはどうみてもCだろ。
なんでリスト構造なのにstd::listでなくstd::vectorを勧めるのかな
なんとかの一つ覚えでvectorしか使っていないから
そろそろ
「もうlistなんか流行らねぇんだよ( ´_ゝ`)プ」
とか来そうだな。
242の奴が、list使え、とか言ってるんです
そこでまたぶち切れですよ
あのな、listなんてきょうび流行んねーんだよ
ボケが
配列やlistにもいいところがあるのになぁ。
#これだからなんとかの一つ覚えは・・・
247デフォルトの名無しさん:03/02/27 14:52
Write a program that adds all values stored in the array val and displays the
total. Modify the program to calculate and display the total of each row.
248デフォルトの名無しさん:03/02/27 14:57
Write a program that specifies three one-dimensional arrays named price,
quantity and total. each array should be capable to hold ten elements.
using a for loop, input values for the price and amount arrays. The entries
in the total array should be the product of the corresponding values of
the price and quantity arrays. After all the data have been entered, display an output
as a table in the following.
total price quantity
249デフォルトの名無しさん:03/02/27 14:59
HELP ME PLEASE.
>>247-249
C or C++?
配列valに格納された値をすべて加えて、合計を表示するプログラムを書いてください。
各列の合計を計算し表示するプログラムを修正してください。
価格、量および合計と命名される3つの一次元の配列を指定するプログラムを書きます。
各配列は10の要素を保持するのに有能に違いありません。
使用、1つの、ループ、価格に対する入力価値および量配列のために。
配列の合計中のエントリーは価格と量の配列の対応する値の製品であるべきです。
データがすべて入力された後、下記中のテーブルとして出力を表示してください。
価格量の合計
252デフォルトの名無しさん:03/02/27 15:14
C++ DESU. ONAGAISIMASU.
英語にはびびったが、設問そのものは簡単だな。
254デフォルトの名無しさん:03/02/27 17:05
プログラミングを始めたんですが、わからないことがあるので教えてください。
開発環境:C++(VisualC++.NET)です。

#include <stdio.h>

main()
{
printf("Hello!\n");
}

このようなプログラムを作成して実行したところ、一瞬だけウィンドウが表示されるのですがすぐ消えます。
このあとに何を書き込めばとまるんでしょうか???
255デフォルトの名無しさん:03/02/27 17:21
#include <stdio.h>
#include <conio.h>

main()
{
printf("hello world\n");
getch();
}
#include <stdio.h>

void main(void)
{
printf("Hello!\n");
return ;
}
こっちの方が良くね?
>>254
main()
{
printf("Hello Work");
(void(*(void)))NULL();
}
>>254
while(!kbhit())
;
>>256
void main()って言うな。
260デフォルトの名無しさん:03/02/27 20:07
2項演算処理の完成。
<被演算数>および<演算数>に対して<演算子>が示す計算を行い画面表示する。
コマンド入力:”cal2 <被演算数> <演算子> <演算数>”
演算数・被演算数 .... 数値を指定。符号、小数点の指定も可能。
演算子 ......... +(加算)、−(減算)、乗算(*)、/(除算)、%(剰余算)
実行例:
>cal2 123 + 45
123 + 45 = 168
>cal2 1234.56 % 78
1234.56 % 78 = 64.56
プログラムソース:
<<cal2.c>>
0001: #include <stdio.h>
0002: #include <stdlib.h>
0003: #include <string.h>
0004: #include <math.h>
0005: /*****************************************************************************/
0006: int main (int argc , /* IN : Arguments Count */
0007: char *argv[] ) /* IN : Arguments Contents */
0008: {
0009: int ret = (-1) ;
0010: const static
0011: char *command_help =
0012: "Command usage:\n"
0013: "\"<cmd> <Operated Digits> <Operator> <Operating Degits>\"\n"
0014: " <Operator> .... acceptable oerator are, +, -, *, /, %.\n" ;
0015: double ope1 ; /*** <被演算数> ***/
0016: double ope2 ; /*** <演算数> ***/
0017: double ans ; /*** <計算結果> ***/
0018: char *chp ;
0019:
261デフォルトの名無しさん:03/02/27 20:09
0020: if ( argc == 1 )
0021: puts(command_help) ;
0022:
0023: else if ( argc < 4 )
0024: puts("Argument Error: not enough arguments.\n") ;
0025:
0026:
0027:
0028: else if ( argc > 4 )
0029: puts("Argument Error: too many arguments.\n") ;
0030:
0031: else if ( ( ope1 = strtod(argv[1],&chp) ) == HUGE_VAL || *chp != '\0' )
0032: puts("Argument Error: <Operated Digit> error.\n") ;
0033:
0034: else if (
0035: /******************************************
0036: ** 許容される演算子か否かをチェック? **
0037: ******************************************/ )
0038: puts("Argument Error: <Operator> error.\n") ;
0039:
262デフォルトの名無しさん:03/02/27 20:09
0040: else if ( /***********************************
0041: **** <演算数>の変換・チェック ****
0042: ***********************************/ )
0043: puts("Argument Error: <Operating Digit> error.\n") ;
0044:
0045: else if ( /***************************************
0046: **** <演算数>のチェック−ゼロ除算 ****
0047: ***************************************/ )
0048: puts("Argument Error: Zero-Divide occur.\n") ;
0049:
0050: else{
0051: /****************************************************
0052: ** 計算処理を行い、変数ansへ格納。 **
0053: ** 剰余算は、標準関数=fmodを用いる **
0054: ****************************************************/
0055:
0056: printf("%.9g %s %.9g = %.9g\n",ope1,argv[2],ope2,ans) ;
0057: ret = 0 ;
0058: }
0059:
0060: return ret ;
0061: }
>>259
void main()厨 うるさい
264デフォルトの名無しさん:03/02/27 20:10
上のプログラムの穴埋め部分を教えてください。
if (strchr("+-*/%", argv[2][0]) == NULL) {
/* エラー処理 */
}
>>264
まずはどこに穴があるのかを教えてください。
なお、予想されるくだらないネタレスは遠慮願います。
267266:03/02/27 20:13
ああ、このコメントの部分か。
わかりにくい書き方だな。
if ((argv[2][0] == '/' || argv[2][0] == '%') && ope2 == 0) {
/* エラー処理 */
}
269264:03/02/27 20:16
許容される演算子か否かをチェック?、<演算数>の変換・チェック 、
<演算数>のチェック−ゼロ除算、計算処理を行い、変数ansへ格納。
剰余算は、標準関数=fmodを用いる、の4箇所です。誰かお願いします。
switch (argv[2][0]) {
case '+':
ans = ope1 + ope2;
break;
case '-':
ans = ope1 - ope2;
break;
/* 割愛 */
default:
/* 有り得ない */
ans = 0;
break;
}
( ope2 = strtod(argv[3],&chp) ) == HUGE_VAL || *chp != '\0'
>>270
defaultいらねーだろ。
要らなくても書いておくのが粋ってもんだ。
HAGE_VAL
275264:03/02/27 20:38
ありがとうございます。
助かりました。
276222:03/02/27 22:01
>>247
// マルチはやめませう。

#include <vector>
#include <iostream>
#include <algorithm>
#include <numeric>

int main()
{
std::vector<double> values;
// "all values stored" はとりあえず標準入力から入力しとけば良し?
std::copy(std::istream_iterator<double>(std::cin), std::istream_iterator<double>(), std::back_inserter(values));
std::cout << std::accumulate(values.begin(), values.end(), 0.0) << std::endl;
}

// "each row" ってなんじゃらほい?
277222:03/02/27 22:02
>>248
#include <vector>
#include <algorithm>
#include <iomanip>

template <typename T>
class calc_total
{
std::vector<T>& price_, &quantity_;
unsigned int id_;
public:
calc_total(std::vector<T>& price, std::vector<T>& quantity) : price_(price), quantity_(quantity), id_(0) {}
T operator()()
{ T ret = price_[id_]*quantity_[id_]; ++id_; return ret; }
};

int main()
{
std::vector<double> price(10), quantity(10), total(10);
// "using for loop" じゃぁ仕方あるめぇ…でもstd::algorithmなら内部的には(ry
for(int i=0;i<10;++i) std::cin >> price[i] >> quantity[i];
std::generate(total.begin(), total.end(), calc_total<double>(price, quantity));
std:: cout << "total price quantity\n";
std::cout << std::setiosflags(std::ios::left);
for(int i=0;i<10;++i) // ここはさすがに素直にforかな。フォーマットはこれでいいんかいのぅ。
std::cout << std::setw(9) << total[i] << std::setw(8) << price[i] << quantity[i] << "\n";
}
278!=259:03/02/27 22:47
>263
スレ違いでスマソが
void main()ってなにか問題あるの?
>>278
標準C/C++にはそんなものはない。だけ。
>>278
深刻なほうから順に、

コンパイルすらできないことがある。
実行できないことがある。
正しく実行できないことがある。
くさかべーにいじめられる。
深刻でない方から順になっているように見えるが
282247:03/02/28 03:41
someone help me
283デフォルトの名無しさん:03/02/28 04:41
俺が買った『C言語の総合研究』高田美樹著は void main() が全面的に採用されていて、「なんだかなあ」と思いました。
本自体は、役に立ったけれど。
ZOID main
コンパイルできてちゃんと動くならvoid mainでいいよ。
信者が煽っているだけ。
まあ、今から勉強するならint mainと書く習慣をつけるに
こしたことはないけど。
287222=276:03/02/28 10:33
>>247
貴様漏れのコードじゃ不満だと言いやがるのですか?
# だから "each row" ってなんじゃらほい
よくわからんが、各出力行にそれまでの累計を一緒に出すようにせよ
ってことでは?
>>281
くさかべーにいじめられるのが一番深刻ということか。
それはそれで、面白い話ではある。
くさかべーについては、『ということにしたいのですね』で2典をひくと、
少しわかる。
>>289
確かに、
>コンパイルすらできないことがある。
その時点でわかるから深刻ではない。

>実行できないことがある。
実行してみれば判るからそれほど深刻ではない。

>正しく実行できないことがある。
これもテストの段階でわかるから余り深刻ではない。

>くさかべーにいじめられる。
これはいじめられるかどうかわからないだけに深刻だね。

>深刻ではない。
ということにしたいのですね。
馬鹿な記事が増えて迷惑です。

等と言われて、ハァハァできそうでつ・・・
292デフォルトの名無しさん:03/02/28 15:18
このようなプログラムをつくりたいのですがどうすればいいのでしょうか

配列arrのデータに従って、前回までのデータを含めた今回の平均値を計算する

arr[0] : 前回までのデータの総数。arr[2]を加算して平均値を計算する
arr[1] : 前回までのデータの総和。arr[3]以降を加算して平均値を計算する
arr[2] : 今回のデータの数。0のときarr[0]arr[1]をクリアする
arr[3]〜 : 今回のデータ

どなたかかお願いします。
arr[0]からarr[n]までの総和を何か別の変数に入れておく。
0クリアはmemsetで。
294デフォルトの名無しさん:03/02/28 15:32
for (i=3; i < arr[2]+3; i++) {
arr[0] += arr[i];
arr[1]++;
}
間違えた。
if (arr[2]==0) { arr[0] = 0; arr[1] = 0; }
else arr[0] += arr[2];
for (i=3; i < arr[2]+3; i++) arr[1] += arr[i];
double calcAve(arr_type_t *arr)
{
 int ic;

 if (arr[2] == 0) {
  arr[0] = 0;
  arr[1] = 0;
  return 0;
 }
 for (ic = 3; ic < 3 + arr[2]; ic++) {
  arr[1] += arr[ic];
 }
 arr[0] += arr[2];
 return arr[1] / (double) arr[0];
}
297293:03/02/28 15:36
あ、ちょっと勘違いした。配列の要素に総和を入れるのか
double calcAve(arr_type_t *arr)
{
 if (arr[2] == 0) {
  arr[0] = 0;
  arr[1] = 0;
  return 0;
 }
arr[0] += arr[2];
 for (;arr[2]--;) {
  arr[1] += arr[arr[2]];
 }
 return arr[1] / (double) arr[0];
}
>配列arrのデータに従って、前回までのデータを含めた今回の平均値を計算する

平均値を計算しているのは>>296だけか。
>>298もか。
301デフォルトの名無しさん:03/02/28 22:13
   %
   ↑
どうやったら表示できますか?
>>301
putchar('%');
printf("%%");
>>302
さんくす
304デフォルトの名無しさん:03/02/28 22:58
スカートの裾をちょこんと摘んで思い思いのご挨拶をする二人。
一斉に驚きの声と女生徒の「かわいーっ」という声が混ざった歓声が上がる。

「メルメルメ〜vvv」
「お、おいっゴン!?」

しぇりりんに抱きつき、顔をペロペロしようと思いっきり飛び掛ったウマゴンであったが、相手は幻影。すなわち単なる映像である。
どんなに精巧に映し出されていても実体が無いのだから、彼が彼女たちをすり抜けて床にダイビングしてしまったのも仕方の無いことだった。
(゚Д゚)ハァ?
>>304
ナイスたて読み。
>>306
どう読むの?
>>307







ばか
かば
読めない…
釣りなのだろうか、俺が馬鹿なのだろうか…
>>310
「どしおメース」でぐぐってみろ
312デフォルトの名無しさん:03/03/02 16:18
最初の引数にアルファベットを入力させ、
次に表示させる範囲を入力させて均等な隙間を空けて表示します。
例えばABC 5ならA B C、A 3なら A 、ABCDEF 8なら ABCDEF 。
均等に隙間を与えられない場合は真ん中に寄せます。
ABC 4ならABC。のように余裕のない場合は隙間を消して
表示させたいのですがどうしたらよいでしょうか。
アルゴリズムが分からないのかCのコードに落とせないのかどっちだ?
すみません。
アルゴリズムからご教示願います。
>>312
方針としてはこんなところか。
1. 文字間の空白の大きさを求める→ (表示範囲-文字数)/(文字数-1)
2. 空白を含めた文字数が決まるので、1文字目の開始位置が決まる
3. 表示。
>>315
大きな流れは解りました。
ABC 7は(7-3)/(3-1)=2だからA B Cと。
ABC 6ならば(6-3)/(3-1)≒1でA B Cということですね。
ABCD 6で(6-4)/(4-1)=2/3で1に満たないけれど両端に空白を
置く場合はどうしたらいいのでしょうか。 ABCD のように。
それと2の部分のもう少し細かい説明をお願いします。
317312:03/03/02 22:49
316==312です。
間違えてsageてました。
318デフォルトの名無しさん:03/03/03 15:04
こんな感じかな?
#include <stdio.h>
#include <stdlib.h>

void test(int n, char *s) {
int size = strlen(s);
int sp_size = (n - size) / (size - 1);
int side_sp = sp_size * (size - 1) + size < n-1;

printf("%d:", n);
if (n < strlen(s)) { puts("$"); return; }
if (side_sp) putchar(' ');
for (; *(s+1); s++) {
int i;
putchar(*s);
for (i = 0; i < sp_size; i++) putchar(' ');
}
putchar(*s);
if (side_sp) putchar(' ');
puts("$");
}

void main() {
int i;
char s[] = "ABCDF";

for (i = 0; i < 12; i++)
test(i, s);
}
0:$
1:$
2:$
3:$
4:$
5:ABCDF$
6:ABCDF$
7: ABCDF $
8: ABCDF $
9:A B C D F$
10:A B C D F$
11: A B C D F $
void main キタ━━━━━━━━━!!
ゴメン。
#include <stdio.h>
#include <string.h>

void test(int n, char *s) {
int size = strlen(s);
int sp_size = size <= 1 ? 0 : (n - size) / (size - 1);
int side_sp = (n - sp_size * (size - 1) - size) / 2;
int i;

printf("%d:", n);
if (n < size) { puts("$"); return; }
for (i = 0; i < side_sp; i++) putchar(' ');
for (; *(s+1); s++) {
putchar(*s);
for (i = 0; i < sp_size; i++) putchar(' ');
}
putchar(*s);
for (i = 0; i < side_sp; i++) putchar(' ');
puts("$");
}

int main(int argc, char *argv[]) {
int i;
char s[] = "ABCDEF";

for (i = 0; i < 12; i++)
test(i, s);
return 0;
}
ポイント先のデータを見るだけならconstを付けろ。これは命令だ。
>>322
黙れ。
constはいいよ。使えるよ。
char const *const *argv
argvイジる気もなければ
char const *const *const argv
>>324
はっきり言ってウザい。
>>325
char *strcpy(char *, const char *);
とかの意味わかった上で、そう言っているのか?
327デフォルトの名無しさん:03/03/03 21:43
>>321
char s[] = "" ;
char s[] = "A" ;
のときはどうなってしまうんですか。
strchrの第一引数の型がconst char *と決められているせいで、return時にキャストしなければならない。
キャストするくらいなら最初からchar *にしろYO!
>>328
? どういうこと? 意味がよく・・・
const引数にはconstしか渡せないって思い込んでいるんじゃ?
>>329
char *strchr(const char *s,int c)
{
for(;*s;s++)
if(*s==(char)c)
return (char *)s; /* ここ */
if(!c)
return (char *)s; /* ここ */

return NULL;
}
>>330
ハァ?
>>331
あーなるほど 
これは引数のconstを外すか戻り値にconstを付けないとだめだよね

でもこれって関数を作る側の意見だよね?
使う側ではあまり関係ないような気がする
334331:03/03/03 22:18
>>333
そう。使っているだけの時はなんとも思わなかった。
でも試しに自分で書いてみてすごく違和感があったので。
335334:03/03/03 22:19
もちろんライブラリは使う者が主体だからいいんだけどネ
なーにが「いいんだけどネ」だ。
ウゼー
337334:03/03/03 22:23
>>336
ごめんなさい(T_T)
>>328
バカ。char*だとconst char*を渡した時にエラーになるんだよ。
それにconst がついてるとコメントを書かなくても入力専用である事が利用者に伝わる。
まぁそもそもstrchrの返り値がポインタであること自体、今風にはダサいのだが。
340330:03/03/03 23:06
>>331
さっきはすまんかった。おまえが感じた違和感はまともだし、
キャストを使ったこのコードには>>333>>335みたいなのんきなことを
言っていられない危険がある。だが、引数のconstをはずすと今度は、
書き込み不可の文字列をstrchrするのにキャストが必要になる。
これも困る。

本当は、入出力ともconstのstrchrと、入出力ともそうでないstrchrが
作れればいい。C++では作れる。

ウゼーとか言うなよ。
341334:03/03/03 23:14
>>338
そうだ。const char *を与えたらエラーになるんだ。これは重大だ(^_^;)
俺が間違っていたスマソ

>>340
うん。分かった。
342334:03/03/03 23:15
今までは>>338の三行目の理由だけでconstにしていると思っていたのよ。
二行目は考えもしなかった・・・・
constイラネ
課題が全くわからないので、どなたかご教授おながいします(;´Д`)

ラインエディタを作成しなさい(メモリの動的確保、双方向リストを用いること)
必要な機能として
・ファイルの読み込み
・表示
・行の入れ替え
・行の削除
・行の挿入
・ファイルへの保存
これくらいなら7行で書けるかな。
誰かチャレンジゴー
>>344
C++でいいなら簡単にできるけど?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct line { char *str; struct line *prev, *next; } *start = NULL, *p;
char filename[1000];

void print(struct line *p, FILE *fp) { if (p) fprintf(fp, "%s", p->str); }
struct line *nline(int n) { for (p = start; --n && p; p = p->next) ; return p;}
int num(const char *s) { int n; sscanf(s, "%d", &n); return n; }

void del(const char *s) {
p = nline(num(s));
if (!p) return;
if (!p->prev && !p->next) start = NULL;
if (p->prev) p->prev->next = p->next;
if (p->next) p->next->prev = p->prev;
free(p->str); free(p);
}

void change(const char *s) {
int i, j; char *t; struct line *q;
sscanf(s, "%d %d", &i, &j);
p = nline(i); q = nline(j);
if (!p || !q) return;
t = p->str; p->str = q->str; q->str = t;
}

void delall(void) {
struct line *q;
for (p = start; p; p = q) { q = p->next; free(p->str); free(p); }
start = NULL;
}

void read(void) {
char buf[1000];
FILE *fp = fopen(filename, "r");
if (!fp) return;
delall();
for (; fgets(buf, sizeof buf, fp); p = p->next) {
struct line *q = malloc(sizeof(struct line));
if (!start) start = p = q;
q->str = malloc(strlen(buf)+1);
strcpy(q->str, buf);
q->prev = start == p ? NULL : p; p->next = q; q->next = NULL;
}
fclose(fp);
}

void write(void) {
FILE *fp = fopen(filename, "w");
if (!fp) return;
for (p = start; p; p = p->next) print(p, fp);
fclose(fp);
}
void insert(const char *s) {
char buf[1000];
struct line *q = nline(num(s));
if (!q) return;
printf("* ");
fgets(buf, sizeof buf, stdin);
p = malloc(sizeof(struct line));
p->str = malloc(strlen(buf)+1);
strcpy(p->str, buf);
p->prev = q->prev; p->next = q; q->prev = p;
if (p->prev) p->prev->next = p;
}

int main(int argc, char *argv[]) {
char buf[1000];
for (;;) {
printf("? ");
fgets(buf, sizeof buf, stdin);
switch (*buf) {
case 'r': sscanf(buf+1, "%s", filename); read(); break;
case 'v': print(nline(num(buf+1)), stdout);; break;
case 'c': change(buf+1); break;
case 'd': del(buf+1); break;
case 'i': insert(buf+1); break;
case 'w': write(); break;
case 'q': return 0;
}
}
}
ラインエディタとは違うかも。
上のだと双方向リストにする意味ないし。
書き直すわ。
351344:03/03/04 17:28
>>350
ありがとうございます。
こんなに早くレスもらえて嬉しいです。

>>346
C++だと教授に説明できないんです、、すいません。
_| ̄|_ ≡○
352デフォルトの名無しさん:03/03/04 19:09
>>350
> ラインエディタとは違うかも。
> 上のだと双方向リストにする意味ないし。
> 書き直すわ。
353デフォルトの名無しさん:03/03/04 19:10
7行の人早くやって!!
354アナルファッカ:03/03/04 19:13
sin関数を超初歩から解説してください
355デフォルトの名無しさん:03/03/04 19:16
SIN(3) Linux Programmer's Manual SIN(3)

名前
sin - 正弦(サイン)関数

書式
#include <math.h>

double sin(double x);

説明
sin() 関数は x の正弦(サイン)の値を返す。ここで、 x はラ
ジアン単位で与えられる。

返り値
sin() 関数は -1 と 1 の間の値を返す。

準拠
SVID 3, POSIX, BSD 4.3, ISO 9899

関連項目
acos(3), asin(3), atan(3), atan2(3), cos(3), tan(3)

June 8, 1993 1
サイン、コサイン、タンジェント!ナイスショット!
357アナルファッカ:03/03/04 19:17
マザファッカ
358アナルファッカ:03/03/04 19:31
なぜラジアン単位 度数*3.14/180の計算が必要なのか超初歩から解説してください
円の1周は、radianでは2π。 degreeでは360度。
なら
360 : 2π = deg : rad
360 * rad = 2π * deg
rad = π * deg / 180
>>353
あなたも七行の人ですが何か?
xがラジアンだとすると
(sin x)' = cos x, (cos x)' = -sin xになるから
マクローリン展開で求められます。
sin 0 = 0, cos 0 = 1.
sin x = 0 + x + 0*x^2/2! - x^3/3! - 0*x^4/4! + x^5/5! .....
>>358
高校に戻って数学やり直せ。ここで一から説明しているスペースも時間もない。
363アナルファッカ:03/03/05 00:02
>>362
中学数学だろブァカ
お前には将来が無い
ラジアンは中学で習わないよ
>>363
いや、ラジアンは高校数学だろ!!
高2で習ったね
一部の中学では高校の勉強を先取りするらしい。
>>367
さすがにラジアンまでは先取りしないだろ!!
相当昔だったりして。
>>369
戦前ですか?
紀元前
実はおとといだったり…
池沼は放っておけよヽ(´ー`)ノ
数学板に逝け
あと、いつ学ぶかは工業高校は大学の初歩程度まで一気にやるし
(数学できないと電気電子なんか授業にならないからな)
進学校は3年分を2年間でやったりと参考にならんぞ
ちなみに漏れはラジアンやSIN、COSは高校一年で習った
375デフォルトの名無しさん:03/03/05 10:29
俺の印象だと
sin、cos(度数):中学
sin、cos(ラジアン):高校文系
sin、cosの微分:高校理系
マクローリン展開、テイラー展開:大学初歩
マクローリン展開とかテイラー展開とかとsin、ラジアンで検索すれば
詳しく解説してるページあると思うけど。
>>361は符号が違いますよ。
sin x = 0 + x - 0*x^2/2! - x^3/3! + 0*x^4/4! + x^5/5! .....
で、Cで書くとこんな感じ。
double sin(double x) {
double s = 0, a = x; int n = 2;
do {
s += a;
a *= -1 * x * x / n / (n + 1);
n += 2;
} while (n < 20);
return s;
}
三角関数は普通は中学じゃやらねーよバーヤ
普通の高校(というのも曖昧だが)は高校二年で学ぶそうだ
10年前の話だそうだが

漏れは中学でsin,cos使ってた
プログラムやる奴はそんなもんだろ
理解してるかどうかは別として
>>377
んなこと言うと小学生でも三角関数知ってる奴とかもいるので問題外。
ここで言ってるのは教育機関でいつ習うかってことだろ。
>>374
普通科でも高校一年でやるけど・・・
380デフォルトの名無しさん:03/03/05 12:12
構造体はいくつかのデータ(変数)をひとまとまりにして扱うものであった。
それに対してクラスは、そのメンバとして変数と共に@も含めたものである。クラスのメンバ
として@を特にAと呼ぶ、構造体と同様にプログラム上でクラスを扱うためにはクラスの定義
だけでなく、クラスの実体を宣言する必要があり、この実体をBと呼ぶ。クラスのメンバは
外部から直接呼び出すことができるCメンバとAの中でしか呼び出すことができないDメンバとに
分かれる。一般に、データメンバはEとしてAはFとしておくのがよいとされる。
Aの中でも特別なものとしてGとHがある。GはBを作成するとき呼び出すもので
主にデータメンバの初期化を行う。またその関数名Iと決まっている。HはBを削除するときに
自動的に呼び出され、データの解放などを行うのに使われる。またその関数名はJと決まっている。
C++?

1 関数
2 メソッド
3 インスタンス
4 パブリック
5 プライベート
6 private
7 public
8 コンストラクタ
9 デストラクタ
10 はクラス名と同じものだ
11 クラス名の先頭に~をつけたものだ
382デフォルトの名無しさん:03/03/05 12:22
c++ッス。ちなみにこの問題は某専門学校のテストだったらしい・・・
基礎中の基礎って感じだけど。
こんな穴埋め問題じゃあまり役には立ちそうにないね。
6とか7はいけないだろ。
「変数だから」とか「関数だから」という理由で公開・非公開を決めるんじゃなくて、目的に応じて決めるべきだ。
385デフォルトの名無しさん:03/03/05 12:36
答でてるけど実は語群があったり・・・

--語句--
コンストラクタ デストラクタ オブジェクト 手続き 関数 変数 配列
ポインタ private public virtual ~クラス名 関数名 関数の型 メンバ関数
メンバ変数 仮想関数 

って…遅かった…
386381:03/03/05 12:39
メソッドってJavaか(鬱
間違ってはないんじゃない?
語群があると分からなくなる私は逝ってよしですか?
389デフォルトの名無しさん:03/03/05 13:49
結局、答は?
CMの後!
>>389
分かってるくせに。
392デフォルトの名無しさん:03/03/05 15:31
http://www.simhq.com/simhq3/sims/downloads/migalley/migalley.exe

このフライトシムのソースコードが出てますよ。
直リンは怖い!って人は
http://www.simhq.com/simhq3/sims/downloads/

からMIG ALLEYをクリック。
393344:03/03/05 18:14
>>350
書き直すとプログラム難しくなりますか?
できるだけシンプルなのがいいなと思いまして、、。
ヘタレな自分、、、鬱。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct line { char *str; struct line *prev, *next; } *start, *p, *pa;
char filename[1000];

void print(struct line *p, FILE *fp) { if (p) fprintf(fp, "%s", p->str); }

void change(const char *s) {
int n; sscanf(s, "%d", &n);
for (p = start; --n && p; p = p->next) ;
if (pa && p) { char *t = pa->str; pa->str = p->str; p->str = t; }
}

void connect(struct line *p, struct line *q) {
if (p) p->next = q; else start = q;
if (q) q->prev = p;
}

void del(void) {
if (!pa) return;
connect(pa->prev, pa->next);
p = pa->next ? pa->next : pa->prev ? pa->prev : start;
free(pa->str); free(pa);
pa = p;
}

void delall(void) {
for (p = start; p;) { struct line *q = p->next; free(p->str); free(p); p = q; }
start = NULL;
}
void makeline(struct line *p1, const char *s, struct line *p3) {
struct line *p2 = malloc(sizeof(struct line));
if (!p2) return;
p2->str = malloc(strlen(s)+1);
if (!p2->str) return;
strcpy(p2->str, s);
connect(p1, p2); connect(p2, p3);
}

void read(void) {
char buf[1000];
FILE *fp = fopen(filename, "r");
if (!fp) return;
delall();
for (p = NULL; fgets(buf, sizeof buf, fp); p = p ? p->next : start)
makeline(p, buf, NULL);
fclose(fp);
pa = start;
}

void write(void) {
FILE *fp = fopen(filename, "w");
if (!fp) return;
for (p = start; p; p = p->next) print(p, fp);
fclose(fp);
}
void insert(void) {
char buf[1000];
printf("* ");
fgets(buf, sizeof buf, stdin);
makeline(pa ? pa->prev : NULL, buf, pa);
}

int main(int argc, char *argv[]) {
char buf[1000];
start = pa = NULL;
for (;;) {
print(pa, stdout);
printf("? ");
fgets(buf, sizeof buf, stdin);
switch (*buf) {
case 'r': sscanf(buf+1, "%s", filename); read(); break;
case 'v': print(pa, stdout); break;
case 'n': if (pa && pa->next) pa = pa->next; break;
case 'p': if (pa && pa->prev) pa = pa->prev; break;
case 'c': change(buf+1); break;
case 'd': del(); break;
case 'i': insert(); break;
case 'w': write(); break;
case 'q': return 0;
}
}
}
397344:03/03/05 20:13
ありがとうございます!
理解できるように勉強してきます!
age
399デフォルトの名無しさん:03/03/11 01:13
いくら考えても分からないので、どうかご教授おねがいします。

入力として文字列一つを受け取り、その部分文字列すべてを短い順に出力する
プログラムをC言語を用いて作れ。文字列は引数で与え、プログラムからは
main(int argc, char *argv[])関数の引数argv[1]として利用せよ。
整数変数をmain関数の行数だけ用意して、完成したプログラムのすべての箇所で
実行時の通過回数を数えるカウンタとして使い、計算が終わったあとに最も
通過回数の多かった箇所の回数と、文字列の長さを印字するようにせよ。
例:入力がabcdeだったときの出力は

文字列の長さは5
a
b
c
d
e
ab
bc
cd
de
abc
bcd
cde
abcd
bcde
abcde
(通過回数はわからなかったので省略しました)


>>399 てきとーだけど、
#include <stdio.h>
#include <string.h>

int checkstr(int len, char *argv, char *str)
{
  int i;
  if(len > (int)strlen(argv)) return 0;

  str[0] = argv[0];

  for(i=1;i<len;i++) {
    if(argv[i-1] < argv[i]) str[i] = argv[i];
    else return 0;
  }
  return 1;
}
int main(int argc, char *argv[])
{
  int i,j,count,len;
  char str[256];

  count=strlen(argv[1]);
  
  for(i=0,len=1;i<count;i++,len++) {
    memset(str, 0, sizeof(str));

    for(j=0;j<count;j++) {
      if(checkstr(len, &argv[1][j], str))
        printf("%s\n", str);
    }
  }
  
  return 0;
}
>整数変数をmain関数の行数だけ用意
?あーよくわからん・・・
checkstrは>>399氏のものをそのまま。
本当にコレでいいかは知らない。

int printlinecount(int *lines, int size)
{
int maxvalue = 0;
for(int i=0;i<15;i++)
maxvalue = maxvalue > lines[i] ? maxvalue : lines[i];
printf("%d回", maxvalue);
}

int main(int argc, char *argv[])
{
int i,j,count,len,line[15]={0}; line[0]++;
line[1]++; char str[256]; line[1]++;
line[2]++;
line[3]++; count=strlen(argv[1]);
line[4]++; printf("文字列の長さは%d", count);
line[5]++; for(i=0,len=1;i<count;i++,len++) {
line[6]++; memset(str, 0, sizeof(str));
line[7]++;
line[8]++; for(j=0;j<count;j++) {
line[9]++; if(checkstr(len, &argv[1][j], str))
line[10]++; printf("%s\n", str);
line[11]++; }
line[12]++; }
line[13]++;
line[14]++; printlinecount(line, 15); return 0;
}
-line[9]++; if(checkstr(len, &argv[1][j], str))
-line[10]++; printf("%s\n", str);

+line[9]++; if(checkstr(len, &argv[1][j], str)) {
+line[10]++; printf("%s\n", str); }
405399:03/03/11 04:51
>>400->>404さんレスありがとうございますm(__)m
main関数の行数分の整数変数は、文字列の長さと最大通過回数の関係から
最悪時間計算量を見積もるためのものかと思ったんですが、無知な私が考えたことなので
違っているかもしれません(;´Д`)
C言語だけでなくアルゴリズムのほうも勉強し直してきます。
それから、レスが遅くなってしまい申し訳ありませんでした。
こんな変な問題出さずにプロファイラの使い方教えれよな…
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
int count = strlen(argv[1]);
int n; char *s, *t;
for (n = 0; n < count; n++)
for (s = argv[1]; *(s+n); s++) {
for (t = s; t < s+n+1; t++)
putchar(*t);
putchar('\n');
}
return 0;
}
408デフォルトの名無しさん:03/03/15 14:39
誰か僕に宿題を出してください。
>>408
「2ch をやめて、まっとうな生活に戻れ。」

これが、お前の宿題だ。
努力します。
>>410
してねーじゃん。(藁
>>408
これ使って何か具体的なプログラムを書け。
int (*(*(*array(int, int (*)[4]))[3])[2])(int, int (*)[4]);
>>412
そういうのは読めれば十分だ。
それを実際に使う力を身につけさせるような事はむしろすべきじゃない。
>>413
禿同。読める必要はあるけど、書ける必要はない。
素直に、typedef 使え。
むしろ書けない必要がある。
読めないんですけど(;;)

array(int , int(*)[4]) ってなに?関数じゃないでしょ?
array()(int, int(*)[4]) もわけわからない(;;)
解説お願いしますー
// array(int , int(*)[4])
typedef int int4array[4];
typedef int4array *pint4array;
int array1(int , pint4array);

// array()(int, int(*)[4])
typedef int int4array[4];
typedef int4array *pint4array;
typedef int (*func_of_return)(int , pint4array);
func_of_return array2(void);
これ以上はもういや(w。誰か続きやって。

int (*(*array(int i))[2])(int);

int func(int i)
{
return i;
}

int (*(*array(int i))[2])(int)
{
static int (*ptr[2])(int) = {func, func};

printf("parameter = %d\n", i);
return &ptr;
}

int main(void)
{
printf("array() = %d, %d\n", (*(*array(0))[0])(123), (*(*array(1))[1])(456));
return 0;
}
>418
やるなよw
420416:03/03/17 09:55
>>417 >>418
関数ポインタだったんですね……
あまり、関数ポインタ使わないので解らなかったです。
ありがとうございました。
違う違う、>>412は関数宣言

int (*(*(*array(int i, int (*x)[4]))[3])[2])(int, int (*)[4]){
return (int (*(*(*)[3])[2])(int, int (*)[4]))0;
}

main(){
int x[3][4] ;
array(0,x);
}
こんな風に読めましたがあってますか?
array is function with parameter(int, int(*)[4]) returning pointer to array[3] of pointer to array[2] of pointer to int

arrayは(int, int(*)[4])をパラメータに取り、intへの大きさ2のポインタ配列の大きさ3の
ポインタ配列を返す、と読めます。
ポインタ配列のポインタ配列を返す具体的なプログラムか。初めてだなこんなの。
arrayは(int, int(*)[4])をパラメータに取り、intへの大きさ2のポインタ配列の大きさ3の
ポインタ配列を返す関数、 だったスマソ。
Int i=3;
cout<<i**i;

これが18を出力するようなoperatorを定義してください。
class Int {
public:
  Int(int i) {};
  int operator *() { return 0; }
  int operator *(int i) { return 18; }
};
その問題は一体何なんだ?
漏れも 425 のような答えしか思いつかない・・・。
>>426
このスレが寂しそうなのでこっそりあほな問題だしてみた
425正解


f(o^_^o)(o^_^o)(o^_^o)(o^_^o);

これをコンパイルが通るように適当に何かを定義してください。コメントアウトは不可で。
くそっ。
べき乗じゃないのかよ。

真面目に考えてソース書いた瞬間ネタだと分かった・・・。
void f3(int i) { printf("f3(%d)\n", i); }
functype1 f2(int i) { printf("f2(%d)\n", i); return f3; }
functype2 f1(int i) { printf("f1(%d)\n", i); return f2; }
functype3 f(int i) { printf("f(%d)\n", i); return f1; }
int main()
{
int o = 1, _ = 2;
f(o^_^o)(o^_^o)(o^_^o)(o^_^o);
return 0;
}
>>428
べき乗でもどうやるか想像つかない漏れは逝ってヨシですか?

てなわけでうpきぼんぬ
431428:03/03/18 00:23
>>430
俺にわざわざ恥を晒せと?
まぁいいや。gcc 3.2で確認した。

#include <iostream>
struct Int {
 struct Tag { int num; Tag (int i) : num(i) {} };
 int num; Int (int i) : num(i) {}
 Tag operator* () { return Tag(num); }
 Int operator* (Tag t) {
  int ret = 1;
  for (int i = 0; i < t.num; ++i) { ret = ret * num; }
  return Int(ret);
 }
};
std::ostream& operator<< (std::ostream& o, Int i) { return o << i.num; }
int main () { Int i = 3; std::cout << i**i << std::endl; }
>>429
早いですねー
ちなみに別回答です
struct foo
{ foo &operator()(int) { return *this; } };
int o,_; foo f;
f(o^_^o)(o^_^o)(o^_^o)(o^_^o);


3[o . o]/~bye;
これをコンパイルが通るように適当に何かを定義してください。コメントアウトは不可で。
ちなみにこれはさよならをしている耳のついたロボットです。AA初挑戦
C では o . o の消化が無理ぽ
と思ったらできないでもなかった。
int main()
{
struct { char *o; } o = { "12345" };
int bye = 1;
3[o . o]/~bye;
return 0;
}
おもろないから出力つけた。
int main()
{
struct { char *o; } o = { "12345" };
int bye = 1, ans =
3[o . o]/~bye;
printf("%d\n", ans)%3
化けた 。・゚・(ノД`)・゚・。
>>434-
正解! こんなくだらないことに付き合ってくれてありがとう! 
もう終わりにします。

A_____A
< 3 , 3 >
( o ) < "ありがとー";
>>437
template <int a, int b> char *A_____A(int c){return 0;}
int main(void)
{
int o=
A_____A
< 3 , 3 >
( o ) < "ありがとー";
printf("o=%d\n", o);
return 0;
}
>>438
正解!!
終わってなかったかんい
\e
SSTP かよ!!
EOF
KOF
おまえら暇なら何か宿題を捏造しろ!
>>445
汎用GUIライブラリを作成しなさい。
>>445
浣腸の最大効果が得られる挿入角度、深度を計算する
専用BENPIライブラリを作成しなさい。
449デフォルトの名無しさん:03/03/22 05:38
宿題募集
451デフォルトの名無しさん:03/03/23 00:17
文字列 s をその場所で逆順にする関数
reverse(s) の再帰版を書けっていう
k&r の演習なんですけどお願いします
452..:03/03/23 00:17
★あなたのお悩み解決致します!!
●浮気素行調査
彼氏、彼女、妻、夫の浮気を調査致します!!
●盗聴器盗撮機発見
あなたの部屋に誰かが仕掛けているかも!!
●行方調査
行方不明になっている家族の消息を調査致します!!
●電話番号から住所割り出し
一般電話、携帯から住所を割り出し致します!!
●ストーカー対策
社会問題ともなっているストーカーを撃退致します!!
その他人生相談からどんなお悩みでも解決いたします!!
 直通  090−8505−3086
URL  http://www.h5.dion.ne.jp/~grobal/
メール  [email protected]
   グローバル探偵事務局 
>>451
こんなのはどうだ。

char *reverse(char *str)
{
char *p;
char c1, c2;

if (strlen(str) < 2) return str;
p = str + strlen(str) - 1;
c1 = *str, c2 = *p;
*p = '\0';
reverse(str + 1);
*p = c1;
*(p + 1) = '\0';
*str = c2;
return str;
}
454デフォルトの名無しさん:03/03/23 01:23
>>453
(・∀・)イイ!!

で質問なんですが

*(p + 1) = '\0';

この一行って必要なんでしょうか?
>>454
そう言われてみれば不要かも。急いで作ったので削っておいてくれ。
>>455
更に、*str は再帰したルーチンでは触らないので c1 へ退避は不要。

char *reverse(char *str)
{
 char *p;
 char c2;

 if (strlen(str) < 2) return str;
 p = str + strlen(str) - 1;
 c2 = *p;
 *p = '\0';
 reverse(str + 1);
 *p = *str;
 *str = c2;
 return str;
}
>>456
なるほどいただきます。
漏れも適当に組み。
遊びにはいいけど、実用にはならない・・。
// 文字列 src を逆転して dst に複写します
char *reverse_recursive( char *dst, char *src) {
 char c = *src;
 if( c ) {
  *(dst = reverse_recursive( dst, src+1)) = c;
  return ++dst;
 }
 return dst;
}
char *reverse( char *s) {
 if( s ) reverse_recursive( s, s);
 return s;
}
void reverse(char *s) {
char *t = s;
for (; *t; t++) ;
for (t--; s < t; s++, t--) {
char c = *s;
*s = *t;
*t = c;
}
}
460459:03/03/23 13:10
再帰版か。
461459:03/03/23 13:18
void reverse(char *s) {
char c = *s;
if (!c) return;
reverse(s+1);
for (; *(s+1); s++)
*s = *(s+1);
*s = c;
}
>>461
俺も最初はそれを考えたが、文字列全体をシフトするので著しく
効率が悪くなりそうでやめた。
void reverse(char *s) {
char *t = s + strlen(s);
if (s+2 > t) return;
*t = *s;
*s = *(t-1);
*(t-1) = '\0';
reverse(s+1);
*(t-1) = *t;
*t = '\0';
}
>>463
char s[1];
s[0] = '\0';
reverse(s);

ってやった時に破綻する可能性があるぞ。
if (s+2 > s) return;
>>465
単なる typo なのか、本当のアフォなのか判断に迷うレスすんなよ。(藁
void reverse(char *s) {
char *t = s + strlen(s) - 1;
if (s+2 > t) return;
if (s+4 > t) {
char c = *s;
*s = *t;
*t = c;
return;
}
*(t+1) = *t;
*t = '\0';
reverse(s+1);
*t = *s;
*s = *++t;
*t = '\0';
}
468デフォルトの名無しさん:03/03/24 23:27
すいませんが
printf("printf("in the file \"%s\".\n",);\n");
というように表示したいのですがどうすればいいのでしょうか
厨な質問ですいません
fputs("printf(\"printf(\"in the file \\\"%s\\\".\\n\",);\\n\");", stdout);
470デフォルトの名無しさん:03/03/25 00:14
\%s
471デフォルトの名無しさん:03/03/25 01:42
%%s
>>468
そう書いたファイルを読みとって表示。
fputs に % のエスケープは要らん。
#define STR(s) (#s)
fputs( STR(printf("printf("in the file \"%s\".\n",);\n");), stdout );

...みにくい
475宿題アリコ:03/03/28 08:57
[JAVA]JAVAの宿題・課題は俺に任せろ のすれに宿題のせたん
デスケド,誰も任されてくれないので、俺に任せろと思っちゃった
人はぜひ任されちゃってください・・

ピンチなんで助けてくれるとかなりうれしーです、お願いします。

http://pc2.2ch.net/test/read.cgi/tech/1047538922/
>>475
このスレに書いたということはCとかC++とかで解けってこと?
どの問題かわからないなw
478宿題アリコ:03/03/29 00:15
いえ・・あの・・1さんが最近はJAVAもやっているといったので・
やっぱりすれ違いなのですね・・・逝ってきます・・

>>477エレベータの問題です。宿題アリコのは全部それ関係です。
もしよろしかったら、助けてくださいな。
479にやこう ◆Es3JBt9s5c :03/03/29 00:46
(・∀・)ニヤニヤ 
どんな型でも使える二次元配列の動的確保と開放のコードをおながいします。
Cで。
#define MATRIX_ALLOC(t, x, y) (t(*)[y])malloc(sizeof(t) * x * y)

char (p*)[3] = MATRIX_ALLOC(char, 5, 3);
...
free(p);
void reverse( char *pt, int len )
{
char ch;

if( 1 >= len )
return;

len--;

ch = *pt;
*pt = *(pt+len);
*(pt+len) = ch;

pt++;
len--;

reverse( pt, len );
}


strlenが何度も呼ばれるのが気に入らない版
引数が増えて鬱だったらマクロでもかませ

最後のポインタもってた方がいいんじゃない?
void reverse(char *pt, char *last) {
char ch;
if (pt <= last) return;
ch = *pt;
*pt = *last;
*last = ch;
reverse(++pt, --last);
妥当な題材とは思えない・・・。
再帰が適するのは、それによって記述が簡単になる場合だよな?

void reverse(char *p)
{
char *t = p;
if(!*t) return;
while(*++t);
t--;
while(p < t)
{
char c = *p;
*p++ = *t;
*t-- = c;
}
}
>>481
そのマクロだと列のサイズが固定じゃないと使えないと思うんだけど。
>>485
配列だからいいんじゃないの?
春休み中で宿題が少ないので宿題を作ってみました。
暇ならやってみてください。
Compilable Ascii Artです。(適当に命名)

A_____A
[(o) (o)]
()
()
()
()()()()() = 3;

これをコンパイルが通るように適当に何かを定義してください。コメントアウトは不可で。
class X;
class X
{
public:
X operator=(int i) {}
X operator[](int i) { return *this; }
X operator()() { return *this; }
};
class Y;
class Y
{
public:
int operator()(Y) { return 0; }
};

Y o;
X A_____A[1];
1を2倍していってそれに4桁づつ単位をつけて出力するつまり2^nを計算して4桁ずつ出力するプログラムを作りたいんですが

include<stdio.h>
main()
{
int n,i,t=0;
int a[50];
a[0]=1;
n=かける回数;

scanf("%d",&n)
for(i=0;i<50;i++){
for(t=0;t<50;t++){
a[t]=a[t]*2;
}
for(t=0;t<50;t++){
while(a[t]>9999){
a[t]=a[t]-10000;
a[t+1]++;
        }
}
}
if(a[49]>0) printf("%d 単位49",a[49]);
          ・
          ・
          ・
if(a[2]>0) printf("%d 億",a[2]);
if(a[1]>0) printf("%d 万",a[1]);
if(a[0]>0) printf("%d ",a[0]);
}
でいいんですかね、なんか無駄が多い気がするんですがこれ以外思いつかなくて
というか一気に2^nを計算するとオーバーフローするので困ってこんなのになりました
#include <stdio.h>

int main(int argc, char *argv[]) {
int n, i;
int a[50];

for (i = 0; i < 50; i++)
a[i] = 0;
a[0] = 1;
scanf("%d", &n);
for (; n > 0; n--) {
for (i = 0; i < 50; i++)
a[i] *= 2;
for (i = 0; i < 49; i++)
while (a[i] > 9999) {
a[i] -= 10000;
a[i+1]++;
}
}
for (i = 49; i >= 0; i--)
printf("%d 単位%d ", a[i], i);
return 0;
}
>>489
計算方法自体は結構まとも。
ただし、実用化するなら、実装は関数にした方がいい。
データも、生の int の配列よりも、struct や typedef で名前付けし、実装は隠蔽
した方がいい。
それにより、固定長だけではなく、malloc() を駆使して可変長も実装できる。
C++ であれば class にするべき。

出力ロジックが冗長なのは、桁名を配列にすれば解決する。
void PrintNumber(int Num[], int size)
{
  const char * const ColNames[] = { "", "万", "億", "兆", "京", "垓", "穰", "溝", "澗", "正", "載", "極", "恒河沙", "阿僧祇", "那由他", "不可思議", "無量大数" };
  const int NumOfColNames = sizeof(ColNames) / sizeof(const char *);
  char *s = "";
  int i;
  for(i = size - 1; i > 0; i--)
    if(Num[i]) break;
  if(i < 0)
    { puts("0"); return; }
  for(; i >= NumOfColNames; i--)
    if(Num[i]) { printf("%s%d単位%d", s, Num[i], i); s = " "; }
  for(; i >= 0; i--)
    if(Num[i]) { printf("%s%d%s", s, Num[i], ColNames[i]); s = " "; }
  putchar('\n');
}
>   if(i < 0)
>     { puts("0"); return; }

これ要らなかった。
>   for(i = size - 1; i > 0; i--)
>     if(Num[i]) break;

これも要らなかった。
代わりに、

>   for(; i >= NumOfColNames; i--)

ではなく

  for(i = size - 1; i >= NumOfColNames; i--)
for(i=0;i<50;i++){
これがおかしい。
>>491
おれっちの流儀では、垓の次に「じょ(漢字が表せないもの)」を入れるのだが、
それに対応するようにフラグをいれてほしいなぁ。
496489:03/04/02 05:14
≫490ー≫494さん 有り難うございます。教科書片手に理解します
っていうか、C++だったら多桁演算クラスがあるべさ。
機種依存の話になって申し訳ないのですが、
DOSでいうコンソールというものがよく分かりません。
コンソールとは一体何でしょうか?
ストリームの標準入力とどう違うのでしょうか?
ププ
DOSでいうコンソールはWin9xで言うDOSプロンプトだと思えばそんなに間違いじゃありません。
>>498
ストリームは入出力デバイスを規定しない。
コンソールは入出力にディスプレイとキーボードが規定される。
コンソールはマシン直付けの操作装置。
インタフェースの種類は関係ない。
コンソールはマシン直付けの操作装置。
インタフェースの種類は関係ない。
コンソール→慰める
コンドーム→薄ければよい。
コンビーフ→(゚д゚)ウマ-
コンビーフの缶がなんであんな形をしているかというとですね(AA略
コンサート→5/10に入場無料でやるから聴きに来てくれ。
509デフォルトの名無しさん:03/04/11 01:53
すいません、誰かこのプログラム教えてください。
初心者には再帰が難しくて。

typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
};

上のリストのセルがelementとして整数1500を
含んでいるなら1を返し
含んでいないなら0を返す
LIST型の引数をもつ再帰的関数を教えてください。
どうかお願いします
int has1500( LIST p )
{
if( !p ) return 0;
if( p->element == 1500 ) return 1;
return is1500( p->next);
}
>>509
マルチ氏ね
6000行2列のデータファイルがありました。スペース区切りです。
2つのファイルを読み込み、同じ要素のところの比を求めます。
その結果を新たなファイルに出力させるプログラムをつくりなさい
とのことでした。
 ̄ ̄ ̄ ̄ ̄ ̄ ̄○ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
           O 。
                 , ─ヽ
________    /,/\ヾ\   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
|__|__|__|_   __((´∀`\ )< というお話だったのさ
|_|__|__|__ /ノへゝ/'''  )ヽ  \_________
||__|        | | \´-`) / 丿/
|_|_| 从.从从  | \__ ̄ ̄⊂|丿/
|__|| 从人人从. | /\__/::::::|||
|_|_|///ヽヾ\  /   ::::::::::::ゝ/||
────────(~〜ヽ::::::::::::|/        = 完 =
>>512
マルチ氏ね氏ね氏ね氏ね
氏ね氏ね氏ね氏ね氏ね
515デフォルトの名無しさん:03/04/11 18:28
協力おながいしまつ。

【問題】
5桁の整数を入力し、それを各桁ごとに分解し、
間に3個ずつ空白をあけてプリントするプログラムを書け。
たとえば、ユーザが 42339 とタイプしたら、次のようにプリントする。

出力: 4___2___3___3___9 (_はスペース)

【ここまで】

これはピアソンから出てる『C言語プログラミング(H.M.ダイテル著)』の
第2章30問目の練習問題なのですが、これは第2章までの技法で可能なのでしょうか?
もしこの本を持ってる方がいたら教えてください。(;´д`)
for (i = 10000; i > 0; i /= 10) {
printf("%d", n % i);
}
int has1500( LIST p )
{
return p ? p->element == 1500 ? 1 : has1500(p->next) : 0;
}
518きふぉ:03/04/11 20:14
>514
市ね死ね紙ね氏ね言うな!
>>518
氏ねと言われたくなかったら言われるようなこと書くなよ( ´,_ゝ`)
520509:03/04/12 00:54
>511,514
すいませんでした。
以後気をつけます。
>>516
それだと逆にならないか?
それにスペース(ry
>516のは 42339 を入れたと考えると、
2339 339 39 9
と言う風に表示されないか?
(わかりやすくなるようにスペース入れた)
>>522
そうだな、もう一つ変数が欲しい。
>>523
/ (i / 10) を付ければよいのでは?
(n/i)%10
かな
526525:03/04/12 02:00
上位の桁にゼロが続く場合に表示しないようにする必要はある。
別に入力は文字列なんだから、
%10とか要らない気がするけど、、
はっ、文字列かっ
寝よっw
529遅レスだが...:03/04/12 05:38
/*文字列反転関数(再帰版)*/
char *Reverse(char *s){
char *t=s,tmp;
static char *s0=NULL;
 if(s0==NULL)
  s0=s;
 if(*t==0)
  return s0;
 while(*t)
  t++;
 t--;
 tmp=*s;
 *s=*t;
 *t=0;
 if(*(s+1))
  s0=Reverse(s+1);
 *t=tmp;
 return s0;
}
単に非効率なだけなので実際には使わないで!
530529:03/04/12 05:52
致命的なバグを発見しました。当てて下さい。
一文字しかないときに消してしまう。つまり反転しない。
あと一度しかつかえない。
532デフォルトの名無しさん:03/04/12 15:54
C言語でストップウォッチのプログラムを作っています。
1/100秒まで表示させないといけないのですが、
time関数を使ってやると1/100秒まで表示させることが出来ません。
1/100秒まで表示する方法(関数)を教えてください。
>>532
Win32ならtimeGetTime()。
534デフォルトの名無しさん:03/04/12 16:52
毎秒n回の処理を行うというプログラムを作りたいのですが
どうすればよいでしょうか?
例えば、パケットを100Kbpsで送信し続けたい場合などです。
誰か教えてください。
535532:03/04/12 17:00
>>533
お返事ありがとうございました。
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<mmsystem.h>
#include<conio.h>

#define CLS printf("\x1b[2J")

void main(void)
{
double t1,t2,t3=0;
t1 = timeGetTime();
while(!kbhit()){
t2 = timeGetTime();
if (t3 != (t2-t1)){
t3=t2-t1;
CLS;
printf("%f",t3);
}
}
}
と作ってVC++6.0でコンパイルしてみました。
しかし、
time.obj : error LNK2001: 外部シンボル "__imp__timeGetTime@0" は未解決です
Debug/time.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー
と2つのエラーが出てしまいました。
timeGetTimeの使い方自体が間違っているのでしょうか?
>>535
インポートライブラリ、という言葉を知っているか?
>>530
??1文字の時も正しく動くぞ。あと一回しか使えないというのは回避は簡単
/*文字列反転関数(再帰版)*/
char *Reverse(char *s){
char *t=s,tmp,first=0;
static char *s0=NULL;
 if(s0==NULL){
  s0=s;
  first=1;
 }
 if(*t==0)
  return s0;
 while(*t)
  t++;
 t--;
 tmp=*s;
 *s=*t;
 *t=0;
 if(*(s+1))
  s0=Reverse(s+1);
 *t=tmp;
 t=s0;
 if(first)
  s0=NULL;
 return t;
}
538532:03/04/12 17:24
>>536
初めて聞きました。
検索したら WindowsでDLLを利用するために必要な情報を記述するライブラリ。
と書かれていましたが・・・
>>538
つーかtimeGetTime()の返り値をdoubleに代入している当たりも
激しく気になる。
>>538
winmm.lib をリンクライブラリに含めろ。
>>535 #pragma comment(lib,"winmm")を書くとたぶんできますよ。
漏れは機種依存の宿題(?)が出ていることに驚いた。
>>542
自分自身に宿題を出せばどんな問題もありえる
C言語のgetcharやscanfは何らかの文字が入力されるまで
プロセスはsleep状態になりますが、
これにタイムアウトを設けることはできるでしょうか?
例えば、とりあえず文字が入力されるまで待ち続けるんだけど、
ある程度時間が経っても、文字が入力されなかったら待つのをやめて、
次の処理へ移行するといったことはできるのでしょうか?
>>544
微妙なマルチやめれ。
>>544
> C言語のgetcharやscanfは何らかの文字が入力されるまで
> プロセスはsleep状態になりますが、

ここから間違い。処理系によってはそうなるとは限らない。

> これにタイムアウトを設けることはできるでしょうか?

できない。

> 例えば、とりあえず文字が入力されるまで待ち続けるんだけど、
> ある程度時間が経っても、文字が入力されなかったら待つのをやめて、
> 次の処理へ移行するといったことはできるのでしょうか?

処理系によるから、処理系を書かないと誰も答えられない。
出来るよ
548532:03/04/14 00:06
1/100秒の表示できました。
協力してくださった方々どうもありがとうございます。
>>548
ご褒美は何?
550544:03/04/14 12:20
>>545
私はここだけにしか書き込んでませんよ。

>>546
スリープ状態になるとは限らなかったんですか、知りませんでした。
できるだけ汎用性のあるプログラムを書きたいので
処理系によるなどの制限があるのならば
この方法は取りやめることにします。
>>544
「スリープ」状態を誤解している気がする。
いずれにしても、先行入力の問題など考慮しないといけない。
ユーザフレンドリに作ろうとしたら、汎用性は犠牲にしないとね。
552デフォルトの名無しさん:03/04/15 05:33
typedef struct CELL *LIST;
struct CELL {
int element;
LIST next;
};
これを用いて
整数のリストを引数とする
再帰的な選択ソートのプログラムを教えてくれませんか?

C言語なら俺に開け! Part 〈54〉で間違って書き込んでしまったので
改めてこちらで。
553デフォルトの名無しさん:03/04/15 06:20
10進数を2進数に直す
再帰的アルゴリズムを教えてください
>>553
私の質問のレスが来てから答えます。

10進数を2進数に直す
再帰的アルゴリズムを教えてください
>>554
私の質問のレスが来てから答えます。

10進数を2進数に直す
再帰的アルゴリズムを教えてください
>>555
私の質問のレスが来てから答えます。

10進数を3進数に直す
再帰的アルゴリズムを教えてください
直すってのが表示すればいいって意味なら
>>553
void print(int n) {
if (n == 0) return;
print(n >> 1);
putchar(n & 1 ? '1' : '0');
}
>>556
void print(int n) {
if (n == 0) return;
print(n / 3);
putchar('0' + n % 3);
}
10進数を2進数に直すアルゴリズムを教えて下さい。(数)
//>>555-556お洒落が解らない>>557は無視する
>>558
数が0だったら0をレス、そうでない場合は私の質問のレスが来てから
答えます。
10進数を2進数に直す再帰的アルゴリズム教えて下さい。(数/2)
偶数だったら0,奇数だったら1をレスする。
>>558
君さぁ、どうでもいいけど
全角数字やめろよ。
それと、文章が理論的に展開してないんだよ。
そんなんでプログラム書けるのか?
10進数を2進数にする再帰的アルゴリズム?
なんだそりゃ?
要するに、atoi()の再帰版だろ
>>556
私の質問のレスが来てから答えます。

10進数を3進数に直す
再帰的アルゴリズムを教えてください
563デフォルトの名無しさん:03/04/15 18:00
if ($PL_VALUES[12] != 6){$PL_VALUES[12]='6' if ($FORM{'mode'} ==1 &&
rand(255) > 253 && $NT_START==1) || (rand(255) > 253 && $NT_START==2) ||
(rand(255) > 253 && $NT_START==2) || (rand(500) == 1 &&
$NT_START==3);}else{$PL_VALUES[12]="$VS_VALUES[12]" if ($FORM{'mode'} !=1 &&
rand(255) > 200 && $NT_END==1) || (rand(255) > 253 && $NT_END==2) ||
(rand(255) > 253 && $NT_END==2) || (rand(500) == 1 && $N

あるオンラインゲームのものです。
私は全く機械語(?)がわかりません。
「もし、PLの値が12だったら、びっくりして6・・・???」
↑頭のなか↑って感じです。
どういうことを言っているのか簡単で良いので、
解読してくれませんか?
perlっぽい
>563
ヲイ。ここを何のスレだかわかってるんだろうな?
機械語?ふざけんな。
本当にわからないなら来るな。
釣りでやってんならよそへいけ。
566563:03/04/15 18:37
>>565
よそへいきます。
きたねーコードだな。
いったいどんなゲームだよ。

それは、C++じゃなくてCだ。
でも、くだ質あたりに行け。
>きたねーコードだな。
>いったいどんなゲームだよ。

>それは、C++じゃなくてCだ。
突込み所満載だな。
アルゴリズム ←対義語→ ナシゴレン
ROだろ
Perlで書かれた自動マクロツールがあるとか
>>563
見覚えあるなぁ、そのコード。
>>571
お前のかっ!

>>563
お前抜いたのかっ!?
なんの話やら、さぱーりわからんですよ。
初歩的な課題なんですが、どうしてもわからないので助力お願いしますm(__)m
カレンダー作成
入力はfgets関数、月入力時にRが入力されたら西暦入力に戻る
西暦・月入力時、Eが入力されたらプログラムを終了する
カレンダーを出力中に
Aが入力されたら西暦の入力処理に戻る
Bが入力されたら翌月を表示する
Cが入力されたら前月を表示する
>>574
プログラムのあらすじはわかるのか?
わからないなら、まずはフローチャートでも書いて考えろ。
>>575
あらすじは、理解しているつもりです。
それをプログラムにするのが難しく悩んでいます。
カレンダーを表示するだけで精一杯です。
>>574
もちろん、お約束としてエラーチェックはないよ。
とりあえずフローはこんなもんかな。
PrintCalendar(int, int); は自分で考えてね。

static char GetNumber(const char Prompt[], int *Number){
 char Buffer[...];
 printf("%s: ", Prompt); fgets(Buffer, sizeof Buffer, stdin);
 if(Number != 0){ *Number = atoi(Buffer); }
 return Buffer[0];
}

int Year, Month, Command;
while(GetNumber("西暦", &Year) != 'E'){
 if(GetNumber("月", &Month) == 'R'){ continue; }
 do {
  PrintCanlendar(Year, Month);
  Command = GetNumber("Command", 0);
  switch(Command){
  case 'A': break;
  case 'B':
   Month++;
   if(12 < Month){ Year++; Month = 1; }
   break;
  case 'C':
   Month--;
   if(Month < 1){ Year--; Month = 12; }
   break;
  default: printf("??\n");
  }
 } while(Command != 'A');
}
>>577
ありがとうございます。
書いてくださったプログラムを参考にし、改めて自分で考え直してみます。
>>577
なんか、綺麗なプログラムですね。
質問者じゃないけど、とても勉強になりました。
引数の渡しかたとか、関数の感じとかお手本になります。
個人的には、ポインタはNULLと比較してほしい。
>>579
> なんか、綺麗なプログラムですね。

ありがと。
VB みたいに途中脱出 (Do 〜 Exit Do 〜 Loop) の構文があれば、関数は定義する必要ないんだけど、C/C++ だとこれがまずまず綺麗に書ける方法だと思う。
(無理矢理、カンマ演算子を使うと言う手もあるが、あまり美しくないし。

>>580
ごめんね。C++ のつもりで書いてるのと、俺 NULL より 0 派だから。
582デフォルトの名無しさん:03/04/17 04:31
nの2乗を計算する再帰的関数を教えてください
(n+1)^2 = n^2 + 2*n + 1
プログラムなんて作ったことのない超初心者です。
音声波形を画面上に表示するプログラムを作れという宿題が出たのですが
全然わからなくて途方にくれております。
教えてください。よろしくお願いします。
また参考になるページなど知っている方はそのアドレスも教えていただけると
ありがたいです。
言語はC++でお願いします。
超初心者でc++って…
>585
教授がC++でつくれと・・・
ゴールデンウイーク明けまでに作らないといけないので
自分でも勉強をはじめているのですが・・・
それは数値データが渡されてグラフ化するみたいなもんなの?
どういう入力と出力なのか書かないと誰もできないと思うよ。
>587
えーとwaveファイルの音声波形を表示するみたいなんですけど
オシロスコープのようなもんを作れとのことです。
これで質問に答えられているか不安ですが
答えになってない
>>588
Winampでいいんじゃねーか?
プログラムの事をなにもわからない状態から、
目的のものを作るのは、かなり困難だと思うぞ。

俺は、音声ファイルとかよくわからんが、
要するに、wavファイルからの入力をフーリエ級数展開してやって
その結果を使って画面にグラフを書くんかいな。

とすると、wavファイルのサンプリングレートとか、
Windowsでやるのか、Linuxでやるのかとか、
コンパイラは何を使うのかとか、そういう情報がまず必要だろう。
まったくもって具体的な方法やデータというものがないので
作れといっても作りようが無い。
その教授ちゃんと教えてるんかいな。
たぶん授業でやってる内容の延長じゃないのかな?
授業で何やってるか知らないから答えても無駄になりそう。
>589
やっぱり答えになっていませんか・・・。
594山崎渉:03/04/17 15:13
(^^)
595hage:03/04/17 18:57
すいません、現在簡単な電卓を作ろうといわれているのですが、どうしてもできません。
数が二つしかない計算のプログラムでしたら書けたのですが「1+2-3*4?5」のような連続した文字列を打ち、「=」でリターンで計算するのが作れません。
atoi関数を使って作るようにいわれたのですが、もう何がなにやら…

誰か教えてください(涙

下がいま自分で書いてたソースなんですが、関数の中身の考え方作り方がさっぱりなんです。
もしかしたら根本的に何もできてないかもしれないんですが…どなたか助けてください

#include <stdio.h>
#include <string.h>
int atoi(char *str);

void main(){
char str[256];
int num;
printf("数式を入力(「=」まで入力後にリターンキーを押す)>>>>");
scanf(str);
num = atoi(str);
printf("%d\n", num);
}

int atoi(char *str){
int n,s=0;
for(n=s,str="=",s++){
if(str[n]!="+" && str[n]!="-" && str[n]!="*" && str[n]!="/"){
atoi(char *str)
}
else if(){}
else
}
}
atoi()は<stdlib.h>のを使えということではないかな?
scanf(str); ってのは何をしたいんだ?
標準入力から文字列を読みたいならfgetsでも使っとけ。
数字は1桁オンリー?
それと、四則演算使うなら、一度、逆ポーランド電卓に変換したほうが簡単そう。
599hage:03/04/17 20:20
>>597
あ、そこはgetsで最初書いたんですけど、scanfで書くようにいわれたんで、scanf("%d",&str);
って言う風になおしたです。

>>598
いえ一桁だけではないです…
600デフォルトの名無しさん:03/04/17 20:27
age
601デフォルトの名無しさん:03/04/17 20:29
>>599
strはchar *かcharの配列か?アドレス演算子(&)はつけるなよ。
602601:03/04/17 20:31
>>595にあったな。
scanf("%s",str);にしなきゃ。
俺だったらfgets使うけどな。
>>595
とりあえず、ひとの作ったやつを参考にしてみるとか...。
内容見てないけど、
ttp://members.tripod.co.jp/hishoh/arc/funcalc.html
等、ソース公開してる人がいるよ。
>>572
一応マジレスしとくが、Perlで書かれた有名な(?)CGIゲームのコード。
>>563は大人しくWebProg板にでも行ってくれ。
605hage 1/2:03/04/18 17:04
一応ここまでやってみたんですが、どうにも動かないです…
どなたかご教授いただけますでしょうか。
#include <stdio.h>
#include <string.h>
int keisan(char* buffer);
void main(){
char buffer[256];
int a=0;
printf("数式を入力(「=」まで入力後にリターンキーを押す)>>>>");
scanf("%s",buffer);
printf("\nbuffer= %s", buffer);
a=keisan(buffer);
printf("\n答え= %s", a);
}
606hage 2/2:03/04/18 17:10
int keisan(char* buffer){
int n=0;
int a=0;
int w=0;
int m=strlen(buffer);
char ez;
for(n=0;n<m;n++){
if(buffer[n]=='+'){
ez=buffer[n];
if(n=1){
a=a+w;}else{
if(ez=='+'){
a=a+w;}
else if(ez=='-'){
a=a-w;}
else if(ez=='*'){
a=a*w;}
else if(ez=='/'){
a=a/w;}
}w=0;}
else if(buffer[n]=='='){
break;}
else {
w=buffer[n]-48;}
}
return a;}
改行大杉ではじかれた…一寸改行減らしました
なんじゃこりゃ
>>605
もし少しでも動くと期待したんだったら、甘すぎるから(一旦)諦めろ。
計算云々前に、数値と記号をきちんと分離するプログラムを書くところから始めたらどうだ?
>>605
数式を前から順番に読みに行くと、
乗算の優先順位と、加算の優先順位が守られなくなるよ。
前の方で誰か書いてたが、一度、逆ポーランド記法に変換するとかしたほうがいいかな。

というか、if elseをswitchでまとめたほうがいいぞ。
どうすれば有限の手順で計算を終えられるか考える。
ひとつ考え方を示す。(模範的なものではない。)

計算式はどんな場合でも2つの部分に分けることができる。
ex) a*b/(c+d)-e*f
→ [a*b/(c+d)] - [e*f]
このとき二つの部分を結んでいるのはもっとも優先順位の低い演算子(この場合は-)
である。ここでkeisan関数が完成したと仮定する。これを$keisanと呼ぶ。
するとkeisan関数は、

1.もっとも優先順位の低い演算子を見つけ、これをopとする;
2.$keisan(左被演算子) と$keisan(右被演算子)に対して、opを実行する。
3.結果を返す。

と書くことができる。ここで$keisanをkeisanで置き換えて見る。すると
keisanは渡された式を2つに分けて、それぞれを別のkeisanに渡す。
渡されたほうのkeisanもその式を2つにわけて・・・ということが起こる。これは
永遠に終わらないので、

0.if(渡された式が単一の数字) その数字をintに変換して返す。

を付け加えればよい。これで枠組みは完成である。
あとはどのようにこれらを実現するか考えればよい。
611hage:03/04/18 18:14
ギャフン!

確かにたぶん皆さんのおっしゃるとおりなんでしょうねぇ…
最初に書くのを忘れてたんですけども、四則演算の順番は打ち込んだとおりでよくって、昨日までに習った所+あと自習で完成させろという課題でしたんで…

御目汚しなモノ張ってすいませんでした…

一応さっき張ったのをいじって何とか一桁四則演算はでるようになったです。
ttp://www.kmonos.net/alang/boost/classes/spirit.html
ttp://www1.kcn.ne.jp/~robe/pf/index.html のbisonとflexのあたり参照

再帰についてはこの辺がいいかも↓
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/index.html

構文解析とトークンの切り出しは分けた方がいいと思う
整数だけでも
1 +1 -1 1.0 12,345,678 1.4*10^5
少数とか入れたらさらにあるし、まあ変なもの除けばいいかもしれないけど
ついでに関係ない文字が来ることも考慮しないといけないし
bisonが使えれば楽なんだけどねぇ。
それは邪道か。
直接使わないでも考え方とか知るだけでも有用かと
>>605
あんまり綺麗に書けなかったんだが、これはどうでしょうか?
あとはこのスレッドのみなさんで、うまく修正してください。

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

char *pbuffer;

int Get_kazu(void)
{
char kazu[256];
for (;*pbuffer == ' '||*pbuffer=='+'||*pbuffer=='-'||*pbuffer=='*'||*pbuffer=='/'; pbuffer++);
sscanf(pbuffer, "%[0-9]", kazu);
pbuffer += strlen(kazu);
return atoi(kazu);
}
int main(void)
{
char buffer[256];
int num = 0, answer;
printf("Input :");fgets(buffer, 256, stdin);pbuffer = buffer;
answer = Get_kazu();
while (*pbuffer != '=') {
switch(*pbuffer) {
case '+':
num = Get_kazu();answer += num;break;
case '-':
num = Get_kazu();answer -= num;break;
case '*':
num = Get_kazu();answer *= num;break;
case '/':
num = Get_kazu();answer /= num;break;
default: // 数字や空白ならpbufferを進める
break;
}
pbuffer++;
}
printf("Answer = %d\n", answer);
return 0;
}
617デフォルトの名無しさん:03/04/19 00:58
連立方程式を示す行列を
1.0 2.0 3.0 | 4.0
2.0 5.0 7.0 | 10.0
-1.0 2.0 -4.0 | 5.0
として実際に解いてみてください.

Gauss Jordan法を使って。
#include <boost/spirit/core.hpp>
#include <iostream>
#include <stack>
#include <functional>
#include <string>

using namespace std;
using namespace boost::spirit;

struct push_int {
    push_int(stack<long>& eval_) : eval(eval_) {}
    void operator()(char const* str, char const* /*end*/) const {
        long n = strtol(str, 0, 10);
        eval.push(n);
        cout << "push\t" << long(n) << endl;
    }
    stack<long>& eval;
};
template <typename op> struct do_op {
do_op(op const& the_op, stack<long>& eval_) : m_op(the_op), eval(eval_) {}
void operator()(char const*, char const*) const {
long rhs = eval.top();
eval.pop();
long lhs = eval.top();
eval.pop();
eval.push(m_op(lhs, rhs));
}
op m_op;
stack<long>& eval;
};

template <class op> do_op<op> make_op(op const& the_op, stack<long>& eval) {
return do_op<op>(the_op, eval);
}

struct do_negate {
    do_negate(stack<long>& eval_) : eval(eval_) {}
    void operator()(char const*, char const*) const {
        long lhs = eval.top();
        eval.pop();
        eval.push(-lhs);
    }
    stack<long>& eval;
};
struct calculator : public grammar<calculator> {
  calculator(stack<long>& eval_) : eval(eval_) {}
  template <typename ScannerT> struct definition {
    definition(calculator const& self) {
      integer = lexeme_d[ (+digit_p)[push_int(self.eval)] ] ;
      factor = integer |  '(' >> expression >> ')' |  ('-' >> factor)[do_negate(self.eval)] |  ('+' >> factor) ;
      term = factor >> *(  ('*' >> factor)[make_op(multiplies<long>(), self.eval)] |  ('/' >> factor)[make_op(divides<long>(), self.eval)]) ;
      expression = term >> *( ('+' >> term)[make_op(plus<long>(), self.eval)] |  ('-' >> term)[make_op(minus<long>(), self.eval)]) ;
    }
    rule<ScannerT> expression, term, factor, integer;
    rule<ScannerT> const&
    start() const { return expression; }
  };
  stack<long>& eval;
};
int main()
{
    stack<long> eval;
    calculator  calc(eval); //  Our parser
    string str;
    while (getline(cin, str)) {
        if (str[0] == 'q' || str[0] == 'Q') break;
        parse_info<> info = parse(str.c_str(), calc, space_p);
        if (!info.full)
        {
            cout << "Parsing failed\nstopped at: \": " << info.stop << "\"\n";
        }
    }
    return 0;
}
>>618
ここまで見にくいソースは初めてだ。
C++ってこんなのが普通なの?
>>618
boost::spirit が変態なだけ
わかりにくさ即ち美学と思っているグルの領域だからな…
624618:03/04/19 15:17
625618:03/04/19 15:46
>>617
#include <iostream>
#include <ixlib_matrix_impl.hh>

int main()
{
  double u[] = {
    1.0, 2.0, 3.0, 4,0,
    2.0, 5.0, 7.0, 10.0,
    -1.0, 2.0, -4.0, 5.0
  };

  ixion::matrix<double> A(3, 4, u);
  ixion::matrix<double> jordan = A.gaussJordan();
  jordan.outMatrix(std::cout);
  std::cout << "x = " << jordan(0,3)/jordan(0,0) << "\n";
  std::cout << "y = " << jordan(1,3)/jordan(1,1) << "\n";
  std::cout << "z = " << jordan(2,3)/jordan(2,2) << "\n";
}
>>595 遅レスですが。昔エクセルを作ろうとした時(挫折)やったので覚えているのですが、
5-7*33-8なら→5-231-8→-226-8→-234 見たいにやっていきます。
1、エラーチェック。式に変な文字が入っていないか、順番はおかしくないか、
  僕が作ったのは括弧も入ってたので()は同じ数か等。
2、計算する場所を探す。2項ずつ計算していく。計算する場所の左端、演算子、右端
  を探す。上の式なら- * 3(一の位)。注意するのは左の項が-の時とそうでない時の区別。
  もし上の式が5+7*33-8なら探す位置は7 * 3(一の位)になる。
3、探したものを利用して計算する。上の式は文字列として入力しているが、計算は数値として行う。
4、計算した部分を文字列から削る。上の式なら削ったことによって5-8となる。
5、3で計算した数値を文字列に変換して埋め込む。埋め込む位置は前に探した左端の位置。
6、2〜5を計算する所がなくなるまで繰り返す。
エラーチェックは >>626 みたいに最初に行うのがいいの?
それとも、同時に行えから、同時に行うのがいいの?
>>626
1〜5 ぐらいの理解力で...
> 昔エクセルを作ろうとした
のか ?
少なくとも、>>612 が書いてるリンク先ぐらいには目を通しておいた方が良いぞ。
ねたでしょ
普通に書くのが嫌なだけたろ。
631626:03/04/19 17:47
>>627 式を変化していく途中でエラーが起こらないように始めに厳しくチェックします。
途中では入れてなかったと思います。でもどちらでもいいでしょう。
>>628 はい。勉強します。
>>629 ネタではないですよ。グラフやマクロなんかできませんが。B1+C3みたいなのや
行の潜入、削除など初歩的な表計算のみですが。コンソール+エスケープシーケンス
でへぼいやつです。エラーが解消できなくて途中で止めましたが。
>>Enzan.exe http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=62
成る程。そうすれば再帰を使わずに解析できるのか。勉強になります。
自分は変数の使えるものを作っていたことがあって、
>>610のような方法しか思いつかなかったので。
でもどうせUPするならソースを見たかった…
633626:03/04/19 18:29
>>632 汚いし、長いし、余り乗せたくなかったのですが。コメントなんかも適当ですよ。
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=63
>>633
わざわざどうもです。ちょっと読んでみます。
2-1 = 1
2--1 = 3 まではいいとして、

2---1 = 1
2----1 = 3 と計算するのか...
636山崎渉:03/04/20 03:03
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
637山崎渉:03/04/20 03:41
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
638617:03/04/20 21:04
他の解答例はありますか?
639625:03/04/20 21:45
>>638=617
お例の一言も無しでそれかよっ!
640617:03/04/20 21:53
>639
あなたのやつは全然参考にならなかったので
>>640
この場合、参考にできない 617 が悪い。
642617:03/04/20 21:59
>641
ごめんなさい。習いたてなので理解ができなかったんです。
説明してくだされば嬉しいのですが・・
いくら質問スレっつっても、
無礼さの限界値ってのがあるわけよ。
644640:03/04/20 23:01
>>642
ixlibのmatrix::gaussJordan()を使っています。説明オワリ。
645640:03/04/20 23:16
>>617
しょーがねぇからマジレス。「一応」C++。

#include <cstdio>

int main()
{
  double a[3][4];
  double b;
  int i,j,k;

  a[0][0] = 1.0;  a[0][1] = 2.0; a[0][2] = 3.0;  a[0][3] = 4.0;
  a[1][0] = 2.0;  a[1][1] = 5.0; a[1][2] = 7.0;  a[1][3] =  10.0;
  a[2][0] = -1.0; a[2][1] = 2.0; a[2][2] = -4.0; a[2][3] =  5.0;

  for(k=0;k<3;k++) {
    b = a[k][k];
    for(j=0;j<4;j++) a[k][j] /= b;
    for(i=0;i<3;i++){
      if(i==k) continue;
      b = -a[i][k];
      for(j=0;j<4;j++) a[i][j] += (b*a[k][j]);
    }
  }
  for(i=0;i<3;i++) printf("x[%d]=%lf\n",i,a[i][3]);
}
646デフォルトの名無しさん:03/04/21 00:00
>>640
これはネタとかそういう問題でもないだろ 悪質
647644=645:03/04/21 00:09
スマン、間違えた。漏れは640じゃなくって>>639デシ。
でも、悪質ってのはやっぱ漏れの事かな(w
ネタ投稿もアリじゃねぇの?「悪質」は言い過ぎだろ。2chなんだし。
どっちかっつーと>>640=>>617の口の効き方の方が個人的にはよっぽど気に食わないんだが。
まぁロクに答えてない俺が言うのもなんだがな。
ここを質問スレと勘違いしてる香具師がいるな。
650 :03/04/21 22:26
Q0.1,E0.8,E0.4
正しい括弧付けかどうかをテストするプログラムを教えてください…
651 :03/04/21 22:40
Q0.1,E0.8,E0.4
正しい括弧付けかどうかをテストするプログラムを教えてください…

>正規表現かどうかを調べるプログラムです
>>650-651
マルチにつきスルーよろ。(つーか、なに聞きたいかちんぷんかんぷんだしね。)
Go --- >>650-651 --- through. ε=(・A・)
http://www.google.com/search?hl=ja&lr=lang_ja&q=%90%b3%82%b5%82%a2%8a%87%8c%ca%95t%82%af
によれば、
正しい括弧付け:
 解析木に含まれる括弧付けのうち、
 コーパスに付加された構文構造の
 全ての括弧付けと交差しないもの
とあるが、、、

ちなみに、
http://www.google.com/search?hl=ja&lr=lang_ja&q=Q0.1%2cE0.8%2cE0.4 だと
http://tcslab.csce.kyushu-u.ac.jp/~hiroyuki/automaton/automaton1.html
がでてくるなぁ。

何なんだろう、一体?
push & popか?
括弧といったらスタックでしょ?
過去に3 Dimensional Arrangementを使ったビットマップの読み込み方(?)
が出ていたようなのですが、あれって32bitですよね?
カラーデータが4byteだったし・・・。
あと、24bitのビットマップをbinary editerで見てみると
なぜか変なところに規則的に00が1、2個並んでるような・・・。
どなたか、C++ もしくはCのみでビットマップファイルの読み込み、
DOS画面に表示する方法を教えていただけないでしょうか?
自分でもググっても見たのですがコピペしてもものすごい量の
エラーが出るし・・・。
できればできる限りの種類のビットマップファイルを読み込めるよう
にしたいのですが・・・。

//長文 && 教えて君 && クレクレ君 && 自称初心者で申し訳なく・・・
658sage:03/04/22 12:10
>>657
突っ込み所満載でどこから手をつけていいやら。
取り敢えず何がしたいのか、何をやってみたのか、具体的に書いてみ?
尤も、ここは教えるスレじゃなくて宿題を楽しむスレだから教えてはやらないが。
あう、間違えた。すまn
660レレレ:03/04/22 12:27
俺やったよ!ついにやったよ!
>>660
自首しなさい。
662デフォルトの名無しさん:03/04/22 13:59
キーボードから半英小文字を5字入力し、
全角に変換するプログラムを作成せよ。
↑がわかんない^^;
とうほうCはじめて1週間
663デフォルトの名無しさん:03/04/22 14:00
すみません。
↑の補足で、(while)を用いてです

ガシャ(AA略
665デフォルトの名無しさん:03/04/22 14:21
>>662
キーボード入力をそのまま表示するのは出来るのか?
全角に変換するのがわからないのか?
何がわからないんだ?
666bloom:03/04/22 14:24
C++ならtoupperとかつかうのかな
あ 大文字じゃなくて全角なのか
switchあたりでやるしかないんでない?
テーブル作っとけ
/* エラーチェックはしてないし、出力はEUCでもSJISでもない */
void ascii2jis(char *pDest, char const *pSrc)
{
 while (*pSrc != '\0') {
  *pDest++ = '#';
  *pDest++ = *pSrc++;
 }
}
672Cん入生:03/04/22 17:20
すいません、今授業の課題で下のような課題をもらったんです。

数字を読み込み、カンマ編集して出力する。

例) 入力:1000000 出力:1,000,000

注) メイン処理のみで製作すること

という課題をもらったんですけど、だれかたすけてください。
ポインタとかまだ習ってないです…
#include <stdio.h>
#include <string.h>

int main()
{
char buf[256], out[290];
int i, ip=0, op = 0;

fgets( buf, 256, stdin );
i = strpbrk(buf,"\n.") - buf;

for( ; i>0; i-- ){
if( ( i % 3 ) == 0 )
out[op++] = ',';
out[op++] = buf[ip++];
}
out[op] = 0;
printf("%s\n", out );

return 0;
}
674Cん入生:03/04/22 18:08
>>673

なんか動かないです…ちゃんと#include <string.h> してるはずなのにstrpbrkは未定義ですってでますです
>673
それじゃ数字じゃなくても出力するやんw
>674
じゃ、i=strchr(buf,'\n') -buf;でいいよ。

>675
鼻から悪魔が出てきたと思いねぇ。
677Cん入生:03/04/22 18:26
>>676

stdinが定義されていないって出てきまつ

あとfgetsじゃなくてscanfで入力したいでつ…
未定義というのはライブラリのリンクが設定されてないという事ですか?
そのタコいコンパイラの名前挙げろ。
680Cん入生:03/04/22 18:31
C 言語スレに C Machine は使うなと書いてあるだろ。
682Cん入生:03/04/22 18:37
>>681
ΣΣ(゚д゚lll)ガガーン

まじですか…でもこれつかってコンパイルせいという指令で…。・゚・(ノД`)・゚・。
まあ別にscanf使っても、2カ所変更するだけで済むわけだが。
そんな指令は捨てろ。それはCMachineという方言の勉強にしかならん。

それから、scanf()は入力を行の途中のまま終了するから
後々エラー処理が面倒だぞ。
685Cん入生:03/04/22 18:52
いや、非常に十分且つ必要にタコで方言バリバリであっても、現状の課題として与えられた環境がこれなので何とも…
>>680のサイトにサポート掲示板とかいうのあるじゃん。
ライブラリ関数に関してはそこで質問すれば?
C言語で
バイナリ比較をしたいのですが
Aというファイルを開いて先頭が3バイトが
47 49 46 だったら というif文はどうかけばいいのでしょうか?
unsigned char signature[3] = {47, 49, 46};
unsigned char sig[3];

if (memcmp(sig, signature, 3) == 0) ...
char num[3];
File* fp;
int i;

fp = fopen("A", r);
for(i = 0; i < 3; i++) {
num[i] = fgetc(fp);
}

if(num[0] == 47 && num[1] == 49 num[2] == 46) {
/*処理を書く*/
}

fclose(fp);
return 0;
ではコンパイラ通るかもわからないですが、やはりダメですか。
>>689
それだったら
fread(num, 1, 3, fp);
if (num[0] == 47 && num[1] == 49 && num[2] == 46) {
/* 処理 */
}
でいいじゃん。
でもまぁ、
unsigned char signature[] = {47, 49, 46};
char num[sizeof(signature)];
FILE *fp = fopen("A", "r");
fread(num, 1, sizeof(signature), fp);
if (memcmp(num, signature, sizeof(signature)) {
/* 処理 */
}
fclose(fp);
とでもしておいた方がチェックするバイトが増えたときに楽だろ?
#その点では>>688は却下。
おっと、if文の条件が逆だった。
if (!memcmp()) {
ってことで。
692687:03/04/22 20:40
ありがとうございます バイナリ比較は簡単にできるんですね
ところで 47, 49, 46 っていうのは GIF なんですが

fread(num, 1, 3, fp);
printf("%d%d%d",num[0],num[1],num[2]);
で読み込んで表示して見ると 717370 と表示されます・・・
バイナリエディタでみてる数値とずれているのですが
なぜなんでしょうか?
693687:03/04/22 20:43
あ すみません 16進ダンプでみてますた・・
>>672 遅レスですが。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char s[256];int a;int l;int ok=0;
for(;ok==0;)for(puts("正の整数を入力して下さい"),gets(s),l=strlen(s),a=0,ok=1;a<l&&ok;a++)
if(!isdigit((int)s[a])){ok=0;puts("入力エラー");}
puts(",を入れて見やすくします");
for(a=0,l=strlen(s);a<l;a++)
{printf("%c",s[a]);if((l-a)%3==1&&a+1!=l)printf(",");}
printf("\n改行を押してください。終了します");getchar();return 0;
}
>>687
unsigned char signature[] = "GIF";
余りの計算を使わないで偶数、奇数の判定をするとは
どうすればよいのでしょうか・・・。
if(hoge && 1)
{
//奇数
}
else{
//偶数
}

でいいんじゃね?
あ、&は一個でいいんだっけか
ビット演算
>一個でいいんだっけか

一個じゃなきゃいけない。
あ、有難うございました。
できました。こんなものだったとは…。
差もこれの変化形ですかね。
ごめんなさい…最後の一文意味不明でした。
703Cん入生:03/04/23 17:54
>>694
for(;ok==0;)for(puts("正の整数を入力して下さい"),gets(s),l=strlen(s),a=0,ok=1;a<l&&ok;a++)

バリバリ動くんですけども、okを使ったここの部分がよくわかんないんですけど、okはつまりどのような働きをしてるのでしょうか?
正の整数が入力されてるかの判定。
されてなかったら0になって
for(puts("正の整数を入力して下さい
"),gets(s),l=strlen(s),a=0,ok=1;a<l&&ok;a++)
のループにまた入る。
別関数で判定させてdo while文を使った方がすっきりすると思う。
>>694
なんだか、色んな意味でスゲー(*゚∀゚)
char t;
do for(puts("正の整数を入力して下さい
"),gets(s),t=s,ok=1;*t;t++)
if(!isdigit(*t)){ok=0;puts("入力エラー"); break;}
while (!ok);
>>694
> for(;ok==0;)

while(!ok) じゃダメなん ?
708sage:03/04/23 23:31
極力短く8クィーン問題を作りたいのですが、
どのようなプログラムが考えられますか?
710デフォルトの名無しさん:03/04/24 05:19
>>708

○山大学通信2年だろ? こんなところで出会うなんて奇遇だな(藁
>710
あなた達の大学ってレベルが低いんですね(笑
712某三流工専:03/04/24 11:33
a[n] n=10000 但し、a[i]=(int)fmod(13*i,10000)
このときバブルソートで整列し計算時間を出力するプログラムを作れ。

お願いします。
バブルソートって
for(i=0; i<n; i++)
for(j=0; j<n-1; j++)
if (a[j] > a[j+1]) swap(j, j+1);
こんなんでしょ。
714708:03/04/24 14:51
>>710

すいません・・・。
当方○石高専の4年です(汗
知り合いでなくて申し訳ない。
でも学年的には一緒ダナw
716デフォルトの名無しさん:03/04/24 16:01
CでもC++でも可です。

・floatで例えば以下の様に配列を宣言して、計40バイトの領域を確保しまつ。
で、別にchar test_c[40]とか宣言しておいて、元来のfloatデータ形式で
1バイト目をtest_c[0]に入れる、2バイト目をtest_c[1]に入れる・・・という方法を
探しています。BCBでmallocとかポインタとか使ってみたけど駄目でした。
どなたか分かる方がいればご教示願いたく。

float test_f[] = {2.9, 3.4, 8.8, 2.2, 5.3};
>>716
float test_f[] = {2.9, 3.4, 8.8, 2.2, 5.3};
union {
 float f[sizeof(test_f) / sizeof(float)];
 char c[sizeof(test_f)];
} test;
test.f = test_f;
for (int ic = 0; ic < sizeof(test); ic++) {
 printf("%#02x ", test.c[ic]);
}
718710:03/04/24 16:21
>>714(708)
そうなの?残念。間違いスマソ。
719bloom:03/04/24 16:26
720デフォルトの名無しさん:03/04/24 16:29
>>711
あなた達の家族ってレベル低いんですね(笑
721デフォルトの名無しさん:03/04/24 17:45
「***すれ立てるまでもない質問はここで 第35刷***」で質問したら
こちらに逝けとのことでしたので、質問させていただきます。

----------問題---------------------------------
それぞれの値が0からn-1までの間の整数値を持ち、
さらに、すべての値は異なるような、長さがk(k<=n)
であるランダム整数列(ランダム置換列)を生成する
ためにはどうしたら良いでしょう?

1:早く、短いプログラム(擬似コード)を作りなさい。
2:そのプログラムの正当性を証明しなさい。
-----------------------------------------------

えーと、言語はCとかJAVAとか何でもいいです。
基本的に、「動くプログラムを作れ」ってことじゃなくて
「こういう方針でコーディングすればよい」ってのが
わかれば良いので。

あと、rand(でしたっけ?乱数発生させる関数)を使って
うまいことやるみたいです。

よろしくおながいします。
722716:03/04/24 18:01
>>717
おお素晴らしい!!なるほど共用体ですか!!!
と、思って打ち込んでみたら・・・BCBエラー吐くやん。

test.f = test_f;
for (int ic = 0; ic < sizeof(test); ic++) {
 printf("%#02x ", test.c[ic]);
}
↑こいつは・・・

for (int ic = 0; ic < sizeof(test); ic++) {
 test.f[ic] = test_f[ic];
 printf("%#02x ", test.c[ic]);
}
でないとマズいみたいですね(BCBだけ?!)。
>>717さんありがとうございました。
723716:03/04/24 18:08
間違えた・・・

for (int ic = 0; ic < (sizeof(test_f) / sizeof(float)) ; ic++) {
 test.f[ic] = test_f[ic];
}

for (int ic = 0; ic < sizeof(test); ic++) {
 printf("%#02x ", test.c[ic]);
}
が正解かな?
連続カキコ失礼しました。
>>721
質問スレのほうに返事書いちまった。

線形合同法とかM系列とかそういうキーワードで調べろ。
正当性の評価とかって、ガロアの群論使えばいいのかな。

あとさ、その課題って、rand 使ってやれってことじゃなくて、
rand を自作しろってことじゃないのか?
>>721
むずかちいことは、よくわからんが、
解1
10 0〜n-1までのテーブルAを作成(0,1,2,3,4....n-1)
20 0〜k-1の領域Bを確保
30 index1 = 0
40 index2 = rnd(0〜n-1の範囲)
50 もしA[index2] が -1 の時 40へ戻る
60 B[index1] に A[index2]を代入
70 A[index2] に -1を入れる
50 index1を増加させ index1が k 以下の場合40へ進む
解2
10 0〜k-1の領域Aを確保
20 Aの配列に増値n/kで代入し、小数点以下は切り捨てる
30 Aの配列をランダムにシャッフル
解3
10 0〜n-1までのテーブルAを作成(0,1,2,3,4....n-1)
20 Aをランダムでシャッフル
30 A[0〜k-1]を解とする

解2はアヤシイな。解1も速度がイマイチRNDによっては帰ってこないかな。
3はシャッフルの精度次第か。
726721:03/04/24 18:27
>>724
レスありがとうございます。
この課題の趣旨を書いてなかったんですけど
ソーティングアルゴリズムの評価をするために
テスト入力用のファイルを作るって課題なんです。
で、たぶん”すべての値は異なるような”ってとこが
ネックなんだと思います。
解1を少し改造する
40 index2 = rnd(0〜n-1-index1の範囲)
70 A[index2] に A[n-1-index1]を入れる
C++にて

#include <algorithm>
#include <vector>
std::vector make(int n, int k)
{
  std::vector<int> x;
  x.resize(n);
  for(int i = 0; i < n; ++i)
    x.push_back(i);
  std::random_shuffle(x.begin(), x.end());
  return std::vector(x.begin(), x.begin() + k);
}

あんまり?
あ、<int>が2箇所抜けてる…
鬱打死脳
しかもresizeじゃなくてreserveじゃん。
逝ってきます
すみません、コード作成しコンパイルは成功したのですがどうしても実行時に
Debug Asertion Failed!というエラーメッセージが出てしまいます。
コードのどこが誤りでどのように修正すれば良いか見ていただけないでしょうか。
よろしくお願いします。

ある配列があり、その配列のサイズを超えた要素に値を入れようとしたとき、
自動的に配列のその要素までメモリ領域を確保するプログラムです。
例えば配列vaの要素数が2である時にva[3]に値を入れようとした場合、
自動的にva[3]まで領域が拡大され、そこに値が書き込まれます。
配列の情報は構造体(array.hで宣言)が持っており、メンバはbase(配列の先頭アドレス)、
limit(配列の要素数)と2つの関数ポインタです。
732731:03/04/25 09:58
/*ヘッダファイルarray.hの内容*/
struct varray {
int *base;
int limit;
int (*read) (struct varray *va, int index);
void (*write) (struct varray *va, int index, int value);
};

struct varray *varray_new (void);
void varray_free (struct varray *va);
/*ここまで*/
733731:03/04/25 10:05
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "array.h"

static int va_read (struct varray *va, int index);
static void va_write (struct varray *va, int index, int value);

static int va_read (struct varray *va, int index)
{
return (va -> base)[index];
}

static void va_write (struct varray *va, int index, int value)
{
  if((va -> limit) <= index){
     (va -> limit) = index + 1;
     (va -> base) = realloc((va -> base), sizeof(int) * (va -> limit));
  }
  (va -> base)[index] = value;

}
734731:03/04/25 10:05
struct varray *varray_new (void)
{
  struct varray *p;
struct varray va = {NULL, 0, va_read, va_write};
  p = &va;
  return p;
}

void varray_free (struct varray *va)
{
free(va);
}

int main (void)
{
struct varray *va = varray_new ();
  va->write (va, 3, 99);      /*引数3は配列のインデックス数、99は書き込む値*/
  printf ("%d\n", va->read (va, 3)); /*引数3は値を読み込む配列インデックス数*/
varray_free (va);
return 0;
}
735731:03/04/25 10:11
あと、この課題はテンプレートがあり、私が書いたのは関数varray_newとvarray_freeと
va_readとva_writeの中身だけです。よろしくお願いします。
どこにassert()があるんだよ。
あとvarray_free()でva->baseを解放してない。
varray_new()でローカル変数のアドレスを返しているから。


あと、varray_free()内ではva->baseをfreeせんと駄目では?
738デフォルトの名無しさん:03/04/25 10:35
varray型変数{NULL,0,va_read,va_write}はスタックに割り付けられるのが普通で
関数を出たらその値の一貫性はまず保証されない。
だからといってstatic struct varray={NULL,0,va_read,va_write};
とすればいいだろうと即断するともっと泥沼に陥る。
struct varray va={NULL,0,va_read,va_write};のままでいいから
きちんとmallocを使ってpに確保してvaの値をpに確保した領域にコピー
これなら大丈夫な筈。reallocなんて使ってるのにどうしてmalloc使わなかった
のだろうと不思議に思うべき。
739731:03/04/25 10:53
>>736-738
無事実行できました。ありがとうございます。
色んな考えが抜けてたみたいですね…勉強になりました。
>>731
readのときに範囲チェックと拡張処理が無いのは、いいのかな?
仕様がわからんから何ともいえんだろ。
writeでチェックかけてるのは、va->baseの領域を確保する為にも必要だし。
未確保の時にどんな値を返すべきかもわからんしなー
と思ったけど、現状でもwriteでreallocした後、新たに確保した領域の初期化はせずに放置プレイか
743RIE:03/04/25 15:00
通常課題1-1) 提出フォルダへ
キーボードから文字列を読み込んで,読み込んだ文字列の長さを表示するプログラムを作成せよ.
(例)papa->4, level->5

(通常課題1-2)提出フォルダへ
キーボードから文字列を読み込んで,読み込んだ文字列を逆にした文字列を表示するプログラムを作成せよ.
(例)papa->apap, level->level

(通常課題1-3)提出フォルダへ
小文字のaからzまでを表示するプログラムを作成せよ.ただし文字定数および文字列定数を使ってはいけない.
(ヒント)文字コードを使う

(応用課題1-A1)提出フォルダへ
キーボードから文字列を読み込んで,読み込んだ文字列が逆から読んでも同じ(回文のようなもの)文字列かどうかを判定するプログラムを作成せよ.
(例)papa->no, level->yes
744RIE:03/04/25 15:02
お願いダレカオシエテー!!!
>>743
1-1)
#include <stdio.h>
#include <string.h>
int main() {
char s[256];
gets(s);
printf("%s->%d\n", s, strlen(s))
return 0;
}
「キーボードから」と限定されると難しいね。
「小文字のaからz」もasciiと限定されてないので不可能っぽい気がするし。
キーボードから二バイト文字を入力されたらどうするんだろうとか、
突っ込み所が山ほどあるんですが。
>>745
256文字以上入力される可能性は考慮しないの?
キーボードからってどうやって保証するの?
>>743
1-2)
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int i;
gets(s);
printf("%s->",s)
i = strlen(s)-1;
for(;i>=0;--i) putchar(s[i])
putchar('\n')
return 0;
}
>>743
1-3)
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
int main(){
int i;
for(i = 0; i <= UCHAR_MAX; ++i) {
if(islower(i))putchar(i);
}
putchar('\n');
return 0;
}
>>743
1-A1)
#include <stdio.h>
int main(){
char s[100];
int i,len,f;
gets(s);
len=strlen(s);
f = 1;
for(i=0; i < len/2; ++i) {
if(s[i] != s[len-1-i]) {
f = 0;
break;
}
}
printf("%s->",s)
if(rev){
puts("yes");
}
else {
puts("no")
}
return 0;
}
>>750
間違えた
×if(rev){
○if(f){
752RIE:03/04/25 15:58
本当に助かりました!返事遅れてゴメンナサイ(@-@)
753RIE:03/04/25 16:03
本当にたすかりました!!!アリガトウガザイマス(@-@)
何故バッファサイズが256だったり100だったりするのだろう・・・
755RIE:03/04/25 16:23
先ほどの課題1-2で10行目に関数ポインタとして評価されない式を使って関数を呼び出そうとしましたと出ました?わけがわからないので教えてもらえないでしょうか?
756bloom:03/04/25 16:26
757デフォルトの名無しさん:03/04/25 16:26
>>755
セミコロン「;」が抜けてるからじゃないの?
>>755
行末のセミコロンが抜けてた。
ほかのもミスがあるから、自分でがんばってなおしてみ。
759RIE:03/04/25 16:29
ありがとー!!ホント抜けてた。私の性格もよくぬけてるっていわれるからね。反省(@-@)
760デフォルトの名無しさん:03/04/25 16:30
761デフォルトの名無しさん:03/04/25 16:35
二次計画問題のプログラムを書いてください!
762RIE:03/04/25 16:41
またご迷惑おかけします。よろしくオネガイシマス!!
数値の内部表現は,データ型(整数の場合はchar, short, long, intごとにビット長が異なる.
そこで,キーボードから整数値を入力しshort型(16ビット)の変数に格納した後,
この変数の内部表現をビット列で表示するプログラムを作成せよ
>>759
1-3)の回答は教師の意図とはちがうかもな。
ヒントが「文字コードを使え」だから。
>>762
#include <stdio.h>
#include <limits.h>
int main() {
int i;
short n;
scanf("%hd", &n);
for(i=0;i<CHAR_BIT*sizeof short;++i) {
if(n<0)putchar('1');
else putchar('0');
n <<= 1;
}
}
765れな:03/04/25 17:02
(通常課題2-3)提出フォルダへ
1000以下の正の整数値のうち,素数をすべて計算し,その結果をファイルに格納するプログラムを作成せよ.素数とは自分自身と1以外の数値で割り切れない整数のことである.
また、計算の実行の中で乗除(乗算と除算)を行った回数もあわせて表示し、ファイルに格納すること
素数の判定
int isprime(int n) {
int i;
if (n < 2) return 0;
for (i=2; i*i < n; i++)
if (n % i == 0) return 0;
return 1;
}
767れな:03/04/25 17:10
error LNK2019: 未解決の外部シンボル _main が関数 _mainCRTStartup で参照されました。
fatal error LNK1120: 外部参照 1 が未解決です。
こんなんでちゃったよお


mainを書けばいいんでない?
>>767
ネカマきも。
>>767 mainはC言語の一番初めの所に出てくるものだからそれがわからないと・・・。
まったくC言語が始めて?なあなたになぜそんな問題が出されるのか不思議です。
http://www.kumei.ne.jp/c_lang/ ここなんかで勉強しましょう。
ここは、女の名前で宿題を出すと、
みんなが懇切丁寧に教えてくれるスレですか?(w
>>761
なんだそれ
シンプレックス法か?
773デフォルトの名無しさん:03/04/25 19:51
ここが噂のネカマ スレですか?

除算をし
137/1110 = 0.1(234) のように、何らかの記号をつけて
循環小数であるとを示す。
0.122313(略)7837|  ただし、小数点以下100桁に収まらない場合は
 └―ここが100桁以上   小数点以下100桁まででよい。
乳の写真でもUPしたら答えてやるんだがな。
もう乳も見飽きた。
むしろもませろ!
乳の写真あります
http://group.lin.go.jp/data/zookan/kototen/rakuno/r122.htm

さらに来てくれればいつでも揉ませてあげます。
777健太:03/04/26 10:32
本当にすみませんでした。前にRIEとかいって宿題お願いしたのは自分です。申し訳ありませんでした。今度は一人の男としてお願いします。なんとか

数値の内部表現は,データ型(整数の場合はchar, short, long, intごとにビット長が異なる.
そこで,キーボードから整数値を入力しshort型(16ビット)の変数に格納した後,
この変数の内部表現をビット列で表示するプログラムを作成せよ

を解いてやってください。「shortが不要です」と出て実行できません。助けてください。


>>777
#include <stdio.h>
#include <limits.h>
int main() {
int i;
short n;
scanf("%hd", &n);
for(i=0;i<CHAR_BIT*sizeof(short);++i) {
if(n<0)putchar('1');
else putchar('0');
n <<= 1;
}
}
779健太:03/04/26 11:22
ありがとうございました!本当に助かりました。もう二度とあんなバカなまねはしません。本当にありがとうございます!
780健太:03/04/26 11:29
大変言いにくいのですが、もう二問だけ自分に力を仮してくれませんか?回答を見てから自分でももう一度考えてみますので。この

数値の内部表現は,データ型(整数の場合はchar, short, long, intごとにビット長が異なる.そこで,キーボードから整数値を入力しshort型(16ビット)の変数に格納した後,この変数の内部表現をビット列で表示するプログラムを作成せよ.



1000以下の正の整数値のうち,素数をすべて計算し,その結果をファイルに格納するプログラムを作成せよ.素数とは自分自身と1以外の数値で割り切れない整数のことである.
また、計算の実行の中で乗除(乗算と除算)を行った回数もあわせて表示し、ファイルに格納すること.

です。お願いします。助けてやってください。
たった7分で挫折か。
782まさこ:03/04/26 11:40
TFT(高速フーリエ変換)のモジュールを作れといわれました。
作ってください。
783健太:03/04/26 11:42
すぐに打ったからそう思われてしまったかもしれませんが、実はこの課題は2週間前から出されているものでずっと考えていたのですがどうしても解けないのです。
だから決してすぐに挫折したわけでは無いんです。どうしても分からないんです。なんとかお願いできませんか?
784デフォルトの名無しさん:03/04/26 11:50
FILE *fout = fopen("sosou.txt","w");
fprintf(fout,"1\n");
for(i=1; 1000>i; i++){
flag=1;
for(j=1; i>j; j++){
if(i % j == 0){ flag=1; break; }
}
if(flag == 0)fprintf(fout,"%d\n",i);
}
fclose(fout);
>>780 >>783
778の回答じゃいかんの?
ただ、教えろって連呼するだけじゃなくて、なぜいけないか説明して
みないよ。

> for(j=1; i>j; j++){
     ~~
n%1は0じゃないか
>>778
俺の環境 (Win2K + VC++6) ではとりあえず動く。ただ、負数のシフト結果は保証されないことがあるからお勧めしない。俺なら素直に...
#include <stdio.h>
#include <limits.h>
int main() {
 int i;
 short n;
 scanf("%hd", &n);
 for(i = CHAR_BIT * sizeof(short) - 1; 0 <= i; i--){
  if(( n & (1 << i)) != 0){ putchar('1');} else { putchar('0'); }
 }
}
とするだろう。
>>782
#include <fftw3.h>
789デフォルトの名無しさん:03/04/26 12:02
>>786
バグ修正まで面倒見れません。
790健太:03/04/26 12:03
本当に申し訳ありません。その回答はエラーも出ず完璧でした。自分の間違いで780で問題を書き間違えていました。本当は

キーボードから月(12ヶ月)に相当する整数値を入力し,その月の値に応じて,3・4・5月は「春またはspring」、6・7・8月は「夏またはsummer」、9・10・11月は「秋またはautumn」、12・1・2月は「冬またはwinter」と表示するプログラムを作成せよ.

という問題を願いしようとしてたんです。すいません、本当にすいませんでした。
791デフォルトの名無しさん:03/04/26 12:08
>>790
2週間の間、一瞬でも自分の頭で考えたことあるのかどうか問い詰めたい。
#include <stdio.h>
int main(void)
{
int n;
do
scanf("%d", &n);
while(n <= 0 || 12 < n);
switch(n)
{
case 12:
case 1:
case 2:
printf("冬またはwinter\n");
break;
case 3:
case 4:
case 5:
printf("春またはspring\n");
break;
case 6:
case 7:
case 8:
printf("夏またはsummer\n");
break;
case 9:
case 10:
case 11:
printf("秋またはautumn\n");
break;
}
return 0;
}
793健太:03/04/26 12:22
プログラミングはかなり苦手です。でも今も自分なりに考えているのですが、790の問題はswitch~caseを使えばできると思い自分で書いてみたのですがどうしてもエラーがでるのです。switch~caseではダメなのですか?


794bloom:03/04/26 12:26
>>793
エラーがでたら、何故エラーの内容を書かない?
俺らはエスパーじゃないんだが。
>>793
#include <stdio.h>

int main(){
int n;
scanf("%d", &n);
const char *tbl[] = {"冬またはwinter","春またはspring","夏またはsummer","秋またはautumn"};
printf("%s\n",tbl[n%12/3])
}
797デフォルトの名無しさん:03/04/26 12:41
>>792,793
do while の間に{ } がないからでは?
むしろ>>792のなにが問題なのか解らん。普通に動くんだが。
っていうか>>796のは場合によっては死ぬだろ?

#include <stdio.h>
int main(void) {
 int manth;
 while(1) {
  scanf("%d", &manth);
  switch(manth){
  case 12: case 1: case 2:
   printf("冬またはwinter\n"); return 0;
  case 3: case 4: case 5:
   printf("春またはspring\n"); return 0;
  case 6: case 7: case 8:
   printf("夏またはsummer\n"); return 0;
  case 9: case 10: case 11:
   printf("秋またはautumn\n"); return 0;
  default:
  }
 }
}
>>798
問題があるってわけじゃないけど、出題者の意図どおりの
回答しても面白くないじゃん。
>>798
あっ、もう792みたいにbreakせずにシステムへreturnしちゃう?
そっちの方がいいのかな?
ここは質問した人以外でも勉強になるスレだなぁ。
>>796はセミコロン抜けてるし、途中で変数の宣言してるし、ダメダメだ。
スマソ。
>>798
manthってなんだろ。
それと、main()からの出口が複数あるのはちょっといやだなぁ。
>>797
ちゃんと確認してからレスつけなよ。
>>796
nがunsignedなら落ちないのに。
宿題なんだから、バグのひとつやふたつ残しておいて、
本人になおさせろよ。
804デフォルトの名無しさん:03/04/26 14:23
One Pass DP法 による音声認識プログラムを書いてください。
805デフォルトの名無しさん:03/04/26 14:28
>>804
#include <OnePassDP.h>
806デフォルトの名無しさん:03/04/26 14:33
>>805
じゃあそのヘッダファイルの中身を書いてください。
807デフォルトの名無しさん:03/04/26 14:34
>>806
チンコの写真UPしたら書いてやるよ。
>>806
#ifndef AAAA
#define AAAA

int init(void);
char *ninshiki(void *);

#endif
809デフォルトの名無しさん:03/04/26 16:32
質問させていただきます。宿題は、
「配列に格納されたn個の数を、最大値選択法によって昇順にソートする」というものでした。
とりあえず以下。

void selection_sort(int *ptr, int n)

{
    int i, j, k;

    for(i=0; i
       k = i;
      for(j=i+1; j
         if(*(ptr+k) > *(ptr+j)){
          k = j;
         }
       }
      swap((ptr+i), (ptr+k));
   }
}

void swap(int *ptr1, int *ptr2)
{
   int w;

   w = *ptr1;
   *ptr1 = *ptr2;
   *ptr2 = w;


間違っているところあったら指摘してください。
また、これを擬似言語で記述するとどのようになるのでしょうか。
よろしくお願い致します。
>>809
なんでforの後ろが抜けてるの?
811デフォルトの名無しさん:03/04/26 16:47
すみません。改めて書き直しました。

void selection_sort(int *ptr, int n)


   int i, j, k;

   for(i=0; i<n-1; i++){
     k = i;
     for(j=i+1; j<n; j++){
       if(*(ptr+k) > * (ptr+j)){
         k = j;
       }
     }
     swap((ptr+i), (ptr+k));
   }


void swap(int *pyr1, int *ptr2)

   int w;

    w = *ptr1;
   *ptr1 = *ptr2;
   *ptr2 = w;




   
最大値選択法になってると思う?
1 ソートしていない値を、0 〜 最後尾未満 まで、以下を繰り返す。
2 決定する値の場所を、現在の決定する場所を仮の初期値とする。
3 決定する値の場所 + 1 〜 最後尾について次を繰り返す。
4 最小値を探し、その場所を覚えておく。
5 覚えておいた場所の値と、決定する値を交換する。

という手順を踏んでいます。
単純選択法、つまり最大値選択法ではないかと思うのですがどうでしょう。
       if(*(ptr+k) < * (ptr+j)){
最大値っていうんだからこうじゃないの?
815デフォルトの名無しさん:03/04/26 18:08
ある文字列(a-zA-Z0-9)があって、
同じパターンが繰り返されていたらその部分を括弧でくくるプログラムですが、
文字列の長さが最大10の時(\0を含む)

例一:ABCDECDE  →   AB (CDE)
例二:ABCDEFCDE  →  AB (CDEF)
  /* 最大の長さ */   /* 同じパターンが続くと類推する */
となのですが、
例二の類推が上手くできません。
●投げで住まんけど、お願いします。
<<814
ありがとうございます。やってみます。
このアルゴリズムを擬似言語で記述するとどうなるんでしょうか?
>>814
そうすると降順にソートされるよ。
>>817
ループを逆に回したら?

nが0より小さければ終了
最大値を見つけてn番目と交換する。
nを1減らす。
819デフォルトの名無しさん:03/04/26 19:09
数値から文字列にしたいんですけどどうすればいいですか?
sprintf
821デフォルトの名無しさん:03/04/26 19:24
>>820
ありがとう
>>815
とりあえず美しくないが...
#include <stdio.h>
#include <string.h>
#include <conio.h>
static void foo(const char *s)
{
 const char *p;
 printf("%s --> ", s);
 while(*s){
  p = strchr(s + 1, *s);
  if(p == NULL){
   putchar(*s++);
   continue;
  }
  int i;
  for(i = 0; &s[i] < p; i++){
   if(p[i] == '\0' || s[i] != p[i]){ break; }
  }
  if(p[i] == '\0' || s[i] == p[i]){
   putchar('(');
   for(; s < p; s++){ putchar(*s); }
   putchar(')');
   s = &p[i];
  } else { putchar(*s++); }
 }
 putchar('\n');
}
>>818
ありがとうできました。・・・けど擬似言語わからん。Cじゃいかんのか。
16bit,24bit,32bitのbitmapを読み込みたいのですが、
どうやればいいのでしょうか?
とりあえず、考えた方法ではこんな感じなんですが・・・
//こーぞーたいの宣言はWindowsとおんなじ
#include <stdio.h>
int main(int ArgCount,char* Argument[])
{
BITMAPFILEHEADER BMPFileHeader;
BITMAPINFOHEADER BMPInfoHeader;
RGBQUAD RGBQuad;
FILE* pFile;
unsigned char BMPBuffer[3];
pFile = fopen("(HCG)(無修正)George W Bush × Saddam Husayn.BMP","rb");
fread(&BMPFileHeader,sizeof(BITMAPFILEHEADER),1,pFile);
fread(&BMPInfoHeader,sizeof(BITMAPINFOHEADER),1,pFile);

for (Y = 0; Y < BMPInfoHeader.biHeight; Y ++)
{
for (X = 0; Y < BMPInfoHeader.biWidth; X ++)
{
// ここでイメージを1ピクセルごと読み込む

RGBQuad[(Y + 1) * (X + 1) - 1] = BMPBuffer;
}
}

return 0;
}
自分では完成されられないので助けていただけないでしょうか?
あと、もっと高速に美しく読み込む方法があると思うので
教えていただけませんでしょうか?
ミジンコヤローでも分かるくらい簡単に・・・
825お願いします☆:03/04/27 00:03
問題1
立方体の体積を求めるプログラムを作成せよ。
また、実行結果を書け。
(ヒント)立方体体積 たて*よこ*高さ
     int taiseki,tate,yoko,takasa;
書式 たて%4d よこ%4d 高さ%4d 体積%6d
     
     実行結果 たて( )センチ、よこ( )センチ、高さ( )センチの
     立方体の体積は( )立方センチです。

問題2
円柱の体積を求めるプログラムを作成せよ。
また、実行結果を書け。
(ヒント)円柱の体積=円周率(3.14)*半径*半径*高さ
     int hankei,takasa;
float taiseki;
 半径=12、高さ=34
     書式 半径%3d 高さ%3d 体積%8.3f
     
     実行結果 半径( )センチ、高さ( )センチの円柱の体積は( )
     立方センチです。
直方体って言葉があってそっちの方が適切なような?
>>824
その固定ファイル名は何とかならんのか(w

それはともかく、
BMPは1ラインのバイト数が4の倍数になるようになってるから、
単純にforでまわすと絵が崩れることがあるよ。

>16bit,24bit,32bitのbitmapを読み込みたいのですが
って言われてもなぁ。
読み込んだ後どうしたいのか書いてくれないと。
画像処理して別のファイルに書き出し?
それとも画面に表示?
表示したいなら環境依存だから環境かいてないとわかんないよ。
>>825
そこまでわかっててできないわけがない。
日本語の変数名って分かりやすいけど、
なんか違和感を感じるね。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define NFRAC 100 /* :D */
#define NBUF 200 /* :D */
#define NSTR 200 /* :D */
int gcd(int x, int y){return (y == 0 ? x : gcd(y, x%y));}
void reduce(int *n, int *d){int g; g=gcd(*n,*d); *n=*n/g; *d=*d/g;}
int cycle(int *h, int t, int n){while(t--) if(h[t]==n) return t; return -1;}
char *expand(char *s, int n, int d){
  int x,y,i,m,c,neg,rt=0,qt=0,*r,*q; char buf[NBUF];
  reduce(&n, &d); neg = n*d < 0 ? 1 : 0; x = n = n<0?-n:n; y = d = d<0?-d:d;
  sprintf(s,neg?"-%d.":"%d",n/d); if(d==1) return s; strcat(s,".");
  r=(int*)alloca(sizeof(int)*NFRAC); q=(int*)alloca(sizeof(int)*NFRAC);
  while(0>(c=cycle(r,rt,n))){r[rt++]=n;n*=10;m=n/d;n=n%d;q[qt++]=m;}
  for(i=0;i<m;i++){sprintf(buf,"%d",q[i]); strcat(s,buf);} strcat(s,"(");
  for(i=c;i<qt;i++){sprintf(buf,"%d",q[i]); strcat(s,buf);} strcat(s,")");
  return s;}
int main(int c, char *v[]){
  int n,d; char str[NSTR]; if(c<3){fprintf(stderr,"%s n d\n",v[0]);return 1;}
  n=atoi(v[1]); d=atoi(v[2]); printf("%d/%d = %s\n",n,d,expand(str,n,d));
  return 0;}
いつの間にかバグってやがる欝氏
- for(i=0;i<m;i++){sprintf(buf,"%d",q[i]); strcat(s,buf);} strcat(s,"(");
+ for(i=0;i<c;i++){sprintf(buf,"%d",q[i]); strcat(s,buf);} strcat(s,"(");
833デフォルトの名無しさん:03/04/27 04:00
>>824
最低限、windows.hのインクルードはしてね。
834824:03/04/27 08:30
>> 824
> 単純にforでまわすと絵が崩れることがあるよ。
Σ(゚Д゚) では、どうすればいいのでしょうか?
> 読み込んだ後どうしたいのか書いてくれないと。
bit/pixelを変えて保存したいのです。 でも、表示もしたいです。
環境はMS-DOSかLinuxがいいな〜。

>> 833
Windowsに依存したくないんです。
>>834
MS-DOSかLinuxで点を打つ事はやったことはあるの?
>>824
Windowsに依存したくないなら、bmpの構造関係を全部自前で宣言しないとねぇ。
xvみたいなソースの公開されているViewerのソースを見るのが一番早いんじゃない?
837デフォルトの名無しさん:03/04/27 11:43
hです。
制すうちを入力しshort型の変数に格納した後
この変数の内部表現をビット列で表示するプログラムを作成せよ・・・
という課題がでました。

integer=>1
0000000000000001
integer=>-2
1111111111111110

といった感じで表示するってとこまでは分かったけど・・・
実際のプログラムが分かりません。どうしよう・・・tt
>>837
unsigned short a;
for(int i=0;i<16;i++){
 printf("%d",(a>>15)&1);
 a<<=1;
}
839824:03/04/27 12:44
>> 835
ないです。 MoveTo()とLineTo()でならあります。 恐ろしく効率が悪いですが。

>> 836
824の「//こーぞーたいの宣言はWindowsとおんなじ」の部分に
typedef struct BITMAPFILEHEADER{
unsigned intFileType;
unsigned longFileSize;
unsigned intReserved1;
unsigned intReserved2;
unsigned longOffset;
}BITMAPFILEHEADER;
840824:03/04/27 12:45
typedef struct BITMAPINFOHEADER{
unsigned longStructureSize;
longBitmapWidth;
longBitmapHeight;
unsigned intPlaneCount;
unsigned intBitCountPerPixel;
unsigned longCompressionType;
unsigned longImageSize;
longXPixelPerMeter;
longYPixelPerMeter;
unsigned longColorTable;
unsigned longImportantColor;
}BITMAPINFOHEADER;

typedef struct RGBQUAD{
unsigned charBlue;
unsigned charGreen;
unsigned charRed;
unsigned charReserved;
}RGBQUAD;

typedef struct BITMAPINFO{
BITMAPINFOHEADERBitmapInfoHeader;
RGBQUADRGBQuad[1];
}BITMAPINFO;
こんな感じで宣言してあります。
841824:03/04/27 12:57
>> 824
LinuxのGraphicViewerですね。 Linux系は
ttp://lss.eternity.ne.jp/
ttp://www.sourceforge.net/
等で落としてきてソースを見ているのですが全然理解できないんです。
いや、もちろん私がおたんちんなのがいけないんですけど・・・。
>>841
ImageMagic の corders/bmp.c の方が作りは素直かも
>>834
レス番つけるときに">>"のあとにスペースは入れないでくれ。

スピード上げたいんなら、ヘッダ読んだ後にデータ自体もファイルから
freadでメモリ上に全部まとめて読み込んで、
あとはそこからデータを読むようにしたほうがいい。

1ラインが4の倍数になるってことから、1ラインごとのバイト数が計算できるから、
それでアクセスすべきアドレスは計算できる。
1ラインのバイト数=((1ラインのピクセル数*ピクセルごとのビット数/8-1)/4+1)*4

変換するのと表示するのは別問題だから、
とりあえず環境依存のない変換だけをやってみたほうがいいよ。
>>837
課題の度に聞くのであれば、ばれるだろうけど?
845デフォルトの名無しさん:03/04/27 16:03
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
  int i, j, ransuu, ni[8];
  srand ((unsigned)time(NULL));/* 異なる乱数を得るため */
  for (i=0 ; i<10 ; i++) {
    ransuu = rand() / 32768.0*256;/* 0〜255までの乱数指定 */
    j = 8;
    do {
      j--;
      if (ransuu%2 == 1) {
        ni[j] = 1;
      }else {
        ni[j] = 0;
      }
      ransuu = ransuu/2;
    }while (ransuu > 0);

    for (j=j ; j<=7 ; j++) {
      printf ("%d", ni[j]);/* 2進数表示 */
    }
    printf ("\n");
  }
}

乱数を求めて二進数に変換するプログラムなんですけど、8ビットにそろえたいのですがうまくいきません。
(↑のプログラムだと乱数が10の場合、1010が表示される。そうじゃなくて00001010にしたい)
どのようにすればうまくできるでしょうか?。
}while (ransuu > 0);を
}while (j > 0);
847845:03/04/27 16:31
848845:03/04/27 16:34
↑まちがえました。

>>846
ありがとうございます。
何だか難しいことを考えていたのですが、そんなに簡単なことだったなんて(泣)
精進します。
っていうか、2進文字列化する部分は関数にしようよ。
ていうか配列なくてもできるでしょ。
for (i=1<<7; i>0; i<<=1)
putchar(ransuu&i ? '1' : '0');
851845:03/04/27 17:12
>>849
>>850
なるほど。改良してみます。
>>850 ビット処理使ったこと無いから分かんないけど、なんかかっこいい。
これを機に勉強してみよ。
微妙に間違ってるから要注意。
/* char *sに整数nを幅wになるようゼロパディングしてb進法で書く */
/* b<1 || 36<b || w<1 のとき何もせずNULLをその他の場合sを返す */

#define DIGITCHAR "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
char *
int2str(char *s, unsigned int n, int b, int w)
{
  if (b < 1 || 36 < b || w < 1) return 0;
  s[w] = '\0';
  while(n || w>=0){s[--w] = DIGITCHAR[n%b]; n/=b;}
  while(w >= 0) s[w--] = '0';
  return s;
}
b == 1だと・・・
b < 2 じゃないと駄目でつね。とほほ
857デフォルトの名無しさん:03/04/27 20:33
すみません教えてください。

int型の配列の中に数字を代入しているのですが
(例) hairetu[5] = {5,4,3,2,1};
これを一つの変数のなかに代入したいんです(ファイルに出力したい為)
(例) hitotu = 54321;
どうしたらできますか?
>>857
なんで配列に入れるとファイルに出力できないの?
>>857
? 何がやりたいのかわからんが、こうか?

int ret=0;
for(int i=0; i<5; i++)
{
ret+=hairetu[i];
ret*=10;
}
あ、間違えてた
まずは素朴に書いてみる。
hitotu = 0;
hitotu += hairetu[0]*10000;
hitotu += hairetu[1]*1000;
hitotu += hairetu[2]*100;
hitotu += hairetu[3]*10;
hitotu += hairetu[4];
>>861
0なんか代入しないで最初の+=を=にすればいいじゃん。
int ret=1,hitotu=0;
for(int i=4; i>=0; i--)
{
hitotu+=hairetu[i]*ret;
ret*=10;
}
hairetu[5] = {5,4,3,2,1}; をhitotu = 54321; にしようとするのが激しく謎だ。
>>862 そうだね。
#include <math.h>
    ・
    ・
for(int i =0; i < 5; i++) {
 hitotu += hairetu[0] * pow( (double)10, (double)(4-i) )
}
とか考えたけど、>>863で十分なんですな。勉強になります。
>>863
こんな処理ごときで、変数を2個 (for の制御変数を入れると3個) も使わんとできんのか ?

int hitotu = 0;
for(int i = 0; i < 5; i++){
 hitotu = 10 * hitotu + hairetu[i];
}

(と言うか、これって定石じゃないのか ?)
math.hさえきちんとインクルードしておけばキャストは必要ないな。

Cでも通る書き方でかけよC++厨
これぐらい自分で変換しろ
スペース削減でしょう。
Cに直すのは一瞬で可能でしょう。
だいたい何処にもCで書けなんて言ってなかったよC厨
871デフォルトの名無しさん:03/04/27 21:09
皆さんありがとうございます。解決しました。
なんでそんな事したのかの謎に答えてから帰れー。
まぁ宿題なんてそんなモンなんだよね。
>>870
どこにも書かれていないからこそだよ。
Cでやっていたらコンパイルできないよって言ってくるだろう。
初  心  者  は
すみませんでした
875857:03/04/27 21:26
先ほど質問したものなのですが、ちょっと不具合が出たのでもう一度質問させてください。すみません (..)

配列のなかが
hairetu[5] = {5,4,3,2,1}; の場合はうまくいくのですが、
hairetu[5] = {0,0,6,7,8}; とかゼロが入っていると「678」と出力されてしまいます。
「00678」と0も表示させたい場合はどうすればよいのでしょうか?
>>875
fprintf(fp,"%05d",hitotu)
877デフォルトの名無しさん:03/04/27 21:29
>>875
hairetu[5] = {0, 0, 6, 7, 8}
のhairetuをpaiotuと書き換えてみてください
878デフォルトの名無しさん:03/04/27 21:34
独習C++の中にあったある例題がさっぱりわからないのですが、
ここに書いても大丈夫でしょうか?
for(i=1;i<int(log10(kekka));i++)
printf(" ");
880デフォルトの名無しさん:03/04/27 21:36
大丈夫
881857:03/04/27 21:37
>>876-877
ありがとうございます(^-^)
>>875
なんか、文字列に変換した方がいいのでは...。

for(int i = 0; i < 5; i++){
 fputc(hairetu[i] + '0', fp);
}

つーか何のためにこんなことが必要なのか書けよ。
>>881
paiotu
884857:03/04/27 21:41
>>882
宿題です。ごめんなさい(;;)
>>884
宿題の意図するところを勘違いしていないか? なんかおかしい。
>>884
とりあえず宿題の問題を全部ここにコピペしる!
887デフォルトの名無しさん:03/04/27 21:44
>>885
じゃあ、お前はなんのためにこのスレに書き込んでんの?
宿題の問題 生きたまま2chを掛け抜けろ
889878:03/04/27 21:47
#include <iostream>
#include <cstdlib>
using namespace std;

class list {
public:
list *head; // リスト先頭へのポインタ
list *tail; // リスト末尾へのポインタ
list *next; // 次項目へのポインタ
int num; // 格納される値
list() { head = tail = next = NULL; }
virtual void store(int i) = 0;
virtual int retrieve() = 0;
};

// キュー型リストの作成
class queue : public list {
public:
void store(int i);
int retrieve();
};

890878:03/04/27 21:48
void queue::store(int i)
{
list *item;

item = new queue;
if(!item) {
cout << "メモリ割り当てエラー\n";
exit(1);
}
item->num = i;

// リスト末尾に置く
if(tail) tail->next = item;
tail = item;
item->next = NULL;
if(!head) head = tail;
}
891878:03/04/27 21:48
int queue::retrieve()
{
int i;
list *p;

if(!head) {
cout << "リストは空です\n";
return 0;
}

// リスト先頭から取り除く
i = head->num;
p = head;
head = head->next;
delete p;

return i;
}
 
あまりにも長いので一部だけ載せます。
//リスト末尾に置く というところから何がどうなってどうなるのか、さっぱりわからないのです。
どなたかアドバイスお願いします。
>>887
わかんね? なんでだ?
>>889
何年制の何年目でこの問題が出されるの?
894878:03/04/27 21:51
>>893
いえ、>>878で書いたとおり参考書の例題なんです。
俺はC++初めてそろそろ二ヶ月というところです。
if(tail) tail->next = item; //最後にデータが入っていれば、その次にいれる(上書きし無いように)
tail = item; //tailに item(データのある所の最後)のアドレスを代入
item->next = NULL; //item(=tail)の次にNULLを代入
896デフォルトの名無しさん:03/04/27 21:58
>>894
ごめん。相手間違えた
>>894
ついでに聞くと二が月前からCの知識はありました?
898895補足:03/04/27 22:01
>item->next = NULL; //item(=tail)の次にNULLを代入(NULLが末尾を保持(表す))
>>878
何ページ?
>>892
は?
901878:03/04/27 22:06
>>895
ありがとうございます。
しかし、なんとも頭がこんがらがっちゃいます…
なんと言ったらいいのでしょう。言葉では説明しにくいのですが。
tail->next や item->next でどうして次を指すのか、というのがスデにわからなくて…
>>900
>>885の意図するところを勘違いしていないか?なんかおかしい。
903878:03/04/27 22:07
>>899
3版でしたら336、改訂版でしたら328です。
904878:03/04/27 22:09
>>897
はい、Cは一通りやったつもりです。
俺も良くわからないや。
多分,頭だけじゃなくて、紙に書いたりして考えるのもいいだろうね。
問題はどんな図を書くべきかだ。
>>889
最初はheadとtailにitemを入れておく。
次からはheadは変えずにtailにitemを入れる。
ただし前のtailのnextにもitemを入れる。

headからnextをたどっていってtailまで届くようにしてる。
tailのnextには終端をあらわすNULLを入れる。
>>902
ごめんよ
908878:03/04/27 22:13
>>905
ありがとうございます。
紙ですか〜試してみます!
909895:03/04/27 22:16
最初は図を書くと良い(next,data,adress,etc.)
イメージで覚えてしまうとなかなか忘れないし。
*nextは、常にデータのある次のアドレスの部分を指す為に使う、など、
(通り道、行き先等簡略して良い)
意味をしっかり捉えてから進めた方が良い。
address □ ここに保持される値の特徴は?
data  □ こっちは?
next  □ さらに、こっちは?
とかね(上の四角の中から矢印を出して次の部分に繋げたり、擬似的にデータをいれてみたりする)。
910878:03/04/27 22:16
>>906
うっすらとわかってきたような気がしてきました。
head,tailを使うクラスとnextを使うクラスを
分けて考えたほうが解りやすいかもしれんね。
跳ね返りのプログラムができないよー。
教えてください。
if(x<0||800<x)
 dtx=-dtx;
if(y<0||600<y)
 dty=-dty;
914デフォルトの名無しさん:03/04/27 22:33
Cの方が単価が高いのになんでJAVAから入って終わる人が多いの?
なんの宿題?
上のhead, tailとかnextとかって要は線形リスト(というかチェインというか)だよね?
リスト全体を大きな一直線のジグソーパズルとして、リストの要素をパズルのピースとすると、
(暇だったら図書いてみるといいかも?)

ジグソーパズルのピースには、はめるためのでっぱりと、はめられるためのへこみがある。
この例題の場合、そのはめるためのでっぱりがnextにあたるかと。

パズルに言い換えれば、nextってのは自分がどのピースと繋がってるかを表すものかと。
例えば、AっていうピースがBっていうピースにはまってたとしたら、
Aのデッパリ(next)にはBへのポインタが入ってる。

こうしておけば、まず最初に一個のピースを設置して、後はデータを追加する際には
そのピースのでっぱりに新しいピースをはめて、次はその新しいピースのでっぱりに、、、

っていう一直線のジグソーパズルを作ることが出来る。
headとtailってのはそれぞれ先頭と末尾のピースへのポインタ。

実際にデータを追加する時には、tailを参照するとパズルの一番最後のピースが分かるから、
そのピースのでっぱりに新しい要素をはめる、ってイメージじゃないかな。

で、headとtailっていうのは最初と最後のピースへのポインタだから当然要素がなければNULLだし、
パズルの一番最後にピースをくっつける時(つまりは要素を追加する時)は当然、最後のピースへのポインタ(tail)は変えなきゃいけないし。
もちろん最後のピースは何も繋がってないからnextはNULLだし。

その例題はそういうことじゃないの?
ていうか変にかみ砕きすぎて意味がわからない文章になった。。
全く見当違いのこと書いてたら&無駄な長文スマソ
917まりも:03/04/28 00:30
はじめましてこんにちわ、いま、VCでCOM(ATLウイザード)で
作ったCOM(DLL形式、タイプライブラリ)をVBから
つかっているのですが、現在つかっているCOM別に新たに
COMを作って、C++でいう継承をしたいのですが、
簡単に説明すると
新規で作ったCOMクラスBとしてC++でいう
基本クラス、現在つかっているCOMをAとしてC++で言う派生クラス
(ちなみにA,BもおなじATLウィザードクラス?なかにつくります。)

class A : public B
{
 インターフェイス関数 drawA
}
class B{
インターフェイス関数 drawB
}
//したい事
A *tmp;
tmp = new A;
tmp->drawB(); ←というようにしたいのですが。

どうもうまくいきません。
どうも、インターフェイスのインプリメントとなるメニューを発見して
実行しました。VCのクラスビュウでは、ちゃんと、Bのインターフェイス
がAのクラスにはいっているのですが、VBから呼び出した場合
インターフェイスの関数名がでません。(メンバ一覧にのっていません)
うまく説明できてないところがありますが、どなたかご存知な
方おしえてもらえないでしょうか?よろしくお願いします。
918デフォルトの名無しさん:03/04/28 03:23
処理系依存しないでミリ秒取りたいんだけどどうやればいいの?
Windowsではそれっぽいのがあるみたいだけど。
ない
920878:03/04/28 07:03
おはようございます。
先日は色々ありがとうございました。
ほぼ徹夜状態で考えてたのですが、また色々混乱してきまして…
実際にstore()を呼び出す時は
for(i=0;i<5;i++){
//...
store(i);
}
こんな感じで呼び出されるわけですが、
これってどんどんlistクラスを生成してる そんな感じで捕らえてよいのでしょうか?
921デフォルトの名無しさん:03/04/28 10:21
int main(void)
{

char str[] = "words";
char *ptr = str;


以上のような変数宣言をしたときの

・ポインタ変数のアドレス
・ポインタ変数に格納されている値
・ポインタ変数が参照する配列変数の先頭アドレス
・ポインタ変数の参照先データ

をそれぞれポインタ変数を用いてポインタの位置を
文字数分まで1つずつ進めながら16進数で確認するプログラムを作れって
言われました。
16進数なら %x を使うと思うのですが?
「思うのですが?」何やねん(w
923デフォルトの名無しさん:03/04/28 10:33
「思うのですが」できません
できないことはないだろ。
int main(void)
{
 char str[] = "words";
 char *ptr = str;

 while (*ptr) {
  printf("%p, %p, %p, %c\n",
      &ptr, //・ポインタ変数のアドレス
      ptr, //・ポインタ変数に格納されている値
      str, //・ポインタ変数が参照する配列変数の先頭アドレス
      *ptr); //・ポインタ変数の参照先データ
 }
}
>>925
無限ループ...。
927デフォルトの名無しさん:03/04/28 11:24
実行したらとまらねー
実行するなよw
>>925
%pでの表記方法は処理系依存

>>921
> 16進数で
>>929
そもそも処理系非依存でポインタを16進表示なんかできないよ。
931929:03/04/28 11:35
>>930
うん。
>>920
store()が>>878だとすれば間違っちゃいない
ただし生成しているのはlistクラスではなくlistクラスのインスタンス
>>930 そうだな
ttp://www-ccs.ucsd.edu/c/types.html#Pointer%20Types
> No relationship exists between the representations of pointer types and
> integer or floating-point types.

もっとも>>921がどういう前提で課題を出されたかはしらんが。
>>918 ttp://www.catnet.ne.jp/kouno/c_faq/c19.html#37
POSIX.1ならnanosleep()がある。
for(; *ptr; ptr++)
printf("%x %x %x %x\n", (int)&ptr, (int)ptr, (int)str, (int)*ptr);
936デフォルトの名無しさん:03/04/29 00:20
次の英文が格納されているファイルdean_msg.txtを開き、
読み込んだデータを単語ごとに分割し、1単語ごとに'[}'で囲んだ上で
標準出力へ各行に1単語ずつ書き出すプログラムを作成せよ。
ただし、データはgetc()を用いて1文字ずつ読み込み、空白、改行が現れたら。
そこまでを1つの単語とする。
このとき','および'.'は読み飛ばすこと。

ちなみに英文は以下です
Every student has been admitted to this University with an unshakable
BELIEF and HOT PASSION. I believe that not only the beautiful nature
of Iwate, but also advanced study enveronment and excellent professors
will support and guide students to realize their HOT PASSION. We have
many laboratory classes for students to realize and improve their real
abilities.
937デフォルトの名無しさん:03/04/29 00:24
で、以下のように考えたんですが
頭文字が出力されない
改行の後の単語が出力されない
'.'','が省けないんですがどこがまずいんでしょうか?

int main()
{
FILE * fp;
char a[100], c[100];
int i;

fp = fopen("dean_msg.txt", "r");
if(fp == NULL){
printf("Cannot open file.\n");
return -1;
}
938デフォルトの名無しさん:03/04/29 00:24
i = -1;
do{
i++;
a[i] = getc(fp);
c[i] = a[i];

if(c[i] == ' ' || c[i] == '\n'){
c[i+1]= '\0';
printf("[%s]\n", c);
i = -1;
}

if(c[i] == ',' || c[i] == '\n'){
c[i] = '\0';
printf("[%s]\n", c);
i = -1;
}
}
while(c[0] = ' ');

return 0;
}
strtok くん使っちゃ駄目界?
おー便利な関数があるんですね。
ありがとうございます。
strtok君使って挑戦してみます。
>>937

int main()
{
char t[100],c;
int i=0;
FILE *fp;

fp = fopen("dean_msg.txt","r");
//エラー処理は省略

while((c = fgetc(fp)) != EOF) {
if(c == ' ' || c == '\n' || c == '.' || c == ',') {
if(i > 0) {
t[i]='\0';
printf("[%s]\n", t);
i = 0;
}
continue;
}

t[i] = c;
i++;
}

fclose(fp);
}

超適当だがこんな感じか?
ってfgetcじゃなくてgetcか、、
942939:03/04/29 01:25
すまんなー。問題見ていると、strtok つかわせまいとしているように
読めた。ごめんよ。
#include <stdio.h>
#define TXT "dean_msg.txt"
int
main(void)
{
  FILE *fp; char c; int i=0;
  if (!(fp = fopen(TXT, "r"))) {perror("fopen(): " TXT); return 1;}
  while((c = fgetc(fp)) != EOF) {
    switch(c) {
    case '.': case ',': case ' ': case '\n': 
      if(i>0) puts("}");
      i = 0; break;
    default:
      if(i++==0) putchar('[');
      putchar(c);
    }
  }
  return 0;
}
944デフォルトの名無しさん:03/04/29 05:14
やらせろ!
getc()で読み込みつーのがあほくさいやね。
getlineくらいつかわせろつーの。
画面上に●が跳ね返るプログラムを作りたいんですけどわかりません
お願いします教えてください。
>946
仕様は細かく丁寧に書こうね。
948946:03/04/29 10:25
●が左上から右下に移動して跳ねかって右上に移動する。
ブロック崩しのボールみたいな感じのプログラムを作りたいんです。
教えて下さいまし。
細かく丁寧にって言ったダロ(゚Д゚)ゴルァ!!
一個のWindowで作るのかそれともUNIXのX11で作るのかはたまた他の媒体で作るのか
移動スピードは機種依存でいいのか一定にするのか
移動コマ数はどうするのか
●の色はどうするのか
反射角はランダムを織り交ぜるのか一定なのか
etc.etc...

そういったことを聞いてるんだYO!
950946:03/04/29 10:47
1個のWindowで、移動スピードは一定で、●の色はそのままで、反射角は一定で
locateを使って作りたいんです。
>>950
コンソール画面でやんの?
952946:03/04/29 11:01
>>951
そうです。
953946:03/04/29 11:28
>>951
そうです。
locateってBASICじゃないのか?
まだはじめて1週間なのでサパーリです。
956新人の宿題:03/04/29 11:55
[問題]
Win32 Platform で動く同一プロセス内の Read/Write Lock クラスを C++ で作りなさい。
その際、Event と CriticalSection オブジェクトだけで構成しなさい。セマフォやミュー
テックスオブジェクトを使用してはならない。
同時に入るスレッドの数、システム状態などには全く依存せず、汎用的に作りなさい。
(但し、システムの限界を越える数(unsigned int の上限値など)の場合はその限りでは
ありません。)

Read/Write Lock とは、複数のスレッドがあるリソース(例えばメモリブロックなど)を
1. Read - Read conflict のときは何もしない
2. Read - Write, あるいは Write -Write conflict のときは待ち合わせ処理をする
という排他制御を言います。
int a,b;
a=2;b=1;
kansuu(int a, intb)
{int koukan;
koukan=a;
a=b;
b=koukan;
}
ポインタを使わない場合、なぜabの値の交換ができないのか
わかりません。
#include <conio.h>

int locate( short, short ) ;

int main( void )
{
int x,y,i;


locate(x,y);
printf("☆\n");


return 0;
}



int locate( short x, short y )
{
COORD dwPos ;
HANDLE hOut ;

dwPos.X = (SHORT)x ;
dwPos.Y = (SHORT)y ;
hOut = GetStdHandle( STD_OUTPUT_HANDLE ) ;

return (SetConsoleCursorPosition( hOut, dwPos ) == 0)? -1: 0;
}
960デフォルトの名無しさん:03/04/29 12:08
Cが一通り(独習Cの内容)終わったので
何か宿題を下さい。おながいします
>>957
Cは値渡しだから、ポインタを使わないと交換関数は作れない。
C++なら&指定で参照渡しになるから交換関数も作れる。
しかし、実装上は単純なポインタ渡しも参照渡しも全く同一のコードになるので、
ポインタ渡しのやり方も覚えて置いて損はない。

また、単純な交換だけが目的なら交換関数とせずにマクロで実現するのも手。
#include<stdio.h>

koukan(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
}
main()
{
int a,b;
a=2;
b=1;
koukan(a,b);
printf("%d,%d",a,b);
}
963デフォルトの名無しさん:03/04/29 12:11
大人の出逢いから ピュアな出逢いまで・・・。
素敵な お相手が貴方を待っています!
もちろん 女性は完全無料です!
http://www.sweet.st
>>957>>961
#define SwapInt(a, b) {int tmp = a; a = b; b = tmp;}
#define Swap(a, b) {a ^= b; b^= a; a^= b;}
> #define Swap(a, b) {a ^= b; b^= a; a^= b;}
これってパイプライン乱しそうで遅くなりそうだよね。
>>964
#define Swap(a,b,type) do{type tmp; tmp=a; a=b; b=tmp;}while(0)
今時defineなんて使うな。(ifdefとかで使う場合を除く)
関数をinlineにしろ。
968アンチconst:03/04/29 12:21
定数定義なら使ってもいいじゃん
っつーか、そもそもCの積もりなんだけどな。
C++だったら最初からテンプレート使うのが当たり前だしね。
#define Swap(a,b) \
{ \
char checker[sizeof(a)==sizeof(b)]; \
char temp[sizeof(a)]; \
memcpy(&temp,&a,sizeof(a)); \
memcpy(&a,&b,sizeof(a)); \
memcpy(&b,&temp,sizeof(a));\
}
>>968
名前空間全体を汚すマクロ定数を使うな
>>970
すげぇ、効率度外視だけど型を問わないと言う点では強力だ。
おかげでわかりました
ありがとうございました。
>>970
なんつーか、char checkerの行がおもしろい。
もしかして常套手段?
>>974
static_assertのC版として使ってみた
別バージョンも思い付いた。 memcpyをつかわない。

#define Swap(a,b) \
{ \
char checker[sizeof(a)==sizeof(b)]; \
typedef struct { char temp[sizeof(a)]; } temp_t;\
temp_t temp=*(temp_t*)&a;\
a=b;\
(*(temp_t*)&b)=temp;\
}
>>974
常識だろ?
糞コード量産厨(w
>>977
まじで!?
>>978
ひどい。 
一生懸命考えたのに・・・
>>979
なにが?
>>981
コンパイルエラーになるかどうかで型(の大きさ)があっているかどうか確かめること。
次スレテンプレです。なんか立てられないので他の人お願いします。


C/C++の宿題やってください。おながいします 5

私はC++房。
今まで1年*ヶ月、ほとんど毎日休まず一生懸命C++を勉強してきた。
ついでに今はJavaと基本情報もやっている。
しかし、全然分からない。宿題はたまる一方だ。
わからない宿題若しくは処理があるのでやってくださいm(_ _)m
4代目: http://pc2.2ch.net/test/read.cgi/tech/1045074808/l50
3代目: http://pc2.2ch.net/test/read.cgi/tech/1041992392/l50
2代目: http://pc3.2ch.net/test/read.cgi/tech/1039772622/l50
宿題手伝いますYO!!: http://pc3.2ch.net/test/read.cgi/tech/1038024989/l50
なんで空白厨が現れたのかと思ったら、1000取りか。
#include<stdio.h>

main(int argc,char **argv,char **envp)
{
echo(envp);
exit(0);
}

echo(char *ss)
{
while (*ss != NULL)
printf("%s\n",*ss++);
}
このプログラムがなんなのかわかりません
環境変数の値を標準出力に吐くプログラム
>>994
envp(というかmainの第三引数)は環境変数のリストだと思う。
Cの標準規格には存在しないけどね。
997デフォルトの名無しさん:03/04/29 13:24
mainでexitって阿呆?
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。