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 2分探索はソート済みのデータじゃないと無理。
hi=MAX-1;
でなく
hi= Num-1;
でないか?
>599
なんか変な仕様だな。
とりあえず、一つのListのvalueが一桁の数値を持つようだな。
これを踏まえてだな。
intに変換する関数。
int DisitToInt(disit *data);
をつくって、intでごにょごにょして、
disit* IntToDisit(int val);
を作ってというのが一つの案なんだが、
読み直してみると、結構面倒だな。
あっさりINT32分超えそう。
すまん、やくにたってないな。
えっと、やっぱり
>>252>>477は難しいんでしょうか。
さっぱり分からないので、「こーすればいいんじゃないの?」みたいなアドバイスでもいいのでご指南よろしくお願いします・・・
>>601 ご回答ありがとうございます。
・・・が,9999と1を入力しても10000にならないです・・・
>604
わざわざご丁寧に有難うございました。
考え方一つでここまで単純にすることができるんですね・・・
>>602 興味が無いわけではないけど、僕はWindows使いなので手が出ません。
まーソケットは扱ったこと無いから元々手が出ないかもしれんが。
608 :
デフォルトの名無しさん:2005/05/20(金) 22:31:33
>598
595のものですが関数のプロトタイプ宣言が
例)void change(char *pre,struct queue *postfix)
な感じになればいいんです。
[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時間しかありません。
必死なんです。どなたか手伝ってください。
ほんと、お願いします!!!!!!!
>>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;
}
>>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++に移行している間に次を書いとく。
>>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
616 :
611: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ですか?
作りおきだが。
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;
}
618 :
609:2005/05/21(土) 01:23:57
皆さんありがとうございます
1番はできたのですが2番の616さんのプログラムがエラー出てしまいます・・
フェボナッチ数自体があってるか謎。
数学の素養がないとこういうときつらいな〜。
#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;
}
620 :
616: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つ作らなきゃならんらしい(それぞれ何を出力するのか問題文からはよく分からん)
からそのままだとアウトだが。
>>ALL
おやすみ〜。
エラーが出るときはエラーメッセージをコピペ。
>>620 ありがとうございます!できました。
自分も問題文がよくわかりませんorz
>表示(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++が分かる方がいたら、教えてください。
ほんと、お願いします。
626 :
625:2005/05/21(土) 03:55:29
628 :
625:2005/05/21(土) 04:11:39
これができないと、次の課題もできなくて、
このクラス、パスできないかもしれないのです。
お願いです。助けてください。
>>628 お金払って、それなりの人にやってもらえば?
大事な単位なんでしょ。そんな問題をタダでやってもらおうなんて虫が良すぎる。
お金払ってやってもらう価値があるんでしょ?
それにいい加減ウザイ。
630 :
625:2005/05/21(土) 04:26:46
>>629 テメエには言ってねえよ(゚Д゚ )ゴルァ!!余計な茶々入れるんじゃねーよ。
私は解いて下さるだけにお願いしているのです。
どうかお願いしますm(_ _)m
>625って明確に落ちこぼれてきてるよな。
633 :
デフォルトの名無しさん:2005/05/21(土) 06:27:47
age
634 :
625:2005/05/21(土) 06:31:46
やってくれた方にはお礼します。
あと2時間しかないです。
630は私ではありません。
>>630 はネタだと思うが。
>>625 よ、学校にお友達いないのか?
回答者にとってここは人助けのためにあるのではなくって、
暇つぶし程度だとおもう・・・そんなに期待しないよーに。
それと、FAQかなぁ。
Q.解けないと単位もらえない。
A.知ったこっちゃない。
Q.急いでください。
A.回答者は急ぐ義理はない。
(とか書くと、やさしいおせっかいさんが、プログラム書いてくれるハズ)
荒れてるなー。
>>634 問題どこ? リンク貼っといて。
それと、お礼はなんですか? いくら出せますか?
637 :
625:2005/05/21(土) 06:41:17
>>635 無理に急いでくださいとは言える立場ではないのは分かってます。
締め切りすぎた後でもこれは必要なので、お願いします。
638 :
625:2005/05/21(土) 06:47:16
・・・んー・・・yahooメールの人は信用してないんで。
ごめんねー。
640 :
625: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 関数を完成させるだけです。
641 :
625:2005/05/21(土) 06:53:04
どこのメールだったらいいのですか?
家のメアドはここには張りたくないのですが・・・。
フリーメール系はダメなんじゃない?
プロバイダのメールとか学校のメールとかか?