トップページ⇒tech
1001コメント433KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001ぼるじょあ ◆yBEncckFOU 2005/07/05(火) 09:19:12
(・3・)アルェー C++房のぼるじょあですYO!
わからない宿題を片づけますYO!

――【注意点】―――――――――――――――――――――――――
・質問は必ず【質問テンプレ】に従ってください。
・問題文は、解いてもらう方にわかりやすいように全文を書きましょう。
・計算問題は必ず数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。解いてもらっている方に失礼です。
・複雑なAAはスレが荒れたり問題が埋もれる原因になりますので使用を控えてください。
―――――――――――――――――――――――――――――――

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

【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

【前スレ】
C/C++の宿題を片付けます 46代目
http://pc8.2ch.net/test/read.cgi/tech/1119514274/

【歴代スレは>>2-13】
0357デフォルトの名無しさん2005/07/08(金) 19:41:25
1] 授業単元: C言語
[2] 問題文(含コード&リンク): 配列x[5]={1.4.5.2.3}を小さい順にソートするプログラムを作成せよ。
[3] 環境
 [3.1] OS:XP
 [3.2] コンパイラ(バージョン):VC++6.0
 [3.3] 言語:C
[4] 期限:明日中
[5] その他の制限:ポインタを使ってお願いします。
0358デフォルトの名無しさん2005/07/08(金) 19:59:48
>>357
#include <stdlib.h>
#include <stdio.h>
int greater_int(const void *x, const void *y){return *(int*)x < *(int*)y;}
int main()
{
  int i, x[5]={1,4,5,2,3};
  sqort(x,5,sizeof(int),greater_int);
  for(i = 0; i< 5; ++i) printf("%d ", x[i]);
  putchar('\n');
  return 0;
}
0359デフォルトの名無しさん2005/07/08(金) 20:01:51
sqort
03603582005/07/08(金) 20:01:57
すまん、色々間違えてる。ひどい。

訂正しました。
>>357
#include <stdlib.h>
#include <stdio.h>
int less_int(const void *x, const void *y){return *(int*)x - *(int*)y;}
int main()
{
  int i, x[5]={1,4,5,2,3};
  qsort(x,5,sizeof(int),less_int);
  for(i = 0; i< 5; ++i) printf("%d ", x[i]);
  putchar('\n');
  return 0;
}
03613582005/07/08(金) 20:03:10
greater とか less とか命名すべきではなかったね。
0362デフォルトの名無しさん2005/07/08(金) 20:20:46
>>353
まずはプロトコルをどうしたいのかはっきりさせろ。
問題文に無い機能を盛り込んでないか?
問題文からはユーザのリストを取得したり(クライアント側で)ユーザを
指定して送信したりする機能が必要とは思われない。

1) クライアントからの最初の送信行はユーザ名として扱う。これは
 クライアント側には返送・転送されない。
2) クライアントからの二行目以降の送信行は、先頭にユーザ名を付加して
 全てのクライアントに送信される。
3) 通信終了はクライアント側からの切断にて行う。クライアントは
 EOF文字を端末から入力された場合に、通信を終了する。

この程度で十分だと思うが。

これでも行指向ではあるので、クライアント毎のバッファ管理は必須だ。
stdioとselect()との併用はよろしくないので、自前でやる必要がある。
0363デフォルトの名無しさん2005/07/08(金) 21:01:20
>>357
何となくだが、求められているのはこんなレベルのような気がする。
#include <stdio.h>
int main(void) {
    int i, j, temp, x[5] = {1, 4, 5, 2, 3};
    for (i = 0; i < 4; i++)
        for (j = 0; j < 4 - i; j++)
            if (x[j + 1] < x[j]) {
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
    for (i = 0; i < 5; i++) printf("\t%d", x[i]);
    return 0;
}
0364デフォルトの名無しさん2005/07/08(金) 21:01:29
>>360
ありがとうございました。
03653572005/07/08(金) 21:03:33
>>363
その通りです・・・ありがとうございます。
for文を用いてというのを言い忘れました。
360さんもありがとうございました。
0366デフォルトの名無しさん2005/07/08(金) 21:24:46
>>365
ポインタ使うの忘れてた。
#include <stdio.h>
void sort(int* x, int n) {
    int i, j, temp;
    for (i = 0; i < n - 1; i++)
        for (j = 0; j < n - 1 - i; j++)
            if (x[j + 1] < x[j]) {
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
}
int main(void) {
    int i, x[5] = {1, 4, 5, 2, 3};
    for (i = 0; i < 5; i++) printf("\t%d", x[i]);
    printf("\n");
    sort(x, 5);
    for (i = 0; i < 5; i++) printf("\t%d", x[i]);
    return 0;
}
0367デフォルトの名無しさん2005/07/08(金) 21:41:25
>>347

サーバ
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/685.txt
クライアント
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/686.txt

仕様は>>362の通りに簡略化してある。
なお俺はLinux環境は持ってないのでそのつもりで。
0368デフォルトの七資産2005/07/08(金) 21:41:47
303>ありがとうございます。

[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
暦の年号を西暦に変換するプログラムを列挙体(enum)を用いた方法で作成せよ。
ヒント(西暦=明治:m+1867、大正:t+1911、昭和:s+1925、平成:h+1988)

[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン):Borland C++ Compiler5.5
 [3.3] 言語:C
[4] 期限無
[5] できるだけ簡単におねがいします。

列挙体(enum)のもお願いできますか。

BY 昨日の電車男で2chの人大好きになりましたデフォルトの七資産でした。w
0369デフォルトの名無しさん2005/07/08(金) 21:44:11
>>368
直ぐ後にイニューム版も貼られてただろ
0370デフォルトの名無しさん2005/07/08(金) 21:52:32
BY 昨日の電車男で2chの人大好きになりましたデフォルトの七資産でした。w
0371デフォルトの名無しさん2005/07/08(金) 23:11:00
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=687
[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):VC++6.0
 [3.3] 言語:C言語
[4] 期限:来週の月曜まで
[5] その他の制限:for文を使用、多重ループ
どなたかよろしくお願いします・・・。
0372デフォルトの名無しさん2005/07/08(金) 23:14:35
>>371
#include<stdio.h>
int main(void)
{
for (;0;) for (;0;);
return printf("-++++\n*-+++\n**-++\n***-+\n****-\n"), 0;
}
0373デフォルトの名無しさん2005/07/08(金) 23:17:52
>>371
#include <stdio.h>
int main()
{
  int n, x, y;
  scanf("%u", &n);
  for(y = 0; y < n; ++y)
  {
    for(x = 0; x < n; ++x)
    {
      if( x > y ) putchar('*');
      else if( x < y ) putchar('+');
      else putchar('-');
    }
    putchar('\n');
  }
  return 0;
}
03743732005/07/08(金) 23:23:25
* と + が逆だった。入れ替えておいてくれ。
0375デフォルトの名無しさん2005/07/08(金) 23:32:38
問題文はこちらに
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/688.txt
よろしくお願いします
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/688.txt
よろしくお願いします
0376デフォルトの名無しさん2005/07/08(金) 23:37:29
>2.要素数10のstdata構造体の配列を差s区政し、
>合計得点以外の適当なデータを入力できるようにせよ。

これの意味がわからん。
0377デフォルトの名無しさん2005/07/08(金) 23:42:03
作成し→差s区政し
0378デフォルトの名無しさん2005/07/08(金) 23:42:57
馬鹿には質問してませんから。
0379デフォルトの名無しさん2005/07/08(金) 23:48:21
生徒数は10人という設定にして
stdata構造体の配列を作成する。
そして生徒一人につき1つ何でもいいからデータを
入れられるようにすればいいようです。
いろいろミスが多くて申し訳ありませんでした
0380デフォルトの名無しさん2005/07/08(金) 23:52:10
何でもって何?
0381デフォルトの名無しさん2005/07/08(金) 23:53:54
>>375
#include <stdio.h>
/* 1 */
struct stdata { int no, char name[11]; int score[5];}
/* 2 */
struct stdata g_data1[10];
int set_data(int index, int no, char *name, int score[4])
{
  if( index < 0 || index > 11) return 0;
  else
  {
    struct stdata *p = g_data[index];
    p->no = no;
    strncopy(p->name, name, 10);
    memmove(p->score+1, score, sizeof(int)*4);
    return 1;
  }
}
/* 3 */
void goukei(struct stdata *astdata)
{
  if( astdata != NULL )
  {
    int i;
    astdata->score[0] = 0;  /* score[0] に合計点 */
    for(i = 0; i < 4; ++i) astdata->score[0] += astdata->score[i];
  }
}
0382デフォルトの名無しさん2005/07/08(金) 23:54:27
#include <stdio.h> じゃなかった、
#include <string.h> ね。
0383デフォルトの名無しさん2005/07/08(金) 23:55:26
strncpy()は'\0'終端されるとは限らないかなり変態的仕様の関数なので
使わないほうが良いぞ。
0384デフォルトの名無しさん2005/07/09(土) 00:01:27
コンパイルできないので書き直し。
#include <string.h>
/* 1 */
struct stdata { int no; char name[11]; int score[5];};
/* 2 */
struct stdata g_data[10];
int set_data(int index, int no, char *name, int score[4])
{
  if( index < 0 || index > 11) return 0;
  else
  {
    struct stdata *p = &g_data[index];
    size_t len = strlen(name);
    p->no = no;
    memmve(p->name, name, 10);
    p->name[len > 11 ? 11 : len] = '\0';
    memmove(p->score+1, score, sizeof(int)*4);
    return 1;
  }
}
/* 3 */
void goukei(struct stdata *astdata)
{
  if( astdata != NULL )
  {
    int i;
    astdata->score[0] = 0;  /* score[0] に合計点 */
    for(i = 0; i < 4; ++i) astdata->score[0] += astdata->score[i];
  }
}
0385デフォルトの名無しさん2005/07/09(土) 00:02:20
>>384
memmve()とかいうなぞの関数を使っているので
たぶんそれもコンパイルできないぞ
0386デフォルトの名無しさん2005/07/09(土) 00:03:51
/* 動的確保 */
struct stdata *create_stdata(size_t n){return malloc(n * sizeof(struct stdata)); }
0387デフォルトの名無しさん2005/07/09(土) 00:03:56
それと、strncpy()は素人には危険な代物だが
strncat()はそうでもないので、そっちを使うとよい。
先頭に\0セットしてからstrncat()すれば、望みの結果を得られる。
0388デフォルトの名無しさん2005/07/09(土) 00:05:40
>>375
>>381が苦労してるみたいなのでうp
#include <stdio.h>
struct stdata {int no; char name[10]; int point[5]; };
void goukei(struct stdata * astdata) {
    int i;
    for (i = 0; i < 4; ++i) astdata->point[4] += astdata->point[i];
}
int main(void) {
    struct stdata data[10] = {0};
    int i, j;
    for (i = 0; i < 2; ++i) {
        scanf("%d%9s", &data[i].no, data[i].name);
        for (j = 0; j < 4; ++j) scanf("%d", &data[i].point[j]) ;
        goukei(&data[i]);
    }
    return 0;
}
03893842005/07/09(土) 00:05:48
× if( index < 0 || index > 11) return 0;
○ if( index < 0 || index > 9) return 0;

× memmove(p->name, name, 10);
○ memmove(p->name, name, len > 10 ? 10 : len);


失礼しました。
0390デフォルトの名無しさん2005/07/09(土) 00:06:47
>>372
>>373
ありがとうございます。助かりました。
一晩中考えてたんですが全く分からなくて・・・。
しかし早いですねぇ。
0391デフォルトの名無しさん2005/07/09(土) 00:10:16
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
次のプログラムを実行してブラウザで表示させんですが、ブラウザを開くと
真っ白のページしかでてきません。コンパイラ時点でエラーは無いですι(´Д`υ;)
http://tokyo.cool.ne.jp/k-12/

[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C言語
[4] 期限:今日まで(すみません(´Д`;))
[5] その他の制限:本当基礎しか教わってません。
  簡単な説明お願いします(´・ω:;.:...
0392デフォルトの名無しさん2005/07/09(土) 00:14:05
>>391
ブラウザは自分では実行せず、z.htmlという名前のファイルをカレントディレクトリ
に作ってその中に出力するだけのようだが
そのファイルの中身はどうなってるのかね?空か?
03933752005/07/09(土) 00:14:42
>>381様>>388様
ありがとうございました
助かりました
0394デフォルトの名無しさん2005/07/09(土) 00:15:09
>>375 さらにの方。mainだけ掲載。他は同じ
int main(void) {
    struct stdata * data;
    unsigned int n, i, j;
    scanf("%u", &n);
    data = malloc(sizeof(struct stdata) * n);
    for (i = 0; i < n; ++i) {
        scanf("%d%9s", &data[i].no, data[i].name);
        for (j = 0; j < 4; ++j) scanf("%d", &data[i].point[j]) ;
        goukei(&data[i]);
    }
    free(data);
    return 0;
}
>>388 俺もミスってる
×    for (i = 0; i < 2; ++i) {
○    for (i = 0; i < 10; ++i) {
0395デフォルトの名無しさん2005/07/09(土) 00:17:22
>>391
title要素が閉じていない。
0396デフォルトの名無しさん2005/07/09(土) 00:19:33
ここだな

× strcat(w, "<title>HP<title>\n");
○ strcat(w, "<title>HP</title>\n");
0397デフォルトの名無しさん2005/07/09(土) 00:20:05
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
#define N 10
int main(void)
{
int aa[N], bb;
bb = sum(aa);
printf("sum=%d\n",bb);

return 0;
}
int sum(int num[N])
{
int n, s=0;
for(n=0;n<N;n++)
s+=num[n];

return s;
}

↑これを修正し、double型の配列変数に格納されている値の平均値を求める関数ave
を作成せよ。またaveもdouble型とする。
[3] 環境
 [3.1] OS:UNIx
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005年7月11日まで
[5] その他の制限:まだ入門編というところでしょうか
0398デフォルトの名無しさん2005/07/09(土) 00:21:40
>int aa[N], bb;

氏ね
0399デフォルトの名無しさん2005/07/09(土) 00:22:16
>>398
それの何が問題なのか?
0400デフォルトの名無しさん2005/07/09(土) 00:23:57
>>397
入門編どころの騒ぎじゃないな
int → double

後は書式指定子
0401デフォルトの名無しさん2005/07/09(土) 00:25:02
>397

>[3.1] OS:UNIx
おちゃめだな
0402デフォルトの名無しさん2005/07/09(土) 00:25:06
#define N 10
int main(void)
{
    double array[N], average;
    average = ave(array);
    printf("sum = %g\n", average);

    return 0;
}
double sum(double a[])
{
    int i;
    double s = 0;
    for(i = 0; i < N; i++)
        s += num[i];
    return s;
}
double ave(double a[])
{
    return sum(a) / N;
}
04033912005/07/09(土) 00:30:36
>>392様>>395様>>396様
どうもありがとうございました!!

>>395様>>396様のご指導通りtitle要素を終わらせたら表示できました
本当に早い対処ありがとうございました
04043332005/07/09(土) 00:55:05
学校の宿題なのですが...
「足し合わせると1000になるような二つの素数の組を全て求めるプログラムをつくる」っていうものなのですが全然わかりません...教えてください。
0405デフォルトの名無しさん2005/07/09(土) 00:59:57
[1] 授業単元:構造体
[2] 問題文(含コード&リンク):
 あるファイル(seiseki.txt)を読み込んで、各生徒ごと・各科目ごと
それぞれの合計点・平均点・最高点を求めよ。
 プログラムに、構造体を用いる事。
[3] 環境
 [3.1] OS:Unix
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:2005年7月11日まで
[5] その他の制限:
 「seiseki.txt」の中身は下記の通りです。
1番左のアルファベットは名前で、次の列から順番に
英語、数学、国語、理科、社会の点数を示しています。

A 70 56 66 45 88
B 66 85 68 55 73
C 55 65 53 67 55
D 85 72 76 58 65
E 92 70 45 73 55
F 56 57 52 62 82
G 72 62 33 85 95
H 46 95 48 72 34
I 83 42 88 92 56
J 68 65 91 82 66
0406デフォルトの名無しさん2005/07/09(土) 01:51:48
>>404  一組しかないっぽ。
#include <stdio.h>
#include <math.h>
#define N 1000
int main()
{
  static int buf[N];
  int i,j;
  for(i = 2; i < sqrt(N); ++i)
  {
    if( buf[i] ) continue;
    for(j = i+i; j < N; j += i) buf[j] = 1;
  }
  for(i = 2, j = 0; i < N; ++i)
  {
    if( buf[i] ) continue;
    buf[j++] = i;
  }
  buf[j] = 0;
  i = 0;
  while( i <= j )
  {
    if( (buf[i] + buf[j]) == N) printf("%u %u\n", buf[i], buf[j]);
    ++i; --j;
  }
  return 0;
}
04073332005/07/09(土) 01:58:14
ありがとうございますm(__)m
0408デフォルトの名無しさん2005/07/09(土) 02:00:39
ごめん間違ってる。
04094062005/07/09(土) 02:07:56
最後のwhileブロックを、これに代えてくれ。
力技だ。

  for( i = 0; buf[i]; ++i)
    for(j = i; buf[j]; ++j)
      if((buf[i]+buf[j])==N) printf("%u %u\n", buf[i], buf[j]); 
  return 0;
04104062005/07/09(土) 02:22:30
別バージョン。bsoearchを使ってみた。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1000
int cmp_int(const void *a, const void *b){ return *(int*)a - *(int*)b;}
int main()
{
  static int buf[N];
  int i,j,*p, key, save;
  for(i = 2; i < sqrt(N); ++i)
  {
    if( buf[i] ) continue;
    for(j = i+i; j < N; j += i) buf[j] = 1;
  }
  for(i = 2, j = 0; i < N; ++i)
    if( !buf[i] ) buf[j++] = i;
  buf[j] = 0; save = N;
  for(i = 0; buf[i] < save; ++i)
  {
    key = N - buf[i];
    if(NULL != (p = bsearch(&key,buf, j, sizeof(int), cmp_int)))
    {
      printf("%d %d\n", buf[i], *p);
      save = *p;
    }
  }
  return 0;
}
0411デフォルトの名無しさん2005/07/09(土) 02:27:06
>>404
#include <stdio.h>

int is_prime(int n)
{
  int i;
  if (n < 2)
    return 0;
  for (i = 2; i < n; i++)
    if ((n % i) == 0)
      return 0;
  return 1;
}

int main(void)
{
  int i;
  for (i = 2; i < 500; i++) {
    if (is_prime(i) && is_prime(1000-i))
      printf("%d %d\n", i, 1000-i);
  }
  return 0;
}
04121/22005/07/09(土) 02:48:57
>>405
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define BUFMAX 512
#define DELIMITER " "

typedef struct _Person {
char *name;
int total;
}Person;

int line_sum( FILE *fp ) {
char buf[BUFSIZ];
int line = 0;
for ( ; fgets( buf, BUFMAX, fp ); line++ ) { }
if ( strchr( buf, '\n' ) != NULL ) line--; // 改行で終わっていたら
return line;
}
04132/22005/07/09(土) 02:50:47

int main( int argc, char *argv[] )
{
FILE *fp;
char buf[BUFSIZ];
char *p;
int before_total = 0, i;
int id,no,line; // 一番大きかった人の 番号が id に入る
Person *p_person;

fp = fopen( "seiseki.txt", "r" );
if ( fp == NULL ) {
fprintf( stderr, "file not found" ); return 1;
}
line = line_sum( fp );

p_person = (Person*)calloc( line, sizeof( Person ) );
fseek( fp, 0L, SEEK_SET );

for ( no = 0; no < line; no++ ) {
fgets( buf, BUFMAX, fp );
if ( strchr( buf, '\n' ) != NULL ) *strchr( buf, '\n' ) = '\0';
p_person[no].name = strtok( buf, DELIMITER );
printf( "%s さん :" ,p_person[no].name );
for ( i = 0; (p = strtok( NULL, DELIMITER )) != NULL; i++ ) {
printf( " %s " ,p );
p_person[no].total += atoi( p );
}
04142/2 ... last2005/07/09(土) 02:51:31
printf( " 合計点:%d 平均点:%.2lf \n" ,p_person[no].total ,(double)p_person[no].total / i );
if ( p_person[no].total > before_total ) {
before_total = p_person[no].total; // 前回の結果を残す
id = no;
}
}
printf( "\n最高得点は %s さんの %d 点でした" ,p_person[id].name ,p_person[id].total );
fclose( fp );
free( p_person );
return 0;
}
04154122005/07/09(土) 02:56:26
>>405
if ( strchr( buf, '\n' ) != NULL ) line--; // 改行で終わっていたら
ここいらないや。削除しといてください。
struct 使う必要性があまりなかったので、無理に使ってコードが長くなってしまった・・・
すみません。
0416デフォルトの名無しさん2005/07/09(土) 02:59:39
なんか成績集計の問題が多いな……
なんでわざわざCでそんなことやらなあかんのじゃ
出題者の発想の貧困の表れか
0417デフォルトの名無しさん2005/07/09(土) 03:14:08
授業→レポートという責め苦を与える中で、C言語を用いたのでしょう。
別に数学だろうが三角木馬だろうが何でも良いんじゃ?
0418デフォルトの名無しさん2005/07/09(土) 03:21:36
じゃあ、もまい達が先生ならどんな問題だすんだ?
0419デフォルトの名無しさん2005/07/09(土) 03:25:34
Cで成績集計させる
0420デフォルトの名無しさん2005/07/09(土) 05:18:44
cursesでスネークゲームを作らせる。
……それなりに面白いと思うんだが。
0421デフォルトの名無しさん2005/07/09(土) 06:17:01
私も縛って鞭で責めつつCで成績集計させる
0422デフォルトの名無しさん2005/07/09(土) 09:01:54
私なら、ヒストグラム作らせるな。
1行1データの入力にしておけばパイプラインを組み合わせて色々できるしね。
0423デフォルトの名無しさん2005/07/09(土) 09:27:02
int is_prime(int n)
{
int i;
if (n < 2) return 0;
for (i = 2; i < n; i++)
if ((n % i) == 0) return 0;
return 1;
}
↓
if (n < 2) return 0;
if (n%2==0) return 1;
for (i = 3; i < n/2; i+=2)
if ((n % i) == 0) return 0;
return 1;
0424デフォルトの名無しさん2005/07/09(土) 09:28:06
>if (n%2==0) return 1;

はぁ?
0425デフォルトの名無しさん2005/07/09(土) 09:58:09
>412
>struct 使う必要性があまりなかったので

>405
>1番左のアルファベットは名前で、次の列から順番に
>英語、数学、国語、理科、社会の点数を示しています。
もれなら
#define NUM_OF_SUB 5
struct _Person {
char name[NAME_LEN];
int sc[NUM_OF_SUB+1]; /* +1は合計の分 */
}
だな
>typedef struct _Person {
>char *name;
>int total;
>}Person;
04263542005/07/09(土) 13:06:21
古い話ですが……
>>356
「確実に止まる」は満たしてないですが、「確率1で止まる」ことになるので、
それほど題意を曲げているわけではないですよ。
0427デフォルトの名無しさん2005/07/09(土) 13:17:39
擬似乱数を使っている限り無限ループの可能性があるわけだが。
0428デフォルトの名無しさん2005/07/09(土) 14:46:19
何回で必ず停止する。
何回以内に必ず停止する。
ならOKだと思うが、
何回操作しても停止しない可能性がある。
というのはダメだと思う。

さて、次のプログラムは必ず止るといえるか?
while (rand() % 10 == 0)
;
0429デフォルトの名無しさん2005/07/09(土) 15:27:57
という宿題?
0430デフォルトの名無しさん2005/07/09(土) 15:29:20
俺様が生きている間に止まらないプログラムは止まらないプログラムだな。
0431デフォルトの名無しさん2005/07/09(土) 16:40:51
じゃ、ここで「半永久ループ」「半無限ループ」という用語を提案してみようか。
0432デフォルトの名無しさん2005/07/09(土) 16:52:12
>>430
一週間くらいは許容範囲だと思うが
0433デフォルトの名無しさん2005/07/09(土) 17:09:57
430 は余命一週間もないらしい。
0434デフォルトの名無しさん2005/07/09(土) 18:15:05
[1]C言語 コンパイgcc Linux
[2]期限 7月12日火曜日(午後5時
[3]どうかよろしくおねがいしますorz
会員番号 氏名       性別 生年月日
  1   Noriko ITAKURA   F  1983 7 25
  2   Akemi UTSUNOMIYA  F  1990 10 14
  3   Hideki KINUGASA   M  1987 9 16
  4  Tomoko KISAKI    F  1975 10 14
  5   Takuya UMEMOTO   M  1975 10 16
  6   Jun-ichi AKAMATSU  M  1982 3 16
  7   Nobuta NONI     M  1988 12 29
  8   Shizuka MINOMOTO  F  1989 1 9
会員  第一ピリオド  第二ピリオド   第三ピリオド
番号  ゲーム数     ゲーム数     ゲーム数
   #1 #2 #3 #4 #5  #1 #2 #3 #4 #5  #1 #2 #3 #4 #5
1   6  3 5  7 9    8 8  5 2  0   3  7 6  5 2
2   1  2 4  7 10   10 10  3 7 10   5  7 7  8 9
3   2  4 2  5 2    1 8  10 3  6   6  7 6  8 5
4   5  8 0  10 0    9 8  9 10 10   5  5 5  3 5
5   1  2 3  4 5    6 7  8 9  10   9  8 7  9 5
6   8  8 4  8 3    6 7  2 8  6   8  9 8  2 0
7   6  6 1  6 6    1 6  7 4  9   1  8 10  5 3
8   7  3 4  7 2    8 9  7 3  2   4  5 10  9 7
上記ファイルmember_data.dat を読み込み会員氏名、生年月日、性別をソート表示するとともに、それらを各自のホームディレクトリ(またはカレントディレクトリにASCII形式で保存するプログラムを作成し、実行しなさい
なお、このプログラムでも構造体struct club_dt に対する構造体変数はグローバルとして宣言しないこと
0435デフォルトの名無しさん2005/07/09(土) 18:15:57
<処理の流れ>
�@ファイル読み込みに関してはload()なる関数を定義し、その内部で実行させること
(fread()関数を用いよ)
�Aメニューを表示し、氏名によるアルファベット順ソートか生年月日による年齢順ソートかを選ばせる、適切な入力がなされるまで繰り返しメニュー表示を繰り返させること
<メニュー例>
MENU
1.Sorting in alphabetical order/2.Sorting in order of age.
Please input number:
アルファベット順ソートに関してはsort_al()なる関数を定義し、その内部でソート実行。表示。保存させる。ただし、ソートは会員の姓に基づき実行し、表示は氏名性別生年月日の順とする。保存時のファイル名は"member_data_al.dat"とすることゲーム成績は保存しなくてよい
<ソート結果、保存ファイル内容例>
Jun-ichi AKAMATSU M 1982 3 16
Noriko ITAKURA F 1983 7 25
Hideki KINUGASA M 1987 9 16
Tomoko KISAKI F 1975 10 14
Shizuka MINOMOTO F 1989 1 9
Nobuta NONI M 1988 12 29
Takuya UMEMOTO M 1975 10 16
Akemi UTSUNOMIYA F 1990 10 14
年齢順ソートに関してはsort_age()なる関数を定義し、その内部でソート実行・表示・保存させる。ただし、ソートは結果が高齢順となるようにし、表示は氏名性別生年月日の順とする。保存時のファイル名は" member_data_age.dat"とすることゲーム成績は保存しなくてよい
<ソート結果、保存ファイル内容例>
Tomoko KISAKI F 1975 10 14
Takuya UMEMOTO M 1975 10 16
Jun-ichi AKAMATSU M 1982 3 16
Noriko ITAKURA F 1983 7 25
Hideki KINUGASA M 1987 9 16
Nobuta NONI M 1988 12 29
Shizuka MINOMOTO F 1989 1 9
Akemi UTSUNOMIYA F 1990 10 14

以上です、おねがいします(;´・ω・`A
0436デフォルトの名無しさん2005/07/09(土) 18:18:22
なかなかアレな宿題ですね。
0437デフォルトの名無しさん2005/07/09(土) 18:30:31
ゲーム成績は保存しなくていいってことは無視でいいの?
それならちょっと飯食った後誰もやって無さそうなら練習がてら考えてみるよ
0438デフォルトの名無しさん2005/07/09(土) 20:57:24
[1]授業単元:c言語
[2]問題文:リストから削除する、関数del_listを作成する。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/690.txt
★で囲った部分怪しいと思います。。
どうか修正お願いします_| ̄|○
[3]環境
[3.1]OS:XP
[3.2]コンパイラ:VC++ 6.0
[3.3]言語:C ++
[4]期限:7/10
0439デフォルトの名無しさん2005/07/09(土) 21:17:52
>>438
NODE *del_list(NODE deldata)
{
  NODE **p;
  for (p = &head; *p != NULL; p = &(*p)->next) {
    if (strcmp(deldata.name, (*p)->name) == 0) {
      NODE *res = *p;
      *p = (*p)->next;
      return res;
    }
  }

  return NULL;
}
0440デフォルトの名無しさん2005/07/09(土) 21:37:51
ごめん。修正だったね。

>if★(strcmp(deldata.name,head->name)){★//リストの先頭なら
これだと「リストの先頭じゃないなら」になる。

>return ★head;★
return back;

>while(★p != NULL && strcmp(deldata.name,p->name) >= 0★){
... > 0
= があると、pが指すのが取り除くノードの次のノードになってしまう。

>★head->next= p;★
back->next = p->next;
0441デフォルトの名無しさん2005/07/09(土) 22:41:06
[1]授業単元:c言語
[2]問題文:
�@「jrand(j)」という関数を使って{1,2,...,j}の中からn個の数をランダムに取り出し、
配列変数に記憶させ、記憶させた内容を表示させるmainプログラムを書きなさい。
�Aint型配列とその大きさを入力変数として、最大値最小値を計算して返す関数プログラムを書きなさい
�B�Aを使って、�@で作ったプログラムに、配列データの最大値、最小値を計算して表示するプログラムを付け加えなさい。
[3]環境
[3.1]OS:XP
[3.2]コンパイラ:VC++ 6.0
[3.3]言語:C
[4]期限:7/10

どうぞよろしくおねがいします。
0442デフォルトの名無しさん2005/07/09(土) 22:48:35
>>441
仕様がよく分からん。nはどうやって与えるのか?
配列は大域変数でいいのかポインタで渡すのか?
04434412005/07/09(土) 22:55:11
>>442
あ、すいません。j=10,n=2000 でお願いします。
0444デフォルトの名無しさん2005/07/09(土) 23:06:41
>>443
{1...10}の中から2000個の数をねぇ・・・
04454382005/07/09(土) 23:08:48
ありがとうございました、出来ました
04461/22005/07/09(土) 23:11:27
#include <stdio.h>
#define N 2000

int jrand(int, int*);
int maximum(int *, int);
int minimum(int *, int);

int main(void) {
int i, src[N];
jrand(10, src);
for (i = 0; i < N; i++)
printf("%d\n", src[i]);
putchar('\n');
printf("最大値:%d\n最小値:%d", maximum(src, N), minimum(src, N));
return 0;
}

//エラー時、負を返す
int jrand(int j, int *buf) {
int i;
for (i = 0; i < N; i++)
while ((buf[i] = (random() * N) % (j + 1)) <= 0);
return 0;
}
04472/22005/07/09(土) 23:11:56
//最大値を返す
int maximum(int *src, int nums) {
int max = src[0], i;
for (i = 1; i < nums; i++)
if (src[i] > max) max = src[i];
return max;
}

//最小値を返す
int minimum(int *src, int nums) {
int min = src[0], i;
for (i = 1; i < nums; i++)
if (src[i] < min) min = src[i];
return min;
}

作ったがNとJ逆じゃないか?まぁその辺は自分で修正してくれ
0448デフォルトの名無しさん2005/07/09(土) 23:12:34
>>441
最大値最小値を計算して返す関数?
けいさんってたしざん?ひきざん?二つをかえすって、いっぺんに二つ返すの?
それは引数のフラグでどちらを返すか判断するの?
0449デフォルトの名無しさん2005/07/09(土) 23:20:01
もうやっちゃった人がいましたか o(>_< )
お礼忘れないようにネ!
04504412005/07/09(土) 23:21:44
>>446-447
どうもありがとうございます!助かりました。
0451デフォルトの名無しさん2005/07/09(土) 23:32:22
>>450
gccで普通にコンパイル通るんで見落としてたがエラー出たら
コメントをC89準拠にしてくれ
0452デフォルトの名無しさん2005/07/09(土) 23:39:42
>>441
#include <stdio.h>
#include <stdlib.h>

int jrand(int j) { return rand() % j + 1; }
void max_and_min(const int * arr, int length, int * pmax, int * pmin)
{
  int i;
  *pmax = *pmin = arr[0];
  for (i = 1; i < length; i++) {
    if (*pmax < arr[i]) *pmax = arr[i];
    if (*pmin > arr[i]) *pmin = arr[i];
  }
}

int main(void)
{
  int arr[2000];
  int i, length = sizeof(arr)/sizeof(arr[0]);
  int max, min;
  for (i = 0; i < length; i++) {
    arr[i] = jrand(10);
  }
  max_and_min(arr, length, &max, &min);
  printf("最大値:%d, 最小値:%d\n", max, min);

  return 0;
}
0453デフォルトの名無しさん2005/07/09(土) 23:40:50
あ、配列の中身も表示しなきゃいけないのか。
0454デフォルトの名無しさん2005/07/10(日) 00:55:05
[1] 授業単元:C言語プログラミング
[2] 問題:
じぶんで書いたコード:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/691.txt
課題内容はこちら:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/692.txt
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ(バージョン): Borland C++ Compiler 5.5.1
 [3.3] 言語:C
[4] 期限:日曜PM5:00まで
[5] 制限:配列の内容はポインタで示さなければならないらしいですが
自分で書いたコードがどうしても変なのに表示されます
.     ('A`#) イライラ
  _| ̄ ̄||)_
/旦|――||// /|
| ̄ ̄ ̄ ̄ ̄| ̄| . |
|_____|三|/

3つめのedge_processingの関数がたぶんおかしいのだと思いますが
具体的にどこが間違ってるのかわかりません
分かる方いらしたら教えてください
0455デフォルトの名無しさん2005/07/10(日) 01:21:42
>>454
素直にncol,nrowを使おう。12x12確保してるんだから、main内ではそれを生かすこと。
それと、エッジ作るところでは外枠が上下左右1列ずつなんだから、
確保された目盛りは12x12のままだが、10x10の処理になる。

edge_processing(11,11, &m1[1][1], &m2[1][1]);
↓
edge_processing(nrow,ncol, &m1[0][0], &m2[0][0]);

void edge_processing(int nrow, int ncol, int *m1_p, int *m2_p)
{
int i,j;
for(i=0; i<nrow; i++){
for(j=0; j<ncol; j++){
if (i > 0 && i < nrow - 1 && j > 0 && j < ncol - 1) /* 追加:応急処置 */
*m2_p=*(m1_p + (i-1) * ncol + j)+*(m1_p + (i+1) * ncol + j)+*(m1_p + i * ncol + (j-1))+*(m1_p + i * ncol + (j+1))-4**(m1_p + i * ncol + j);
m1_p++; /* 追加 */
m2_p++;
}
}
}
0456デフォルトの名無しさん2005/07/10(日) 01:23:03
すまん。オオボケした m1_p++はいらん。
■ このスレッドは過去ログ倉庫に格納されています