[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 08/07 07:52 / Filesize : 195 KB / Number-of Response : 643
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C/C++の宿題片付けます 124代目



1 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 02:13:06 ]
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。

【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。

【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html
【過去ログ検索】        chomework.sakura.ne.jp/
【wiki】               www23.atwiki.jp/homework/

前スレ
C/C++の宿題片付けます 122代目(実質123代目)
pc11.2ch.net/test/read.cgi/tech/1232029287/

407 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 23:58:15 ]
よろしくお願いします。
[1] 授業単元:データ構造アルゴリズム
[2] 問題文(含コード&リンク):タグ名をpricetype,メンバ名をteika,waribikiとする構造体kakakuとタグ名goodstype,
メンバ名をname[30],kakaku(←構造体)とする要素数10個の構造体配列goodsを作成し、商品名と定価を入力すると商品名、
定価、割り引き価格の一覧が表示されるプログラムを作成しなさい。」ただし、割引価格は、定価が1000円以上の場合は
定価の2割引、それ以外は1割引とする。また、表示するときはポインタを使用すること。
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)


408 名前:407 mailto:sage [2009/03/19(木) 00:04:18 ]
すいません環境等書き忘れていましたosはUNIX、コンパイラはgcc期限無期限その他制限なしでお願いします。

409 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 00:56:43 ]
>>399何を?

410 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 01:56:56 ]
>>392 >>396への追加。
#include <stdio.h>
#include <time.h>
int main(void)
{
  int hairetsu[10], rank[10], index[10], i, j, temp;
  srand(time(NULL));
  for(i=0; i<10; i++)
    rank[i] = i, hairetsu[i] = rand() % 100;

  for(i=0; i<9; i++) {
    for(j=9; j>i; j--) {
      if(hairetsu[rank[j]] < hairetsu[rank[j-1]]) {
        temp = rank[j];
        rank[j] = rank[j-1];
        rank[j-1] = temp;
  } } }
  for(i=0; i<10; i++) {
    printf("hairetsu[%d] = %2d, index[%d] = %d\n", i, hairetsu[i], i, rank[i]);
    index[i] = i;
  }

  for(i=0; i<9; i++) {
    for(j=9; j>i; j--) {
      if(rank[index[j]] < rank[index[j-1]]) {
        temp = index[j];
        index[j] = index[j-1];
        index[j-1] = temp;
  } } }
  for(i=0; i<10; i++) printf("rank[%d] = %d\n", i, index[i]);
  return 0;
}

411 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 04:17:31 ]
>>410
人のコードに無駄なもの付け足すなw

for(i=0; i<10; i++) index[rank[i]] = i;

で十分だろうが

412 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 07:01:36 ]
ありがとうございます。それで、2回もソートする必要ないですね。
やってみます。

413 名前:407 mailto:sage [2009/03/19(木) 07:59:06 ]
すみません言語c言語で期限は今日のお昼までにお願いします!

414 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 08:42:42 ]
>>407
#include<stdio.h>
#include<string.h>
#include<math.h>
typedef struct pricetype{int teika, waribiki;}kakaku;
typedef struct goodstype{char name[30];kakaku kakaku;}goods;
int get_waribiki(int price){
return (price>=1000)?round(price*0.8):round(price*0.9);
}
void print_goods(goods *p){
printf("name:%s teika:%d waribiki:%d\n", p->name, p->kakaku.teika, p->kakaku.waribiki);
}
int main(void){
goods goods[10];
int i, price, goods_num;
char buf[30], *p;
for(i=0;i<10;i++){
printf("Input name : ");
if(fgets(buf, sizeof(buf), stdin)==NULL) break;
if((p=strchr(buf, '\n'))) *p='\0';
strcpy(goods[i].name, buf);
input_price:
printf("Input price : ");
if(fgets(buf, sizeof(buf), stdin)==NULL) break;
if(sscanf(buf, "%d", &price)!=1) goto input_price;
goods[i].kakaku.teika=price;
goods[i].kakaku.waribiki=get_waribiki(price);
}
goods_num=i;
for(i=0;i<goods_num;i++) print_goods(goods+i);
return 0;
}

415 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 09:21:23 ]
#include <stdio.h>
#define N 10
struct goodstype {
  char name[30]; /* 商品名 */
  struct pricetype {
    int teika; /* 定価 */
    int waribiki; /* 割り引き価格 */
  } kakaku;
} goods[N];
int main(void)
{
  int i, num;
  struct goodstype *work;
  for(i=0; i<N; i++) {
    work = &goods[i];
    printf("商品名[%d/%d]?",i+1,N); fgets(work->name, 30, stdin);
    work->name[strlen(work->name)-1] = '\0';
    do {
      printf("定価[%d/%d]?",i+1,N); num = scanf("%d", &work->kakaku.teika); getchar();
    } while(num == 0);
    if(work->kakaku.teika >= 1000)
      work->kakaku.waribiki = work->kakaku.teika * (1-0.2);
    else
      work->kakaku.waribiki = work->kakaku.teika * (1-0.1);
  }
  printf("商品名,定価,割り引き価格\n");
  for(i=0; i<N; i++) {
    work = &goods[i];
    printf("\"%s\",%d,%d\n",work->name, work->kakaku.teika, work->kakaku.waribiki);
  }
  return 0;
} >>407



416 名前:407 mailto:sage [2009/03/19(木) 16:23:45 ]
>>415さんありがとうございます

417 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 01:16:32 ]
>>405
こうか?
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8991.txt

サンプルにファイルを読む関数がないんだが、「読み込みなさい」とか「調べなさい」は手作業?
探索や削除が間違っとる気がして変えたが、間違ってなかったらマクロを両方とも100に戻しといてくれ。

418 名前:417 mailto:sage [2009/03/20(金) 01:48:36 ]
ごめん。寝付けん暇つぶしでやっとったら、期限見落としとったorz

419 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 17:59:26 ]
ネタ投下キボン

420 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 19:57:17 ]
問題出す方も大変だ。
[1] 授業単元:
[2] 問題文(含コード&リンク): pc11.2ch.net/test/read.cgi/tech/1232627790/211

【 課題 】
課題1.
以下のような賭をすることを考えます.
  1. 開始時の所持金をA円とします.
  2. 目標とする金額をB円とします.
  3. さいころを投げて偶数の場合は1円を獲得,奇数の場合は1円を失います.
  4. 所持金が目標額のB円に到達すれば賭は終了,また所持金が0になった場合は破産で終了とします.
数学的な考察をすると,この賭の期待値はA円となります.つまり,何回もこの賭を続けていると,成功したり破産したりしますが,平均すると元の所持金しか得られないということです.
また,勝ち負けまでに投げるさいころの回数の平均は,(B-A)×Aとなります.
たとえば,開始時の所持金をA=8円,目標額をB=10円とすると,勝つ確率は8割,1ゲームあたり平均すると(10-8)×8=16回,さいころを投げることになります.
このことは,賭をしても儲からない,ことを意味していますね.
このことを確かめるプログラムを作成しなさい.

421 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:02:31 ]
入力した文字に対応するモールス信号を出力するプログラム、お願いします

422 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:12:20 ]
>>1

423 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:14:19 ]
>>421テンプレ嫁

424 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:17:15 ]
読んだけど課題じゃないし書くのめんどくさい

頼んだぜ

425 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 23:06:55 ]
>>424
・・・−−−・・・



426 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:39:28 ]
>このことは,賭をしても儲からない,ことを意味していますね.
ダウト。一部の人間が損をし(破産し)、一部の人間が儲かることを意味している。

427 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:46:19 ]
分散と試行回数による

428 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:51:43 ]
問題の問題点を指摘するルートに入ってるw

>問題出す方も大変だ。
本人も問題を出すつもりだったのだから,本望かw

429 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 00:54:33 ]
>また,勝ち負けまでに投げるさいころの回数の平均は,(B-A)×Aとなります.
マジで?

430 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:21:08 ]
[1] 授業単元:C言語
[2] 問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
[3] 環境
 [3.1]OS:Win
 [3.2] VC 6.0
 [3.3]言語:C
[4]期限:3月24日
[5]その他の制限:main関数以外に自作の関数を利用する

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


431 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:39:02 ]
>>430
最高に間抜けだな

432 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:41:04 ]
前スレにあった気がする

433 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:42:14 ]
スレと時刻的に8992だろ?

434 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 02:57:50 ]
>>430
8992で合ってんなら
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8993.txt

435 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 03:38:25 ]
>>420
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
int i, j, targetMoney, startMoney, currentMoney;
int totalGame = 10000, totalDice = 0, totalWin = 0;

srand(time(NULL));

printf("所持金を入力してください:");
scanf("%d", &startMoney);
printf("目標額を入力してください:");
scanf("%d", &targetMoney);

for(i=0; i<totalGame; i++) {
for(j=1, currentMoney = startMoney; ; j++) {
if((int)(rand() / (RAND_MAX + 1.0) * 6) & 1 ) currentMoney++;
else currentMoney--;
if(currentMoney == targetMoney) { totalWin++; break; }
if(currentMoney == 0) break;
}
totalDice += j;
}

printf("勝率%.2f%% 平均回数%.2f\n", 100.0 * totalWin / totalGame, (double)totalDice / totalGame);

return 0;
}



436 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 12:08:02 ]
>>434
すみません、8992です
ありがとうございました

437 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:29:33 ]
[1] 授業単元:基礎演習
[2] 問題文:ttp://www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008honsen.pdf
10ページ目の6問目です
[3] 環境
 [3.1] OS:Win
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C

考えれば考えるほどわからなくなっていましました…
良ければよろしくお願いします。

438 名前:437 mailto:sage [2009/03/22(日) 02:38:00 ]
437です。

[4]期限:4月1日12:00
[5]その他制限:特になし

改めてお願いします。

439 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:56:56 ]
>>437
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8994.c

440 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 02:58:58 ]
あ、printfに\n入れるの忘れてた

441 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:05:55 ]
>>437
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, *data, key, begin, end, mid, i;

    while(1){
        scanf("%d", &n);
        if(n <= 0) break;
        data = (int *)malloc(sizeof(int) * n);
        for(i = 0; i < n; i++) scanf("%d", &(data[i]));
        scanf("%d", &key);
        begin = 0; end = n - 1;
        for(i = 0; begin <= end; i++){
            mid = (begin + end) / 2;
            if(data[mid] == key){
                i++;
                break;
            }
            if(data[mid] < key) begin = mid + 1;
            else end = mid - 1;
        }
        printf("%d\n", i);
        free(data);
    }
    return 0;
}

442 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:06:27 ]
速いなorz

443 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:11:59 ]
i++を二箇所に書くくらいならi=1からはじめればいいのに。

444 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:23:14 ]
begin > endで抜けることを考えてi++2つとしたが、非常に頭悪いことをしてる気がする。

445 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:53:53 ]
こんなプログラムメンテしたくない。というか、プログラミングのセンスないね、チミ。



446 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 03:54:54 ]
>>445
先生のセンスをこのスレの奴らに見せ付けてやってください!

447 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 09:22:37 ]
>>445
うん、ないよ。でも、趣味でしかないし、1人でのんびりやれればいいから
下手の横好きでもいいかなー。

448 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:03:53 ]
>>445
メンテじゃなくて、先輩社員が作ったプログラムを触る仕事しかさせてもらえないんだろ?

449 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 12:32:16 ]
>>441
ぱっと見、無限ループの可能性有だな〜
問題10ではOKだけど、脱出条件組み込んだ方が吉
if(begin == end) break;見たいな

450 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 12:35:24 ]
>>449
へーそーなのかーwww

451 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 12:44:41 ]
scanfで値読んでるからマイナス入れれば終了するか・・・
>>450サンクス

それより、問題文だとファイルアクセスっぽいがコマンドラインでよいのか?


452 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 12:52:55 ]
何を言ってるのかわからない
>for(i = 0; begin <= end; i++){
で脱出条件とやらは十分だと思うが

453 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:02:46 ]
>>452
いや、外のWhile抜けないでしょそれじゃ。
While抜ける条件が、nのScanf or 値が同じ時のみ。
同値無し && 入力無し時のことを言ってる

454 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:06:44 ]
外のwhile抜けるのになんでbeginとendが出てくるんだよw

455 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:10:30 ]
>>454
441のプログラムを見れば分かると思うが、While(1)で無限ループしてんだぞ?
んで、beginとendで配列範囲を設定して、2文探索をしてる。
同値無し時にbeginとend判定しなくなるから、同値breakがキャンセルされ、あとはScanf()のbreakだけになる。

何を持ってbegin/endで煽るのか分かりかねる。



456 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:12:58 ]
二分探索で見つからなかった場合に終了なんて、問題文のどこを探しても書いてありませんがw

457 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:14:22 ]
終了しないとも書いてないなw

458 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:16:39 ]
もしかして、見つかった場合のbreakで外側のループ抜けるとか思ってないか?

459 名前:デフォルトの名無しさん [2009/03/22(日) 13:18:06 ]
>>417
返事遅くなってすいません。
期限が延びて明日までになりました。

サンプルでは読み込む関数はないので自分で作成せよと本日問題追加されました。


460 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:30:33 ]
>>455
begin/endはプログラムの終了と関係ないからだろ。
見つからなかった場合でも、終了するのはプログラムじゃなくて「探索」だぞ。
>探索の範囲がつきてしまった時に探索
>を終了します。

461 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:32:02 ]
>>453
> While抜ける条件が、nのScanf or 値が同じ時のみ。
値を見つけた時に抜けているのはforだぞ

462 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:32:47 ]
そもそも0を読み込んだら終了なのも理解できてないようだ

463 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 13:33:38 ]
WhileとかScanfとか書いてるからただのアホだろw

464 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 15:56:15 ]
>>441 さん
>>459 % ./a.out <data でファイル入力[Enter]
#include <stdio.h>

int BinarySearch(void);
int main(void) {
  while(!BinarySearch()); return 0;
}
int BinarySearch(void) {
  int n=0, *data, key=0, begin=0, end, mid, i;

  if(scanf("%d", &n) != 1) return 1;
  if(n == 0) return 0;
  if(n < 0) return 2;
  if((data = (int *)malloc(sizeof(int) * n)) == NULL) return 3;
  for(i = 0; i < n; i++)
    if(scanf("%d", &(data[i])) != 1) {free(data); return 1;}
  if(scanf("%d", &key) != 1) {free(data); return 1;}

  for(i = 1, end = n-1; begin < end; i++){
    mid = (begin + end) / 2;
    if(data[mid] < key)
      begin = mid + 1;
    else
      end = mid - 1;
  }
  printf("%d\n", i);
  free(data); return 0;
}

465 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:01:02 ]
n==0のとき0返してどうすんだよw



466 名前:465 mailto:sage [2009/03/22(日) 16:12:54 ]
0はfalse、while(!false);で次のデータ。

467 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 16:42:40 ]
問題は0で終了なのに、また関数呼び出してscanf()失敗してからループ抜けるってのがどうなのかって話

468 名前:466 mailto:sage [2009/03/22(日) 16:48:42 ]
464が俺だ。どうすんだよd どうもしない。

469 名前:464 mailto:sage [2009/03/22(日) 18:28:13 ]
>>464 修正
#include <stdio.h>
#define returnVal(n) {free(data); return n;}
int BinarySearch(void);
int main(void) {
  while(BinarySearch() == 0); return 0;
}
int BinarySearch(void) {
  int n=0, *data, key=0, begin=0, end, mid, i;

  if(scanf("%d", &n) != 1) return 2;
  if(n == 0) return 1;
  if(n < 0) return 0;
  if((data = (int *)malloc(sizeof(int) * n)) == NULL) return 3;
  for(i = 0; i < n; i++) {
    if(scanf("%d", &(data[i])) != 1) returnVal(2)
    if(data[i] == 0) returnVal(1)
  }
  if(scanf("%d", &key) != 1) returnVal(2)
  if(key == 0) returnVal(1)

  for(i = 1, end = n-1; begin < end; i++){
    mid = (begin + end) / 2;
    if(data[mid] < key)
      begin = mid + 1;
    else
      end = mid - 1;
  }
  printf("%d\n", i);
  returnVal(0)
}

470 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 18:56:59 ]
気持ち悪いマクロだw

471 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 19:09:48 ]
#define returnVal free(data); return
{returnVal 2;}
のほうがよかったかd

472 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 22:11:35 ]
いやそこじゃないだろw

473 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 02:02:49 ]
BinarySearch() で
nの入力
malloc
free
をやろうとする頭がキモイ


474 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:38:05 ]
>>437 負の値と零も検索出来るように。マクロ似のmainも外した。
#include <stdio.h>

int main(void) {
  int n=0, *data, key=0, begin, end, mid, i;

  while(1) {
    if(scanf("%d", &n) != 1) break;
    if(n == 0) break;
    if(n < 0) continue; // 暫定コンティニュー
    if((data = (int *)malloc(sizeof(int) * n)) == NULL) break;
    for(i = 0; i < n; i++) {
      if(scanf("%d", &(data[i])) != 1) break;
    }
    if(i != n) { free(data); break; }
    if(scanf("%d", &key) != 1) { free(data); break; }

    for(i = 1, begin = 0, end = n-1; begin < end; i++){
      mid = (begin + end) / 2;
      if(data[mid] < key)
        begin = mid + 1;
      else
        end = mid - 1;
    }
    printf("%d\n", i);
    free(data);
  }
  return 0;
}

475 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 09:46:38 ]
いつまでも引っ張るようなもんでもない



476 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:39:26 ]
char*型を引数にとる関数に
std::string型に格納されてる文字列を渡したいんですが、
c_str()の返す型がconst char *であるためうまく渡せません。
(char *)でキャスト変換するとコンパイルは通るのですが安全とはいえないです。
これを安全に渡すための方法があれば教えてください。
strcpyでコピーする方法はwarningが出てしまいます。
環境はVS2005です。

477 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:41:26 ]
>>476
(char *)でキャストで良いと思います。

478 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:43:38 ]
キャストを用いることはプログラマーが結果に関して責任を持つということ。
プログラマーが安全だと判断すればそれで良い。

479 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:50:04 ]
const_cast使えば?

だがスレ違いだ

480 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:51:15 ]
C++なら(char *)じゃなくconst_cast<char *>だろーと議論に資しないことを申し奉りさぶらわんと欲す

481 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 21:54:18 ]
[1] 授業単元:C言語
[2] 問題文:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/8997.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:4月2日
[5] その他の制限:ユーザ定義関数を利用する

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

482 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:11:37 ]
コラッツの問題だw
きっと誰かが剰余演算子を使わず,さらにはアクロバティックに書いてくれると期待w

483 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:16:06 ]
>>481
#include <stdio.h>

int collatz(int n)
{
    int i;

    for(i = 0; n > 1; i++){
        if(n % 2 == 0) n /= 2;
        else n = n * 3 + 1;
    }
    return i;
}

int main()
{
    int n;

    while(1){
        scanf("%d", &n);
        if(n == 0) break;
        printf("%d\n", collatz(n));
    }
    return 0;
}

484 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:17:47 ]
>>477-480
本当にありがとう。参考になりました。


485 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 22:34:37 ]
これくらいしか思いつかんかった。
#include <stdio.h>
void main(){
int i=0,j;
while((!i||printf("%d\n",j))&&scanf("%d",&i)&&i)
for(j=0;i!=1;i=((i^1)&1)*(i>>1)+(i&1)*((i<<1)+i+1),++j);
}



486 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 23:26:57 ]
>>483 さん
#include <stdio.h>
static int n = 0;
void collatz(void)
{
  int i;

  for(i = 0; n > 1; i++)
    if(n & 1) n *= 3, n++;
    else n >>= 1;
  printf("%d\n", i);
}

int main(void)
{
  while(scanf("%d", &n) != EOF && n) collatz();
  return 0;
}

487 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 00:00:33 ]
>>483
ありがとうございました
助かりました

488 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 09:42:53 ]
>>476>>484
おいキャストするな。
c_strを元にコピーすることを薦める次第だ。

489 名前:デフォルトの名無しさん [2009/03/25(水) 20:07:37 ]


490 名前:デフォルトの名無しさん [2009/03/27(金) 04:12:17 ]
初歩的な問題だと思いますが、勉強し始めでわかりません。どうかよろしくお願いします

下記のソースを記述しコンパイルと実行を確認しなさい
/** データ型 */
#include<stdio.h>

void printDataType1();

main(){
printDataType1();
}
/**
* データ型の表示
* 単純に表示
*/
void printDataType1(){
int intData = 10;


491 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 04:21:13 ]
ごめん、難解すぎる

492 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 08:04:15 ]
printf("dec %d\n", intData);
printf("hex %x\n", intData);
printf("oct %o\n", intData);
}
と、後ろに追加する。コンパイルのしかたは、調べれば分かるので省略する。

493 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 08:09:41 ]
ソースの書き方とコンパイルの仕方を質問しているんじゃないかとエスパーする
どっちにしてもこれ以上のエスパーは無理だが

494 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 13:20:00 ]
一番下に"}"を付けるだけでいいんじゃね

495 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 15:59:32 ]
[1] 授業単元:
[2] 問題文(含コード&リンク):ファイル出力で二つ以上の関数が同じファイルに続けて出力させるにはどうすればいいですか?
毎回file openさせてやってみたら、途中まで上書きになってしまいました。
[3] 環境
 [3.1] OS:Win xp
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限:無期限
[5] その他の制限:



496 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 16:11:04 ]
>>495
二回目はアペンドモード"a"で開くしかないよ
ただしXPならMS-DOSの系統なのでテキストモードだと
EOFが最後に入っているのでこれを1バイト切り詰めてから
アペンドしないといけない

497 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 16:13:52 ]
「途中まで上書き」と言ってるから、俺はfseekで解決と予測。

498 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 16:19:26 ]
>>495
ファイルポインタを関数で使いまわす
FILE* fp = fopen("***", "w");
func1(fp);
func2(fp);
fclose(fp);

499 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 16:25:10 ]
>>498
それあかんよ
FILE構造体にはデータも書き込むので

func1(&fp);
func2(&fp);

としておき

受ける側は

func1(FILE **fp)
func2(FILE **fp)

としないといけない
実際に実験してみればわかる

500 名前:495 mailto:sage [2009/03/27(金) 16:26:59 ]
みなさんありがとうございます。
やってみます。

501 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 17:40:12 ]
>>499
どういう実験か書いてみそ

502 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 17:56:08 ]
実験してないし流れも読めないが、
>>499の主張は間違っている気がする。
だって、FILE* fpなんでしょ?
> FILE構造体にはデータも書き込むので
FILEへのポインタの値を変えたりするつもりは無いはず。

503 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 18:00:09 ]
C++のifstreamとかofstreamのようなオブジェクトなら
リファレンス渡しまたはアドレス渡しをしなければいけないのは
わかるが、CのFILE*ってポインタなんだからそのまま渡していいと思う

504 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 18:14:38 ]
>>499 への容赦ない怒涛のツッコミにワロタww
本人ではないが、func1() や func2() の中で fopen する場合と
勘違いしたんじゃないか、とフォローしてみる。

505 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 18:53:06 ]
void foo(FILE *fp) {
fputs("foo\n", fp);
}
void bar(FILE *fp) {
fputs("bar\n", fp);
}
int main() {
FILE *fp = fopen("124-495.txt", "w");
foo(fp);
bar(fp);
fclose(fp);
return 0;
}
出力結果は
foo
bar



506 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:31:46 ]
>>504
>>498にfopenも書いてあるからその勘違いは無いんじゃね?

507 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:57:18 ]
499> それあかんよ
あかんって何が?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<195KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef