C/C++の宿題を片付け ..
[2ch|▼Menu]
331:デフォルトの名無しさん
07/06/27 00:03:30
綺麗なソースを作ろうと思い、セオリーを守ってる(グローバル変数を極力使わないようにしてる・・・etc)が
実に汚いソースになる。
汚いと分かっていながらどこをどの様に修正すれば良いのか皆目検討つかないから困る。

助けて・・・。

332:デフォルトの名無しさん
07/06/27 00:08:28
>>324
ありがとう
できればもう少し詳しく説明して欲しいです

333:デフォルトの名無しさん
07/06/27 00:17:42
>>331
広域変数は悪じゃない
staticで外部モジュールから参照できないようにするとか
きっちり管理さえすれば忌み嫌うものではない
むしろ広域変数を無理に避けようとして余計マズい設計になることの方が、本来避けるべき

>>332
これ以上詳しく説明しろといわれてもな
Cで使ってる以上は、constにさえ気をつければ初期化も代入もそんな大層な差はない
C++だとまた話が変わってくるんだけど
具体例見るのが一番手っ取り早いから、いろいろ調べてみ

334:デフォルトの名無しさん
07/06/27 00:18:49
>>308 1と2をとりあえず先に
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

335:332
07/06/27 00:26:28
>>333
わかりました
色々ありがとうございました!


336:331
07/06/27 00:28:34
>>333
うん。
今日、指摘された。
staticのスコープは定義された箇所のみが有効範囲だよね?
でもアドレス渡ししたらスコープ外の場所でも値を書き換えたり出来る?

多分、出来たとしてもやっちゃ駄目なんだろうけど・・・。




337:デフォルトの名無しさん
07/06/27 00:38:00
どうでもよいが>>331よ。それは宿題の話なのか。
C言語に関する一般的な相談事ならスレ違いだぞよ。

338:デフォルトの名無しさん
07/06/27 00:41:11
>>336
そう、staticは参照の範囲を同一のファイル内だけに限定できる。
そして、指摘の通り

int g_data = 0;  // 広域変数
int *getGlobal(void) { return &g_data; }

みたいなのも、手法としてはある。
利点は、広域変数をモジュールの中に置ける事で、Cでオブジェクト指向もどきな設計ができること。
反面、C++のgetterと違ってポインタを取得できてしまうから、それを通じて外から値を書き換えてしまうこともできる。
でもgotoと一緒で使いどころさえ間違えなければ大丈夫。

339:デフォルトの名無しさん
07/06/27 00:52:26
>>320
再帰で(3)
int arr_max_pos(int arr[], int n){return n?arr[n-1]>arr[arr_max_pos(arr,n-1)]?n-1:arr_max_pos(arr,n-1):0;}

340:デフォルトの名無しさん
07/06/27 00:57:16
>>320 (1)
int div_pow(int n,int p){return n%p?0:div_pow(n/p,p)+1;}
int div_quo(int n,int p){return n%p?n:div_quo(n/p,p);}

341:デフォルトの名無しさん
07/06/27 00:59:12
>>308
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)

342:デフォルトの名無しさん
07/06/27 06:44:44
関数内で宣言したstatic変数(下の例ではa__)を自在にいじりたいなら…
下品だけどねw

static int a;

int hoge(){
  static int a__ = 123;
  a = a__;
  return(0);
}

int getglobal(){
  a+=10;
  return(a);
}

int main(){
  hoge();
  printf("%d", getglobal());
  return(0);
}

343:デフォルトの名無しさん
07/06/27 06:50:26
意味分らん

344:デフォルトの名無しさん
07/06/27 07:25:54
[1] 授業単元:数値計算
[2] 問題文(含コード&リンク):
以下の式のおいて、刻み幅が0.2のときの解析解をオイラー法で求めよ。

y(0)=0 y'(0)=0
y'=z
z'=-z-2y+cosx

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン: gcc-2.95
 [3.3] 言語: C、C++どちらでも良い
[4] 期限:6/27
[5] その他の制限:

お手上げ状態です。よろしくお願いします。

345:デフォルトの名無しさん
07/06/27 08:43:25
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 多次元配列
次の表は今年の全日本大学野球選手権における
早稲田大学の試合結果である。

2回戦 1 2 3 4 5 6 7 8 9
 早稲田大 0 0 1 0 1 0 0 0 0
九州国際大 0 0 0 0 0 0 0 0 1
準々決勝
 早稲田大 0 5 4 0 0 0 0 0 7
関西国際大 0 0 0 0 3 0 0 0 0
準決勝
  創価大 1 0 0 0 0 0 0 0 0
 早稲田大 6 0 0 1 0 1 0 2 0
決勝
 早稲田大 1 0 0 2 0 0 1 0 0
  東海大 0 0 0 0 0 1 0 0 0
それぞれの試合について各回の得点と失点(表裏ではないので注意)を 2×9の2次元配列に格納するものとする。
試合分のデータがあるので、4×2×9の3次元配列scoreを用意して、得失点を配列の宣言と同時に初期値として格納しなさい。
また以下の内容を計算して出力しなさい。
4試合の平均得点と平均失点
各回ごと(1から9回)の4試合の平均得点と平均失点
多次元配列の要素を参照するには‥多重ループを使う
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: visual studio 2005
 [3.3] 言語: C [4] 期限:来週まで
[5] その他の制限: 特になし
お願いします


346:デフォルトの名無しさん
07/06/27 09:11:52
クソ簡単やないか
なめとんか

347:デフォルトの名無しさん
07/06/27 09:15:34
>>344
y' = z とう条件は不要なんじゃないかと思うが

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

#define N 100

double f(double y, double z)
{
 return -z - 2.0 * y + cos(y);
}

int main(void)
{
 double y[N], z[N], dx = 0.2;
 int i;

 y[0] = z[0] = 0.0;

 for (i = 0; i < N; i++) {
  y[i] = y[0] + i * dx;
  z[i + 1] = z[i] + dx * f(y[i], z[i]);
  printf("y = %f, z = %f\n", y[i], z[i]);
 }

 return 0;
}

348:デフォルトの名無しさん
07/06/27 09:20:12
>>347
師匠。

349:デフォルトの名無しさん
07/06/27 09:23:34
やべえ
 double y[N], z[N], dx = 0.2;

 double y[N + 1], z[N + 1], dx = 0.2;
に直しておいてくれ。

あとf()のcos(y)は題意ではcos(x)になっているが間違いだよな?

350:デフォルトの名無しさん
07/06/27 09:24:42
問題には cosx ってあるが cos y で宜しいんかな?

351:デフォルトの名無しさん
07/06/27 09:27:55
cos x だったとしたら解けん。

352:デフォルトの名無しさん
07/06/27 10:40:57
>>319
#include <stdio.h>
int mycmp(char *m1 ,char *m2)
{
while (*m1 != '\0')
if(*m1++ != *m2++)
return 0;

if(*m1 == *m2)
return 1;
}
int main(int argc, char *argv[])
{
char m1[256], m2[256];
FILE *fp;
fp = fopen(argv[1], "r");
fgets(m1,256,fp);
fgets(m2,256,fp);
fclose(fp);
if(mycmp(m1, m2))
puts("yes");
else
puts("no");
return 0;
}
エラー処理はしてないにょ。動かしてもいないけど、これ以上は自分で。
ちゃんと授業を受けるか、さもなくばIT関連の就職先はあきらめろ。


353:デフォルトの名無しさん
07/06/27 11:36:26
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
「在庫問題」
ある倉庫を考える。この倉庫は営業開始時において、毎日Sトンの初期在庫量を有する。1日の注文量rが確率的に発生するとき、営業終了時間の最終在庫量(S>rの場合)、不足量(S<rの場合)とする。
注文量rが正規分布N(100,20^2);すなわち平均100、標準偏差20の正規分布に従う乱数と仮定する。

平均100、標準偏差20の正規分布に従う乱数は以下で求められる。
0以上、1以下の一様実数乱数をUiとする。それを次式に代入することによって、標準正規乱数Xとなる。
X=U1+U2+……U12-6
Xを次式に代入することによってY(標準偏差20の正規分布に従う乱数)となる。
Y=20X+100

維持費:1トンにつき120円(最終在庫量に対して)
品切損失:1トンにつき180円(不足量に対して)
補充経費:1回につき15000円(補充量に依存せず)
総経費:維持費+品切損失+補充経費

(1)補充発注に関して、自分の採用した決定方法を述べよ。
   これは、
   2日目以降の初期在庫量が毎回200トンになるようにする。
   例えば、第一日目の初期在庫量が125トンだから、その日の注文量が100だとすると125−100=25で最終在庫量25トンだから、その日の
   補充量は200−25=175で175トン発注するというふうにする。
(2)そのような補充を行い、1000日間の、初期在庫量、最終在庫量、補充量、総経費について、1日あたりの平均値を求めよ。
   なお、第一日目の初期在庫量を125トンとする。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] コンパイラ名とバージョン: borland
 [3.3] 言語: どちらでも可
[4] 期限: 2007年06月28日12:00まで
[5] その他の制限: なし

度々すいませんm(__)m

354:デフォルトの名無しさん
07/06/27 13:07:42
[1] 授業単元:プロC
[2] 問題文(含コード&リンク):
1.まず、 pwd を実行し、成功すれば、 ls を実行する。
ただし、コマンドライン引数はすべてls にそのまま渡すものとする。
2.オプション -c があれば、 date を実行し、その後、 cal を実行する。
オプションを指定しなければ、 date だけを実行する。
ただし、オプション -z timezone があれば、 環境変数TZの値をtimezoneに設定して、各コマンドを実行する。
3.findコマンドを呼び出して、指定されたディレクトリ
(複数可。指定がない場合は、カレントディレクトリ)
以下にあるディレクトリ(指定されたディレクトリ自身も含む)を表示する。
↓サンプルプログラム
pwdを実行し、成功すれば、その後、ls -lを実行するプログラム
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS:Vine Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:来週まで
[5] その他の制限:なし

よろしくお願いします。

355:デフォルトの名無しさん
07/06/27 13:35:02
[1] 授業単元:アルゴリズム論
[2] 問題文(含コード&リンク):
 インサートソートに関する問題
 左からつめる方式の昇順アルゴリズムである次のソートプログラムを、右からつめる
降順に書き直せ。
ソートプログラム
 URLリンク(kansai2channeler.hp.infoseek.co.jp)
 inp1.datというファイルには、20個の2桁の整数が入っているものとする。
[3] 環境
 [3.1] OS:Windows XP
 [3.3] 言語:C言語
[4] 期限:6月28日(木)まで

 お願いします


356:バケツ
07/06/27 13:50:59
[1] 授業単元:C言語演習2
[2] 問題文(含コード&リンク):
バケツ法-並び替え(詳細は後述)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ:gcc
 [3.3] 言語:C
[4] 期限: できれば早いほうがいいです。
[5] その他の制限: 特にありません

357:バケツ
07/06/27 13:53:03
aka
ao
kuro
これら三つのデータをアルファベット順に並び替える。
この場合、akaの後ろには半角スペースが1つあり、
aoの場合は2つあると考えて並び替える。

1  2  3  4
ao ao aka ao
aka aka ao aka
kuro kuro kuro kuro

優先順位としては
スペース>アルファベットです。


358:バケツ
07/06/27 13:55:07
1は語尾の文字列に焦点を合わせ、
2は前から三番目、3は前から二番目、4は頭文字に焦点を合わせて並び替える。

説明すると、1ではaoはスペース、akaはスペース、kuroはoなので
上記のような順になる。

このようにして最終結果(頭文字の並び替え)がでるまでこの作業を繰り返し、
出力する。

説明不足かもしれませんが、よろしくおねがいします
katori
nakata
murata
hanada
sakata
tanaka
を配列の要素として作成してください。

scanfを用いて作成してもらってもかまいません。

359:デフォルトの名無しさん
07/06/27 14:00:26
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
 次のプログラムをユーザー関数を用いて、階層化せよ。
 URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS:WindowsXP
 [3.3] 言語:c言語
[4] 期限:6月28日(木)

 リンク先のプログラムは一つ前の問題を自分で書いたものですが、
コンパイルできることを確認しています。
 よろしくお願いします。

360:TKO48
07/06/27 14:20:23
ゲーミング
今回からあつかう問題は営業時間から翌日の営業時間の間の補充量を
可変とし、補充量決定方法をけんとうする。
もっとも単純な考え方として@営業終了時の最終在庫量A経費の合計
から翌日の初期在庫量(補充量)を決定
ただし、今回は補充発注1回ごと(補充量によらない)に一定の経費を
支払うものとする

発注する経費は以下のとうりである
維持費:1tにつき120円(最終在庫量にたいして)
品切れ損失:1tにつき180円(不足量にたいして)
補充量:1回につき15.000円(補充量によらない)




課題
 注文量が正規分布N(100,20^2);すなわち平均100,標準偏差20
の正規分布に従う乱数と仮定し、毎の補充量を入力することで1000日間
の経過を調べる。
(1)補充発注に関して自分の採用した決定方法を述べよ。
(2)そのような補充を行い、初期在庫量、最終在庫量、補
   充量、総経費について、1日あたりの平均値を求めよ。なお、第1日の
   初期在庫を125tとする。


お願いします。。。(´・ω・`)


361:デフォルトの名無しさん
07/06/27 15:03:15
>>353
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int xrand()
{
    double i, x = 0;
    for (i = 1; i <= 12; i++)
        x += (double)rand() / RAND_MAX;
    return 20 * (x - 6) + 100;
}
int main(void)
{
    double fstock_sum = 0, estock_sum = 0, supply_sum = 0, cost_sum = 0;
    int i, stock = 125, supply;
    srand(time(0));
    for (i = 0; i < 1000; i++) {
        fstock_sum += stock;
        stock -= xrand();
        cost_sum += (stock > 0 ? 120 : 180) * abs(stock) + 15000;
        if (stock < 0) stock = 0;
        estock_sum += stock;
        supply = (stock > 200 ? 0 : 200 - stock);
        supply_sum += supply;
        stock += supply;
    }
    printf("平均初期在庫: %g\n", fstock_sum / 1000);
    printf("平均最終在庫: %g\n", estock_sum / 1000);
    printf("平均補充量 : %g\n", supply_sum / 1000);
    printf("平均総経費 : %g\n", cost_sum / 1000);
    return 0;
}

362:308
07/06/27 16:00:14
>>341
ありがとうございます。危うく最後の動画のコメントの奴そのままで出しそうでした。

363:デフォルトの名無しさん
07/06/27 16:05:52
>>353
>>361
ありがとうございます!m(__)m
本当に悪いんですが、補充発注を1日置きごとすることは出来ませんか?
すいません…
1日目にしたら、次は3日目、次は5日目というふうに


364:デフォルトの名無しさん
07/06/27 16:07:05
>>360
>>353と同じ問題だな。
>>353は(1)について、補充方法を自分で書いている。その場合の解が>>361ね。
君はどうしたいのかな。それも回答者に決めて欲しいの?

365:デフォルトの名無しさん
07/06/27 16:13:15
>>363
- int i, stock = 125, supply;
+ int i, stock = 125, supply, f = 0;
-----------------------------------------
        estock_sum += stock;
+       if (!f) {
            supply = (stock > 200 ? 0 : 200 - stock);
            supply_sum += supply;
            stock += supply;
+       }
+       f = !f;
    }



366:デフォルトの名無しさん
07/06/27 16:25:30
これの戦略を無駄に考えてみたけど、
一切補充しないという、
ずっと品切れ作戦が実装の楽さの割りに結構いい感じという結論が出た。

367:デフォルトの名無しさん
07/06/27 16:43:31
>>365
早速ありがとうございます!
助かりました

368:デフォルトの名無しさん
07/06/27 17:03:56
>>367
すまん。補充しない日も補充費を計上してたので修正。
>>366のレスで気づいたw

URLリンク(kansai2channeler.hp.infoseek.co.jp)

369:デフォルトの名無しさん
07/06/27 17:12:05
>>368
ありがとうございます!
こちらこそスイマセンでした

370:デフォルトの名無しさん
07/06/27 17:12:47
さらにすまん。
- cost_sum += 15000;
+ if (supply > 0) cost_sum += 15000;


吊ってくる。

371:デフォルトの名無しさん
07/06/27 17:20:38
二分木を表示するプログラムについて教えてください。

なんらかの木を作ったあと、その木へのポインタを引数にして
木を表示したいと思っています。単純にデータだけを、行きがけ順などで
表示するのではなくぱっと見で木とわかるようなものがいいです。

よろしくお願いいたします。

372:デフォルトの名無しさん
07/06/27 17:31:29
>>370
いえいえ、とんでもないです!
頼んでいるのは私の方なんですから

373:デフォルトの名無しさん
07/06/27 18:45:07
fmod()を使って10進数を2進数に変えたいんです。C++
なかなかうまくいかなくて

374:デフォルトの名無しさん
07/06/27 18:58:52
>>371
graphviz用の入力ファイル(ただのテキスト)を作るのが楽かも
↓みたいな感じで
でも、宿題だとそれじゃ不可かな

#include <stdio.h>
typedef struct node {
    char *label;
    struct node *left, *right;
} node;
void tprint(node *n) {
    if (!n) return;
    if (n->left)
        printf("%s -> %s;\n", n->label, n->left->label);
    if (n->right)
        printf("%s -> %s;\n", n->label, n->right->label);
    tprint(n->left);
    tprint(n->right);
}
int main() {
    struct node tree[] = {
        { "a", &tree[1], &tree[2] }, { "b", &tree[3], &tree[4] },
        { "c", &tree[5], &tree[6] }, { "d", &tree[7], 0 },
        { "e", 0, &tree[8] }, { "f", 0, 0 }, { "g", 0, 0 },
        { "h", 0, 0 }, { "i", 0, 0 }
    };
    printf("digraph test {\n");
    tprint(&tree[0]);
    printf("}\n");
}

375:デフォルトの名無しさん
07/06/27 19:01:31
あの・・・
>>354
をお願いできますか?

376:デフォルトの名無しさん
07/06/27 19:05:51


            ヾヽ'::::::::::::::::::::::::::'',    / 時 .あ ま ヽ
             ヾゝ:::::::::::::::::::::::::::::{     |  間 .わ だ  |
             ヽ::r----―‐;:::::|    | じ て    |
             ィ:f_、 、_,..,ヽrリ    .|  ゃ る     |
              L|` "'  ' " ´bノ     |  な よ     |
              ',  、,..   ,イ    ヽ い う    /
             _ト, ‐;:-  / トr-、_   \  な   /
       ,  __. ィイ´ |:|: ヽ-- '.: 〃   `i,r-- 、_  ̄ ̄
      〃/ '" !:!  |:| :、 . .: 〃  i // `   ヽヾ
     / /     |:|  ヾ,、`  ´// ヽ !:!     '、`
      !      |:| // ヾ==' '  i  i' |:|        ',
     |   ...://   l      / __ ,   |:|::..       |
  とニとヾ_-‐'  ∨ i l  '     l |< 天  ヾ,-、_: : : .ヽ
 と二ヽ`  ヽ、_::{:! l l         ! |' 夂__ -'_,ド ヽ、_}-、_:ヽ




377:デフォルトの名無しさん
07/06/27 19:08:37
>>373
なんでfmod()使わないといけないの?

378:デフォルトの名無しさん
07/06/27 20:04:00
>>359
中途半端になってしまった
URLリンク(kansai2channeler.hp.infoseek.co.jp)

379:デフォルトの名無しさん
07/06/27 20:07:46
>>362 >>308
>>341 の3つめのreturn 0; の前に free(mvt); を忘れとった・・・もう見てへんよな・・・まぁ良いっか・・・
知〜らねっ ^^;

380:デフォルトの名無しさん
07/06/27 20:51:20
fmod()を使うよう指定されました(泣)

381:デフォルトの名無しさん
07/06/27 21:13:32
[1] 授業単元: C言語
[2] 問題文(含コード&リンク): 下記のプログラムで
a[3][3] = {{2.4, -3, 6.1}, {-1.1, 2, 3.5}, {0.5, 0, 3.2}}
b[3][3] = {{1.9, -4.7, 2.5}, {2, 0.9, 5.4}, {2.7, 0.6, 3.5}}
c[3][3] = {{-2, -3.5, 0}, {1.4, 7.3, -1}, {2.1, 0.4, 6.2}}
に置き換えたとき、この要素で与えられる行列を求め出力するプログラムを作成せよ。
#include <stdio.h>
int main(void)
{
int i, j, n;
double b[3][3] = {{3.2, -1.5, 3.9}, {3.8, 4, -1.8}, {1.9, -3, 0}};
double c[3] = {-5, 2.7, 1.5};
double a[3] = {1, 5.1, 6.2};
n = 3;
for (i=0; i<n; i++) {
for (j=0; j<n; j++) {
a[i] +=b[i][j] * c[j];
}
printf("y[%d]=%f\n", i, a[i]);
}
return 0;
}

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: Borland
 [3.3] 言語: C
[4] 期限: 6月30日16:30まで
すみません、よろしくお願いします。

382:デフォルトの名無しさん
07/06/27 22:50:20
>>371 どっかの木構造を解説してるサイトにあったのをパクったやつ
typedef struct tagTree{
    int no;
    struct tagTree *left, *right;
}Tree;

void PrintTree(Bin *root, int depth)
{
    depth++;
    if (root != NULL) {
        int i;
        PrintTree(root->left, depth);
        for (i = 0; i < depth; i++)
            printf("   ");
        printf("%3d\n", root->no);
        PrintTree(root->right, depth);
    }
}

mainで呼ぶときはdepthを0にすればおk

383:デフォルトの名無しさん
07/06/27 22:53:56
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
getchar関数を使用し、コマンドラインからの数字を10回入力し、
入力の中でもっとも大きな数字を表示しなさい。
※入力桁数のエラーについて対処する事

[3] 環境
 [3.1] OS: Windows
 [3.2] コンパイラ名とバージョン: CPAD、LSI C-86 Ver 3.30
 [3.3] 言語: C
[4] 期限: できれば今週中
すみません、どなたか分かる方、よろしくお願いします。

384:デフォルトの名無しさん
07/06/27 22:57:07
>>383
実行例くらい書いてくれ。

385:382
07/06/27 23:00:19
>>382
しまった……
typedef struct tagBin{
    int no;
    struct tagBin *left, *right;
}Bin;
に修正plz

386:デフォルトの名無しさん
07/06/27 23:22:21
>>384
すいません。恥ずかしくてのせてませんでした。
初心者のため、おかしい点等をびしびしあげていただければと思います。

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

void hikaku(int *pX,int *pY);
int main(void){
int x= 0;
int y,i,j;
char str[100];
printf("数字を入力してください。\n");
for(i=1 ; i < 11; i++){
for(j=0; str[j-1] != '\n'; j++){
str[j] = getchar();}
if(j-1 >= 5){
printf("5桁以上は入力桁数エラーです。0にします。\n");}
else{y = atoi(str);
if(y == 0 && str[0] != '0'){
printf("数字以外は入力できません。0にします。\n");}
else {hikaku(&x ,&y);}}}
printf("最大値は%dです。\n",x);
return 0;}
void hikaku(int *pX,int *pY){
if(*pY > *pX){
*pX = *pY;}}


387:デフォルトの名無しさん
07/06/27 23:25:02
>>386
それは実行例じゃないだろ

388:デフォルトの名無しさん
07/06/27 23:26:12
>>386 それができていてなぜ質問したん?w

389:デフォルトの名無しさん
07/06/28 00:19:51
簡単やん

390:デフォルトの名無しさん
07/06/28 00:22:52
>>355
をお願いしたいのですが

391:デフォルトの名無しさん
07/06/28 00:40:33
>>390
while(j>=0 && x[j]>t) { を
while(j>=0 && x[j]<t) { に変更するだけじゃ駄目かな?
inp1.datとか用意するのだるいからまともに見てないけど

392:デフォルトの名無しさん
07/06/28 00:50:17
>>387
すいません、実行例とは何でしょうか?
>>388
自分でここまでは作ったのですが、最初にアルファベットを打ったときなど
特殊な対応が出来ません。また、全く自信がないためです。


393:デフォルトの名無しさん
07/06/28 00:54:23
今、コンパイルが出来ない環境なので確認できないのですが、いまいち右からつめる
降順の解釈の仕方がわからないんです。
左を右に、昇順を降順にしなくてはいけないので、while(j>=0 && x[j]<t) {の変更
だけでは出来ないと思うのですが。

394:デフォルトの名無しさん
07/06/28 00:56:53
>>392
実行例は例えばこのプログラムを実行するとこういう出力になって欲しいんですよ、的な内容。
入力に関しては、一回charに入れた時点で数字かどうか判定すれば?
どの程度のレベルかわからんが、学校授業で4月開始なら上等なレベルかと。



395:デフォルトの名無しさん
07/06/28 01:00:55
>>392 こんなのはどうかな。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int c, max = -1, m, n, nc = 0, f, sign = 1;
    while ((c = getchar()) != EOF) {
        if (isdigit(c)) {
            n = f = 0;
            do {
                if ((m = n * 10 + c - '0') < n) f = 1;
                n = m;
            } while ((c = getchar()) != EOF && isdigit(c));
            ungetc(c, stdin);
            if (f) puts("桁あふれしますた");
            else {
                n *= sign;
                printf("%d\n", n);
                if (n > max) max = n;
                if (++nc == 10) break;
            }
        }
        else if (c == '-') { sign = -1; }
        else sign = 1;
    }
    if (max != -1) printf("最大値: %d\n", max);
    return 0;
}

396:デフォルトの名無しさん
07/06/28 01:10:04
>>393
ああ、右からつめるってそういうことか
単に降順にすればいいだけかと思ってた

めんどくさいからパス。せめてdatファイルがあればなぁ

397:デフォルトの名無しさん
07/06/28 01:16:17
datファイルでなくても、テキストファイルに整数を入れてinp.txtとしても大丈夫だと思うのですが。


398:デフォルトの名無しさん
07/06/28 01:18:19
>>392
ありがとうございます。
10回数字を入力して(ただし、アルファベット、空欄など数字でないやつははじく。また、小数点にも対応する)
桁数は自分で設定し(私のやつは適当に5桁)、最大値を出力する。

>>入力に関しては、一回charに入れた時点で数字かどうか判定すれば?
ずばり、バッファリングの理解が甘く、そこのプログラムが打てず悩んでいます。
分かる方、どうかやり方をご教授願います。

>>392
すいません。書き忘れてしまったのですが、入力の終了はEOFではなく改行でといわれています。


399:デフォルトの名無しさん
07/06/28 01:19:44
>>398
アンカーのつけかたを覚えなさい。全部自分へのレスになってるよ

400:デフォルトの名無しさん
07/06/28 01:21:49
>>398
全て自分に安価する君に惚れたwww
atoi関数に渡す前に
if ( '0' <= str[ j ] && str[ j ] <= '9' ) {
とかでいいんじゃない?
ソースあんま読んでないから、的外れだったらスマソ。

401:デフォルトの名無しさん
07/06/28 01:22:13
>>397
それを用意するのがだるいんだ
まぁやる気が無いだけなんだけどさ

402:デフォルトの名無しさん
07/06/28 01:22:23
>>399
あせってコピペしてしまいました。大変申し訳ありませんでした。

403:デフォルトの名無しさん
07/06/28 01:23:45
>>378
元のプログラムをあまり書き換えないでお願い出来ますか。
注文ばかりですいません。

404:デフォルトの名無しさん
07/06/28 01:28:23
>>400
atoiの前にif ( '0' <= str[ j ] && str[ j ] <= '9' ) {

??????
すいません意味が分かりません。どういうプログラムになるのでしょうか?

405:デフォルトの名無しさん
07/06/28 01:29:31
>>401
無理を言って申し訳ありません。
では、左からつめるを右からに書き換えるにはどうすればいいでしょうか。

406:デフォルトの名無しさん
07/06/28 01:39:11
>>405
左端が0 右端がn-1
今はj=0とかi=1からだんだん加算されていってn-1までループしているのを
n-1から減算していって0までループさせればいい

407:デフォルトの名無しさん
07/06/28 01:47:17
>>355 >>405
for(i=n-2;i>=0;i--) {
t=x[i];
j=i+1;
while(j<=n-1 && x[j]>t) {
x[j-1]=x[j];
j++;
}
x[j-1]=t;
}
てきとー まさかどこと差し替えればいいかなんか聞くなよ?

408:デフォルトの名無しさん
07/06/28 01:49:57
URLリンク(www.infonet.co.jp)
EBCDICでも0〜9は連続したコードに登録されているからおkだお ^ω^

409:デフォルトの名無しさん
07/06/28 01:59:50
>>404
ちょっと無理矢理だけど例えば、str[j] = getchar();に下に次の1文を入れてみる。
if ( (str[j] < '0' || '9' < str[j]) && str[j] != '\n' ) j--;
今回getchar関数によって入力された文字が数字じゃなければ、読み込まなかったことにする。
ただ、改行コードもはじかれちゃうのでそれはOKにしておく。

極力、今のソースに手を加えないで変更しようとしたらこんなのになってゴメン・・・orz

410:デフォルトの名無しさん
07/06/28 02:01:29
>>406>>407
ありがとうございます。参考にさせていただきます。
もうひとつ>>359についてお願いできますか?
>>378さんが答えて下さっているのですが、元のプログラムの値をあまり
書き換えないで欲しいのですが。


411:デフォルトの名無しさん
07/06/28 06:01:56
[1] 授業単元:プログラミング
[2] 問題文:
 URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS:WindowsXP
 [3.3] 言語:c言語
[4] 期限:6月30日(木)


412:デフォルトの名無しさん
07/06/28 08:34:40
>411
(1)
#include <stdio.h>
#include <stdlib.h>

void putchar_n(char c1, char c2, int num){
if(num <= 0){
return;
}
putchar(c1);
putchar_n(c1,c2,num-1);
putchar(c2);
}

int main(int argc, char* argv[]){
if(argc != 4){
return 1;
}

putchar_n(argv[1][0],argv[2][0],atoi(argv[3]));

printf("\n");
return 0;
}


413:デフォルトの名無しさん
07/06/28 08:44:04
>>411
(2)
#include <stdio.h>

int main(){
int i = 0;

for(i = 0 ; i+31 < 126+1 ; i++){
printf("%c %d %o %x\n",i+31,i+31,i+31,i+31);
if(i%8 == 7){
printf("--------------------\n");
}

}
return 0;
}

414:デフォルトの名無しさん
07/06/28 10:10:46
>>409
ありがとうございます。
ただやってみたのですが、例えば「fsa256」や「256faj」などを入れるとそれも256として
反映されてしまいます。
何とかはじく方法があればと思うのですが・・・。

415:デフォルトの名無しさん
07/06/28 10:14:22
>>410ですが、>>378さんの書いてくださったプログラムをコンパイルしてみたところ、
35以上でかつ95未満の要素の数の処理は出来たのですが、countの要素の合計の処理が
0となり、うまく処理出来ませんでした。

416:デフォルトの名無しさん
07/06/28 10:39:07
getcharじゃなきゃだめなの?

417:デフォルトの名無しさん
07/06/28 10:46:53
まあそれはいいとして
atoi使わずに
URLリンク(www.bohyoh.com)
使えば済む話だと思う

418:デフォルトの名無しさん
07/06/28 10:55:29
>>415
main()だけ修正

int main(void) {
    int i, *x, n, size, count[11] = { 0 }, sum;
    setp(&x, array(&size));
    for (set(&i,0); less(i,size); inc(&i)) {
        set(&n,div(at(x,i),10));
        if (less(10,n)) set(&n,10);
        inc(&count[n]);
    }
    for (set(&i,0); less(i,10); inc(&i))
        printf("%3d台: %d\n", mul(i,10), at(count,i));
    set(&sum,0);
    for (set(&i,0); less(i,11); inc(&i))
        set(&sum,pls(sum,at(count,i)));
    printf("countの要素の合計は%d\n",sum);
    if (eq(sum,size))
        printf("総和は正しいです\n");
    else
        printf("総和が違います\n");
    for (set(&n,0),set(&i,0); less(i,size); inc(&i))
        if (and(less(34,at(x,i)),less(at(x,i),95))) inc(&n);
    printf("35以上でかつ95未満の要素の数は%d\n", n);
    return 0;
}

419:418
07/06/28 10:57:07
すまん、化けたか?
int main(void) {
    int i, *x, n, size, count[11] = { 0 }, sum;
    setp(&x, array(&size));
    for (set(&i,0); less(i,size); inc(&i)) {
        set(&n,div(at(x,i),10));
        if (less(10,n)) set(&n,10);
        inc(&count[n]);
    }
    for (set(&i,0); less(i,10); inc(&i))
        printf("%3d台: %d\n", mul(i,10), at(count,i));
    set(&sum,0);
    for (set(&i,0); less(i,11); inc(&i))
        set(&sum,pls(sum,at(count,i)));
    printf("countの要素の合計は%d\n",sum);
    if (eq(sum,size))
        printf("総和は正しいです\n");
    else
        printf("総和が違います\n");
    for (set(&n,0),set(&i,0); less(i,size); inc(&i))
        if (and(less(34,at(x,i)),less(at(x,i),95))) inc(&n);
    printf("35以上でかつ95未満の要素の数は%d\n", n);
    return 0;
}

420:デフォルトの名無しさん
07/06/28 11:02:03
>>414
後から細々と注文をつけるんなら、「正しい入力」を正確に定義汁。
最初に正確に仕様を述べないから、>>1で言う
>・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
の状況に結果的にはなっている。

正規表現で言うと、
^-?[0-9]{0,5}$
以外はエラーと思っていいのかな。
負値はどうする?マイナスの場合の桁数の処理は?スペースも許さない?
00004
は正常?

421:デフォルトの名無しさん
07/06/28 11:30:41
-0や00や-000はどうか?という問題もある。
^(0|[1-9][0-9]{0,4}|-[1-9][0-9]{0,3})$
こうか?

422:デフォルトの名無しさん
07/06/28 12:01:40
>>374>>382

早速のレスありがとうございます。ためしにやってみたのですが、うまくいきませんでした。

できれば、
       1
      /\
    /     \
   2        3
  /\      /\
  4  5     6  7

このように表示できたらいいです。表示するデータは3桁の整数です。

おねがいいたします。


423:デフォルトの名無しさん
07/06/28 12:36:11
[1] 授業単元:プロC
[2] 問題文(含コード&リンク):
コマンドライン引数から十進整数値として解釈できる文字列のみを選び、
値が小さい順に並べ替えて、一行に一つずつ標準出力に出力するプログラムを書け。
ただし、十進整数値として解釈できる文字列とは、正規表現 ^[-+]?[0-9]+$ に
マッチするものとする。
ヒント:小さい順に並べ替えるには、 qsort()が便利です。
こちらも、使い方は、manコマンドで調べることができます。

コマンドライン引数すべてについて、 含まれるアルファベットすべてを対応する大文字に置き換えて、
一行にコマンドライン引数一つずつ標準出力に出力するプログラム。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:今週中
[5] その他の制限: 特になしです

どうかよろしくお願いします。


424:デフォルトの名無しさん
07/06/28 12:44:31
>>419さん、>>378さんのプログラムと変更が無いようなのですが。
コンパイルしても変わりませんでした。

425:デフォルトの名無しさん
07/06/28 12:48:03
>>423
#include <stdio.h>
int main(int argc, char **argv)
{
    FILE *fp = popen("egrep '^[-+]?[0-9]+$' | sort -n", "w");
    while (*++argv)
        fprintf(fp, "%s\n", *argv);
    pclose(fp);
    return 0;
}

426:デフォルトの名無しさん
07/06/28 12:50:09
>>424
もう一度確認してみろ。

427:デフォルトの名無しさん
07/06/28 13:53:21
[1]単元:プログラミング技術
[2]問題文:ローダーのNo.4433にアップしました。
[3]環境
OS:リナックス
コンパイラ:cc
言語:C
[4]期限:できれば本日14時30分ごろまでにお願いします。

どうぞよろしくお願いします。




428:デフォルトの名無しさん
07/06/28 13:54:15
授業単元:C言語
環境:if文・for文・while文・do〜while文・switch〜case文・
OS:Windows
コンパイラ名とバージョン:borland
言語:C
テーマ:文字配列の操作
問題1
文字型の配列変数mojiに設定されている文字数を答えなさい
char moji[] = "ABCDEFG";
実行画面
文字数:7


429:デフォルトの名無しさん
07/06/28 13:55:39
授業単元:C言語
環境:if文・for文・while文・do〜while文・switch〜case文・
OS:Windows
コンパイラ名とバージョン:borland
言語:C
テーマ:文字配列の操作
問題1
文字列を入力して偶数番目の要素数と奇数番目の要素を別の配列に格納し、文字列として表示しなさい
実行画面
文字列入力==>ABC123def
偶数要素:AC2df
奇数要素:B13e


430:デフォルトの名無しさん
07/06/28 14:40:31
>>427
#include <stdio.h>
#include <string.h>

void search(char *s1, char *s2)
{
    int i;
    char *p = s1;
    while((p = strstr(p, s2)) != NULL){
        *p++ = '#';
        for(i = 0; i < strlen(s1) - 1; i++)
            *(p + i) = *(p + i + strlen(s2) - 1);
    }
}

int main(void)
{
    char text[1024], word[1024];
    printf("Please input text : ");
    gets(text);
    printf("text = %s\n", text);
    printf("Please input search word : ");
    gets(word);
    search(text, word);
    printf("text = %s\n", text);
    return 0;
}

431:デフォルトの名無しさん
07/06/28 14:44:40
このスレでgets()使うと袋叩きにあうよ。

432:デフォルトの名無しさん
07/06/28 14:45:32
>>427
void search(char *s1, char *s2)
{
    while((s1 = strstr(s1, s2)) != NULL){
        *s1++ = '#';
        strcpy(s1, s1 + strlen(s2) - 1);
    }
}

433:デフォルトの名無しさん
07/06/28 14:46:56
>>431
俺だって使いたかねーけど、問題文に指定してあるからな。

434:デフォルトの名無しさん
07/06/28 14:54:08
授業単元:C言語
環境:if文・for文・while文・do〜while文・switch〜case文・
OS:Windows
コンパイラ名とバージョン:borland
言語:C
テーマ:文字配列の操作
問題
文字列と検索文字、置換文字を入力し文字列中の検索文字を置換文字に置き換えなさい
実行画面
文字列(m1)入力==>ABCDEFAABCDABC
削除文字==>A
置換文字==>*

結果文字列(m1):BCDEF**BCD*BC



435:デフォルトの名無しさん
07/06/28 15:06:21
授業単元 関数

言語 C言語

引数の階乗(1*2*3*....*n)を関数を作れ

お願いします

436:デフォルトの名無しさん
07/06/28 15:09:45
int kaijo(int a)
{
   if(a == 1){
       return 1;
   }
   return a*kaijo(a-1);
}

437:デフォルトの名無しさん
07/06/28 15:13:47
int kaijo(int a)
{
   int i, result=1;
   for(i=1; i<a; i++){
       result *= i;
   }
   return result;
}

438:デフォルトの名無しさん
07/06/28 15:14:47
授業単元 関数

言語 C言語

引数の階乗(1*2*3*....*n)を返す関数を作れ

の間違いでした 申し訳ありません

439:デフォルトの名無しさん
07/06/28 15:20:43
>>378はネタだろw

440:デフォルトの名無しさん
07/06/28 15:21:44
>>422
適当だし、エクスプローラ風の樹形図になっちゃうけど、それでよければ

URLリンク(kansai2channeler.hp.infoseek.co.jp)

441:デフォルトの名無しさん
07/06/28 15:24:36
428 429何方かお願いします

442:デフォルトの名無しさん
07/06/28 15:30:51
>>428

int main()
{
   char moji[] = "ABCDEFG";
   int i;
   for(i=0; moji[i] != '\0'; i++);

   printf("文字数:%d\n", i);
}

443:デフォルトの名無しさん
07/06/28 16:11:45
マイナスの引数でエラーを出さない平方根を返す関数を作れ

C言語でお願いします

444:デフォルトの名無しさん
07/06/28 16:14:43
>>443
>>1

445:デフォルトの名無しさん
07/06/28 16:23:53
授業単元 関数

問題文 マイナスの引数でエラーを出さない平方根を返す関数を作れ

環境
LINUX
C言語
期限 いつでも

>>1 よんでおらず申し訳ありませんでした

446:デフォルトの名無しさん
07/06/28 16:28:04
負の数が入ったときの動作は?

447:デフォルトの名無しさん
07/06/28 16:28:05
>>439
もしネタだとしたら、真面目にお願いしたいのですが。

448:デフォルトの名無しさん
07/06/28 16:30:52
>>446

例として2の 平方根 だと 1.4142135...
ー2 の 平方根 だと -1.4142135...

となるようにです

449:デフォルトの名無しさん
07/06/28 16:33:41
マイミクしてください!
URLリンク(mixi.jp)

450:デフォルトの名無しさん
07/06/28 17:00:35
>>448

double exsqrt(double x)
{
if(x<0){
x=-x;
return -sqrt(x);
}
return sqrt(x);
}



451:デフォルトの名無しさん
07/06/28 17:01:37
>>447 まじめにやってもこの程度だが
URLリンク(kansai2channeler.hp.infoseek.co.jp)

452:デフォルトの名無しさん
07/06/28 17:14:08
あ〜〜fmod()を使って10進数を2進数に変えたいんです。C++


453:デフォルトの名無しさん
07/06/28 17:17:17
[1] 授業単元:多次元配列
[2] 問題文(含コード&リンク):
 以下のステップに従って,行列表示及び演算を行う関数群を作成し,3行3列の行列A,Bのかけ算を行い,結果を表示するプログラムを作成してください.なお,行列AとBは,キーボードから値を入力するようにしてください.

1.3行3列の行列を表示する関数hyoujiを作成
(メイン関数で任意の値で初期化した3行3列の行列Aを引数にしてhyoujiを呼び出し,内容を表示させ,動作確認を行う)
2.3行3列の行列A,Bの足し算を行い,結果を行列Cに代入する関数tasizanを作成
(メイン関数で任意の値で初期化した3行3列の行列A,B,Cを引数にしてtasizanを呼び出し,関数hyoujiにより行列Cを表示させ,動作確認を行う)
3.tasizanをコピー・雛形にして,3行3列の行列A,Bのかけ算を行い,結果を行列Cに代入する関数kakezanを作成
(メイン関数で任意の値で初期化した3行3列の行列A,B,Cを引数にしてkakezanを呼び出し,関数hyoujiにより行列Cを表示させ,動作確認を行う)
4.キーボードから3行3列の行列に見立てた配列に数値を入力する関数nyuryokuを作成
(メイン関数で任意の値で初期化した3行3列の行列Aを引数にしてnyuryokuを呼び出し,関数hyoujiにより行列Aを表示させ,動作確認を行う)
kakezanのヒント:3重ループにすると効率よくプログラムできます
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名:Borland
 [3.3] 言語:C
[4] 期限:7月10日まで
[5] その他の制限:多次元配列までならってます


454:デフォルトの名無しさん
07/06/28 17:30:44
>>451
迅速な返答ありがとうございます。無事実行の確認ができました。

455:デフォルトの名無しさん
07/06/28 19:00:07
>>453

void hyouji(int array[][3])
{
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%3d",array[i][j]);
putchar('\n');
}
}

void tasizan(int A[][3],int B[][3],int C[][3])
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
C[i][j]=A[i][j]+B[i][j];
}

456:455
07/06/28 19:04:02
続き

void kakezan(int A[][3],int B[][3],int C[][3])
{
int i,j,k;
for(i=0;i<3;i++)
    for(j=0;j<3;j++)
    for(k=0;k<3;k++)
    C[i][j]+=A[i][k]*B[k][j];
}

void nyuryoku(int A[][3])
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++){
printf("A%d%d:",i,j);
scanf("%d",&A[i][j]);
}
}


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4769日前に更新/213 KB
担当:undef