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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/01/18(水) 03:35:45
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
 [3.1] OS: (Windows/Linux/等々)
 [3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
 [3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)

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

【前スレ】
C/C++の宿題を片付けます 57代目
http://pc8.2ch.net/test/read.cgi/tech/1136768567/l50#tag993
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0159デフォルトの名無しさん2006/01/19(木) 16:34:25
>>158
どんまい
>>157
ちゃんと謝れよ。非常識なヤツだ。
0160デフォルトの名無しさん2006/01/19(木) 16:42:18
>>156

関数そのものを作れって?
ソートのアルゴリズムは?
何でも良いならバブルソートなら超簡単だからぐぐって自分でやってみ
マージソートやクイックソートはちと複雑だがな
01611562006/01/19(木) 16:57:59
前に授業内で習ったのも多分そのバブルソートなので
今回もそれでいいと思います。

今自分でもどこがダメなのか考えてるので、とりあえずソートの部分調べて作ってきます
0162デフォルトの名無しさん2006/01/19(木) 16:59:28
なんかどれでもいいっていうならクイックソートでも作っていけば点数うpって感じだな
0163デフォルトの名無しさん2006/01/19(木) 17:00:12
つ156
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1505.c
コンパイルしていないけど大丈夫だと思う。
0164デフォルトの名無しさん2006/01/19(木) 17:13:26
>>158サソ せっかく作って頂いたのにすいませんでした。
0165デフォルトの名無しさん2006/01/19(木) 17:18:06
とってつけた謝罪なんて醜いからしなくても良いよ
01661562006/01/19(木) 17:18:11
>>163
ありがとうございます
やってみたところ
順番は並び変わっていたのですが、結果が
3/-858993460
4/-858993460
5/-858993460
9/-858993460
12/-858993460

と、全部の日付が-858993460とかなっちゃって…ショボン(´・ω・`)
問題で出されたQの部分で書き換えていただいた所は自分で理解できたと思うのですが…日付の表示の原因がわからないです
もしかして、どこか先にヒントとして提示されていた部分のコピペが間違っていたのでしょうか…?
0167デフォルトの名無しさん2006/01/19(木) 17:19:45
>>165 とってつけた謝罪なら最初からしませんから。
0168デフォルトの名無しさん2006/01/19(木) 17:20:24
おやおや
0169デフォルトの名無しさん2006/01/19(木) 17:22:23
教授に文句言っといてくれ。
×for(i=0;i<5;++i) printf("%02d/%02d\n",mm[i],dd[j]);
                              ~~
○for(i=0;i<5;++i) printf("%02d/%02d\n",mm[i],dd[i]);
[j]と[i]の違いです。
01701562006/01/19(木) 17:28:59
>>169
!! ありがとうございます 明日文句言ってきます
てかなんで自分で気づかなかったんだろう…
ともかくこれで完成のはず(`・ω・´)


結果
3/15
4/21
5/31
9/ 5
12/29
日付の方だけが何故か入力した順番そのまま出てきてるようです…ナズェダ(´・ω;;:;,.
0171デフォルトの名無しさん2006/01/19(木) 17:33:01
というかプログラムを全て壊してしまうかもしれないけど

scanf("%s",str);
として日付を文字列として受け取って
sscanf(str,"%d%c%d",&month,&temp,&date);
みたいな使い方をすればコードが簡単になると思う

いやごめんね
0172デフォルトの名無しさん2006/01/19(木) 17:35:01
このまま教授に提出してくれ
私にもわけ和漢ね。教授にも間違いはあったんだし文句はいわんだろ。
0173デフォルトの名無しさん2006/01/19(木) 17:43:41
間に合うかな?
Q部分以外は変えてないはず
最後を除いてw

ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1507.txt

原因は多分sort()の同じ月のとこ
01741562006/01/19(木) 17:44:23
>>171
えと…スイマセン、sscanfとか多分習ってないです。持ってるテキストにも載ってなかったですorz
もっと勉強してやり方がわかってから使わせていただきます。ありがとうございます

>>172
了解です。このまま出して、あとは質問してきます
自分ひとりでは、どこが間違っているかわからなかったのでとても助かりました。本当にありがとうございます


また演習でどうしてもわからなかったときは質問に来るかもしれないので
そのときはよろしくお願いします
01751562006/01/19(木) 17:56:33
>>173
おぉ、ありがとうございます。試してみます


結果
3/15
4/21
5/31
9/ 5
12/29
sort()の同じ月の場合のところにif(dd[i]>dd[j]){}をはさんだのはわかったのですが
結果変わらず…orz
01761732006/01/19(木) 17:57:16
俺も同じ間違いしてるし_| ̄|○

月だけスワップして、日付変えてないでヤンスw

  if(mm[i]>mm[j]){
Q   work1=mm[j];
Q   mm[j]=mm[i];
Q   mm[i]=work1;
Q   work2=dd[j];  //ここ追加
Q   dd[j]=dd[i];   //
Q   dd[i]=work2;  //
   }
}
01771562006/01/19(木) 18:08:14
>>174
sort()内の
  if(mm[i]>mm[j]){
Q   work1=mm[j];
Q   mm[j]=mm[i];
Q   mm[i]=work1;
のあとに
Q   work2=dd[j];  //ここ追加
Q   dd[j]=dd[i];   //
Q   dd[i]=work2;  //
   }
}
を入れて試してみましたが…変わりません……日付だけ並び変わらないです
自分の入れるところが間違ってるのでしょうか???
01781732006/01/19(木) 18:16:17
再うp
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1508.txt

そのままコンパイル通るようにQをdefineしてるのは内緒だ。
01791562006/01/19(木) 18:24:33
>>178
おおおできました!できましたよ!
if(mm[i]>mm[j]){のなかでもdd[]の日付を並び替えないといけないんですね

色々時間を取らせてしまってスイマセン。これで心配事が一つ減りました
本当に助かりました。ありがとうございます

0180age2006/01/19(木) 19:00:01
さあ、次の宿題来い
01811632006/01/19(木) 20:20:01
だれか163のどこが悪いのか教えてくれー
気になってしょうがない
01821732006/01/19(木) 20:25:18
>>181

  ,〜'´ ̄ヽ
  ミハ^^ヽヽ(  | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ル ゚∀゚)ζ< 宿題なんだから
 , -|  ̄ll~|- 、 | 先生の意向に従っていただこうッ!!
.〈 イ     〈  |___________________
01831632006/01/19(木) 20:28:48
あんな糞コードを宿題に出す馬鹿は先生じゃねーよ。
少なくとも敬おうとは思わない、寝ながら講座開いてんじゃねーよ。
0184魚チョコ2006/01/19(木) 21:08:20
>>183
――まあ、十円禿くらいには同意。
0185デフォルトの名無しさん2006/01/19(木) 21:17:56
>>150 再アプお願いします。
もしくは57代目の852さん再アプお願いします。
0186デフォルトの名無しさん2006/01/19(木) 21:37:18
[1] 授業単元:プログラミング
[2] 問題文:次のような英小文字の「変換規則」が複数個入ったファイルを用意する。例えばruleとする。
a -> b
b -> c
b -> x
c -> z
変換規則のファイル名、及び「開始文字」を入力し、変換規則を可能な限り使い、変換できなくなるまで変換の過程を出力せよ。何通りもある場合はせべて出力せよ。ただし、変換過程にループがある場合にはその旨を表示して終了すること。
〜例1〜
変換規則のファイル:rule
開始文字:a
出力:
[1]a -> b -> c -> d
[2]a -> b -> x
〜例2〜
変換規則の例
a -> b
b -> a
開始文字:a
出力:ループがあります。
[3] 環境
 [3.1] OS:Windows
 [3.2] コンパイラ名とバージョン:borland
 [3.3] 言語:C
[4] 期限:2006年1月22日まで
[5] その他の制限:特にありません。

まるで分かりません。助けて下さい…OTL
できるだけ分かりやすいプログラムだとありがたいです。
0187デフォルトの名無しさん2006/01/19(木) 21:39:18
>>186
僕にもさっぱり分かりません。
0188デフォルトの名無しさん2006/01/19(木) 21:45:45
変換規則は独自に作るんだろ。
a -> a
だけでいいじゃん
0189デフォルトの名無しさん2006/01/19(木) 21:59:06
>>186
問題の意味が、サップです
0190デフォルトの名無しさん2006/01/19(木) 22:04:18
問題文も解法は自明と思うが.
0191デフォルトの名無しさん2006/01/19(木) 22:21:13
オートマトンを念頭に置いた問題じゃないかな?
0192デフォルトの名無しさん2006/01/19(木) 22:32:03
伝統的な記号処理の問題じゃないかな。
今でも廃れていない。

0193デフォルトの名無しさん2006/01/19(木) 22:57:39
危険対とか合流性・停止性の話だと思うけど、
もう忘れた。
0194デフォルトの名無しさん2006/01/19(木) 23:16:14
DFAを有向グラフで表し、深さ優先探索を行って、巡回を回避
するって問題らしいな。
0195デフォルトの名無しさん2006/01/19(木) 23:19:03
有向グラフはAdjacency Matrixで簡単に表現できるから、後は
要素数を先にスキャンして、何×何の行列を確保するか調べて
おく必要があるな。そこに気をつければ割と簡単かも。
0196デフォルトの名無しさん2006/01/19(木) 23:22:56
[1] 授業単元:プログラミング1
[2] 問題文(含コード&リンク):
全部で20個の整数データを順に入力するものとする。
その際,各データを入力する毎に,新たに入力されたデータが,すでに入力されたデータと異なる場合だけ,
そのデータを出力するプログラムを書け。
なお,データは,1行に1つずつ出力せよ.

[3] 環境
 [3.1] OS:WindowsXP
 [3.2] コンパイラ名とバージョン:VC6.0
 [3.3] 言語:C++
[4] 期限: 一月下旬
[5] その他の制限:特になし。よろしくお願いします。
0197デフォルトの名無しさん2006/01/19(木) 23:24:25
これは推移閉包(transitive closure)を求める問題に帰結できそうだ。
Warshal 推移閉包 でぐぐってみると良い。
0198デフォルトの名無しさん2006/01/19(木) 23:35:17
>>196
#include<set>
#include<iostream>
int main(){
    using namespace std;
    set<int> sets;
    for(int i=0,j;i<20 && cin >> j;sets.insert(j),++i)
        if(!sets.count(j))cout << j << endl;
}
0199デフォルトの名無しさん2006/01/19(木) 23:44:04
>>198
forの条件式には、本当の意味での条件式のみを入れて
読み取りなどはループ本体に書けと何かの本で見た希ガス
02001982006/01/19(木) 23:53:18
んー確かにforに入力のテストを入れるのは少し読みにくいか。
となるとこんな感じかな。

#include<set>
#include<iostream>
int main(){
    using namespace std;
    set<int> sets;
    for(int i=0,j ; i < 20 ; ++i)
        if(!(cin >> j))break;
        else if(sets.insert(j).second)cout << j << endl;
}
0201デフォルトの名無しさん2006/01/20(金) 00:16:31
[1] 授業単元:情報処理
[2] 問題文(含コード&リンク):
引数xのn乗を返す関数my_pow設計せよ。ただし、引数の型はx:double,n:int
とし、戻り値はdoubleとする。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 1月21日でお願いします。
[5] その他の制限:特にないです。
0202デフォルトの名無しさん2006/01/20(金) 00:21:19
>>186
かなり適当。入力チェックは皆無。出力形式もいい加減だから自分で適当に直して。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1511.txt
0203デフォルトの名無しさん2006/01/20(金) 00:24:15
>>201
適当に
double my_pow(double x,int n){
    double r = 1;
    unsigned u = n;
    if(n<0)u = -n,x = 1/x;
    do if(u%2)r *= x;while(x *= x,u/=2);
    return r;
}
0204デフォルトの名無しさん2006/01/20(金) 00:24:26
>>201
double my_pow(double x, int n)
{
int i = 0;
double base = 1;
for(i = 0; i < n; ++i)
base *= x;
return base;
}
0205 ◆Tjwqg0YZug 2006/01/20(金) 00:33:36
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):
1,2,3,4,5,6,7,8,9を一つずつ使ってできる9桁の数(例えば294618375など)をyとする。
また、xを正の整数とする。
そこで、y=x*x が成り立つyとxの値をそれぞれ求め、
y=????????? x=?????
y=????????? x=?????
y=????????? x=?????
上記のような形式で値を出力するプログラムを書け。
[3] 環境
 [3.1] OS: Windows XP
 [3.2] VC++ 6.0
 [3.3] 言語:どちらでも可
[4] 期限: 2006年01月23日20:00まで
[5] その他の制限:特にありません。

一度自分でやってみたのですが、技量不足故に全く手がつきませんでした。
どうかよろしくお願いいたします。
02061862006/01/20(金) 00:47:56
>>202
ありがとうございます。なんとかやってみます。
0207デフォルトの名無しさん2006/01/20(金) 00:55:13
>>203
>>204
ありがとうございます。
0208デフォルトの名無しさん2006/01/20(金) 00:56:46
>>205
#include <stdio.h>
#include <math.h>

int match(int y){
  int flg = 0;
  if(y<123456789||987654321<y) return 0;
  while(y){
    int p = 1<<(y%10);
    if(p&1||flg&p) return 0;
    flg|=p;
    y/=10;
  }
  return 1;
}

main(){
  int begin = (int)floor(sqrt(123456789));
  int end = (int)ceil(sqrt(987654321));
  int x;
  for(x=begin; x<end; ++x) if(match(x*x)) printf("y=%d x=%d\n", x*x, x);
}
0209デフォルトの名無しさん2006/01/20(金) 00:58:29
>>205
#include <stdio.h>

int chk[10];

int check(int y){
int i, r, z;
if(y < 100000000) return -1;
if(y > 999999999) return 0;
for(i = 0; i < 10; i++) chk[i] = 0;
z = y;
while(z > 0){
r = z % 10;
if(chk[r] == 0 && r != 0) chk[r] = 1;
else return -1;
z /= 10;
}
return 1;
}

int main(void){
int x = 1, y, c;
while(1){
y = x * x;
c = check(y);
if(c == 0) break;
else if(c == 1) printf("y=%d x=%d\n", y, x);
x++;
}
return 0;
}
0210デフォルトの名無しさん2006/01/20(金) 01:00:22
>>205
#include<algorithm>
#include<iostream>
#include<math.h>
int main(){
    int y[9];
    for(int i=1;i<10;++i)y[i-1]=i;
    do{
        int value = 0;
        for(int i=0;i<9;++i)value = value * 10 + y[i];
        int x = static_cast<int>(sqrt((double)value));
        if(x*x == value)std::cout << "y="<<value << " x="<<x<<std::endl;
    }while(std::next_permutation(y,y+9));
}
0211デフォルトの名無しさん2006/01/20(金) 01:01:16
[1] 授業単元:プログラミング�T
[2] 問題文(含コード&リンク):
int x;
scanf("%d",&x);
printf("%d",x);
上記のようにprintf()では引数に&を使わないのにscanf()では
使う理由を説明せよ。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: gcc
 [3.3] 言語: C
[4] 期限: 1月22日でお願いします。
[5] その他の制限:特にないです。
0212デフォルトの名無しさん2006/01/20(金) 01:03:56
使わないと望みどおりの結果を得られないから
0213デフォルトの名無しさん2006/01/20(金) 01:07:02
仕様ですとしか言い様がないなぁ
ライブラリ設計者に聞いてみたいところだが
0214デフォルトの名無しさん2006/01/20(金) 01:08:14
char buf[10];
scanf("%s",buf);
printf("%s",buf);
上記のようにscanfで&を使うとは限らない。
単なる仕様
0215デフォルトの名無しさん2006/01/20(金) 01:11:08
>205

#include <cmath>
#include <cstdio>
using namespace std;

bool isOK( int y ) {
 bool digit[10]={};
 for( int i = 0, j = 100000000; i < 9; ++i, j/=10 ) {
  int n = y / j;
  y %= j;
  digit[n] = true;
 }
 for( int i = 1; i <= 9; ++i ) if( !digit[i] ) return false;
 return true;
}

int main( ){
 // 123456789 <= x*x <= 987654321 より x上限がわかる
 int max_x = (int)floor( sqrt( 987654321.0 ));
 int min_x = (int)ceil( sqrt( 123456789.0 ));

 for( int x = min_x; x <= max_x; ++x ) {
  int y = x * x;
  if( isOK( y )) printf( "y=%d x=%d\n", y, x );
 }
}
0216デフォルトの名無しさん2006/01/20(金) 01:13:21
こういうことだろう。

scanfでは与えられた引数の値を書き換える必要があるため。
もしscanfがポインタ渡しではなかったとしたら、
クライアント側で宣言した引数の値をscanf関数が変更することはできない。
printfは与えられた引数の値の変更が一切発生しないため、値渡しでよい。
0217デフォルトの名無しさん2006/01/20(金) 01:17:39
>>211
大筋は>>216でいいと思うが、>>214の様に例外もあるわけで
問題がおかしいと答えとけ
0218デフォルトの名無しさん2006/01/20(金) 01:22:43
printfでも
printf( "%p", &hoge )
みたいに&付けたりあり得るしな。
0219205 ◆Tjwqg0YZug 2006/01/20(金) 01:25:11
>>208
>>209
>>210
>>215
質問してまだあまり経っていませんが、直ぐにお答えしていただいて有難うございます。
皆さんの優しさに本当に感謝いたします。
これからも皆さんを見習って、私も誰かに教えられるような腕前になるまで努力していこうと思います。
本当に有難うございました。
0220デフォルトの名無しさん2006/01/20(金) 01:31:33
いや、問題はおかしくない。

>>211ではまず例を提示しており、
その例を引き合いにして、「printfでは&を使わず、scanfでは&を使う。なぜか?」と聞いている。
scanfでは&を「必ず」使うとは書いていないし、
printfでは&を「必ず」使わないとも書いていない。

まあ、悪文ではあるわな。
02212112006/01/20(金) 01:33:13
明日授業があるので、皆さんに教えてもらった事を参考に
質問してきます。ありがとうございました。
0222デフォルトの名無しさん2006/01/20(金) 01:35:36
とゆうか出題者はその問題によって何を理解させたいんだろうな
scanfが値を格納する関数であることを考えれば
引数は左辺値でなければならないことは自明だし
そうであれば少なくとも値型であるintでは
左辺値とするためにアドレス演算子を使うのは至極当然
0223デフォルトの名無しさん2006/01/20(金) 02:19:52
[1] 授業単元: C言語実習
[2] 問題文(含コード&リンク): ポインタ配列の変数を下記の文字列(”JANUARY”〜”DECEMBER”)で初期化
  1 ’R’が含まれている文字列を表示
  2 各文字列で’R’が最初に見つかった所は先頭から何文字目かを表示する
初期化文字列:"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"
 ○実行結果例  Rがある月はJANUARYで6文字目です
[3] 環境
 [3.1] OS: Windows
 [3.2] gcc
 [3.3] C
[4] 20日24:00
[5] strchr() 
0224デフォルトの名無しさん2006/01/20(金) 02:28:07
まぁ牡蠣でも食べて落ち着け。
0225デフォルトの名無しさん2006/01/20(金) 02:31:04
>>223
#include    <stdio.h>
#include    <string.h>

int main() {
    const char *Month[] = { "JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER",NULL };
    const char **aaa;
    char *bbb;
    
    for(aaa=Month; *aaa!=NULL; aaa++)
    {
        bbb = strchr(*aaa,'R');
        if (bbb != NULL){ printf("%s %d\n", *aaa, bbb-*aaa+1); }
    }
    
    return 0;
}
0226デフォルトの名無しさん2006/01/20(金) 02:32:10
>>223
#include <stdio.h>
#include <string.h>
int main(void)
{
char* month[] = {"JANUARY","FEBRUARY","MARCH","APRIL","MAY","JUNE","JULY","AUGUST","SEPTEMBER","OCTOBER","NOVEMBER","DECEMBER"};
char* p;
int i;
for( i = 0 ; i < 12 ; i++ ) {
p = strchr(month[i], 'R');
if( p != NULL ) printf("Rがある月は%sで%d文字目です\n", month[i], p - month[i] + 1);
}
return 0;
}
脳内コンパイル
0227デフォルトの名無しさん2006/01/20(金) 02:36:48
>>211
出題者がxをどうにかしたいと思っているから、と答えれ
0228デフォルトの名無しさん2006/01/20(金) 02:42:42
>>211
その問題解けないようじゃ
C/C++なんかやめて
JAVAに行きなさい
02292112006/01/20(金) 02:43:16
わかりました。
02302112006/01/20(金) 02:45:26
>>229
俺じゃないです。
0231名無し2006/01/20(金) 03:06:19
[1] 授業単元:再帰法(階乗の計算)
[2] 問題文:[入力]6以下の自然数N(決して7以上の数を入力しないよう!)
[処理]N!を再帰法を使って計算する。[出力]入力の階乗(factorial)!の計算結果を出力。
[説明]fac(n)=1 n=1の時,fac(n)=n*fac(n-1) n>1の時、が階乗!の再帰的な定義である。
この定義をそのまま、関数(再帰的関数)として定義せよ。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:[2006年1月22日9:00まで]
[5] その他の制限:
お願いします。
0232デフォルトの名無しさん2006/01/20(金) 03:10:09
>>231
#include <stdio.h>

int kaijo(int n)
{
    if (n==1)
        return 1;
    return kaijo(n-1)*n;
}

int main()
{
    int n,ans;
    scanf("%d", &n);
    ans=kaijo(n);
    printf("%d\n", ans);
    return 0;
}
0233名無し2006/01/20(金) 03:16:49
[1] 授業単元:再帰法と分割統治法
[2] 問題文:[入力]32個の異なる二桁の自然数[操作]32個の自然数の中で最大値(MAX)と最小値(MIN)を求める。
[出力]入力データ、最大値(MAX)と最小値(MIN)
[説明]入力された32個のデータを配列に記憶。記憶された32個のデータを集合と考え、配列の添数(インデックス index) m,n(m<nを仮定)を
使って配列のm番目からn番目までのデータを含む部分集合は添数を使って(m,n)で表せる。
[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ名とバージョン:gcc
 [3.3] 言語:C
[4] 期限:[2006年1月22日9:00まで]
[5] その他の制限:
0234デフォルトの名無しさん2006/01/20(金) 03:21:03
最小値と最大値を取り出すのではなく
求めるっつーことはソートの関数作れって事でしょ

バブルソートなんかは簡単だから自分で作ってみなさいな
0235デフォルトの名無しさん2006/01/20(金) 03:24:08
>>234
単元が分割統治と再帰だからソートを実装するのが
求められてるのだとしたら、バブルじゃなく
クイック・マージが妥当だろ
0236デフォルトの名無しさん2006/01/20(金) 03:26:23
問題の粒度を小さくするならマージかクイックが最適だな
0237デフォルトの名無しさん2006/01/20(金) 03:35:47
ところでなんで231のは7!以上は駄目なのだろうか

0238デフォルトの名無しさん2006/01/20(金) 03:41:32
>>237
オーバーフローじゃね?
確か16bit整数型だと8!でオーバーフロー起こす
もっともそれでも7!がダメな理由が分からんが

それにlongや(C99なら)long long使えばもっと伸びるしな
0239デフォルトの名無しさん2006/01/20(金) 10:59:27
宿題全然関係ないけどBCCでlong long int て使えないの?
0240デフォルトの名無しさん2006/01/20(金) 11:50:03
つかえね。
0241デフォルトの名無しさん2006/01/20(金) 12:30:49
[1] 授業単元: C言語プログラミング
[2] 問題文
学生20人の成績を入力すると、上位5人の成績・全体の平均点・
最低点を出力するプログラムを作成せよ。
[3] 環境
 [3.1] WindowsXP
 [3.3] C言語
[4] 期限: 1月22日午前10時
[5] その他の制限: 初心者なのでできるだけ簡単な方法でお願いします。
理解できるのは、if,for,while,配列,関数がかろうじて少し…といった
レベルです。

どなたかよろしくお願いします!!
0242デフォルトの名無しさん2006/01/20(金) 12:44:19
[1] 授業単元:情報処理
[2] 問題文:符号なし16進数を文字列s[]に変換する関数ItoH(n,s)を作りなさい。
     nを16で割った余りが16進数の一番低位の数となります。これを'0'〜'9'または'A'〜'F'
     の文字に変換します。次に16で割った商を新しいnとして上の変換を繰り返していきます。
     できあがった文字列は、逆順に並んでいますので、文字列の順序を入れ替えていきます。
[3] 環境
 [3.1] OS: WindowsXP
 [3.2] コンパイラ名とバージョン: bcc
 [3.3] 言語: C
[4] 期限: 一時間以内でお願いします。
[5]<string.h>を使ってください。
おながいします
0243デフォルトの名無しさん2006/01/20(金) 12:45:58
>>241
(゚Д゚)ノ ァィ
#include<stdio.h>
int main(void){
int ten[20],i,k,c;
float s=0.0;
for(i=0;i<20;i++){
scanf("%d",&ten[i]);
s += ten[i];
}
s /= 20;
for(i=0;i<5;i++)
for(k=19;k>i;k--)
if(ten[k]>ten[k-1]){
c = ten[k];
ten[k] = ten[k-1];
ten[k-1] = c;
}
for(i=0;i<5;i++)
printf("%d\n",ten[i]);
printf("平均点:%f点\n",s);
return 0;
}
0244デフォルトの名無しさん2006/01/20(金) 13:06:31
>>242
さ〜て間に合うかな(・∀・)ニヤニヤ
0245デフォルトの名無しさん2006/01/20(金) 13:09:20
13時44分辺りにうpるか
0246デフォルトの名無しさん2006/01/20(金) 13:16:47
>>242
<string.h>ってどこに使うんだ?
0247デフォルトの名無しさん2006/01/20(金) 13:17:16
sprintf使えば1行で出来るな…
0248デフォルトの名無しさん2006/01/20(金) 13:20:03
>>247
ッシ!!
0249デフォルトの名無しさん2006/01/20(金) 13:23:04
作ってみたがstring.hの使いどころが分らないw
無理やり使えないことはないが何か違う気がする
0250デフォルトの名無しさん2006/01/20(金) 13:25:24
sprintfはともかくとして
string.h使うならC++まで拡張して逆方向反復子が使えて便利だったのに
0251デフォルトの名無しさん2006/01/20(金) 13:26:05
string.hを使ってstrrevを使わせたいみたいです。
0252デフォルトの名無しさん2006/01/20(金) 13:36:36
文字列反転の関数Cにあったのか・・・
02532412006/01/20(金) 13:38:40
>243
素早い回答ありがとうございます!
もうお返事あるとは思わず少し感動…。
なのですが、これだと上位5人の成績表示されないと思うのですが…
どう直せばよいのかも分からずorz

すみません、どなたかお願いします!!
0254デフォルトの名無しさん2006/01/20(金) 13:44:21
>>253
あれでおkだよ。ソートしてんじゃん。
0255デフォルトの名無しさん2006/01/20(金) 13:45:06
>>253
(゚Д゚)ノ 悪い最低点忘れてたw
#include<stdio.h>
int main(void){
int ten[20],i,k,c;
float s=0.0;
for(i=0;i<20;i++){
scanf("%d",&ten[i]);
s += ten[i];
}
s /= 20;
for(i=0;i<19;i++)
for(k=19;k>i;k--)
if(ten[k]>ten[k-1]){
c = ten[k];
ten[k] = ten[k-1];
ten[k-1] = c;
}
puts("上位点");
for(i=0;i<5;i++)
printf("%d\n",ten[i]);
printf("最低点:%d\n",ten[19]);
printf("平均点:%f点\n",s);
return 0;
}
0256デフォルトの名無しさん2006/01/20(金) 13:46:17
>>242
そろそろ行くか
#include<stdio.h>
#include<string.h>
void ItoH(int,char*);
void ItoH(int n,char *s){
char str[]="0123456789ABCDEF";
int i=0;
do{
s[i] = str[n%16];
n = n/16;
i++;
}while(n>0);
s[i] = '\0';
strrev(s);
}
int main(void){
char s[256];
int n;
printf("数字入力:");
scanf("%d",&n);
ItoH(n,s);
printf("%s\n",s);
return 0;
}
0257デフォルトの名無しさん2006/01/20(金) 14:45:06
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
   ファイル名をコマンドラインで指定し、その内容を256バイトずつ1ブロックとして、16進と文字列形式でダンプ出力した上で、その内容を16進コードで更新するプログラムを作る。
ただし表示ブロック位置(先頭を0とする)はキーボードから入力するものとして、負値またはエンターキーのみが入力させるまで続ける。ブロック内の更新データの先頭はアドレスは16進で入力する。
更新データは2桁で1バイトの16進データを入力する。

:実行例:

a:\e12345.exe e12345.c
BLNo.->2
000200: 64 69 2e ・・・・・・・・・・・・・・ 63 28 dio.h>・v oid spc(
000210: 69 6e 74 ・・・・・・・・・・・・・・ 28 6e int n)・{ ・・if ((n

         |||途中省略|||

0002f0: 0a 09 7d ・・・・・・・・・・・・・・ 29 3b ・・}・・fcl ose(fi);
ADR->12
DATA->a1a2a4
000200: 64 69 2e 68 3e・・・・・・・・・・・ 63 28 dio.h>・v oid spc(
000210: 69 6e a1 a2 a4 ・・・・・・・・・・ 28 6e int n)・{ ・・if ((n

         |||途中省略|||

0002f0: 0a 09 7d 0a 09・・・・・・・・・・・ 29 3b ・・}・・fcl ose(fi);
DATA->_
ADR->_
Change OK?->y
BLNo.->
[3] 環境 Windows C言語
[4]2006/01/20 18:00まで
0258デフォルトの名無しさん2006/01/20(金) 14:54:18
>>257
ttp://pc8.2ch.net/test/read.cgi/tech/1136768567/409
■ このスレッドは過去ログ倉庫に格納されています