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

このエントリーをはてなブックマークに追加
593デフォルトの名無しさん:2005/05/20(金) 19:07:47
main()
{
int i;
int tgt_key;


while(1) {
printf("Please input the key.\n");
if (scanf("%d", &tgt_key)==EOF)
break;
if((i=bi_search(tgt_key))!=-1)
printf("Found! key=%d, Name=%s \n",
Student[i].key, Student[i].name);
else
printf("Not found.\n");

}
}


594デフォルトの名無しさん:2005/05/20(金) 19:09:30
int bi_search(int target)
{
int hi, lo, mid;
lo=0; hi=MAX-1; /* nは配列の大きさ */

while(lo <= hi) { /* この条件が成立しなければ,データは無い */
mid=(lo+hi)/2; /* 中央のデータのインデックス */
if (target==Student[mid].key)
return mid;
else if(target<Student[mid].key)
hi=mid-1; /* 左半分を再探索 */
else
lo=mid+1; /* 右半分を再探索 */
}
return -1; /* 見つからなかった */
}
595デフォルトの名無しさん:2005/05/20(金) 19:11:48
【質問テンプレ】
[1] 授業単元: プログラミング演習
[2] 問題文(含コード&リンク): ポーランド記法を逆ポーランド記法に変換するプログラムを作成せよ。
ただし、逆ポーランド記法は以下のトークンの列で表現する。
  struct token{
enum{NUM,ADD,SUB,MUL,DIV}type;
int value;
};
NUMは数値を示し、ほかは演算記号です。
[3] 環境
 [3.1] OS: Linux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:なるべく早く
[5] その他の制限: できればキューに格納してほしい
596デフォルトの名無しさん:2005/05/20(金) 19:18:30
>>592-594
テンプレつかっておくれ。
597デフォルトの名無しさん:2005/05/20(金) 19:26:51
>>592
2分探索はソート済みのデータじゃないと無理。

hi=MAX-1;
でなく
hi= Num-1;
でないか?
598デフォルトの名無しさん:2005/05/20(金) 19:31:14
>>595
スタックではなく?
599デフォルトの名無しさん:2005/05/20(金) 19:51:03
[1] 授業単元:演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/432.txt
[3] 環境
 [3.1] OS:linux
 [3.2] コンパイラ(バージョン):
 [3.3] 言語:C
[4] 期限:2005/5/23
[5] その他の制限:特に無し

ご指南よろしくおねがいします。
考えれば考えるほど頭がこんがらがってくる・・・OTZ
600デフォルトの名無しさん:2005/05/20(金) 20:58:42
>599
なんか変な仕様だな。
とりあえず、一つのListのvalueが一桁の数値を持つようだな。
これを踏まえてだな。
intに変換する関数。
int DisitToInt(disit *data);
をつくって、intでごにょごにょして、
disit* IntToDisit(int val);
を作ってというのが一つの案なんだが、
読み直してみると、結構面倒だな。
あっさりINT32分超えそう。
すまん、やくにたってないな。
601デフォルトの名無しさん:2005/05/20(金) 21:04:24
602デフォルトの名無しさん:2005/05/20(金) 21:17:01
えっと、やっぱり>>252>>477は難しいんでしょうか。
さっぱり分からないので、「こーすればいいんじゃないの?」みたいなアドバイスでもいいのでご指南よろしくお願いします・・・
603デフォルトの名無しさん:2005/05/20(金) 21:26:15
>>601
ご回答ありがとうございます。
・・・が,9999と1を入力しても10000にならないです・・・
604デフォルトの名無しさん:2005/05/20(金) 21:38:06
605デフォルトの名無しさん:2005/05/20(金) 21:56:36
>604
わざわざご丁寧に有難うございました。
考え方一つでここまで単純にすることができるんですね・・・
606デフォルトの名無しさん:2005/05/20(金) 22:07:45
もう遅いのは承知だけど、あげ。

http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/435.txt
607デフォルトの名無しさん:2005/05/20(金) 22:14:52
>>602
興味が無いわけではないけど、僕はWindows使いなので手が出ません。
まーソケットは扱ったこと無いから元々手が出ないかもしれんが。
608デフォルトの名無しさん:2005/05/20(金) 22:31:33
>598
595のものですが関数のプロトタイプ宣言が
例)void change(char *pre,struct queue *postfix)
な感じになればいいんです。
609デフォルトの名無しさん:2005/05/20(金) 23:18:57
[1] 授業単元:C言語
[2] 問題文(含コード&リンク):
1.
2つの整数を読み込み、最大公約数と最小公倍数を計算するプログラムを作成せよ.但し,main関数の他に以下の関数を必ず使用すること.
整数の読み込み(読み込んだ整数を戻り値とする関数)
最大公約数の計算(2つの整数を引数,結果を戻り値)
最小公倍数の計算(2つの整数を引数,結果を戻り値)
結果を表示する関数(最大公約数,最小公倍数を引数)
2.
フェボナッチ数列{a_n}の要素,a_1, a_2, ..., a_20の中で素数である要素をカウントし,それらを表示するプログラムを作成せよ.但し,main関数以外に関数として以下の関数を作成すること.
数列を計算する(nを引数とし,a_nを戻り値)
素数を判別する(整数aを引数とし,素数の場合1,素数でない場合0を戻り値とする関数)
表示(1)(素数を引数とし,結果を表示)
表示(2)(カウントした数を引数とし,結果を表示)

[3] 環境
 [3.1] OS:Linux
 [3.2] コンパイラ(バージョン):gcc
 [3.3] 言語:C
[4] 期限:5月22日まで
[5] その他の制限:あまり難しい事は習っていないので簡単?なプログラムで。。。
あつかましいですが宜しくお願いします。
610デフォルトの名無しさん:2005/05/20(金) 23:56:32
>>565
やばい。あとしめきりまで、6時間しかありません。
必死なんです。どなたか手伝ってください。
ほんと、お願いします!!!!!!!

611デフォルトの名無しさん:2005/05/20(金) 23:59:54
>>609 1個目
#include <stdio.h>

int gcd(int a, int b)
{ /* 最大公約数。アルゴリズムはユークリッドの互除法 */
if(b == 0) return a;
return gcd(b, a % b);
}

int lcm(int a, int b)
{ /* 最小公約数。アルゴリズムは…特になし。 */
int ggcd = gcd(a, b);
return a * (b / gcd(a,b));
}

int main(void)
{
int a, b;
printf("a=?"); scanf("%d", &a);
printf("b=?"); scanf("%d", &b);
printf("GCD(%d,%d)=%d\n", a, b, gcd(a, b));
printf("LCM(%d,%d)=%d\n", a, b, lcm(a, b));
return 0;
}
612デフォルトの名無しさん:2005/05/21(土) 00:06:10
>>610
仕方ないから大雑把にアルゴリズムだけ。実際には自分で組め。
まずは表作り。詳しい書き方は(C++を)知らん。
vector<vector<int> > table; // 左端、上端の初期化を忘れずに
for(int i=1;i<=length1;i++)
for(int j=1;j<=length2;j++) {
int fromleft = table[i-1][j]-1;
int fromup = table[i][j-1]-1; // upは文法的におかしい?
int fromdiagonal=table[i-1][j-1]+Matrix[Indexof[s1[i]]][Indexof[s2[j]]]; // ここは適宜直せるだろう
table[i][j] = max(fromleft, fromup, fromdiagonal); // ここもif等で書き換える必要有り
}
これを貴様がC++に移行している間に次を書いとく。
613デフォルトの名無しさん:2005/05/21(土) 00:15:59
>>610 Move vector の作成
vector<Move> 変数名を指定されていた気がするけど忘れた。ここでは v にしておく。
for(int i = length1-1, j = length2-1; i != 0 || j != 0; ) {
int left, up, diag;
left = table[i-1][j];
up = table[i][j-1];
diag = table[i-1][j-1];
if(diag >= left && diag >= up) {
v.push_back(斜め); // enum 忘れた
i--;
j--
} else if(left >= up) {
v.push_back(1にブランク); // 同上
i--;
} else {
v.push_back(2にブランク); // 同上。もしかしたら「1にブランク」「2にブランク」は逆かも。
j--;
}
}
scoreの計算方法は示されてなかったが、おそらく
score=table[length1-1][length2-1];
あとは5時間半がんばれ。
614デフォルトの名無しさん:2005/05/21(土) 00:23:09
>>609
素数の判定だけ

int IsPrime(int n)
{
int i;

if(n < 2) return 0;
if(n==2) return 1;
if(n % 2 == 0) return 0;
for(i = 3; i <= sqrt(n); i += 2)
if(n % i == 0) return 0;
return 1;
}

615デフォルトの名無しさん:2005/05/21(土) 00:25:30
>>614
素数判定するんだったらもっとマシなアルゴリズム使えよwww
616611:2005/05/21(土) 00:33:26
>>609 2個目。表示に関して(1)と(2)の区別の意味が分からんのでそこは放置してる
改行が多い関係で省いたけどisprimeに関しては>>614といっしょ。
#include <stdio.h>
int fibo(int n)
{
int i, a, b, c;
if(n < 1) return 0;
if(n < 3) return 1;
a = b = c = 1;
for(i = 2; i < n; i++) { a = b; b = c; c = a + b; }
return c;
}
int main(void) {
int i, n, fib, count = 0;
printf("n=?"); scanf("%d", &n);
for(i = 1; i < n; i++) {
fib = fibo(i);
if(isprime(fib) == 1) { printf("%d\n", fib); count++; }
}
printf("The number of prime numbers is %d\n", count);
return 0;
}

>>615 AKSですか?
617Me != 615:2005/05/21(土) 01:03:20
作りおきだが。
int *sieve_of_eratosthenes(int upper) {
    int i, notprime, *integers = (int*)malloc(sizeof(int) * (upper + 1));
    for (i = 2; i <= upper; i++) integers[i] = 1;
    integers[0] = integers[1] = 0;
    for (i = 2; i <= upper / 2; i++) {
        notprime = i;
        while ((notprime += i) <= upper) integers[notprime] = 0;
    }
    return integers;
}

int is_prime(int n) {
    int *sieve = sieve_of_eratosthenes(n), ret = sieve[n];
    free(sieve);
    return ret;
}
618609:2005/05/21(土) 01:23:57
皆さんありがとうございます
1番はできたのですが2番の616さんのプログラムがエラー出てしまいます・・
619ME->NewFace:2005/05/21(土) 01:26:23
フェボナッチ数自体があってるか謎。
数学の素養がないとこういうときつらいな〜。
#include <stdio.h>
#include <stdlib.h>
#define TRUE (1)
int F(int n){
    if(n==1) return 1;
    if(n==2) return 1;
    return F(n-2)+F(n-1);
}
int EratosthenesSieve(char *p,int n){/*エラトステネスの篩*/
    int i,j;
    for(i =2;i<n;i++){
        if(p[i]==TRUE) continue;
        for(j=2;(i*j)<n;j++){
            p[i*j]=TRUE;
        }
    }
    return 0;
}
int main(){
    int n,f;char *buf;
    puts("Input N...");scanf("%d",&n);
    f=F(n);
    printf("%d",f);
    buf = (char*)calloc(f+1,sizeof(char));
    EratosthenesSieve(buf,f+1);
    if(buf[f] != TRUE)puts("Prime!!");
    else puts("Not Prime!!");
    free(buf);
    return 0;
}
620616:2005/05/21(土) 01:37:28
>>618
isprime関数を>>614のから
int isprime(int n)
{
int i;
if(n < 2) return 0;
if(n==2) return 1;
if(n % 2 == 0) return 0;
for(i = 3; i * i <= n; i += 2) /* ここが違う */
if(n % i == 0) return 0;
return 1;
}
にしてみ?表示用の関数2つ作らなきゃならんらしい(それぞれ何を出力するのか問題文からはよく分からん)
からそのままだとアウトだが。
621デフォルトの名無しさん:2005/05/21(土) 02:14:17
>>ALL
おやすみ〜。
622デフォルトの名無しさん:2005/05/21(土) 02:18:41
エラーが出るときはエラーメッセージをコピペ。
623デフォルトの名無しさん:2005/05/21(土) 02:26:46
>>620
ありがとうございます!できました。
自分も問題文がよくわかりませんorz
624デフォルトの名無しさん:2005/05/21(土) 02:50:00
>表示(1)(素数を引数とし,結果を表示)
>表示(2)(カウントした数を引数とし,結果を表示)

void put_1(int n){ printf("%d は素数です\n",n); }
void put_2(int n){ printf("素数である要素は %d あります\n", n); }
625デフォルトの名無しさん:2005/05/21(土) 03:23:44
>>612,613
ありがとうございます。
私も、やることのアルゴリズムはわかるんですよ。
でも、このもとあるコードが理解できてないんですね。。。
これだけでもRunするんですよ。
それらを、どういうふうにこのコードにそって
書いたらいいのかが、全くわからないんですね。。。
すいません。
もし、C++が分かる方がいたら、教えてください。
ほんと、お願いします。
626625:2005/05/21(土) 03:55:29
627デフォルトの名無しさん:2005/05/21(土) 03:57:39
ジャンケンプログラム作成を依頼した>>559>>569です。
回答ありがとうございました。
習っていない文法があったので、もう少し簡単目なのではできないのでしょうか?
ttp://www.media.osaka-cu.ac.jp/~k-abe/2001-JS-OSAKA-U/C.html
↑ここの最初からbreak文あたりまでしかまだ習っていないので・・・
628625:2005/05/21(土) 04:11:39
これができないと、次の課題もできなくて、
このクラス、パスできないかもしれないのです。
お願いです。助けてください。
629デフォルトの名無しさん:2005/05/21(土) 04:22:22
>>628
お金払って、それなりの人にやってもらえば?
大事な単位なんでしょ。そんな問題をタダでやってもらおうなんて虫が良すぎる。
お金払ってやってもらう価値があるんでしょ?
それにいい加減ウザイ。
630625:2005/05/21(土) 04:26:46
>>629
テメエには言ってねえよ(゚Д゚ )ゴルァ!!余計な茶々入れるんじゃねーよ。
私は解いて下さるだけにお願いしているのです。
どうかお願いしますm(_ _)m
631デフォルトの名無しさん:2005/05/21(土) 04:28:23
>625って明確に落ちこぼれてきてるよな。
632デフォルトの名無しさん:2005/05/21(土) 04:29:44
>>630
諦めろ。
633デフォルトの名無しさん:2005/05/21(土) 06:27:47
age
634625:2005/05/21(土) 06:31:46
やってくれた方にはお礼します。
あと2時間しかないです。
630は私ではありません。
635デフォルトの名無しさん:2005/05/21(土) 06:32:09
>>630 はネタだと思うが。

>>625 よ、学校にお友達いないのか?

回答者にとってここは人助けのためにあるのではなくって、
暇つぶし程度だとおもう・・・そんなに期待しないよーに。

それと、FAQかなぁ。

Q.解けないと単位もらえない。
A.知ったこっちゃない。

Q.急いでください。
A.回答者は急ぐ義理はない。

(とか書くと、やさしいおせっかいさんが、プログラム書いてくれるハズ)
636デフォルトの名無しさん:2005/05/21(土) 06:41:01
荒れてるなー。

>>634
問題どこ? リンク貼っといて。
それと、お礼はなんですか? いくら出せますか?
637625:2005/05/21(土) 06:41:17
>>635
無理に急いでくださいとは言える立場ではないのは分かってます。
締め切りすぎた後でもこれは必要なので、お願いします。
638625:2005/05/21(土) 06:47:16
>>636
メールください。
639デフォルトの名無しさん:2005/05/21(土) 06:50:49
・・・んー・・・yahooメールの人は信用してないんで。
ごめんねー。
640625:2005/05/21(土) 06:52:17
>>636
もう一度張ります。
【質問テンプレ】
[1] 授業単元: バイオインフォマティックス
[2] 問題文(含コード&リンク):
http://www.geocities.jp/arerenore1357/HW.cab
この中に途中までのコードと問題文が含まれています。
[3] 環境
 [3.1] OS: WinXP
 [3.2] コンパイラ(バージョン): MSVC
 [3.3] 言語:C++
[4] 期限:なるべく早く。
[5] その他の制限:
たぶん、struct AminoAcidAlignmentの中で、
vector<vector<int> >
vector<vector<Move>>を使って
for(int i=1;i<=length1;i++)
for(int j=1;j<=length2;j++)
const int some = kscoreMatrix[s1.AAnums[i=1][s2.AAnums[j-1]];
ってやるんだと思います。
他にもやり方があれば、別にかまいません。

コードはだいたい出来ていて、あとは、align 関数を完成させるだけです。
641625:2005/05/21(土) 06:53:04
どこのメールだったらいいのですか?
家のメアドはここには張りたくないのですが・・・。
642デフォルトの名無しさん
フリーメール系はダメなんじゃない?
プロバイダのメールとか学校のメールとかか?