C/C++の宿題をやらせろや!!!

このエントリーをはてなブックマークに追加
952577:03/02/11 02:30
寝付けなかったので漏れも>>925の宿題やってみよっと!!眠くなるまでな。
>>946
情報系以外ならCだけでも十分かなぁ。
情報系なら絶対に不十分だと思うけど、
Cしかやらない学科も結構ある。

っていうか、Cやってくるならまだいい方で、
中にはfortranやらlispやらpascalやら・・・。
ありがとう。とてもよくわかりました。
955954:03/02/11 02:50
誤爆
956577:03/02/11 03:07
ファイル操作ほとんど失念もうダメポ
おやすみなさい
>>953
Lispはいいんじゃねえの。学校でLisp習えるなんで羨ましいよ。
>>956
そんなもん失念すんなよ・・・
Lispは教えるの難しそうだねぇ。
Cとは別の意味で。
>>959
Lispは抽象度が高いというかなんというか、難しそうだけど。
でもCみたいにポインタがどうしたとかそういう瑣末な
所を抜きにいきなり計算理論に入れるのは教育にいいと思うんだけどな。

いや、無論ポインタの概念も大事だと思うけど、
でもそれは割とCPUにべったりの低水準な技術としての部分であって、
まずアルゴリズムやらの理論をきっちりしっといたほうがよいような。

やれアルゴリズムだ、とかやろうとしてもその前にポインタだ配列だ
mallocだfreeだとかやってもしゃーないような気がしてならないんだが。
そういうところでつまずいてるとしたらもったいない気がする。
その先にもっと面白い世界があるわけで。

ちなみにLispにはポインタの概念もきっちりと存在する。
というかLispのListはもろにリスト構造でconsセルはポインタ
が二つあるだけの存在だし(実際にはもうちょっと複雑だけど)。

10年位前にある本(SICP)を読んで、Lispで普通にオブジェクト指向
できちゃうのを見て仰天した覚えがある(w

とはいえ、実用言語かというと、そうでもないところが痛い。
実用にならないってわけじゃなくて、仕事としては需要がないから、
実用的じゃないという意味なんだが。就職の面接で「Lispやってました」
つってもほとんどのところは (゚Д゚)ハァ? だろうしな。

そういうおれは今日もCでお仕事さ(w
>>960
私ゃEmacs上で動かすくらいだな。
複雑なマクロとしてだったりすることが多いけど
計算式を工夫するときにも使ってる。
awk/perl/javascriptでもいいんだろうけど
再帰式なんか書くのにはlispの方が楽だね。
#って、それはそれでlisp使いから怒られそうだな。w
Lisp もさ、かじる程度に勉強するのはいいと思うんだけどさ、
さもそれがC言語並にいろんな分野で活躍してる言語であるかのように
教えられたりするとちょっと引くんだよな。
最初から「いまどきEmacsのマクロ以外で使われてないけどな」とか
そういうことも教えとかないとあらぬ誤解を生むのではないかと。
963デフォルトの名無しさん:03/02/11 14:41
このような動作をするプログラムを作るにはどうすればいいでしょうか。

例えば ○○○basket○○○ball○○○player○○ (○は空白) と入力すると

basket○ball○player と出力される

単語と単語の間に空白を1つ残すプログラムを作りたいのですが
どうすればいいのでしょうかどなたかお願いします。
sed -e 's/ +/ /g'

っていうか、Cでやる仕事じゃないねぇ。
s/^ +//
s/ +$//
をお忘れで。
プログラムつってるんだから教えてやればいいのに
>>966
お前がな。
出来ているも同然だと思われ
>>963
#include <stdio.h>
int main()
{
  int ch;
  while((ch = getchar()) != EOF)
  {
    putchar(ch);
    if(ch == ' ')
    {
      do { ch = getchar(); } while(ch == ' ');
      ungetc(ch);
    }
  }
  return 0;
}
>>925
#include <stdio.h>
#include <stdlib.h>
#include <search.h>

#define IN_FILE "seiseki.dat"
#define OUT_FILE "seiseki_out.dat"
#define NUM_STUDENTS 80
#define NUM_PASS_STUDENTS 60

struct student
{
  int id;
  int average;
} student[NUM_STUDENTS], *sort_student[NUM_STUDENTS];

int compare(const void *elem1, const void *elem2)
{
  return (*(struct student **)elem2)->average - (*(struct student **)elem1)->average;
}

int main()
{
  char buf[256];
  int i, score1, score2, score3, score4, score5;

  FILE *FP = fopen(IN_FILE, "r");
  if(!FP)
  {
    perror(IN_FILE);
    return -1;
  }
  fgets(buf, sizeof(buf), FP);
  for(i = 0; i < NUM_STUDENTS; i++)
  {
    if(!fgets(buf, sizeof(buf), FP))
    {
      perror(IN_FILE);
      return -1;
    }
    if(sscanf(buf, "%d %d %d %d %d %d", &student[i].id, &score1, &score2, &score3, &score4, &score5) != 6)
    {
      fprintf(stderr, "format error at line %d\n", i + 1);
      return -1;
    }
    student[i].average = (int)((score1 + score2 + score3 + score4 + score5) / 5.0 + 0.5);
    sort_student[i] = &student[i];
  }
  fclose(FP);

  qsort(sort_student, NUM_STUDENTS, sizeof(struct student *), compare);

  FP = fopen(OUT_FILE, "w");
  if(!FP)
  {
    perror(OUT_FILE);
    return -1;
  }
  for(i = 0; i < NUM_STUDENTS; i++)
    fprintf(FP, "ID:%2d、平均:%3d、%s\n", student[i].id, student[i].average, student[i].average >= sort_student[NUM_PASS_STUDENTS - 1]->average? "(・∀・)イイ!!": "あぼーん");
  fclose(FP);
  return 0;
}
>>969
行頭の空白が取れないぞ。

#include <stdio.h>
int main()
{
 int ch;

 ch = getchar();
 while(ch == ' '){
  ch = getchar();
 }
 while(ch != EOF){
  if(ch == ' '){
   do {
    ch = getchar();
   } while(ch == ' ');
   if(ch == EOF){
    break;
   }
   putchar(' ');
  }
  putchar(ch);
  ch = getchar();
 }
 return 0;
}
>>972
制御が見にくい。

#include <stdio.h>
int main()
{
  int ch;
  while((ch = getchar()) != EOF)
  {
    while(ch == ' ');
      ch = getchar();
    while(ch != EOF)
    {
      putchar(ch);
      if(ch == ' ')
        do ch = getchar(); while(ch == ' ');
      else if(ch == '\n')
        break;
      else
        ch = getchar();
    }
  }
  return 0;
}
#include <stdio.h>
#include <string.h>

main()
{
  char s[]="   basket   ball   player  ";
  char* p;
  if(NULL != (p=strtok(s," "))){
    printf("%s", p);
    while(NULL != (p=strtok(NULL," ")))
      printf(" %s", p);
  }
}

むしろstrtokを使っとけと。
あ、間違い

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

main()
{
  char s[]="   basket   ball   player  ";
  char* p;
  if(NULL != (p=strtok(s," "))){
    printf("%s", p);
    while(NULL != (p=strtok(NULL," ")))
      printf(" %s", p);
  }
}
976デフォルトの名無しさん:03/02/13 00:38
printfとかで
『\d』って言う文字を表示させるにはどうしたらいいのですか…?

当然
printr("\d");

ってのはエラーが出るのですが…
977976:03/02/13 00:39
printf("\d");

の間違いです
すみません
>>977
"\\d"
979976:03/02/13 00:50
>>978
ありがとうございます!!!

ってことは『%d』って表示させるときも
『%%d』 って打てばいいんですね
>>979
そうです
\\はCの文字列リテラル共通。
%%はprintf系のみの仕様。

一応。
982:03/02/13 01:25
1から15までの数字をつかった、最大差分三角形のプログラムを作りたいの
ですが、よくわかりません。教えてください
>>982
「最大差分三角形」というのがよくわかりません。教えてください。
>>982
これ?
http://www17.cds.ne.jp/~busyboy/puzzle/pzlguid1.html

そりゃまあ、総当りだろ。
Cマガジン(ってまだあるの??)に載りそうな問題だな。
確かに総当りっぽいが、ちょっとしたコツで劇的に
処理時間を短縮できそうな気もするし。
気が向いたら考えてみるか。
986デフォルトの名無しさん:03/02/13 02:39
1、メールする
goto使いまくった汚いプログラムだけど出来たからうpする。
#include <stdio.h>
#include <stdlib.h>

#define MAXN 15

int inuse[MAXN];
int tri[5][5];

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++) {
とりあえず総当たりごり押しの15段だけを解く
きったねーの作ってみてる(w
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);

lbl1:
inuse[w - 1] = 0;
lbl2:
inuse[v - 1] = 0;
lbl3:
inuse[u - 1] = 0;
lbl4:
inuse[t - 1] = 0;
lbl5:
inuse[s - 1] = 0;
lbl6:
inuse[r - 1] = 0;
lbl7:
inuse[q - 1] = 0;
lbl8:
inuse[p - 1] = 0;
lbl9:
inuse[o - 1] = 0;
lbl10:
inuse[n - 1] = 0;
inuse[m - 1] = 0;
}
inuse[l - 1] = 0;
}
inuse[k - 1] = 0;
}
inuse[j - 1] = 0;
}
inuse[i - 1] = 0;
}
return 0;
}
後は適当に改造してくれ。
ごめんバグりまくってるわ(w
もう一度考えるからちょっと待ってて 
994988:03/02/13 03:12
>>987割り込みすまん。

んで、作って解かせてみてるんだがこりゃだめだ。
何時間かかるかわかったもんじゃない。
995988:03/02/13 03:24
#include <stdio.h>
#define N 15
static int tri[N];
/*
 * 配列triには
 * 01 02 03 04 05
 * 06 07 08 09
 * 10 11 12
 * 13 14
 * 15
 * のように入ってる。
 */
996988:03/02/13 03:24
void check(void) {
  static const int pair[][2] = {
    {1, 6}, {2, 7}, {3, 8}, {4, 9},
    {6, 10}, {7, 11}, {8, 12},
    {10, 13}, {11, 14},
    {13, 15},
    {-1, -1},
  };
  int i;
  /* check */
  for (i = 0; pair[i][0] != -1; i++) {
    if (tri[pair[i][0]] - tri[pair[i][0] + 1] != tri[pair[i][1]]) {
      // printf("\r");
      return;
    }
  }
  /* ok print */
  for (i = 0; i < 15; i++) {
    printf("%d ", tri[i]);
  }
  printf("\n");
}
997988:03/02/13 03:25
void put(int pos, int k)
{
  int j;
  tri[pos] = k;
  if (k == N)
    check();
  else
    for (j = 0; j < N; j++)
      if (tri[j] == 0)
        put(j, k + 1);
  tri[pos] = 0;
}
void genperm(void)
{
  int pos;
  int count = 0;

  count = 0;
  for (pos = 0; pos < N; pos++)
    tri[pos] = 0;
  for (pos = 0; pos < N; pos++)
    put(pos, 1);
}
int main(int argc, char * argv[])
{
  genperm();
  return 0;
}
バグ取れたよ。左右対称は判別してないから2つ答えでるけどね。

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;
}
999988:03/02/13 03:26
こんな感じ。順列の生成は考えるのが面倒だったので
http://www.sra.co.jp/people/miyata/algorithm/genperm.txt
の引き写し(w

なるべく早く動くようにと思って、グローバル変数多用してる。
あと5段決め打ちダサイ(w
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。