1 :
デフォルトの名無しさん :
04/04/27 16:17 みんなの妹、C++ちゃんです。
わからない宿題はまかせてね☆
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2-10 】
_,ィ、 ,r、__ ,.ヘー'´ i `´/ `i_ /ヾ、 ヽ、 i / /ヽ _ィ、〉 > ´ ̄  ̄ ` く ,ゝ、 }、 ,>'´ 、 ヽ./`ヽ ┌! / / i 「`i ヽヽ ヽ } Y ! | | l i i l i ',__,.ゝ ,' | | | !l l | l l ! i ! | | | | j___j | |i i! |i! l ,.|‐T丁i! ハlj, --!`トlノ、|| | ! ! レ'i´`j "i´ `iヽ, i || _ | l |i iバ__ソ L__ソ /.ノ |! _ヽ) | | |l |、//// ' ///// |! |i ヽ) !ハ |! |,ゝ' ´ ̄ ̄ ` く レy'|! __,ノ レ'ヽiハ / \}'´ ̄ `ヽ、 ィ´ ̄/ ,べY やらせて Y`i__ \ 〉/ / , 、ヽ C++ /_`ヽ\ \ ,ィ'ん、 / ! '´__ ヽ /´__,.` ', \ ァ'` `ヽ、/ー' /! __`ヾ! レ'´ _,. ! \ i /ー-ィ、 ィ__! ___`フ / ヽ二 /7 _i弋 / 辷j ! ヽ / / / / } j´ 〉 ヽ、 冫 ヽ__ュ_y\ / / /ヽヘ/え´ / \'´` `}ー-、_,ゝくi ヽ、 ____ ,. イィ_,、 __う'´__/ , `>ャ,`Yー-‐'^ |ニ=ー- ー-/ `^7 ,ゝ、ヽ /// l ! | / } / | iハ_j く///f´ ̄l/ | i y /-、| | // | ┌ヽ. / `ー-='´ _| /` | |\
4 :
デフォルトの名無しさん :04/04/27 17:02
初心者です、教えてください。 今日のプログラミングの課題で「おまんこをプログラミングせよ」 というのがありました。しかし僕は厨房なのでおまんこを見たこと もありません。おまんこを見せてくれませんか? また発展問題として「セクースをプログラミングせよ」というのも 出ました。発展問題を解くと成績が上がるのでぜひ協力してもらい たいのですが。セクースの相手になってくれますか?
6 :
デフォルトの名無しさん :04/04/27 18:46
前スレの746です。 void addLast(SitePtr , SiteList *); という関数があるのですが、なぜ void addLast(SitePtr , SiteList); ではだめなんでしょうか? SiteListっていうのは一番最初のノードを指してるポインタですよね? 一番上の関数はSiteListのポインタのポインタを用意しなければいけないようですが、 これっていったい何のために使うのでしょうか? よろしくお願いします。 (この宿題が締め切りまでに間に合いそうにありません。度々お願いして 申し訳ないのですが、自力でダメだったときに提出したいのでどなたか この課題をやっていただけないでしょうか?よろしくお願いいたします。 もしだめでしたら、質問の答えだけでもよろしくお願いいたします。)
>おまんこを見せてくれませんか? 素直な表現でわろた。
>>930 版権モンなんよ。ただのWindowsの24ビットbmpです。
>>933 だめでした。(;_;)
>>929 は結局
perlで↓のよーなことしました。(コピペじゃないから間違ってるかも)
s/\#[0-9a-fA-F]{16}\"/'#' . sub($&, 1, 2) .
. sub($&, 5, 2) . sub($&, 9, 2) . '"'/e;
なんとか目的の物は出来ましたが、スマートじゃないなぁ。
おお、色んなスレに貼られててうざかったんだよなあ。乙かれい。
14 :
デフォルトの名無しさん :04/04/29 15:33
任意の二つの整数を入力させ、その差を判定します。 その差が10以下なら「差は10以下」、11以上なら「差は11以上」と表示します。 ・・・ここまでは良いんです。ここまでは。 最後に、「論理OR演算子」を使え、と言うのです。 誰か、お助け下さい・・・
15 :
デフォルトの名無しさん :04/04/29 15:42
たとえば data.txt(フォーマットは変更可能) 5 :使う数 2 4 5 7 8 :xベクトル 1 3 4 8 7 :yベクトル として、x・y(xとyの内積計算)を標準入力から 読み込んで計算するプログラムをライブラリ化目的で 作りたいんですが・・ 最終的に行列計算でこの関数を使える形にもっていきたいです 誰かたしけて・・
int main(void) { int a, b; scanf("%d %d", &a, &b); if (a - b < -10 || 10 < a -b) { printf("差は11以上\n"); } else { printf("差は10以下\n"); } return 0; }
>>14 int dif = a - b;
if ((dif <= -11) || (11 <= dif)) {
} else {
}
無理矢理だが
済みません付け足します メモリは動的確保(malloc)です 調べてatoiとかも考えてみましたがいまいちわかりません とほ・・
>>15 ・変更可能というのは利用者か、それとも開発者が勝手にフォーマットを限定していいのか
・ファイルから読みたいのか標準入力から読みたいのか
>>16-17 どうもありがとうございました!
頭が凝り固まっていたようです。もっと柔軟に考えます。
>>20 >・変更可能というのは利用者か、それとも開発者が勝手にフォーマットを限定していいのか
開発者が限定していい です
>・ファイルから読みたいのか標準入力から読みたいのか
ファイルからです 失礼しました
>>21 Cでおながいしまふ…<(_ _)>
リダイレクション使えってことじゃねーの?
>>23 >>・ファイルから読みたいのか標準入力から読みたいのか
>ファイルからです 失礼しました
あれ?
>>15 では
>として、x・y(xとyの内積計算)を標準入力から
>読み込んで計算するプログラムをライブラリ化目的で
っていってるけど。
typedef double * Vector; Vector new_vector(int n) { return malloc(sizeof double * n); } void free_vector(Vector v) { free(v); } double inner_product(int n,Vector v,Vector w) { int i; double s = 0.0; /* あまりよくない */ for(i = 0;i < n;i++) s += v[i] * w[i]; return s; } とりあえず計算部分。
でけた。 浮動小数対応とかはご自分で #include <stdio.h> #include <string.h> #include <malloc.h> #define SEPARATORS " \t" int innerproduct(size_t c, const int *v1, const int *v2) { int i, r = 0; for (i = 0; i < c; i++) r += v1[i]*v2[i]; return r; } void readvector(const char *s, size_t c, int *v) { char *tmp = strdup(s); char *token = strtok(tmp, SEPARATORS); while (token) { *v++ = atoi(token); token = strtok(NULL, SEPARATORS); } free(tmp); }
続き int main(int argc, char** argv) { char s[256]; int c, *v1, *v2; FILE *fp = fopen(argv[1], "r"); fgets(s, 256, fp); sscanf(s, "%d", &c); v1 = malloc(sizeof(int) * c); v2 = malloc(sizeof(int) * c); fgets(s, 256, fp); readvector(s, c, v1); fgets(s, 256, fp); readvector(s, c, v2); printf("内積: %d\n", innerproduct(c, v1, v2)); free(v2); free(v1); fclose(fp); return 0; }
まとめて斬ってみる。
>>16 >scanf("%d %d", &a, &b);
%dの間の空白は不要。
>if (a - b < -10 || 10 < a -b) {
演算子の周囲の空白の空け方が不統一。
で、おまいはそのif文を
「aからbを引いてその結果が-10より小さいか、10がその結果より小さいか」
と言った調子で思考するのか?
普通は
if (a - b < -10 || a - b > 10) {
とした方が思考の流れを妨げずに読めると思うぞ。
ついでに言えば、
if (a - b <= 10 || b - a <= 10) {
とした方が表示すべき文章との整合性が取れるな。
>>17 >(11 <= dif)
>16同様。
あと、行列計算に使うためにライブラリ化すると
>>27 と
>>28 で分けて別ファイルで保存して利用すればいいのですか?
次々すみません
ダサいからこのまま使うなw 意図せずああいう分け方になったが、 改行多すぎで分けただけ。 行列ライブラリが欲しいならそこら辺に転がってるじゃんよー
>>32 わかりました、調べてきます
ありがとうございました
>>29 ||の後ろの-bはただのtypo。申し訳ない。
不等号の向きに関して少し弁解。
この書き方は、右に行くに従って大きくなる数直線とイメージを重ねている。
a - b のとる値が、0から見て10若しくは-10よりも外側にあるというように考える、ということ。
図にするとこんな感じかな。(等幅フォントで見るとずれないはず)
───────┐ 0 ┌───────
━━━━━━━○────────┼────────○━━━━━━━→ a - b
-10 10
確かに、説明されないと変な書き方に見えるし、こういった人に見せる場で書くコードとしては
不適切だったかもしれない。
おなじく。言語仕様としてシバリが無い限り、数直線で考える。 俺は全然問題ないと思うが。
漏れも漏れもだな。数直線派だよ。 if (a - b < -10 || a - b > 10){のほうが読みにくい。 「aからbを引いてその結果が-10より小さいか、10がその結果より小さいか」 と言った調子で日本語に翻訳して読まないし。
下らん言い争い止めて abs(a-b) > 10 でいいじゃん…
というより漏れの場合'>'がつく比較演算子は使わない。 右小 < 左大 で 結果、真 じゃないと気持ち悪いと思うし ソース内でこういうところが統一されてないと漏れの場合バグになりやすいね。
>>37 それだとa,b がint(整数)じゃないと意味が変わってくるよ。
一応 abs(int),labs(long),fabs(double) と全部出しとくか。
すまん 左小 < 右大 だな。
>>38 右はお箸を持つほう...と
43 :
デフォルトの名無しさん :04/04/29 21:12
正直いちいち議論するほどのことじゃないよ。
c言語で↓のようにするにはどうしたらよい? @ @@ @@@ @@@@ @@@@@ と @ @@ @@@ @@ @
printf("@\n@@\n@@@\n@@@@\n@@@@@\n"); printf("@\n@@\n@@@\n@@\n@\n");
いや、2重ループ使って解けって言われてます。
ははは。ほんと面白い。
>>46 >>1 くらい嫁よ。
#include <stdio.h>
int main(void) {
int i, j;
for (i = 0; i < 1; i++)
for (j = 0; j < 1; j++)
printf("@\n@@\n@@@\n@@@@\n@@@@@\n");
for (i = 0; i < 1; i++)
for (j = 0; j < 1; j++)
printf("\n@\n@@\n@@@\n@@\n@\n");
return 0;
}
>>46 int i, j, add = 1;
for (i = 1; i <= 5; i++){
for (j = 0; j < i; j++){
printf("@");
}
printf("\n");
}
printf("\n");
for (i = 1; i > 0; i += add){
for (j = 0; j < i; j++){
printf("@");
}
printf("\n");
if (i >= 3){ add = -add; }
}
なんつーの。
51 :
デフォルトの名無しさん :04/04/30 00:20
#include<stdio.h> #include<stdlib.h> int main(){ int i,j; for (i=1;i<=5;i++){ for(j=1;j<=i;j++) printf("@"); puts(""); } printf("\nと\n\n"); for (i=1;i<=5;i++){ for (j=1;j<=3-abs(3-i);j++) printf("@"); puts(""); } return 0; }
#include<stdio.h> void main(void) { int x,i,j; scanf("%d",&x); for (i=1;i<=x;i++){ for(j=1;j<=i;j++){ printf("☆"); } printf("\n"); } } 改造したらできました。ありがとうございました。
53 :
デフォルトの名無しさん :04/04/30 02:05
キーボードからある整数nを入力して、 1, -1/2, 1/3, -1/4, ... という数列の第n項までの和を求めよって問題なんですが、 以下のソースがうまくコンパイルできません。 #include <stdio.h> int main() { int n, i; double j = 0; printf("Input the number.¥n"); scanf("%d", &n); for (i=1; i<=n; i++) { j += (( -1 ) ** ( i + 1 )) * ( 1 / i ); } printf("The value is %lf.¥n", j); return 0; } 9行目のところで、 error: invalid type argument of `unary *' というエラーが出ます。コンパイラは、gcc3.3 です。 C言語&プログラムを習い始めて間もないので、初歩的なことを見落としている可能性が高いのですが、 とても自己解決できません。なにとぞ、よろしくお願いします。m(_ _)m
**なんていう演算子は無い
いや T oprator ** (T a, T b) { return a * ((int)b % 2 == 0 ? 1 :-1);} とか?
>>53 >j += (( -1 ) ** ( i + 1 )) * ( 1 / i );
(-1)の(i+1)乗を求めたいんなら pow()って関数がある。
でも今回の場合は単に iが奇数なら1、偶数なら-1にするだけだから
べき乗なんて持ち出さないで
(-1) * ((i + 1) & 1)
でいいでしょう。
教育的に((i + 1) & 1) はナシじゃないの?やっぱし。 素直に a=1.0; b=1.0からループで c += a / b; a = a * -1.0; b = b + 1.0; するのがまっとうでは?
>>56 無理。opratorなんて予約語はC++にないし、**という演算子は
C++に存在しないのでオーバーロードも無理。
そういやネタ禁止だっけ?この板。ツマランネェ。
と、ごまかしてみました
カンジワル。つーかほんとにマジつっこみするならテンプレートだろ(w
>>38 それじゃ、
if (value >= maxLimit) {
ですむロジックを、いちいち
if (maxLimit <= value) {
って書いちゃうわけ?
そんな変な癖ついちゃってたらそりゃぁ、バグの温床になるねぇ。
>36の言うような日本語に翻訳して読むだけの問題ではないんだけど、
頭の中でいちいち数直線持ち出さなきゃいけないんだから効率悪いしバグにもなるわけだ。
どこが変な癖なのかさっぱり分からん。
その程度でバグを出すなら、どうしたってバグが出る。
>>63 で、前者と後者の「ロジック」に何の差があると?
各々が考えやすいように書いたほうがバグが減るだろ
遅レスだが
>>37 それをやると || の使いどころがなくなる
>>63 議論するほどのことじゃないと思う。あくまで漏れの場合だよ。
(わりと漏れに同意してくれる人はいるみたいだけど)
ただ漏れの個人的希望では条件分岐の条件にはソース内で
なんらかの合理的な法則が欲しいと思うわけよ。あんまり賢くないからね。
それがif文であれば左小、右大であるし(プログラムソースは左から読むし
プログラムでなくても通常の数式でもそう書くのが一般的だからね)、
switch〜caseのcaseであれば規則正しく昇順(降順)でラストがdefaultって感じかな。
>>63 はそういうのが出鱈目でもミスしないようだからきっと頭がいいのだろうね。
宿題スレでする話題じゃないな。
たしかに。スマソ。
馬鹿らしい規則かと思ったけど、自分のソース見たら統一してあった。 皆、無意識にやってるんじゃないか?
基本的には 参照元 符号 参照値 の列が正しい。 あるいは 場所 関係 機能 でお考えになられても可。
したがって、符号の向きを揃えたいがためだけで 表記法を変更するのは愚行であるかと。
数直線で考えるのが一般的じゃないか? a >= 5 && a <= 10 より 5 <= a && a <= 10 の方がわかりやすい気がするんだが。 あと、スレ違いだな>俺
時とばやいによるんだろ。 ああ、スレ違いの流れに飲み込まれていく…。
判り易いかどうかの問題じゃないんだな。 5 <= a の表現は禁則なんだな。代入式の形式を無視している。 これでは定数値に対して変数値を評価しているようになる。 それに数直線様な見た目を好む方は2次元以上を扱うことはできるのですか? スレ違いか・・・
そもそも比較において、定数と変数を分ける意味って何?
もういいもういい。初心者だが〜、スレ違いだが〜は免罪符じゃない。 続けるなら他の適切なスレでやってくれ。
先生っ! C言語で適当に演算させてその結果を標準出力ではなくて 自分のメアドにその内容を送るにはソースコード内にどう書けば良いですか?
>>73 の場合なら同意。範囲内かどうかなら揃ってた方が見やすい。
でもaが5より大きいとかをわざわざ 5<a とは書かない。普通に a>5 でわかる。
>>79 処理系くらい書け。
>>79 ここは「宿題」スレなので、
>>1 の注意点を熟読してから書いてね。
なんだ・・・実装できないようなカスばっかかよ(´・ω・`)
#include <stdio.h>
#include <string.h>
int main()
{
char addr[] = "
[email protected] ";
char command[256] = "/usr/sbin/sendmail ";
strcat(command, addr);
FILE *fp = popen(command, "w");
fprintf(fp, "To: %s\nFrom: %s\nSubject: test\n\n", addr, addr);
fprintf(fp, "message body\n");
pclose(fp);
return 0;
}
n個の整数からなる配列をできる限り低速にそーとするアルゴリズムを設計して実装せよ。 フェアプレイの精神を忘れないように。 つまり、処理を進行させていずれは終了するアルゴリズムでなければならず、 時間稼ぎのループのようなインチキを働く実装であってはならない。 そのアルゴリズムの計算量をnの関数として表現せよ。 よろしくお願いします。
モチベーションのあがらない宿題だな。
教科書にそー書いてあるんですわ・・・ モチベーションあがらん教科書ですな。
>>84 引き算をデクリメントのループで実装するような姑息な手段はフェアじゃないのだろうか。
実際、どこまでがアンフェアなのかの線引きがない以上手の出しようがないな。
n個のデータなんでn!の比較、n!の入れ替えが一番遅くなる。 なんで、バブルソートが設計的には一番低速だろ。 それ以外のはいんちきじゃないとできない。(論理的には)
選択法のほうが遅くないか。
90 :
デフォルトの名無しさん :04/04/30 22:41
ここの板にいる輩は サリンジャーすら読んだことないやつらばっかみたいだねwww 正直生きてて恥ずかしくないか? 最低でもナインストーリーズのバナナフィッシュにうってつけの日くらいは 読んでおかないと社会に出てから恥ずかしい思いするぞwww
#define MAX 100
void slowsort(int *data)
{
int i,j,half;
half=MAX/2;
i=rand()%half;
j=i+1+(rand()%half);
if(data[i]>data[j]){
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
}
Nが大きい時はかなり早いが、完璧にソート出来ない可能性も有る諸刃の剣。
O(N)の方は
>>92 に任せた。
ライ麦しか読んだことない
配列のそれぞれの値を調べて それを小さい順(もしくは、大きい順)に並べる って事したいです。お願いします
>>95 あなたのギャグセンスは30代以上ですね。
総統閣下は相当カッカ来てるな
>>90 「はじめてのC」しか読んだことありません。
そのネタ知ってたのに再度笑ってしまった自分が情けない。
JAVAでの int count = 0; while(count < 1) { try{ ・・・ここで入力 } catch (NumberFormatException e) { System.out.println("正しい入力をしてください"); continue; } count++; } のようなことをBorland C++でやりたいのですが、どのようにすればよいでしょうか ちなみにコンパイラはBorland C++で、 OSはWindowsXP SP1です。 期待する入力はint型、エラーとして受け取りたいのはint型の範囲を超えるものと、int型以外の型です。
104 :
104(1/2) :04/05/01 16:20
#include <stdio.h> #include <stdlib.h> #include <string.h> struct record list{ char name[32]; int score; struct record *next; }; int main(void){ struct record *list; *tmp = NULL; list = (strucct record *)malloc(sizeof(struct record)); scanf("%s", list->name); while(strcmp(name, "end") != 0){ scanf("%d", &(list->score)); list->next = tmp; tmp = list; list = (strucct record *)malloc(sizeof(struct record)); scanf("%s", list->name); } list = tmp; while(list != NULL){ printf("%s: %d\n", list->name, list->score); list = list->next; } return 0; }
上のプログラムに、free関数を使って引数として指定された 得点をリスト構造から削除する関数を追加したいのですが どのようにすればいいですか?
void delete(struct record* src,int score) { struct record* next = src; while(src){ next = src->next; if(src->score == score){ free(src); } src = next; } }
>104 struct record *del_score(struct record* src,int score) { if(src!=NULL){ src->next = del_score(src->next,score); if(src->score==score){ struct record *temp=src; src = temp->next; free(temp); } } return src; } 使い方 list = del_score(list,消したい得点);
もうちょっと簡潔に void del_score(struct record** src,int score) { if(*src!=NULL){ del_score(&src[0]->next,score); if(src[0]->score==score){ struct record *temp=*src; *src = temp->next; free(temp); } } } 使い方 del_score(list,消したい得点);
>111訂正 使い方 del_score(&list,消したい得点);
113 :
デフォルトの名無しさん :04/05/01 20:53
2分探索法を再帰的な関数を使ったプログラム教えてください。 Cでお願いします。
>>113 int binary_search(int l,int r,int a[],int key) {
int m = (l + r) / 2;
if ( l == r && a[m] != key ) return -1;
if(a[m] < key) return binary_search(m+1,r,a,key);
else if(a[m] > key) return binary_search(l,m,a,key);
return m;
}
116 :
デフォルトの名無しさん :04/05/01 21:23
>115 ありがとうございました。 初心者なので助かります。
誰かよろしくお願いします。
ウホッいい初心者
>>117 int count = 0;
while(count < 1){
try{
}
catch(NumberFormatException e){
printf("正しい入力をしてください\n");
continue;
}
count++;
}
NumberFormatException& e だな。
>>119 ,120
エラー E2303 win_search.cpp 87: 型名が必要(関数 main() )
エラー E2377 win_search.cpp 87: Catch文に ) がない(関数 main() )
が出てきます。
struct NumberFormatException {}; とかを勝手に定義してくれ。
うまくいきません。。。 {}の中に何をどう定義すればいいのでしょうか
だめでした。 try の中は cin >> key; だけでいいんでしょうか? これじゃぁ無理な気がしてきました。
自分で検出して自分でthrowするんじゃ?
#include <iostream> struct NumberFormatException {}; int main() { int count = 0; while (count < 1) { try { std::cin >> key; if (keyがなんかおかしい) throw NumberFormatException; } catch (NumberFormatException) { std::cerr << "正しい入力をしてください" << std::endl; continue; } count++; } return 0; }
全ての変数・配列・ポインタ等をリセットしてmainの冒頭に戻る なんて都合のいい関数ってありますか?関数じゃなくてもいいですが
system(thisapp); exit(0);
>>128 setjmp(), longjmp() でどうにかならないかな。
131 :
デフォルトの名無しさん :04/05/02 18:14
>>128 そんなひねくれた技覚える前に,まともな方法はちゃんと判ってるのか?
ん?関数じゃなくてもいいってことは判ってないのか… 例えば int main(){ int array[10]={1,2,3}; ..... return 0; } ↓ int main(){ for(;;){ int array[10]={1,2,3}; ........ if(終わりたくなったら) break; } return 0; } 変数の寿命:{}ブロック内で宣言した変数はそのブロックの先頭で初期化され, そのブロック内でのみ有効。 を活用する。
133 :
デフォルトの名無しさん :04/05/03 11:05
for(i = 0; i < 20; i++) { for( k = 0; k < 10; k++) { if(stopblocks == 0) ; else if(i = 0) ; else if(a[i][k] == 0 ) { if( a[i-1][k] == 0) ; else if((a[i+1][k+1] == 0) && (a[i][k+2] == 0)) { a[i-1][k] = 0; a[i][k] = 1; a[i-1][k+1] = 0; a[i+1][k+1] = 1; a[i-1][k+2] = 0; a[i][k+2] = 1; } } else { /*stopblocks = 0*/; } ↑荒々しいコードですみませんが、上のようなコードを書いたとき iとkの中身がインクリメントされてるはずなのに何度ループしても両方0の ままになってしまいました。iとkがインクリメントされていってくれるものと 思ってif文を書いてたのですが、iもkも常に0なので いつも一番最後のelse文になってしまい、思うように動いてくれないです・・・。 どこがマズいのでしょう・・・ for文の中のいろんな行でiとkの値を表示させてみたんですが何度ループした後もいつも0になってるんです。
>>133 まずは、コンパイラの警告に耳を貸すことを覚えろ。
else if(i = 0)
135 :
デフォルトの名無しさん :04/05/03 11:13
>>134 しまったああああああああああああああああああああああ
そこかあああ
ありがとうございました。
↓定数を左に置くと(ry
時定数に変身!
138 :
デフォルトの名無しさん :04/05/04 01:52
1.日付と時刻が以下のように表現される。 これを構成する各要素を表現するためのC言語の型定義を示せ。 単に文字列とするのではだめ。 平成 16年(2004) 4月27日(火) 12:15:35 2.火曜日 A群 03 2年 3532 アルゴリズムとデータ構造I 木村 前 03IB 21522 上記の情報を表現するためのデータ構造を、C言語の定義型として書け。 3.データ型、データ構造、抽象データ型の違いを述べよ。 よろしくお願いします。
140 :
デフォルトの名無しさん :04/05/04 04:00
>>139 struct tmみたいなものを自分でつくれということでは?
曜日は enum でだろうな・・・
>>139 おいおい。間違ってはいないけど、それは違うだろw
半径rを入力し、rが正のときは、球の体積V=4/3*πr^3を計算して出力する。 ただし、rが0の時は、「半径が0になっています」と出力し、 rが負のときは「半径が負になっています」と出力する 初歩的なものだと思うんですが、やり始めたばかりなので分かりません。お願いします
#include <stdio.h> main(){ int r=0; printf("r="); scanf("%d",&r); if(r<0){printf("rが負になっちょる\n");} else if(r==0){printf("rが0ですぜ\n");} else{ printf("半径%dの球の体積は%dπです。\n",r,r*r*r*3/4); } }
V=3/4*πr^3になってたorz
少数も欲しいなら #include <stdio.h> main(){ float r=0; printf("r="); scanf("%g",&r); if(r<0){printf("rが負になっちょる\n");} else if(r==0){printf("rが0ですぜ\n");} else{ printf("半径%gの球の体積は%gπです。\n",r,r*r*r*4/3); } {
147 :
デフォルトの名無しさん :04/05/04 19:10
n個の値 a[0], a[1], …,a[n-1] が与えられているとき、i を与えるとa[i]の順位 r を求めるプログラムを書け。 これ、問題の意味からしてわからないんです。誰かたすけてー
n個が5個だとしたら (a[0]=10 (a[1]=30 5個←(a[2]=20 (a[3]=50 (a[4]=2(a[n-1]) という意味で iがもし2だったら、a[0〜4]のなかでa[2]が何番目にでかいかって事?
>順位 r なぜ「でかいかって」と思うんだ?
おにいちゃん、ぼくもうがまんできない
順位の求め方。自分より点数が上のものの数+1 int rank(int i,int n,int a[]) { int j, r = 1; for(j = 0;j < n;i++) if(a[n] > a[i]) r++; return r; }
>自分より点数が上のものの数+1 なぜ「上」(w しかも「点数」(w
>>88 >n個のデータなんでn!の比較、n!の入れ替えが一番遅くなる。
n*n = n^2 が一番遅くなるだろ?
nが3より大きいならn!の方が遅い
>154 n! よりも遅い n^n を思いついたぞい(w
>>156 そのオーダーで動くソートアルゴリズムがあればなw
>>157 こんな感じかな
/* 最大値、最小値を探す */
max=min=tbl[0];
for(i=1; i<TBL_SIZE; ++i){
if(min>tbl[i]) min=tbl[i];
if(max<tbl[i]) max=tbl[i];
}
/* ソート(w */
p=0;
for(n=min; n<=max; ++n){
for(i=0; i<TBL_SIZE && p<TBL_SIZE; ++i){
if(n==tbl[i]){
tmp=tbl[p]; tbl[p]=tbl[i]; tbl[i]=tmp;
++p;
break;
}
}
}
>>158 いんちきの定義が曖昧なんであれだけど、明らかに不要なループをまわしてるんで
それはいんちきの内にはいるんじゃないの?
しかもn^nじゃないし。
初歩ですがbreakがよくわからないので... 素数がどうかを判別するものです。 #include <stdio.h> int main(void) { int i, num; printf("2以上の整数を入力してください\n"); scanf("%d", &num); for(i = 2; i <= num; i++){ if(i == num){ printf("%dは素数です\n", num); } else if(num % i == 0){ printf("%dは素数ではありません\n", num); break; } } return 0; }
参考書によると、 「break文を使うと、内側のブロックを抜け出して、 もうひとつ外側のブロック処理が移ることになっています」 とあるのですが、そうだとすると例えば上のnumに12を入れたとすると 12は素数ではありません 12は素数ではありません 12は素数ではありません 12は素数ではありません 12は素数です と、出るべきじゃないかなと。 つまり、i = 2のときにbreakにかかってfor文に戻り、i = 3のときにbreakにかかってfor文に戻り、 i = 4のときにbreakにかかってfor文に戻り、i = 6のときにbreakにかかってfor文に戻り、 i = 12のとき(i == num)となってfor文を抜け出すと... breakの部分をどう間違って解釈しているのでしょうか? 長かった・・・
>>162 どの本読んだかわからないけどちがう。
上記の例の場合、breakしたときはforブロックを抜ける。
164 :
デフォルトの名無しさん :04/05/04 21:52
>>148 >>149 そうです。
順位とは自分よりもおおきいものの数+1だと注があるのを写しわすれていました。
>>162 breakはブロックを抜け出す、というのが間違い。
最も内側のfor,while,do/while,switchを抜けるんだ。
breakなんだから、普通にforを抜けているだけ 君のやりたいことだとcontinueを使えばいいのかな?
しまった。 「君のやりたいこと」でもないし
>159 >それはいんちきの内にはいるんじゃないの? そうかスマソ >160 >しかもn^nじゃないし。 そうかスマソ
>>163 >>165 >>166 有難うございます。
参考書(やさしいC第2版/高橋麻奈著)を見たら、
「繰り返し文をネストしている場合、内側の文でbreak文を使うと、内側のブロックを抜け出して、
もうひとつ外側のブロック処理が移ることになっています」
と、ありました。
>>162 で少し削ってしまい申し訳ないです。
今まで、「break文とは最も内側のブロックを抜け出すものだ」と解釈していたので
大変勉強になりました。有難うございました。
170 :
デフォルトの名無しさん :04/05/04 22:10
>>151 「n個の値 a[0], a[1], …,a[n-1] が与えられているとき」というのはどういうふうにやったらいいんでしょうか。
basicみたいに最後にdataとつけたらいいんでしょうか。
例えば int a[]={0,1,2,3,4,5,6,7,8,9}; これで a[0]〜a[9]が用意される。
172 :
デフォルトの名無しさん :04/05/04 22:48
@a(0..9);
おいっ!はやくょぅι゙ょ降臨してくれよ。もう一週間も待っているんだぞ!
>>169 その解釈だと、例えば
int ic;
for (ic = 0; ic < 9; ++ic) {
if (...) {
break;
}
}
のbreakにに何の意味もなくなってしまう。
175 :
デフォルトの名無しさん :04/05/04 22:58
>>171 おお、最初に埋めこんでしまうんですね。
たとえば、
# include <stdio.h>
main ()
{
int a[]={0,1,2,3,4,5,6,7,8,9};
と、始めるわけですか。
とすると、配列の要素数を求めるにはどうしたら、
>>173 自分でデスクマスコットなりなんなりプログラム組んで戯れてください。
>>175 その場合実行時にコピーするコストが掛かるので、
普通は
static int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
或いは固定値でいいなら
static const int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, };
とする。
178 :
デフォルトの名無しさん :04/05/04 23:35
>>177 うおお、かなりむつかしい事になってきました。
ゆっくりと理解していかなければ……
mainのchar *argv[]をintに変換し、代入せよ お願いします
int n = atoi(argv[i]);
やっぱええです。すみませんでした
なにかわかりませんががんばってください
>>175 >int a[]={0,1,2,3,4,5,6,7,8,9};
>配列の要素数を求めるにはどうしたら、
配列全体のサイズは sizeof(a)
1要素あたりのサイズは sizeof(int)
従って、要素数は sizeof(a)/sizeof(int)
>>185 #define numberof(x) (sizeof(x)/sizeof(*(x)))
#define numberof(x) for (;;)
侘しさのあまりに自己レスとみた
190 :
デフォルトの名無しさん :04/05/06 18:13
マス・ダンパ・バネ系の運動方程式をオイラー近似で解く、 C言語プログラムを教えていただきたいです。 物体の質量m、台車の変位x、粘性係数c、剛性係数k、 離散のサンプリング間隔をdtと置いて。 どうやったらいいか、などのアドバイス程度だけでもいいんで是非是非おながいします。
先輩のプログラムを参照しましょう。 どうせ理学系の大学生だろ?
1 2 3 4の4つの数から成る順序つきの組み合わせ 計24個を表示するにはどうすればいいでしょうか? forを使ってネストにしているのですが、期待した動作を してくれません。
>>192 多分合ってる筈
int i,j,k,m;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
for(k=0;k<4;k++)
for(m=0;m<4;m++)
if(i!=j&&i!=k&&i!=m&&j!=k&&j!=m&&k!=m)
printf("%d%d%d%d\n",i+1,j+1,k+1,m+1);
196 :
悩める無能男 :04/05/06 22:23
高速フーリエ変換のプログラムを組んでいるのですが、 0、1、2、・・・、((2^k)−1)の数字を二進数表現の逆順ビット列の順番にする (数字を2進数で表現し、ビットを反転させてから(例えば100なら001に)大きい順 に並べ替え、そして10進数に直す。たとえば0,1,2,3、なら0,2,1,3に並べ 替えられる)プログラムがどうしてもできません。方針でもかまいませんので教えてください。 お願いします。 このように並べ替えることにより、バタフライ演算が容易になるんだそうです。
自己レスです。解決しました。
>>196 小さいほうから反転させればいんじゃないの?
いつのまに みんなの妹とかいうのが入り込んだんだ?
>>195 今現在鯖の 503 を確認いたしました
後日再挑戦致します
201 :
悩める無能男 :04/05/07 00:24
初歩的な質問なんですが、どうやって反転すればよいのか・・
あのさビット反転てほんとにそういう意味? 排他的論理和じゃねーの? (例えば100なら011に)
ぐぐったらモロに出てきたが、
>>196 は調べたのか?
/* ビット反転並べ替えを行う */
void bitrv(int n, double a[])
{
int i, j, k;
double tmp;
i = 0;
for (j = 1; j < n - 1; j++) {
for (k = n >> 1; k > (i ^= k); k >>= 1);
if (j < i) {
tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
}
for (k = n >> 1; k > (i ^= k); k >>= 1); かぁ。すげ。 もう少しエレガントな方法ないんだろうか。 パズルみたいで面白いとオモタ
205 :
デフォルトの名無しさん :04/05/07 01:41
4月からパソコンを触り始めた初心者です。 C++のプログラムですが 整数値を読み込み、それが正の値であれば、その数を逆順に出力するプログラムを製作せよ。 たとえば12345なら54321と出力すること。なお、読み込んだ値が0以下なら何も出力しない。 いままでに習ったのはdo文までで配列はまだ出てきません。お願いします。
こんなんでいい? #include <iostream> int main(){ int val; std::cin>>val; if(val<0) return 0; do{ std::cout<<val%10; val/=10; }while(val!=0); return 0; }
207 :
デフォルトの名無しさん :04/05/07 02:46
>>206 ありがとうございました。
試してみます。
>206 おしいな "読み込んだ値が0以下なら何も出力しない" >if(val<0) return 0;
209 :
デフォルトの名無しさん :04/05/07 03:11
あぁ、<=0ね。
210 :
デフォルトの名無しさん :04/05/07 03:18
>>205 #include <iostream>
using namespace std;
void f(int val)
{
if (val > 0) {
cout << val % 10;
f(val / 10);
}
}
int main()
{
int val;
cin >> val;
f(val);
return 0;
}
#include <iostream> int main(){ int val; std::cin>>val; for(; val>0; val/=10) std::cout<<val%10; return 0; }
212 :
デフォルトの名無しさん :04/05/07 18:08
「n個の任意の値を入力して、大きい順に並び替えるプログラムを作成せよ」という問題が、解けません。どなたかわかるかたいらっしゃいませんか?お願い致します。
213 :
デフォルトの名無しさん :04/05/07 18:32
(if文を使って 長さxメートル(xは整数)の紐をn等分するときの長さを am bcm cmmで表示しなさい。 ただしxとnは入力し、m、cm、mmの桁が0のときは、その桁の出力を 抑制すること)の解答を教えてください。mmからcmの繰り上げがよくわかりません。
1m = 100cm = 1000mm
>213 mmで計算して、出力時に換算する。 mm>cmは10で割ってintにキャストすれば端数は切り捨てられる。
自己解決した筈のものですが、仕様の変更があり、困っています。 二次元平面上に任意の点を最大で10程度取り、原点Oからその 全ての点を通る経路について最短経路長及び経路順を求めよ。 ただし、二点間の距離は sqrt(pow(x1-x2,2)+pow(y1-y2,2))で求められるものとする。 なお、使用言語はC++であり、点はクラスを用いて表現する。 というものです。点の数が任意であるため、単純なforループでは 実装できませんでした。 やはりGAなどを使ったほうがいいのでしょうか?当方にはGAに関する 知識が無いので困っております。どなたかご指南をお願いいたします。 また、GAを使う必要が有るのであれば、参考になる文献などを教えていただけると 幸いです。
>>212 #include <iostream>
#include <vector>
#include <algorithm>
#define N 8
using namespace std;
bool greater(const int &a, const int &b){ return(a > b); }
int main(void)
{
vector<int> d;
int b;
for(int i = 0; i < N; i++){
cin >> b;
d.push_back(b);
}
sort(d.begin(), d.end(), greater);
for(vector<int>::iterator c = d.begin(); c != d.end(); c++){
cout << *c << ", ";
}
return 0;
}
>>217 こうでしょ。
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(v));
std::sort(v.begin(), v.end(), std::greater<int>());
std::copy(v.begin(), v.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}
#include <stdio.h> #include <stdlib.h> void set_first(int *, int); int next_junretu(int *, int); void print_junretu(int *, int); void mainloop(int); int main(int argc, char *argv[]) {int i; if (argc < 2) mainloop(3);else for (i = 1; i < argc; i++)mainloop(atoi(argv[i])); return 0;} void mainloop(int n) {int *p; if (n < 1) return; p = (int *) malloc(sizeof(int) * (n+1)); if (p == NULL) { /* no memory */ return; } set_first(p, n); do { print_junretu(p, n); } while (next_junretu(p, n)); free(p);} void set_first(int *p, int n) { int i; for (i = 0; i < n + 1; i++)p[i] = i;} int next_junretu(int *p, int n) { int i, j, t; for (i = n - 1; p[i] >= p[i + 1]; i--) ; if (i == 0) return 0; for (j = n; p[i] >= p[j]; j--) ; t = p[i]; p[i] = p[j]; p[j] = t; for (i++, j = n; i < j; i++, j--) { t = p[i]; p[i] = p[j]; p[j] = t; } return 1;} void print_junretu(int *p, int n) { int i; printf("%d", p[1]); for (i = 2; i <= n; i++) printf(" %d", p[i]); printf("\n");}
222 :
デフォルトの名無しさん :04/05/07 21:14
C++のexeファイルをダブルクリックで実行すると全部出力しないうちに実行画面が消えてしまいます。 先生はC言語でのgetcharにあたるものを文中に使えば途中で消えないと言うのですが、C++では何になるんでしょうか?
C++はCのスーパーセットです。
224 :
デフォルトの名無しさん :04/05/07 22:15
CはC++のサブセットです。
>>221 有難うございます。
ソースのほうと、ライブラリ関数のほう両方とも見させていただきました。
やはり、要素数が10のときに順列の生成に時間が掛かりすぎてしまいますね・・・
どうにかしてスマートに求められないでしょうか?どなたかご指南お願いいたします
#include <stdlib.h> int main() { system("PAUSE"); return 0; }
>216
>点の数が任意であるため、単純なforループでは実装できませんでした。
これは再帰使えば解決できる。
>やはりGAなどを使ったほうがいいのでしょうか?
GA なんてご大層なもの使うほどの問題でもないような気がするけど。
で、枝刈りしながら再帰で探索する方法で作ってみた。座標はランダム初期化。
10点程度なら(よほどの悪条件でなければ)数秒もせず結果が出てくるはず(@PentiumM 1.3GHz)。
高速化のための工夫としては、
1.各点間の距離テーブルを最初に作成しておく
2.今までに発見された最短経路距離を越えた時点で探索を打ち切る(枝刈り)
3.次の点の候補を選ぶ際、距離の短い点から順に選ぶ
(早期により短い経路が発見されやすくなると期待できるので、枝刈りの効率が上がる)
4. 3.のための順序テーブルも最初に作成しておく
といったところ。
結果は多分正しいと思うけどちゃんと確認してない。
後、せっかく C++ だからってんで STL 使って余計見にくくなってしまったかもしれない。
ttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=55&fi=no # 最初、「原点から」の部分を読み落としてたんだけどあまり変更せずに対応でけた
228 :
デフォルトの名無しさん :04/05/08 11:24
ニュートン法を使って4次方程式の解を求めるプログラムを作れという課題なのですが、 初期値を0として、解を一つ出すところまではできたのですが、 二つ目以降の解を求める際の初期値を求める方法がどうしても分かりません。 どうかよろしくお願いします。
>>228 学校の課題程度なんだったら、
・初期値は手動で与える
・収束しなさそうな場合、ループを途中で打ち切ってエラーメッセージを出力
でいいんじゃない?
>>227 ありがとうございます。幾つか質問させていただいてよろしいでしょうか?
l47:bool operator()(int a, int b) { return table[a] < table[b]; }
operator()(・・・)がいまいち理解できません。関数オブジェクトだとは
解るのですが・・・・
l61:table[i].push_back(j);
vectorには不慣れなもので、よく分かりません。コンテナの末尾にjを挿入している
理由が理解できずに居ます。
l63:sort(table[i].begin(), table[i].end(), ValueCompare<Dists>(dist[i]));
l47に便乗して、sortの最後にあるValueCompareの動作がわかりません。
l87:context.results.push_back(context.temp);
l61同様に、理由が理解できません
以上、
お手数ではありますが教えていただけ無いでしょうか?
232 :
デフォルトの名無しさん :04/05/08 16:51
「あるファイルの行数・バイト数を数えるプログラムを作れ」という問題が、分かりません。 よろしくお願い致します。
int c; long bytes = 0,lines = 0; FILE *fp; ファイルを開くとか while((c = fgetc(fp) != EOF) { if(c == '\n') lines++; bytes++; } 位でお茶を濁す。
>>232 # include <stdio.h>
int main(void)
{
int c;
FILE *file = fopen("あるファイル", "r");
int nbytes = 0, nlines = 1;
while((c = getc(file)) != EOF) {
if(c == '\n') nlines++;
nbytes++;
}
fclose(fp);
printf("行数:%d バイト数:%d\n", nlines, nbytes);
}
>>222 コマンドプロンプトから実行すればいいだけの話じゃ?
cin.ignore();と書くのがスマートかな?
>>230 全部出たよ。
どんなパラメータを入力した?
>231 やっぱ分かりにくかったか。すまん。 とりあえず、dist[i][j] が i 番目の点と j 番目の点の距離、 table[i] は i 番目の点を選択した後、次の点を選択する際の順序ってのはいい? >l47:bool operator()(int a, int b) { return table[a] < table[b]; } これは sort に渡すための関数オブジェクト。qsort でも比較関数渡すよね? sort の第 3 引数に渡すことで、operator < の代わりに要素の比較に使われる。 a と b の比較をする場合に、table[a] と table[b] の比較を行うことになる。 table 自体はコンストラクタで渡してるものを使う。 >l63:sort(table[i].begin(), table[i].end(), ValueCompare<Dists>(dist[i])); ValueCompare<Dists>(dist[i]) は一時関数オブジェクトの生成。 ↑の関数オブジェクトで比較を行う際の table に dist[i] を使うことを指定。 結果、dist[i][a] と dist[i][b] の比較、つまり i 番目の点からの距離の大小で ソートを行うことになる。 NNUM = 5, i = 3 とすると table[i] は { 1, 2, 4 } と点の番号が並ぶ vector に なってる。 sort の結果が { 2, 1, 4 } となった場合、3番目の点に一番近いのが 2 番目の点。 以下、1 番目、4 番目と続くのでこの順で選択を試す。(>227 の 3, 4) >l61:table[i].push_back(j); >l87:context.results.push_back(context.temp); 何が分からないのかよく分からないけど、末尾挿入自体に大した意味はないよ。 別に、添え字を使ってアクセスして代入したところで違いはない。 ただそれだと現在の要素数を管理する必要があるんで、それが面倒だったから。 | for(int j = 1; j < NNUM; j++) if(i != j) table[i].push_back(j); と | int k = 0; | for(int j = 1; j < NNUM; j++) if(i != j) table[i][k++] = j; の違い。 l87 の方だと context.results のサイズが足りるかどうかも気にしなきゃならなくなる。
>233,234 コマンドラインからのファイルリダイレクト使えよ(w
標準入力とかコマンドライン引数とかまだ習ってない可能性が高いだろ大馬鹿者。
標準入力習わずにファイル扱うかよヴォケ しかもコマンドライン引数だぁ?誰がそんな話してるかよ糞が
>>239 たびたび有難うございます。納得いたしました。
最後に一つだけ質問させてください。
NUMはconst intとしてglobalに宣言されていますが、これを
ユーザからの入力で決定したい場合、main内にてcinから受け取っても
大丈夫でしょうか?
>>237 なんか古い実行ファイルで試してたみたいです。
あらためて最新のコードで実行したらちゃんと値が出ました。
勘違いスミマセンでした。
245 :
デフォルトの名無しさん :04/05/08 19:56
>>235 getcharの代わりは何を使えばいいか、というのが課題です。調べてもわかんない・・・
宿題でこんなのが出たのですが、もうお手上げです。どなたかお分かりになったら おねがいします。 2次方程式 ax*x+bx+c=0 の係数a,b,cを与え方程式の解を求めて 出力せよ
判別式だけチェックしてから解の公式にそのまま叩き込め。 解の公式が分からないとか言い出すなよ。
クラスが別のクラスを内包していて(クラスがあるクラスをメンバとして保持?)、 その内包されているクラスが内包しているクラスのメンバや関数を 使いたくなった場合、 どのように対処すべきですか?
引数で外側のクラスの情報を貰う。
>>251 やりたいことは、
class A;
class B
{
A a;
};
class A
{
B b;
};
ってこと?
254 :
デフォルトの名無しさん :04/05/08 23:32
「200000000よりも大きい最初の素数を割り出すプログラムを書け」と言う問題なのですが、 C言語を勉強したことがないので見よう見まね。 コンパイルはできるのですが出力できません。 どちら様かご教授願います。 #include <stdio.h> int k_s = 200000000; /*素数候補の初期値*/ int hantei; int judge() /*素数かどうか判定する*/ { int m = k_s; int k_y = 2; /*約数候補、2から始める*/ do{ m = m / k_y; k_y ++;} while( !( m % k_y == 0 ) || !(k_y^2 > k_s) ); if( !( m % k_y == 0 || !( m == 2 ) ) ){/*あまりが0でない、つまり割り切れないとき*/ hantei = 1;/*素数とする。*/ }else{ hantei = 0; } } int main (void) { do { k_s ++; judge(); } while( !( hantei == 1 ) ); printf("%d", k_s); }
classA{ classB{ classC{ int m_i; }m_c } m_b; } こんなんか? A a; a.m_b.m_c.m_i = 0;
256 :
デフォルトの名無しさん :04/05/08 23:37
k_y^2
class B{ //ここでmethod_A()やa //を使いたいのです。 } class A{ B; int a; method_A(); }
258 :
デフォルトの名無しさん :04/05/08 23:41
class B{ A; //ここでmethod_A()やa //を使いたいのです。 }
>>254 #include "iostream"
int main()
{
using namespace std;
cout << 200000033 << endl;
return 0;
}
260 :
デフォルトの名無しさん :04/05/08 23:47
>>254 #include <stdio.h>
int k_s = 200000000; /*素数候補の初期値*/
int judge(int k_s) /*素数かどうか判定する*/
{
int k_y = 2;/*約数候補、2から始める*/
for (; k_y * k_y < k_s; k_y++)
if (k_s % k_y == 0) return 0;
return 1;
}
int main (void)
{
do k_s++; while(judge(k_s));
printf("%d", k_s);
}
class B{ //ここでmethod_A()やa //を使いたいのです。 } class A{ B; int a; method_A(); } class Aが大きいのでclass Bのメンバにはしたくないのです。
>>262 いやな設計だな。
BはAのメンバである必要性が本当にあるんか?
AとBが互いの領域を侵しあうようだと、クラス設計が怪しいぞ。
264 :
デフォルトの名無しさん :04/05/09 00:06
class Aが大きいのでclass Bのメンバにはしたくないのです。
class A; class B{ public: B(A *a){ pa = a; }; A *pa; }; class A{ public: ~A(){ if(b) delete b; }; B *b; Init(){ b = new B(this); }; }; int main() { A a; a.Init(); return 0; } なんじゃこりゃあああああ
>>264 大きいからいやだって何でよ。
ポインタで持てば、インスタンスの大きさなんか関係ないじゃない。
classAは初期化処理を行っていて、 classBは描画処理を行っているんですが、 classAでの初期化時に値をaに保持させていて、 それを描画時に使いたいんです。 クラス設計が全然わからないので、 いっつもクラスにクラスをメンバとして持たせてしまっているのですが、 それがいけないのでしょうか…
>>267 初期化だけをするクラス?
何を初期化するの?
描画処理を行うクラス?
何を対象に描画するの?
OOPの基本中の基本は、「操作の対象」と「操作」を一つにまとめるとこから始まるんだぞ。
初期化がclass Aで、描画が class B なんていう状況はありえないと思うが。
描画処理に必要なデータとメソッドをBに移して、 Aの初期化処理でBのデータを変更させる。
激しくソースがみてみたい・・・・ゴクリ
271 :
デフォルトの名無しさん :04/05/09 00:19
>>267 みると、
同じクラスでいいじゃん、と思うんだが
>>267 Bが描画をするクラスで、そのために必要な情報をAが持っているのなら、
普通に考えて、BがAを持っているべきだよな。
>>267 設計の良し悪しはともかく、
>>265 が質問の答え。
ポインタとコンストラクタってどんなものか分かる?
275 :
デフォルトの名無しさん :04/05/09 02:02
int binary_search(int l,int r,int a[],int key) { int m = (l + r) / 2; if ( l == r && a[m] != key ) return -1; if(a[m] < key) return binary_search(m+1,r,a,key); else if(a[m] > key) return binary_search(l,m,a,key); return m; } 上記の再帰的な2分探索法で k回目で検索される可能性があるデータと配列の要素の添え字とを「すべて」表示するようなプログラムを教えてください。 お願いします。
"検索される"の意味がよくわからないが int binary_search(int l,int r,int a[],int key,int k) { int m = (l + r) / 2; if( k == 0 ){ printf("%d回目:a[%d]=%d\n",k,m,a[m]); } if ( l == r && a[m] != key ) return -1; if(a[m] < key) return binary_search(m+1,r,a,key,k--); else if(a[m] > key) return binary_search(l,m,a,key,k--); return m; } こんな感じじゃだめ?
277 :
デフォルトの名無しさん :04/05/09 02:20
>276 k回目でチェックされるという意味でした。 ご回答ありがとうございます。 試してみます。
278 :
デフォルトの名無しさん :04/05/09 02:37
>276言葉足らずで申し訳ないです。 k回目でチェックされる可能性がある配列の添え字とデータの「すべて」を 表示したいです。 たとえば一回目の検索では中央のデータと配列の添え字を1カ所表示し、2回目はもし検索すべきデータが大きい場合と小さい場合があるので、 表示は2箇所となります。ゆえにkステップ目では表示は2^(k-1)箇所必要になるのです。 検索すべきデータがm(中央値)より大きい場合と小さい場合のそれぞれに対して再帰をしてやると簡単だという周りはいっているのですが。。 すみませんお願いします。
>>275 こんなかんじ?binary_search関数と下のshow_all関数を見比べて、
動きを掴んでみてくらはい
#include <stdio.h>
void show_all(int l,int r,int a[],int k,int n){
int m=(l+r)/2;
if(k==n) printf("%d:a[%d]=%d\n",n,m,a[m]);
if(l==r) return;
show_all(m+1,r,a,k,n+1);
show_all(l,m,a,k,n+1);
}
#define K_NUM 5
#define ARRAY_LEN 1000
int main(){
int a[ARRAY_LEN];
int i;
for(i=0;i<ARRAY_LEN;i++) a[i]=i*2;
show_all(0,ARRAY_LEN-1,a,K_NUM,1);
}
あ、ちっと変だ。 > if(l==r) return; この行は適当に直しといておくれ
281 :
デフォルトの名無しさん :04/05/09 03:01
>279 ありがとうございました。 吟味してみます
282 :
デフォルトの名無しさん :04/05/09 03:02
int binary_search(int l,int r,int a[],int key,int k) { int m = (l + r) / 2; int ret1, ret2; printf("%d回目:a[%d]=%d\n",k,m,a[m]); if ( l == r && a[m] != key ) return -1; else if(a[m] == key) return m; k++; ret1 = binary_search(m+1,r,a,key, k); ret2 = binary_search(l,m,a,key, k); if(a[ret1] == key) return ret1; else if(a[ret2] == key) return ret2; else rerturn -1; } こんなのできました、表示はばらばらになるけど 合ってるかわからん
/* 位置だけ表示。適当な名前が思いつかん */ void func(int l, int r, int depth) { int m = (l + r) / 2; if (depth < 1 || l > r) return; if (depth == 1) { printf("%d\n", m); return; } func(l, m-1, depth-1); func(m+1, r, depth-1); }
284 :
デフォルトの名無しさん :04/05/09 04:01
「連想記憶モデルのシュミレーション」という題名で、問題が5問出されているのです。 1.乱数を用いて、各要素に-1と1が不規則に現れるようなN次元ベクトルをP個生成するプログラムを作れ。 その為に、P×N次元の配列X[P][N]を用意せよ。ここではN=20、P=3としてこのプログラムを実行し、 実行に用いた乱数のseed値も記載すること。 2.上で作ったプログラムを発展させ、次の規則でN×N次元行列を計算するプログラムを作れ。 上で得られた記憶パターンから計算される20×20次元結合行列を以下の要領で表示せよ。 p-1 J[i][j]= Σ X[p][i]・X[p][j] (i≠jの場合) p=0 i,j=0,1…N-1 J[i][i]=0 (対角成分は0) 3.神経回路のプログラミング。 N=100,P=10とする。0番目の記憶パターンの要素をM個反転させたパターンを初期状態に設定し、 連想記憶モデルの時間発展を追うプログラミングを書け。Mの値が10、20、30、40、50の5通りの場合に ついてシュミレーションを行う。 残り2問は3の問題の数値を変更して行うものなので、なんとかなりそうなのですが、それまでの問題が出来ません。 C言語はさっぱりで、どんなものになりそうなのかすら想像出来ません。検索もかけてみたのですが良くわからず、 お手上げ状態です。どうか、お願いいたします。
285 :
デフォルトの名無しさん :04/05/09 04:05
>282 ありがとうございました。 並べて表示するにはどうしたらいいでしょうか?
>>284 1.
#include <stdlib.h>
#define P 3
#define N 20
static int X[P][N];
void foo1()
{
for (i = 0;i < P;i++){
for (j = 0;j < N;j++){
int n = rand() % 2;
if (n){ X[i][j] = 1;}
else{ X[i][j] = -1;}
}
}
}
>285 283でじゅうぶんじゃない? print文のところで深さをサーチ対象と同じ大きさの配列にでも記録するようにすればいい。 で、最後にお好みの方法で表示。
>>254 かわいそうなので、真面目にレス。
>do{
>m = m / k_y;
>k_y ++;}
>while( !( m % k_y == 0 ) || !(k_y^2 > k_s) );
ごめん、何をしたかったか見当がつかん、、
>if( !( m % k_y == 0 || !( m == 2 ) ) ){ /*あまりが0でない、つまり割り切れないとき*/
こうあるけど、mが素数であるためには、√m以下の全ての素数について、割り切れない必要があるわけで、
今のままだとこのif文は一回しか通らないから、明らかにおかしい。
√mを計算するの、ライブラリリンクとか説明するの面倒なので・・、√mは65536以下なのは明らかなので
(int型の最大の制限から)、65536以下の整数全てについて、割り切れないかを検証して、割り切れなけれ
ば素数と判定すればいい。
ということで、judge関数書き直し。
int judge() /*素数かどうか判定する*/
{
int k_y = 2; /*約数候補、2から始める*/
do {
// 一個でも割り切れる約数がみつかれば、hanteiを1として、関数judgeから抜ける(return)
if(k_s % k_y == 0) {
hantei = 1;
return ;
}
while( k_y < 65536 );
// ここまで来たならば、65536までのすべての数で割り切れないということ
hantei = 1;
}
とりあえず次は関数の引数とか、値を返す方法とか勉強しましょう。
うわ、すまん。キャッシュの関係で、最近のレスが見えてなかった。 恥かしいので死んできます
>>284 Cのライブラリでは
rand() 関数は 0 から RAND_MAX の間の疑似乱数整数を返す。
srand()関数は、 rand()関数で作られる疑似乱数整数系列の新しい種として、その引数の値を使用する。
問題文の"乱数のseed値"とはsrand()に渡すパラメータだ
なお、rand() の実装は、下位のビットが上位のビットほどランダムになってはいない
場合があるので、注意が必要
(単純に rand() % 10 のような、下位のビットを用いる方法はよくない)
本当にありがとうございました。 これを参考に勉強させていただきます。
どなたかおしえてくらさい 次のようなCプログラムを作成せよ 標準入力から学生数nを入力する。 一人分のデータ(学生番号no、英語の点数en、数学の点数mt、理科の点数sc) を入力して、3科目の平均点avを計算し、 no,en,mt,sc,avを標準入力に出力する。 n人分のデータを繰り返して処理する。
{int n,cnt; scanf("%d",&n); for(cnt=1; cnt<=n; ++cnt){ int no,en,mt,sc; double av; scanf("%d",&no); scanf("%d",&en); scanf("%d",&mt); scanf("%d",&sc); av=(en+mt+sc)/3.0; printf("%d,%d,%d,%d,%f\n",no,en,mt,sc,av); } }
課題2 ./a.out 30 unix.txt とすると30字ごとに改行するように文書整形を行うプログラムを作成しなさい. ただし、文書中にタブコード(\t)があった場合はスペースに置き換えてもよい
>>293 さん
どなたか存じませぬが
ありがとうございますた。
298 :
デフォルトの名無しさん :04/05/09 15:33
>>296 上から
junizuke
k++
ten
juni
juni[j]
>297 元の改行は無視でつか?
>>299 無視しますた。if (ch != '\n')の部分をとれば
きちんと反映されるし、改行があった場合は
また1文字目から数えなおすという仕様でも
ちょこっと変えればできるはず。
もし、単語は切れてはいけないとかそういう仕様なら そのコードじゃ全然だめだが。
>>298 ありがとうございました。
師匠と呼ばせてください。
>301 >無視しますた。 ダメだろ(w >改行があった場合はまた1文字目から数えなおすという仕様でもちょこっと変えれば こっちだ。直しとけ。
>243 返答遅くなった。 そういう意味で「定数である必要はない」って注釈つけた。 ただし、main 先頭 points の生成前に設定してくれ。 NNUM の方もちゃんと NUM + 1 で設定しなおす。const もはずしてくれ。 ところで今更だけどちゃんと動いてくれてる?
>306 > double distance(const Point& p) { > return sqrt(((p.x-x)*(p.x-x))+(p.y-y)*(p.y-y)); // pow はさすがに無駄かと > } だったらsqrt()も無駄だと思われ
>>306 有難うございます。解決しました。
動作のほうは、いろいろと弄ってありますが特に問題ありません。
BCC32 MinGW 共にコンパイルできました
(CLだけは、timeの挙動でアウトみたいでした。ライブラリやヘッダが足りてないのかもしれません)
ファイルを分割(宣言・定義・メイン)させるプログラムでエラーが出て困っています。 power.h(ファイル名) /*power関数の宣言*/ int power(int x, int y); power.c(ファイル名) /*power関数の定義*/ int power(int x, int y) { int i, ans; ans = 1; for(i = 1; i <= y; i++){ ans *= x; } return ans; }
8-5.c(ファイル名) #include <stdio.h> #include "power.h" int main(void) { int num1, num2, ans; num1 = 0; num2 = 0; while((num1 < 1) || (num1 > 5)){ printf("1番目の整数を入力してください(1〜5)\n"); scanf("%d", &num1); } while((num2 < 1) || (num2 > 5)){ printf("2番目の整数を入力してください(1〜5)\n"); scanf("%d", &num2); } ans = power(num1, num2); printf("%dの%d乗は%dです\n", num1, num2, ans); return 0; }
一応、実行はできるのですが、num2を入力するとフリーズしてしまいます。 8-5.cをコンパイルするとエラーが 8-5.obj(8-5.c): Undefined symbol: power_ とあり、マニュアルでこのエラーを調べると file: Undefined symbol: name file中で参照されているシンボルnameはどこにも定義がありません。 と、ありますがどうすればよいかわかりません。 どうすれば解決するのでしょう?
cl 8-5.c power.c bcc32 8-5.c power.c gcc -o 8-5 8-5.c power.c
>>312 統合環境なんだろうなぁ…。
OSの種類、コンパイラのバージョン、統合環境の使い方を
メモして、当該スレッドへ行ってみるが吉。
for(i=1;i<=l;++i) { x=(double)rand()/RAND_MAX; y=sqrt(1-x*x); a+=y; sgl_color(col1); sgl_circle(x,y,0.005); } の3行目と5行目の解説を教えてください
>>316 3行目は変数への代入と除算について解説する。
5行目は加算代入演算子について解説する。
rand() は、0から RAND_MAX までの(int)乱数を返す。 (double) で、cast して RAND_MAX で割ると、0 から 1 までの乱数を返す。 a += y; は、 a = a + y; と同じ。a の値を y 増やす。
>>320 間違ってるところはあります。というか、把握している問題点を書けよ。
5行目が間違ってると思うんですが違いますか?
323 :
お願いします :04/05/10 16:37
f(x){ x − 10 if x > 100 f(f(x + 11) otherwise 問1 f(x)を計算する関数(プログラム)を再帰的に定義せよ。そして整数データを 読み込みその値に対する関数 f の値を計算して出力するCプログラムを作成せよ。 問2 f(x)を計算する関数(プログラム)を再帰なしで定義したい。そして整数データを 読み込みその値に対する関数 f の値を計算して出力するCプログラムを再帰なしで作成せよ。 この2つ、できるだけ詳しくお願いします。
324 :
デフォルトの名無しさん :04/05/10 17:17
#include<stdio.h> int main (void){ int i; char *p[3]; for(i=0;i<3;i++){ gets(p[i]); printf(p[i]); } return 0; } これを実行するとエラーが出て文字列を代入できません。 どなたかお願いします。
上記の者ですが、分かりました。 すいませんでした・・。
>>323 答1
f(x)
{
return x > 100 ? x - 10 : f(x + 11);
}
答2
f(x)
{
while (x <= 100)
x += 11;
return x - 10;
}
プログラムエントリ
#include <stdio.h>
main()
{
char b[4096];
fgets(b, sizeof b, stdin);
printf("%d", f(atoi(b)));
}
自力でできましたのでまたお願いします。
328 :
お願いします :04/05/10 17:52
>>328 mainが共通だからそうかいただけ。
問1のf()とmain 問2のf()とmainを組み合わせてコンパイルすればいい。
330 :
デフォルトの名無しさん :04/05/10 18:01
short** abc 上のような文はどういう意味なのでしょうか?。 正しいのでしょうか?。*を間違って2つ打ったのかな?。
>>330 shortへのポインタへのポインタとしてabcを宣言している。
332 :
デフォルトの名無しさん :04/05/10 21:30
お願いします 課題:すごろくを作れ なんですが、初心者の私にはなにをどう始めるのかさえさっぱりな 状況です・・・。手元の資料、ネット上で調べてみても少しも進まないので こちらでお願いすることにしました。 是非お願いしますm(__)m
>>332 すごろくのコースは有向グラフとして表せる。
コマの位置はグラフのノードによって表せる。
とりあえずここから始めてみてはどうかな。
334 :
お願いします :04/05/10 22:02
>>326 ちょっとわかりづらいのですが・・・ もうちょっとおねがいできますか??
ボーリングの得点計算を行うプログラムを作成せよ。 仕様 1.始めに人数を入力(最大4名) 2.1で入力した人数分の名前を入力(名前の最大文字数は19文字まで) ※'\0'含めて20文字 3.1人ずつ10フレームまでの得点を入力 4.その際に”○フレーム 1投目 : ”と表示させること 5.人数分の得点が入力し終わったら 名前 : 5( 2) 7( 2) 10( ) 3( 7) ・・・・・・ 2( 3)( ) Total :110 と言う形で全員分の得点を表示させよ。 さっぱりわからんです・・・
>>333 多分、彼には難しすぎ。
>>334 超基本形↓rand,srandのツッコミ禁止
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
int goal=20;int step=0;int s;
srand((unsigned)time(NULL) % RAND_MAX);
while (step!=goal){
s=rand()%6+1;step+=s;
printf("%d コマ進んだ\n",s);
if(step>goal) {
step=goal*2-step;
printf("行って戻って、");
}
printf("残りは%d コマ\n\n",goal-step);
}
printf("ゴールしたらしい\n");
return 0;
}
337 :
デフォルトの名無しさん :04/05/10 23:21
浮動少数演算doubleを用いよ。dv[1000]を用意し、 i=1〜1.999までをdv[0]〜に格納し、それらの総和の平方根を求めよ。 ヒント #include<math.h>が必要。printfには%fを用いる。 ・・・だそうです。大学入って予備知識なしの状況で 「やれ!」と言われました。教科書に[]の配列?の詳しい使い方載ってないです。 for文とsqrtを使うのはわかるのですが・・・。 ご指導よろしくお願いします。 環境:何とかLinuxのときもあればSolarisのときもあります。
>>335 地質調査の専門家に聞け!
とゆーのは冗談で、ボーリングのルールとか得点とかを調べるべきですな。
>335 int score[4][20]; char name[4][20]; int player; //プレイヤーの人数を聞き、playerに格納 int i,j,k; for(i=0;i<player;i++){ //名前を聞き、name[i]に格納 } 取っ掛かりだけ。 点数入力部はplayer*10フレーム*2投でforループが3重になる。 とりあえず点数計算は後回しで倒した本数を表示できるところまで頑張れ。
>>339 取っ掛かりサンクスコ
提出まで相当日があるからじっくりやってみます。
341 :
デフォルトの名無しさん :04/05/10 23:31
文字を入力して、逆から出力させるプログラムはどうしたらいいのでしょうか? 教えて下さい。お願いします。例えばopqrを入力してrqpoを出力する。
>>337 アンダースコアは空白文字に置換すること。
#include <math.h>
#include <stdio.h>
#define RESOLUTION 1000
int main()
{
____double dv[RESOLUTION];
____double result = 0.;
____int i;
____
____for (i = 0; i < RESOLUTION; ++i) {
________dv[i] = 1. + (double)i / RESOLUTION;
________result += dv[i];
____}
____result = sqrt(result);
____printf("%f\n", result);
____return 0;
}
文字型配列を用意して文字列を1文字ずつ読み込み配列に格納しなさい。 ある1文字がその文字列に存在するか判定し、存在すればその文字列の最初 から何番目かを出力しなければ無いと出力しなさい。 * 例えば"cherry"と入力し、この文字列に"r"が存在するので4番目 と出力します。これができたら、複数存在する場合には、 複数の位置を出力できるようにしなさい。 * 例えば"cherry"に'r'が4番目と5番目と出力します。
だぁ!違う! 最終フレーム、ストライクのときは+2投、スペアで+1投か。 11フレーム分用意して、点数計算・出力時にもう一捻りだ。 簡単なようでいやらしい問題だな。
/*
>>337 コンパイルオプションに -lm が必要かもしれん */
#include <stdio.h>
#include <math.h>
int main(void)
{
int i;
static double dv[1000];
double sum;
/* dv[0]〜に、1.000〜1.999を入れる */
for (i = 0; i < 1000; i++)
dv[i] = 1.000 + i / 1000.0;
/* dv[0]〜の総和を求める */
for (i = 0, sum = 0; i < 1000; i++)
sum += dv[i];
/* 総和の平方根を出力 */
printf("%f\n", sqrt(sum));
return 0;
}
>333 ありがとうございます。 それでもよく分からないのですが;、有向グラフやグラフのノードなど おっしゃられたものを調べて少しでもやってみることにします!
>>342 345
ありがとうございます。試してみます。
>>341 #include <stdio.h>
int main(void)
{
char str[256];
int cnt;
printf("Input string : ");
scanf("%s",&str[0]);
for(cnt = 0; str[cnt] != '\0'; cnt++);
for( ; cnt>0; cnt--)
{
printf("%c",str[cnt-1]);
}
return 0;
}
for(cnt = 0; str[cnt] != '\0'; cnt++); の部分は #include <string.h>を使えば cnt=strlen(&str[0]); とすることも可能
#include <stdio.h> #include <string.h> #define BUFSIZE 1024 /* ****************************** * 戻り値 正常 = 0, エラー = 0以外 ******************************* */ int reverse(char *buf, size_t size){ char tmp; int left = 0; int right = size - 1; if(!buf) return -1; if(left > right) return -1; for( ; left < right; left++, right--){ if(buf[left] == buf[right]) continue; tmp = buf[left]; buf[left] = buf[right]; buf[right] = tmp; } return 0; } /* main **************************/ main(){ char buf[BUFSIZE]; fputs("input > ", stdout); fgets(buf, BUFSIZE, stdin); reverse(buf, strlen(buf) - 1); printf("result > %s", buf); }
>343 strchr()を使ってはどうか?
352 :
デフォルトの名無しさん :04/05/11 02:18
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i, ans, num, j; printf("数当てゲーム\n 100までの数字です。\n"); srand((unsigned) time(NULL)); num = rand()%100; for(i=0, j=5; i<5; i++, j--) { printf("%d回目の数字を>>> ", i+1); scanf("%d",&ans); if( j == 1){ printf("残念 答えは %-5dでした。\n\n", num); break; }
else if( num > ans ){ printf("%-2dは小さいです\n",ans); printf("チャンスはあと%d回\n\n", j-1); } else if( num < ans ){ printf("%-2dは大きいです\n",ans); printf("チャンスはあと%d回\n\n", j-1); } else if( num == ans){ printf("********\n 大正解\n********\n\n"); break; } } return 0; } 答えが近くなれば(+-5くらい)「おしい!」とだしたいのですがどなたかいいアイデアがあれば教えてください よろしくおねがいします
abs()使え
間違えた。 mainの中の最初のfor文の継続条件は i < times ではなく i <= times でした。
357 :
デフォルトの名無しさん :04/05/11 03:43
人間3人でやるすごろくを作っているのですが、どうやったら順番が決められるのか分からないです。 助けてください(泣) /******* ↓は人間vsCPUの 先攻・後攻を決める関数 *******/ void before_after(int& myrest){ if(rand()%2) myrest=1; /* 後攻は一回休み */ } これを人間3人でやる場合ってどう応用したら良いのでしょうか??
>>354 >>355 さん
ありがとうございます
初心者なりにも参考になりました。
355さんはさっきプログラムを書いてくださったのですか・・・・
本当にありがとうございます
私は2日かかってまだ出来ていないのですぐさま書けるなんてすごい驚いてます
がんばります・・・
私なりに考えた末こうしてしまったことを報告しておきます
else if( num == ans +3 || num == ans +2 || num == ans +1)/* 答えより+3以内なら*/
ありがとうございました
>>358 不等号使ったほうがいいべ。
else if( (num - ans) >= -3 && (num - ans) <= 3 )/* 答えより±3以内*/
>>358 それから、条件判定を連続でやるときは、厳しい条件から判定したほうがやりやすい。
if( 大正解 ){
....
プログラム終了
}
if(答えとの差が ±3以内){
...
}
if(答え>入力値){
...
}
else { /* 答え<入力値 */
...
}
つーか、マルチすなや。
363 :
デフォルトの名無しさん :04/05/11 09:31
def(short** abc) という関数を定義した時に呼び出すには、 def(&rei) で良いのでしょうか?。def(&&rei)とかでは、なくて。
reiがshort*ならな。
ならreiがshortなら&&reiですか?
def((short **)rei)
368 :
デフォルトの名無しさん :04/05/11 13:19
二つのファイルを読んで、それを結合するプログラムを作れだとよ。Cで。
規則は
main(int argc, char *argv[]) { char s[256]; sprintf(s, "copy /B %s+%s %s", argv[1], argv[2], argv[3]); system(s); }
>>368 いやー、そりゃまた難題をふっかけられましたな。
同情はしてあげますが、プログラムが組めなくてなー。
役に立てずに済まんな。
>>368 凄い高度なことをやるんですね。
さぞかし素晴らしい学校に通っておられるんですね。
敬服します。
1次元ランダムウォークでN人がそれぞれn歩いたトキ、 止まった点Xの分布のグラフを求めるプログラムを作りなさい。 ヒント 出力{Xの平均値、Xの標準偏差} 入力「歩く人の数N人、歩数n歩、左に進む確立p(右はq=1−p)、 乱数の種 ISEED」 グラフィックス「歩く人の歩いた軌跡(N人分)、Xの分布のグラフ、 平均値の位置、標準偏差の位置」 誰かこの問題のプログラムを教えてください。 お願いします。
>>375 あなたはこの問題に対してなにをどうしたらいいのかさっぱりわからないの?
もしそうなら、あなたはこの問題を解くまでのレベルには達していないので
本を読んで勉強しなおしてください
そうでなかったら、どこまで考えたのか書いてみて
この問題のどこがわからなくて困っているのかがわからなければ
教えようがないでしょ
宿題を丸投げしようと思ったんなら
逝ってよし
ここは宿題丸投げスレ
378 :
デフォルトの名無しさん :04/05/11 21:54
#include <stdio.h> int mc91(int n) { if (n>100) { return n-10; } else { return mc91(mc91(n+11)); } } int main() { int n; int mc; printf("Enter a number: "); scanf("%d",&n); mc = mc91(n); printf("mc91(%d)=%d\n",n ,mc ); return 0; } このプログラムを再帰無しで作り変えろ。 という問題です。お願いします教えてください。
int main() { int mc; int i; for(i=0;i<200;i++){ mc = mc91(i); printf("%d:%d ",i ,mc ); } return 0; } まずこれで各数字に対しmcの返す値を観察してみな。
381 :
デフォルトの名無しさん :04/05/11 22:32
おっと書き忘れ。mainだけ置き換えて、mcの定義はとりあえずそのままな。 同じ入力に同じ結果を返すのならば、内部でどんな計算をしても(しなくても)「作り変え」た事になるはず。
ようするに #include <stdio.h> int mc91(int n) { if (n>100) { return n-10; } else { return mc91(mc91(n+11)); } } int main() { int mc; int n; for(n=0;n<200;n++){ mc = mc91(n); printf("mc91(%d)=%d\n",n ,mc ); } return 0; } これをコンパイルして実行しろって事。
384 :
デフォルトの名無しさん :04/05/11 22:49
>>383 たびたびありがとうございます。returnを使うことは再帰を使っている事にはならないんでしょうか?
386 :
デフォルトの名無しさん :04/05/11 22:56
>>385 プログラムを再帰無しで完全に書き換え、値もでるようにしたいのです。できますか?
すいません、最初から言っておくべきでした・・・。
∩___∩ | ノ u ヽ / ● ● | | u ( _●_) ミ 彡、 |∪| 、`\ 後出しすんなクマー / __ ヽノ /´> ) (___) / (_/
388 :
デフォルトの名無しさん :04/05/11 23:01
教えて下さい。7個の数字を入力して小さい数字から出力プログラムは 下のプログラムでいいのでしょうか? #include<stdio.h> main() { int box[7],i,j,max,suuji; for(i=0;i<=6;i++){ scanf("%d",&a); max=box[i]; suuji=i; for(j=i+1;j<=7;j++){ if(max>box[j]){ max=box[j]; suuji=j; } } box[suuji]=box[i]; box[i]=max; } for(i=0;i<=7;i++) printf("%d ",data[i]); printf("\n"); }
389 :
デフォルトの名無しさん :04/05/11 23:04
>>387 本当にすいません。。できればお願いいたします。
>>388 最初に7個の数字を入力してもらって
その7個の数字を比較して
小さい数字から出力するようにしたほうがいいと思うよ
>386 383を実行してみた? 実行してみたのならばどう置き換えればいいかなんて一瞬でわかると思うけど。 100以降は単に-10だし、それ以前は一目瞭然。 >388 scanf("%d",&a)はscanf("%d",box+i)とするのが正しい。ポインタに絡む話なんで初心者にはきついか。 というか、まずはコンパイルしてみれ。
ソートを使ったもの #include<stdio.h> void insertion(int *s, int n){ int i, j, v; for (i = 1; i < n; i++){ v = s[i]; for (j = i; j > 0 && s[j - 1] > v; j--) s[j] = s[j - 1]; s[j] = v; } } int main(void) { int box[7], i; for (i = 0; i < 7; i++){ printf("%d番の数目",i+1);scanf("%d", &box[i]); } insertion(box,7); puts(""); for (i = 0; i < 7; i++) printf("%d\n",box[i]); return 0; }
>>388 やる気のないソースワロタ
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *i, const void *j){
int *a = (int *)i;
int *b = (int *)j;
return (*a- *b);
}
int main(){
int i, work, box[7];
for(i=0;i<=6;i++){
scanf("%d",&work);
box[i] = work;
}
qsort(box, 7, sizeof(int), cmp);
for(i=0;i< 7;i++)
printf("%d ",box[i]);
printf("\n");
return 1;
}
395 :
デフォルトの名無しさん :04/05/12 00:09
データを次々と入力して,入力データの総和を出力するようなプログラムをお願いします. 入力は正の数値として,データの終りを0 の入力
main() { int d, v=0; while (std::cin >> d) { if (d == 0) break; v +=d; } std::cout << v; }
397 :
デフォルトの名無しさん :04/05/12 00:20
396>>ありがとうございます。 C++じゃなくCでお願いします
398 :
デフォルトの名無しさん :04/05/12 00:21
プログラムと数学の類似点、相違点 くわしく教えてください
include <stdio.h> int tmp,sum=0; main(){ while(fscanf("%d", &tmp) > 0 ) { if( tmp == 0 ) break; sum+= tmp; } printf("sum=%d\n", sum); }
400 :
デフォルトの名無しさん :04/05/12 00:30
>399 ありがとうございました
>398 まるぽ。
>399 をいをいまじかΣ(゚∀゚;)
>>397 #include<stdio.h>
int main(void){
int tmp=1,sum=0;
while(tmp!=0){
scanf("%d",&tmp);
sum+=tmp;
}
printf("sum=%d\n", sum);
return 0;
}
tmp=1 イヤン
406 :
デフォルトの名無しさん :04/05/12 01:32
○課題4 乱数をn個生成し、それらをすべて配列に格納する。 その後、配列rの値をすべて表示する。 さらに、次のことを繰り返す(i=0,1,2,...,n-2)。 r[i]とr[i+1]を比較し、 r[i] > r[i+1]ならr[i]とr[i+1]を交換、 r[i] <= r[i+1]ならなにもしない。 上記を繰り返すと、r[n-1]に最大値が求められている。 最後に、配列rの値をすべて表示する。 ○課題5 乱数をn個生成し、それらをすべて1次元配列rに格納する。 その後、配列r中のn個の値を小さい順に並べ替え、並べ替え後の配列rの値をすべて表示する。 nの値は自由。表示のしかたも自由。
407 :
デフォルトの名無しさん :04/05/12 01:33
まぁ、乱数をいじっくっていろいろする問題なんですが、 const int n=10; int r[n]; int index; int max = 0; int j; randomize(); cout << "0 から 99 までの乱数を生成して配列へ格納" << endl; for(int i=0; i<n; i++) { cout << (r[i] = rand() % 100) << " "; } cout<<'\n'; max=r[0] ; for (int j=1; j<n;j++) { if(max<r[j]) { max=r[j] ; index=j; } } cout << "最大値は " <<"r["<<index<<"]の"<< max << "です。"; cout << "最大値r["<<index<<"]とr["<<n-1<< "]を交換すると。"; r[j]=r[n]; r[n-1]=max ; for(i=0;i<n;i++) cout<<r[i]<<" "; getch(); return 0; } で、↑は4の途中なんですが、どうしてもうまくいきません。 なんか、繰り返しがうまくいかないのか・・・。初歩的な問題だと思いますが、お願いします。
ごめん、余計なコメントが残ってた。 意味不明なこの↓コメントは、無視してください。 >> // 現在のスタックpopしてして関数処理
>>406-407 >どうしてもうまくいきません。
何がうまくいかないのかなー。
r[j]=r[n];
って意図的?
あと、課題4で書いてあるとおりに値を交換して最大値を求めないと
出題者の意図を汲んだ回答にはならないような気がするよ。
411 :
デフォルトの名無しさん :04/05/12 01:55
すみません、超初心者でさらに独学で勉強してるものなのですが、下の getint の書き方では、後に数字の付かない + あるいは - は、 ゼロの正しい表現として扱われる。そうした文字を入力に戻すように、このプログラムを直した上でmain を付けて、動作するプログラムを作れ。 っという問題がわかりません。教えてください #include <ctype.h> int getch(void); void ungetch(int); int getint(int *pn) { int c, sign; while (isspace(c = getch())) ; if (!isdigit(c) && c != EOF && c != '+' && c!= '-'){ ungetch(c); return 0; } sign = (c =='-') ? -1: 1; if (c == '+' || c == '-') c = getch(); for (*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if (c != EOF) ungetch(c); return c; }
ああ、なんかelseブロックのコメントがみんなおかしいや。確認が足りなかったごめんね。
413 :
デフォルトの名無しさん :04/05/12 01:58
>>410 お察しのとおり r[j]=r[n]; で実行時にエラーが出るわけです。
値を交換ですか・・・。 なんとなくイメージはつかめるんですが、別の場所に格納するんですね。
414 :
デフォルトの名無しさん :04/05/12 02:00
整数の入力を求めているのに、小数や文字列を入力された場合に、 「入力しなおして下さい」と表示するプログラムの作り方を教えてください。
宿題を依頼する人は、最低限
>>1 を読んでからお願いします。
int isinteger(const char* s) { if (s[0] == '-' || s[0] == '+') s++; while (isdigit(*s)) s++; return *s ? 0 : 1; }
>>414 http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1064150088&res=57&fi=no ここにあったよ。その部分だけ抜き出すと、こんなかんじ。
------------------------------------------------------------------
#include <stdio.h>
#include <ctype.h>
typedef enum {FALSE=0, TRUE=1} BOOLEAN;
/* 文字列が数字だけ(0-9)で構成されているかどうか */
BOOLEAN IsNumberString(char *s){
for( ; *s && *s != '\n'; s++){
if(!isdigit(*s)) return FALSE;
}
return TRUE;
}
#define BUFSIZE 256
main(){
char buf[BUFSIZE]; /* ワーク用 */
int input;
/* ユーザ入力。入力値が数値以外ならやり直し */
for(;;){
printf("%d 回目の数字を >> ", i);
fgets(buf, BUFSIZE, stdin); /* 文字列で取得 */
if(IsNumberString(buf)) break;
else printf(" 入力しなおしてください\n");
}
}
------------------------------------------------------------------
いろいろやってみましたが、どうもうまくいきません。 格納の仕方が悪いのでしょうか?
>>411 K&Rそのままじゃん。
第二版のP96 にあるgetch() ungetch() を書かないと動かせないよ。
>>406 とりあえず課題4だけ
課題5は問題の意味がよくわかりません・・・
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
const int NUM = 10;
int main(){
int n = NUM;
/* int r[n]じゃコンパイルできなかった・・・ */
int r[10];
int i, tmp;
srand(time(NULL));
for(i = 0; i < n; i++) r[i] = rand();
for(i = 0; i < n; i++) printf("%d ", r[i]);
printf("\n\n");
for(i = 0; i < (n - 1); i++){
if(r[i] > r[i + 1]){
tmp = r[i + 1];
r[i + 1] = r[i];
r[i] = tmp;
}
}
for(i = 0; i < n; i++) printf("%d ", r[i]);
return 0;
}
>>414 ありがとうございます。
やはり、r[j]=r[n];がありえなかったのですね。
>420 >とりあえず課題4だけ >課題5は問題の意味がよくわかりません・・・ 課題4は最大値だけ端にくるんだろ? 課題5は全部ソート汁!
>>406 ほい課題5、最初問題の意味がわからなかったが、よく読むとただのソートですかい・・・
悩んで損した・・・
ソートの効率はあまり良くない
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
const int NUM = 10;
int main(){
int n = NUM;
/* int r[n]じゃコンパイルできなかった・・・ */
int r[10];
int i, j, tmp;
srand(time(NULL));
for(i = 0; i < n; i++) r[i] = rand();
for(i = 0; i < n; i++) printf("%d ", r[i]);
printf("\n\n");
/* 基本挿入法 */
for(i = 0; i < n; i++){
for(j = i - 1; j >= 0; j--){
if(r[j] > r[j + 1]){
tmp = r[j]; r[j] = r[j + 1]; r[j + 1] = tmp;
}else{
break;
}
}
}
for(i = 0; i < n; i++) printf("%d ", r[i]);
return 0;
}
>>422 面目ない
日本語が苦手なもんで・・・
>>406 ソートの方法は他にもあるので、興味があればググること
>>/* int r[n]じゃコンパイルできなかった・・・ */ nが定数じゃないから当たり前 NUMなんて使わないで素直に const int n = 10; にしとけよ
>>>>/* int r[n]じゃコンパイルできなかった・・・ */ >>nが定数じゃないから当たり前 そんな古いコンパイラは捨ててしまえ。
>>425 constでも無理でした
defineならOKなようです
>>427 捨てた方が良いですか、bcc32・・・
>>428 constで無理ってことはC++じゃないのか。
Cだと定数式のみ。#defineしてくれ。
bcc32でも拡張子がcppならC++としてコンパイルするよ。
>>430 せめてコンパイラと環境、エラーメッセージくらい書こうとは思わんか?
>>430 エラーが起こっている個所に対してもうちょっと頭をひねろう。
括弧の対応がなっていない。
エディタによっては括弧対応を強調表示したり、検索できるものがあるので
そういうのを使うといいかもね。
>>411 『プログラミング言語C』を教本としているなら、
『Cアンサーブック』も買おう。
>>430 日本語の勉強もしよう。
「とうる」なんて言葉はないよ。
リスト構造の最後に新しいリストを加える関数PushBack(int val,List *lp)を作っているのですが、 エラーが出てしまいます。どのようにすればよいでしょうか? struct list{ int value; struct list *next; } typedef List; void PushBack(int val, List *lp){ List *nl; nl = (List *)malloc(sizeof(List)); nl->value = val; nl->next = NULL; //新しいリスト{val,NULL}を作る for(;;){ if(lp->next == NULL) break; else lp = lp->next; //Listの最後はNULLなのでNULLがくるまで次の構造体を調べる } lp->next = nl; //リストの最後のポインタを新しく作ったリストへ繋げる } main(){ int val; List *head = NULL; printf("Enter value "); scanf("%d",&val); PushBack(val,head); return; }
437 :
デフォルトの名無しさん :04/05/12 11:54
このプログラムを参考にして、200の階乗を計算するプログラムを作る。 #include <stdio.h> #include <stdlib.h> int main() { int a[ 1000 ]; int i; int j; int c; for ( j = 0; j < 1000; j++ ) a[ j ] = 0; a[ 0 ] = 1; for ( i = 0; i < 1000; i++ ){ c = 0; for( j = 0; j < 1000; j++ ){ a[ j ] = a[ j ] * 2 + c; if ( a[ j ] >= 20 ){ a[ j ] = a[ j ] - 20; c = 2; } else if ( a[ j ] >= 10 ){ a[ j ] = a[ j ] - 10; c = 1; } else { c = 0; } /* if */ } /* for */ } /* for */ for ( j = 999; j >= 0; j-- ) printf( "%1d", a[ j ] ); printf( "\n" ); return ( 0 ); } /* main */
>>436 typedef struct list{
int value;
struct list *next;
} List;
>>437 そんなのを参考にしなければいけないのか・・・
>>438 ありがとうございます。でも、ダメでした。
コンパイルだけは通るので(実行したらエラーが出て止まりますが)、そんな間違いではないと思うのですが…
def((short **)rei) こういうポインターへのポインターなんですが、なんでこんな事をするの でしょうか?。なにが便利なんでしょうか?。 プログラムを読んでも、よく分からん。抽象的な質問ですいません。
>>439 NULLポインタを参照している。
>List *head = NULL;
言葉が足りてないな。 headの指すべき領域を確保せずに、なぜかNULLポインタとして初期化している。
>>440 shortがほしけりゃ、short変数の場所(変数へのポインタ)を関数に教えてやる
short rei;
def(&rei);
if (rei == ... ) {}
shortへのポインタがほしけりゃ、short*変数へのポインタを関数に教えてやる
short *rei;
def(&rei);
if (rei[0] == ...) {}
配列を返して欲しいときは、ポインタのポインタを使う必要があるということだ。
>>443 ありがとうございます。
List *head;
head = (List *)malloc(sizeof(List));
head->value = NULL;
head->next = NULL;
と書き直したら、うまくいきました。
と思ったらhead->value = NULL;でエラーだ(;´д`)
結局分かりませんですた・・。
//--------------------------------------------------------------------------------------
//
//以下のプログラムを作成してください。
//問題10の関数をさらに完全なものとしてください。
//int Calc(int calc , int a, int b, int *ans)
//@返り値を付加する。ただし、返値=0なら正常、返り値=-1ならエラーとなります。
//A計算方法をもっとわかりやすくするため、#define定義にしてください。
//
//--------------------------------------------------------------------------------------
http://www1.linkclub.or.jp/~yon/haha/saru-img/saru0784.c にageてあります。
お暇な方よりしくおながいします。
>>447 一つだけやってみるので、もうちょっとがんがれ
#define DIV 3
int Calc(int calc, int a, int b, int *ans)
{
int result = 0;
switch (calc) {
case DIV:
if(b == 0) result = -1; /* division by zero */
else *ans = a / b;
break;
default :
printf("認識できない数字です。\n");
result = -1
break ;
}
return result;
}
>>447 ありがd。
>もうちょっとがんがれ
ういっす、もちょっと考えます。
>>450 Calc関数の第一引数をADDとか、MULで置き換えろって事でしょ。
1とか3とかではなく、SUB、DIVと書いてあれば、意味が分かりやすいから。
var = 0 ;
Calc(var, x, y, &z) ;
ではなく、
var = ADD;
Calc(var, x, y, &z) ;
とするか、
Calc(ADD, x, y, &z) ;
のようにするか。
452 :
デフォルトの名無しさん :04/05/12 15:57
#if 0 式 #endif とプログラムの中ほどにあったら、式を実行しないという事ですか?。 コメントのかわりかな。
>>452 プリプロセッサによって取り除かれ、その部分はコンパイルすらされません、というか、
コンパイラまで伝わりません。
なるほど、あとで書き直すときそのほうが便利ですね。あと、見やすいですし。
>>452 コメントのネスト(/* /* */ */)は普通エラーになるから、そういうとき代わりに#if 0を使う
質問です。 ヘッダファイル typedef enum token{ EMPTY, EPSILON, AST, CONC, LPAR, RPAR, VERT, LETTER, EOREG, } token; extern int debug; extern char *reg_string; extern void fatal_error(char *s); extern token curr_token; extern char token_val; extern int lexer(void); extern void get_token(void); extern void print_token(token tok, int val);
ファイル@ #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include "calc1.h" void fatal_error(char *s); int debug = 0; char* reg_string; int main(int argc, char* argv[]) { debug = 1; if(argc != 2) fatal_error("no argument"); reg_string = argv[1]; if(debug) printf("Regular expression: %s\n",reg_string); lexer(); return 0; } void fatal_error(char *s) { fprintf(stderr, "%s\n", s); exit(1); }
ファイルA #include <stdio.h> #include <ctype.h> #include "calc1.h" token curr_token; char token_val; int lexer() { do{ get_token(); }while (curr_token != EOREG); return 0;} void get_token() { char c; while ( c = *reg_string ) { switch (c){case '\\':++reg_string; if ( c == '0' ) curr_token = EMPTY; else if ( c == 'e') curr_token = EPSILON; else curr_token = LETTER; break; case '*': curr_token = AST; break; case '.': curr_token = CONC; break; case '(': curr_token = LPAR; break; case ')': curr_token = RPAR; break; case '|': curr_token = VERT; break; case '\0': curr_token = EOREG; break; default: curr_token = LETTER; break;} reg_string++;} if (debug) print_token(curr_token,token_val); }
ファイルA続き void print_token(token tok, int val) { switch (tok){ case EMPTY: printf("EMPTY\n"); break; case EPSILON: printf("EPSILON\n"); break; case AST: printf("AST\n"); break; case CONC: printf("CONC\n"); break; case LPAR: printf("LPAR\n"); break; case RPAR: printf("RPAR\n"); break; case VERT:printf("VERT\n"); break; case EOREG: printf("EOREG\n"); break; case LETTER: printf("LETTER(%c)\n",val); break; default: fatal_error("Invaild token"); break; }} これらをコンパイルして走らせても無限ループにはまるんですが どこを改善すればいいのでしょうか
ステップ実行かトレース汁
>>457-460 汚い、読みづらい。2chの使用上インデントが反映されないのは仕方がないが、
改行位置をなんとかしろ。
で、void get_token()内
while ( c = *reg_string )
c に0が代入されたとき、whileブロックには入らないから
case '\0': curr_token = EOREG; break;
が実行されることはない。
何がやりたいのかわからん。
最終的には正規表現で文字列のパターンマッチをさせるのが目的のようだが。
・文字ごとに種類を定めたいのだとすると、get_token()でwhile()する意味がない。
・ふつう、tokenは、ある文字の連なり、つまり文字列を指すんだが。意味が通っていない。
・正規表現をパスさせるのが目的なのか、要素ごとに分けるのかも良くわからん。
>>462 漏れは
$ indent -kr -ip4 -ts1000
したよ。
適当に変えてとりあえずはまらないようにしてみた。 期待してる動作かどうかはわからないですけど。 void get_token () { char c; while ( 1 ){ /* <-ここ */ c = *reg_string; /* <-ここ */ switch (c) { case '\\': /* <-これはこのままでいいの? */ ++reg_string; if (c == '0') curr_token = EMPTY; else if (c == 'e') ・ ・ ・ case '\0': curr_token = EOREG; break; default: curr_token = LETTER; break; } if(curr_token == EOREG ) break; /* <-ここ */ reg_string++; } if (debug) print_token (curr_token, token_val); }
>>463 1文字以上で構成されるシンボルがトークンなんだから
意味は通ってるんじゃないのか?
LETTERが463のお望みのものだろうし。
while(1) よりも for(;;) を使おう。
こんばんは。
>>462 さん 見苦しいプログラムを貼ってしまいすみませんでした。
改行をなくそうとしたのが裏目に出てしまいました。ほんとすみません。
>>463 さん このプログラムは、文字列について文字をひとつづつ
解析しその結果を出力するようなパターンマッチを目的として
書いたつもりです。書いているうちにこんがらがってしまいました。
見苦しくてすみません。
>>464 さん 手直ししていただき有難うございます。
\\ですが、まず\を認識させて、その後に続く文字によって
出力が変わるようにしたいと考えている部分です。つまり
\をエスケープシーケンスとしてはたらいと考えて書きました。
>>465 うーん。そーなんだけれどさぁ・・・。
普通、get_token()って入力を単位文字(列)を1つ持ってくる働きをしそうではないですか。
while (入力の最後まで) {}
っていうのだと、意味が通らないなぁって思ったのでした。
ふと読んでて思ったのは、switch () {}中のbreak;が外側のwhile(){}に対しての脱出だったら、
意味が通りそうかなぁとか。(でも、やっぱヘン)
>>467 ひと区切り(一文字、もしくはエスケープ1つ)だけ、取ってくる関数をつくりなされ。
そして、それを呼び出すwhile()を持った関数を別に作りなされ。
>>466 まだwhile(1) で警告出すコンパイラをお使いですか?
さすがにwhile(2)とか書かれた日にゃあ殴りたくもなるかもしれませんが、
while(1)は十分、市民権を得たでしょう。
それでもfor(;;)を推奨する理由があるなら、不勉強な私に教えてくださいませ。
470 :
デフォルトの名無しさん :04/05/12 21:32
質問よろしいでしょうか。 >command para1 para2 para3 とコマンドを入力して、 para?の文字列が長い順に並び替え表示をするプログラムを作ることになっているのです。 例としては >command matsuya yosinoya sukiya yosinoya matsuya sukiya と表示したいのです。 argvでパラメータのアドレスを取得して、strcpyでうつしてやればよいかと考えたのですが、 文字列の長さが一致しないので、どうやってよいのか分かりません。 教えていただけないでしょうか。
>>470 移す必要ないじゃん。だからstrcpyも使わない。
ためしに para3 para2 para1 の順で表示するプログラム書いてみ。
>>466 ,469
好きな方、もしくは会社等で定められたコーディング規則に従えば
どちらでもよい話。議論する理由もない。
>教えていただけないでしょうか。 ヒント:添え字を並べなおせ
>470 #include <stdlib.h> int lencomp(const void *p1, const void *p2) { return strlen(*(char**)p2) - strlen(*(char**)p1); } int main(int argc, char **argv) { int i; if(argc < 1) return EXIT_FAILURE; qsort(&argv[1], argc - 1, sizeof(char*), lencomp); for(i = 1; i < argc; i++) puts(argv[i]); return EXIT_SUCCESS; }
>474 #include <string.h> が抜けてるな。C なら通るだろうが。
>475 つか、#include <stdio.h> も抜けてるな。吊ってくる。
477 :
デフォルトの名無しさん :04/05/13 00:30
1 次元配列a[ ] の0 番目からn − 1 番目までに入っているデータを,a[ ] の中で逆順に並べな おしたいです。 要するに,a[ ] の0, 1, 2, . . . , n − 1 番目の 要素をそれぞれa[ ] のn − 1, n − 2, n − 3, . . . , 0 番目 に移したいです.この処理を行うプログラムをお願いします。.
>>477 とりあえず、何も考えていない単純で簡単な実装。
void reverse(int a[],int n) {
int i,temp;
for(i = 0; i < n / 2; i++) {
temp = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = temp;
}
}
479 :
デフォルトの名無しさん :04/05/13 01:00
>>477 #include <algorithm>
std::reverse(a, a+n);
とっても簡単な質問だと思うんですが、わからないので質問させてください。 例えばで、scanfで読み取った数字 123456 を 56 という数字に桁をずらす?場合はどうすればいいのでしょうか?
x = 123456; x = x % 100;
文字列として読み込んで、末尾の文字を取り出す、とか。 でかい数字でなければ例えば100で割った余りでもよいかも。
>>482 >>483 有難う御座います。
宝くじの当選かはずれかを出力するプログラムの課題を出されて、
下2桁の当選の場合だけがさっぱりでした。
数日前にC言語習い始めたばかりでまだまださっぱりです><
>>431 失礼します。
使用コンパイラ gcc -v 3-3.1
OS WindowsXP
エラーメッセージは
test47:error before token':'
test52:error before token':'
です。
>>432 >>434 >>435 訂正します。コンパイルできません。
unsigned rrotate (unsigned x, int n)
{
int bits = int_bits();
n %=bits;
/*return(n?(x>>n)|(x<<(bits-n):x));エラー*/
return(n?(x>>n)|(x<<(bits-n):)x);/*修正*/
}
遅レスすまそ
こうしたらうまくコンパイルできるようになりました。
失礼しました。
演算子の所を復習します。
>>484 とりあえず、宿題全文な。
(学校名はわからんよーに書きな。ネタにされる)
>>485 >/*return(n?(x>>n)|(x<<(bits-n):x));エラー*/
> return(n?(x>>n)|(x<<(bits-n):)x);/*修正*/
なんか括弧の位置がきもちわるい
return n? ((x>>n)|(x<<(bits-n))): x;
488 :
デフォルトの名無しさん :04/05/13 12:10
ネットワーク対応ソフト作ってください
>>488 main()
{
printf("Hello, world.\n");
}
telnetとかにリダイレクトすればok
Cでルーティングのプログラムを作れといわれましたが、Cは知らないので どうやって作ったらいいですか?
>>490 ズボンを下げて尻を丸出しにし、手でパシパシ叩きながら
「びっくりするほどルーティング!びっくりするほどルーティング!」
と大声を上げて教室あるいは社内の部屋を一周する。
フォートラン キーボードから実数xを入力し、結果を表示するプログラムを 作成せよ。 y1=(2*x**2)(3*x−3/4)
main(){ double d; scanf("%f", &d); printf("program nullpo\nreal x,y1\nx=%f\ny1=(2*x**2)*(3*x-3/4)\nwrite(*,*) y1\nstop\nend\n",d); return 0; }
#include <iostream> int main(void){ std::cout << "Gaxtu!" << std::endl; return 0; }
フローチャート書いてみたか? 書いてみろそうしないと無理だぞ
フローチャートですか、解りました。やってみます。 明日提出なもので、かなり焦ってます。どうもすみませんでした。
499 :
デフォルトの名無しさん :04/05/13 18:42
おい!誘導されてきたぜ!助けてくれ! 数字をピラミッドみたいに表示させろって言うんだ!具体的には↓みたいなの 1 22 333 4444 55555 って表示させるにはどうすりゃいいんだ! 上の行からスペースの数が4.3.2.1.0.と減って言ってるわけ! ifを使えってさ!あと二重ループっぽくしたらいいってさ!
>>498 がんばれ
どうしても間に合いそうになかったら誰かに聞け
俺は知らんぞ
>>499 もうちょっと真面目に質問しろ
そんなんじゃみんなに放置されても仕方ないぞ
for(i=1;i<=5;i++)
{
for(n=1;n<=i;n++)
{
printf("%d",i);
}
}
if文使ってないけど気にすんな
printf("%d",i); の後に if(n==i) printf("\n"); を追加してくれ えらそうなこと言ってすまんかった
>>500 マジありがとう!これからはキチンと説明します。
そろそろ、行頭に空白が出ない事に気づいた頃かな? #include <stdio.h> #define NUM 5 int i, keta; for (i=1; i<=NUM; i++) { for (keta=1; keta<NUM; keta++) { if (keta <= 5 - i) printf(" "); // 最初の 5-i 桁は空白 else printf("%d", i); } printf("\n"); }
いやーん × for (keta=1; keta<NUM; keta++) { ○ for (keta=1; keta<=NUM; keta++) {
506 :
デフォルトの名無しさん :04/05/13 19:18
先生!VCの質問もありでしょうか?
ふわあああん!!! #define NUM 5ってなんなんだよおお
どうせならif (keta <= 5 - i)もif (keta <= NUM - i)にすればいいのに。
509 :
デフォルトの名無しさん :04/05/13 19:33
foreach (1...5) { print " "x(5-$_)."$_"x$_."\n"; }
if (keta<=4-i)で上手くいったよ!あんがと!!
>506 宿題なら構わないんじゃないか? 「C++相談室 part30」は質問という単語をスレタイに含めるべきだと思った、そんな夜。
Q:配列の中で同じ値が続く部分の最長範囲を求めるプログラムを作れ。 このプログラム簡単そうだけど、いい案が浮かびません・・・。どうすればいいでしょうか?
int hage(int*a,int n){int r=0,i,j;for(i=0;i<n;i=j){for(j=i+1;j<n&&a[i]==a[j];)j++;if(j-i>r)r=j-i;}return r;}
515 :
デフォルトの名無しさん :04/05/14 02:53
tを配列xの要素数として、 double f(double x[],int t,int k) { double u[t/2],v[t/2],y; int j; for(j=o;j<t/2;j++) { u[j]=y[j]; v[j]=y[j+t/2]; } if(t==2) { y=u[0]+k*v[0]; } else { y=f(u,t/2,k)+k*f(v,t/2,k); } return y; } という関数を作ったのですが正しい値を返してくれません。 u,vの中身がおかしくなっているのでしょうか?
516 :
デフォルトの名無しさん :04/05/14 03:11
for(j=o;j<t/2;j++) { u[j]=x[j]; v[j]=x[j+t/2]; }
for(j=0;j<t/2;j++) コンパイル通ったのかよ。
あああごめんなさい。xです。 そしてt=2^kを書いてませんでした。 申し訳ないです…
char *mozi の中に文字列(「abc」とか「5/13」とか)が入っていて、 それをchar retu[10]の配列の中に「1文字ずつ」格納したいのですが、 どの様にやれば良いのでしょうか? とりあえずsschanfとか使ってみて頑張ったけど駄目だったよママン_| ̄|○
int count; for(count=0;;count++){ retu[count] = *moji++; if(retu[count] == '\0')break; }
521 :
デフォルトの名無しさん :04/05/14 14:30
e = ((...(((1/n + 1) / (n - 1) + 1) / (n - 2) + 1) ... )/2 + 1) / 1 + 1 とかける。この性質を利用してe を小数点以下100桁まで求めるプログラムを作れ。 (ヒント:最初にeに1000...000のような非常に大きな数がかかっていると考えよ。 また割算を実現しなければならないが、この場合は上の例を逆に繰り下がりが問題となる。)
522 :
デフォルトの名無しさん :04/05/14 14:38
>521 よくわかりませんなぁ、自然対数ね。
>>522 細かい事ですまんが、自然対数の「底」ね。
>>519 わざわざ難しく考えなくとも…
char *mozi, retu[10];
strncpy(retu, mozi, sizeof(retu)-1);
526 :
デフォルトの名無しさん :04/05/14 16:49
if (isupper(ch) != 0) ch = tolower(ch); else ch = toupper(ch); というようなものを使って読み込んだテキストファイルに記述されている アルファベットの大文字を小文字へ、小文字を大文字へ変換して出力する、 というプログラムを作ろうと思うのですが、 2バイト文字(漢字)とかの場合ってどうなるんでしょう?
527 :
デフォルトの名無しさん :04/05/14 16:54
528 :
デフォルトの名無しさん :04/05/14 16:54
523のリンク先じゃだめなのか?
shift-jis 漢字判定 #define IsKanji(c) ( (unsigned char)((int)((unsigned char)(c) ^ 0x20) - 0x0A1) < 0x3C )
531 :
デフォルトの名無しさん :04/05/14 17:00
>>530 私へのレスでしょうか?
isupper〜…で英単語の大文字⇔小文字の相互変換を行うプログラムに、
漢字が記述されているテキストを食わせるとどうなるのでしょう?
という質問だったのですが…
文章が足りずに申し訳ないです。
532 :
デフォルトの名無しさん :04/05/14 17:16
#include <stdio.h> #include <stdlib.h> int main() { int a[ 1000 ]; int i,j,c; for ( j = 0; j < 1000; j++ ) a[ j ] = 0; a[ 0 ] = 1; for ( i = 0; i < 1000; i++ ){c = 0; for( j = 0; j < 1000; j++ ){ a[ j ] = a[ j ] * 2 + c; if ( a[ j ] >= 20 ){ a[ j ] = a[ j ] - 20; c = 2; } else if ( a[ j ] >= 10 ){ a[ j ] = a[ j ] - 10; c = 1; } else { c = 0; } /* if */ } /* for */ } /* for */ for ( j = 999; j >= 0; j-- ) printf( "%1d", a[ j ] ); printf( "\n" ); return ( 0 ); } /* main */
533 :
デフォルトの名無しさん :04/05/14 17:18
>>532 このように、配列を主に学習しているので、なんとかこのプログラム を改良して、eの値を出せないでしょうか??
535 :
デフォルトの名無しさん :04/05/14 17:42
「入力した文字列(例:pencil)をアルファベット順(例:ceilnp)に並び替えるプログラムを作れ」 というのはどのようにしたらよいのでしょうか??
536 :
デフォルトの名無しさん :04/05/14 18:05
昇順に並んでいるとは限らないか。 昇順に並んでいない文字セットがあるかどうかしらないけど。
>>536 の言ってる仕様なら
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void *a, const void *b){
return *(char*)a - *(char*)b;
}
int main(void){
char buf[128];
fgets(buf, sizeof buf, stdin);
qsort(buf, strlen(buf) - 1, 1, cmp);
puts(buf);
return 0;
}
539 :
デフォルトの名無しさん :04/05/14 18:15
マチンの公式のマクローリン展開の1項,2項,3項,…,10項までを 計算してπの近以値を求めよ 級数による近似計算では,級数の収束を判定して,計算を終了させることが多い.たと えば,数列のi項目をaiとしi項月までの級数(i項目までの和)をsiとするとき, lai/sil<10e-14を満たすとき計算を終了させるプログラムのソース がわかりません(;;) 重量
π=4(4tan-1(1/5)-tan-1(1/239)) マチンの公式
541 :
デフォルトの名無しさん :04/05/14 18:36
助けて!!!!! 1 222 33333 4444444 555555555 4444444 33333 222 1 上からスペースが四つ「1」を表示。それから五つスペースのあと%0として改行。 以降スペース3、「2」を3回、スペース4回、%0と表示するプログラムを作れとの事なのですが 表示される1.2.3などの数字は文字列としてやれと指示されました。 int a[5][10]; for(j=0;j<=4;j++){ for(i=0;i<=8;i++) はっきり言ってここまでしか思いつきません。ぎゃお
#include <stdio.h> void main(void) { double sum, x=1.0/5, y=1.0/239, ax, ay; int n; ax=x; ay=y; sum=4*ax-ay; printf("%17.14f\n",4*sum); for(n=2;n<=10;n++){ ax=-ax*x*x; ay=-ay*y*y; sum=sum+(4*ax-ay)/(2*n-1); printf("%17.14f\n",4*sum);} } このプログラムを改造して条件fabs(ai/Si)<10e-14を 満たすときプログラムを終了し出力例のように出力する プログラムを教えてください (出力例) π=3.14159265358979,収束に要した項数11,|ai/Si|=5.0860511575627e-10
>>541 void print(int x){
int i, j;
for (i = 1; i <= x; i++){
printf("%*c", x - i + 1, ' ');
for (j = 0; j < i * 2 - 1; j++) printf("%d", i);
puts("");
}
}
↑これだと先頭に余計にスペースが入るので素直にforにしとく void print(int x){ int i, j; for (i = 1; i <= x; i++){ for (j = 0; j < x - i; j++) putchar(' '); /*空白*/ for (j = 0; j < i * 2 - 1; j++) printf("%d", i); /*数字*/ puts(""); } }
545 :
デフォルトの名無しさん :04/05/14 19:23
もれもできた。 --------------------------------------- #include <stdio.h> #include <memory.h> #include <malloc.h> #define N 5 main(){ char *str; int i; str = malloc(N * 2); for(i = 1; i <= N; i ++){ memset(str, ' ', N - i); memset(str + N - i, i + '0', i * 2 - 1); *(str + N + i - 1) = '\0'; puts(str); } for(i = N - 1; i >= 1; i--){ memset(str, ' ', N - i); memset(str + N - i, i + '0', i * 2 - 1); *(str + N + i - 1) = '\0'; puts(str); } free(str); } ------------------------------------------
共通処理を関数化してみる。 #include <stdio.h> #include <memory.h> #include <malloc.h> #define N 5 void PutLine(int n, int i, char *str){ memset(str, ' ', n - i); memset(str + n - i, i + '0', i * 2 - 1); *(str + n + i - 1) = '\0'; puts(str); } main(){ int i; char *str = malloc(N * 2); for(i = 1; i <= N; i ++) PutLine(N, i, str); for(i = N - 1; i >= 1; i--) PutLine(N, i, str); free(str); }
あ、すまん勘違いしてた。 俺のだと、半分までしか表示されんな。
>542 #include <stdio.h> #include<math.h> int main(void) { double sum, x=1.0/5, y=1.0/239, ax, ay; int n=2; ax=x; ay=y; double an; double maxerr = pow(10,-14); double err = 1.0; sum=4*ax-ay; printf("%17.14f\n",4*sum); while(err >= maxerr){ ax=-ax*x*x; ay=-ay*y*y; an = (4*ax-ay)/(2*n-1); sum += an; err = fabs(an/sum); printf("%17.14f\n",4*sum); n++; } printf("π=%.14f ,収束に要した項数%d ,|ai/Si|=%.14E\n", sum*4.0,n,err); return 0; } 制限事項 ・オリジナルのコードがウンコーなのできっと評価はウンコー。 ・|ai/Si|として書かれてる数字、有効数字周りがかなり胡散臭い。仕様。
即席で直したがちょっとわかりにくいかモナ #include <stdio.h> #include <stdlib.h> void print(int x){ int i, j; for (i = 1; i < x * 2; i++){ for (j = 0; j < abs(x - i); j++) putchar(' '); /*空白*/ for (j = 0; j < (x-abs(x-i))* 2 - 1; j++) printf("%d", x-abs(x-i)); /*数字*/ puts(""); } }
551 :
デフォルトの名無しさん :04/05/14 20:25
>530 処理系によるんじゃねーの?
>>526 > 2バイト文字(漢字)とかの場合ってどうなるんでしょう?
入力する漢字コードの種類によって動作が異なる。
Shift-JIS/JIS(7bit) → 文字化けする
EUC/UTF-8 → 文字化けしない
>542 ありがとうございます。オリジナルコードは助教授が作った ものです。
554 :
デフォルトの名無しさん :04/05/14 22:52
>521 配列を使ってプログラムをつくらなければいけないのですがどうか助けてください! (>_<)
555 :
デフォルトの名無しさん :04/05/14 23:02
問 適当な英文テキストファイルを読み込んで、大文字小文字の区別をせず、 連続2文字で出現する頻度が最も高い組合せを出力する。 なんですが… 自分で解いててわからなくなったのでみなさんの力を貸してください 自分が考えたプログラム(途中) ↓
556 :
デフォルトの名無しさん :04/05/14 23:03
#include<stdio.h> #include<string.h> #include<ctype.h> int main(void) { FILE*fp; charfp[256],d[256],e[256],f[256][256]; int a,b,c,s,t,u; fp=tolower(fp); for(s=0;s<26;s++ ){ e[s]="a" + s; while(!0){ fscanf(fp,"%s",d) ; c = strlen(d) ; for(t=0;t<c;t++ ) { if( (isalpha(d[t]))&& (isalpha(d[t+1])) ) { for(a=0;a<26;a++){ for(b=0;b<26;b++) f[a][b]
557 :
デフォルトの名無しさん :04/05/14 23:51
質問です。10進数を2進数に直す課題なのですが関数をつかって 文字型であらわすプログラムなのですが、普通の2で割って1,10,100とかけていけば 答えはでるのですが、シフトをつかっての書き方がよくわかりません どうか教えてください。(*- -)(*_ _)ペコリ
>>557 シフト使うなら2で割るところを
>>1 で良いんじゃないのかな?
n = a / 2; なら n = a >> 1; って感じで。
560 :
デフォルトの名無しさん :04/05/15 00:13
>>491 そしたら上司が
いきなりズボンをおろしておしりをたたきながら
「カツラがずれてもルーティングっ!!カツラがずれてもルーティングっ!!」
といいながら社内を一周しだしました。
何箇所か訂正。一応、アップしたので動くことは動くけど・・・ × void push(char tmp[2], int n){ ○ void push(int tmp[2], int n){ × char tmp[2]; ○ int tmp[2] × if(!(fp = fopen(argv[1], "r"))) { ○ if(NULL == (fp = fopen(argv[1], "r"))) {
あと、#include <ctype.h> も忘れてた。
>>557 #include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 256
main(){
unsigned int n, mask, int_bit;
char buf[BUFSIZE];
printf("数値を入力 >");
fgets(buf, BUFSIZE, stdin);
n = atoi(buf);
int_bit = sizeof(int) * CHAR_BIT;
for(mask = 1 << (int_bit - 1); mask != 0; mask >>= 1){
if(mask & n)
putchar('1');
else
putchar('0');
}
putchar('\n');
}
/* 大きすぎる値や負の数を入力した場合の動作保証はありません。 */
thxです。 ただ…もう少し初心者向けに作りなおせないでしょうか? 自分習い始めたばかりなもので。
>>565 かなりわかりやすい部類のソースだと思うが。
コメントまで書いてくれているし、、、
こういう場合は、机上で適当なデータを用意して、どのように推移するか、を確かめてみると
(初心者には)いいだろう。
>>567 int main(void); ←これ
>>564 さん
このプログラムもらってもいいですか?
>>566 ソースの最初に // コマンドライン第一引数(argv[1])で、対象ファイル名を指定。 とありますが、どうすれば適当なデータを入力できるのでしょうか?
push とmemsetがよくわからないんですが、 このふたつを使わないプログラムに書き換えられないでしょうか?
>>555 の問題って俺の大学のじゃん。
通報しときますた(w
>>568 さん
ありがとうございました。
コンパイルできるようになりました。
が、私の意図したように動いてくれないので
現在バグ取りとしているところです。
575 :
デフォルトの名無しさん :04/05/15 13:03
576 :
デフォルトの名無しさん :04/05/15 13:04
577 :
デフォルトの名無しさん :04/05/15 13:09
自分大学生ではないんで違うと思われますが? ちなみにばれたら自分もまずいですが… みなさんのおかげでだいたいわかりました。 thxです。
>555 >576 はも少し簡単にすませろ int now,prev=0; while((now=fgetc(fp))!=EOF){ if(isalpha(prev) && isalpha(now)){ if(max < ++ch[toupper(prev) -'A' +1][toupper(now) -'A' +1]) max=ch[toupper(prev) -'A' +1][toupper(now) -'A' +1]; } prev=now; }
%u
582 :
デフォルトの名無しさん :04/05/15 15:16
データを次々と入力して, 入力データの最大値を出力するプログラムをお願いします. ただし,入力は 正の数値で,データの終りは0 の入力です
全く同じ問題を最近見かけた気がする。
最大値=マイナスの最小値 while(入力が終わるまで){ if(入力が0) ループ終了 if(最大値<入力値) 最大値=入力値 }
void main() { int max=0,j; for(;;) { printf("Please Input any Number!\n"); scanf("%d",&j); if(j==0)break; if(max<j && (j*10)%10==0)max=j; printf("Maximum number is %d!!\n",max); } } konnatokorodedoudesyouka?
>(j*10)%10==0 なんぢゃこりゃ?
西暦を入力し、平年か閏年を求めなさい(論理演算子 !、&&、||) 閏年の条件 西暦が 1、4で割れること 2、100で割れてはいけない(但し、400で割れる) if文1行で終わるそうですが、解りませぬ・・・
((y%4==0 && y%100!=0) || y%400==0)
ブーーーーーっと吹いちゃう位に簡単ですたね・・・・・ やっぱり趣味の世界で辞めて置いたほうが良い事を、改めて確信しますた。 どうも有難う。
どうしても次の問題が解けないのでお願いします。 スタックを初期化する関数 void stack_initialize(stack *stk) およびスタックが空であるかどうかを判断する関数 int is_stack_empty(stack *stk) を作れ。 is_stack_empty は,スタックが空であるときに 1 を,空ではないときに 0 を返す。 C言語でお願いします。 できれば説明も書いていただければありがたいです。
スタック自体はどのようなものですか?
すいません・・・自分が初心者なので全くわかりません。
問題の前提にあるものを晒せ
>>590 「stack」←この構造体が宣言されているはずなのだが。
これが分からないことには、誰にも答えられません。
void stack_initialize(stack_t *stk){ stk->count = 0; return; } int is_stack_empty(stack_t *stk){ return (stk->count == 0); } で、良いんかな?
スタックが空であるときに 1を返すのは(stk->count == 0); をifにして後にelseをするんですか? それでもうできているのかな・・。
ブールで調べてみ。 心配なら。 int is_stack_empty(stack_t *stk){ return stk->count == 0 ? 1 : 0; } とでも書いたらよかろう。
>>598 激しく無駄。
「心配なら」って断るくらいならif文使うことを勧めた方がいい。
つーか、return文に括弧つけるなよ。
(stk->count == 0)が真なら1、偽なら0を返します。 stk->countが0なら(stk->count == 0) は真なので 1 と同じ。 stk->countが0以外なら(stk->count == 0) は偽なので 0 と同じ。 # というか、定義と問題のスタックの構造体の型が違うような気がするのは # 気のせいか?
>>599 >つーか、return文に括弧つけるなよ。
何故?
おまえは格好つけるなよ。
mainとかはなくても大丈夫なんですか?
>>603 なんていうか、予想を超えた返答が来たな
mainやらなにやらはもちろん必須
>>600 でも、問題では戻り値はブーリアンだと明記されていないわけだから、
あえて、1,0を返すのは悪い作法とは思えないよ。
>>603 要求されてないぞ。「プログラムを作れ」なら兎も角、「関数を作れ」だからな。
テストするのに必要なら自分で作れ。
>>603 もんだいをみるかぎりではmainは必要ない。
プログラムを実行しろと書いてないから。
関数だけでよかったんですね。 答えは上のやつで正解ですか?
以下の質問に答えよ、という問題でつ。 グローバル変数とローカル変数の違いについて説明せよ 関数引数への値渡しとアドレス渡し(ポインタ渡し)の違いについて説明せよ 関数定義とそのプロトタイプ宣言について考察せよ 分割コンパイルとは何か説明し、そのメリットについて考察せよ お願いしまつ。えらい人
>>587 速習Winプログラミング
C言語超入門
ゼロからのプログラミング
藤森水絵 著
か?
グローバルなことと、ローカルなことが違います。 値で渡るのと、アドレスで渡るのが違う。 関数定義のプロトタイプを宣言して前方参照を解決する。 分割してコンパイルすること。メリットはコンパイル時間が短くなる。モジュール独立性を高める。など。
グローバル変数はグローバルな変数で、ローカル変数はローカルな変数。 値渡しはアドレス渡しより分かりやすいと思います。 以下の設問は「考察せよ」なので回答をする必要はありません。
>グローバル変数とローカル変数の違いについて説明せよ スコープが違う >関数引数への値渡しとアドレス渡し(ポインタ渡し)の違いについて説明せよ どっちも同じ。プログラマが違うと考えてるだけ >関数定義とそのプロトタイプ宣言について考察せよ 定義と宣言で十分なのになんで"プロトタイプ"宣言なのかな。冗長だな >分割コンパイルとは何か説明し、そのメリットについて考察せよ ファイル毎にコンパイルすること。 ヘッダが巨大になると全コン時に遅くなるので、まったりできる。
617 :
デフォルトの名無しさん :04/05/15 23:56
0〜10までの数字を4個組み合わせて、合計が10になる数字の組み合わせを求めるプロ グラムを教えて下さい。また4個組み合わせて同じ数字が一個もない組み合わせを求める プログラムを教えて下さい。2つもすいません。お願いします。
618 :
デフォルトの名無しさん :04/05/16 00:19
正の整数n の値を入力して,S = 1+(1+2)+(1+2+3)+(1+2+3+4)+· · ·+(1+2+· · ·+n) を求めるプログラム教えてください。 Cでおねがいしま〜〜す
int i,s,n; /* n入力部略 */ for(i=s=0;i<n;i++) s+=(i+1)*(n-i);
620 :
デフォルトの名無しさん :04/05/16 00:36
ちとひねった #include <iostream> #include <sstream> template <int N> struct FFindNum { void calc( int min, int max, const std::string& pre = "" ) const { FFindNum<N-1> next ; for( int i = min ; i <= max ; i++ ){ std::stringstream sstr ; sstr << pre << i << " + " ; next.calc( min, max - i, sstr.str() ) ; } } } ; template <> struct FFindNum<0> { void calc( int min, int max, const std::string& pre ) const { if( min == max ) std::cout << pre << min << std::endl ; } } ; int main() { FFindNum<3> f ; f.calc( 0, 10 ) ; return 0 ; }
621 :
デフォルトの名無しさん :04/05/16 00:49
文字を入力:program a=1 g=1 m=1 o=1 p=1 r=2 のように、入力した文字を、カウントしてくれるプログラムを C言語でお願いします。
int c,cnt[2][26]; while((c=fgetc(stdin))!=EOF){ if(isalpha(c)) if(toupper(c)) ++cnt[0][c-'A']; else ++cnt[0][c-'a']; }
>622 初期化汁!
624 :
デフォルトの名無しさん :04/05/16 01:12
>617 重複無し版…つーかさっきのバグってたかも… 反省を込めてCで #include <stdlib.h> char buf[256] ;//必要なサイズは適当に... void calc( int min, int max, int nest, char *pos ) { int i ; if( nest > 0 ){ for( i = min ; i <= max ; i++ ){ sprintf( pos, "%d + ", i ) ; calc( i + 1, max - i, nest - 1, pos + strlen(pos) ) ; } } else { if( min <= max ) printf( "%s%d\n", buf, max ) ; } } int main() { calc( 0, 10, 3, buf ) ; return 0 ; }
>>613-615 ローカルとは、一部、というような意味で、その関数の中のみ使われる変数であり、それに対してグローバル変数はすべての関数で使える変数である。
値そのものを渡すのと、値があるアドレスを渡すことの違い
関数を定義してプロトタイプ宣言することで、以前のを参照することを阻止する
ファイルごとにコンパイルすること。分割することによってコンパイル時間が短くなる
でいこうと思いまつ。ありがとうございました。
逆ポーランド記法の式の計算をスタックを用いて行うプログラムを おしえてください^^
ぐぐれ
プロセスメモリを書き換えるプログラムを作って戴きたいのですが。 そして登録したものをキーで割り当てて実行できるような・・・。
登録したものって何?
説明不足すみません。 書き換えたいコードの事です。 書き換えたいコードを登録していき、チェックボックスにチェックする事で実行するコードを選択でき、 実行ボタンを押すと任意のプログラムに反映される。 という感じなのですが。
>>618 亀レスだが
int sum(int n)
{
return n*(n+1)*(n+2)/6;
}
1÷7を小数点以下60桁ほど正確に求めよ
int H[SIZE];という配列において 0からSIZE-1までの数をひとつずつなるべくランダムになるように H[0]からH[SIZE-1]に代入するプログラムを作れ お願いします。
>>630 何がしたいのか全然わかんない。
ランチャーが作りたいの?
>>632 #include <stdio.h>
int main(){
int a = 1, i;
puts("0.");
for(i = 0; i < 70; i++){
a *= 10;
putchar(a / 7 + '0');
a %= 7;
if((i + 1) % 10 == 0) putchar('\n');
}
return 0;
}
>>633 int i,j,k;
for(i = 0; i < SIZE; i++) H[i] = i;
srand(time(NULL));
for(i = 0; i < SIZE; i++){
j = rand() % SIZE;
if(H[i] != H[j]){
k = H[i]; H[i] = H[j]; H[j] = k;
}
}
> if(H[i] != H[j]){ この判定無駄だった。
>>632 printf("0.");
for (int i = 0; i < 60 / 6; ++i) {
printf("142857");
}
>>634 簡易プロセスメモリエディタを作っていただきたいという事です。
>>639 それは宿題なのか?
もっとも情報が少なすぎで何ともできないけどな。
>>1 読んで出直してこい。
入力した整数(6桁まで)を反転して出力するプログラムを書きなさい できれば配列を使わずにお願いします。
int r(int n){ int a; if(n>999999||n<0) return -1; /* error */ for(a=0;n;n/=10) a=a*10+n%10; return a; }
5桁以下の整数を入力して、その整数の5桁目のみを16進数で表現する プログラムを教えて下さい。
十進数の整数から一桁を取り出して、それを16進にしても、10進の時と同じだが?
宿題は全文を書け。
>>647 ごめん、勘違いしてたみたい。物凄い簡単だった。
>>648 分かりやすくまとめたんだ、タコ。
>>649 勘違いした状態で分かりやすくまとめる=わかりにくい=全文書く方がいい
>>650 アホ発見。まとめたのは問題文。勘違いしてたのはプログラムの中身。
意味分かる?
>>652 プログラムを勘違いした状態で分かりやすくまとめる=わかりにくい=全文書く方がいい
てか、問題文はアレであっているのか?
>>647 で書かれているように、問題文自体がアホなんだけど。
>>654 問題の意味自体は履き違えてなかった。勘違いしてた部分はささいな事。
ここまで言ったら理解できるか?
>>656 ささいな事を勘違いした状態で分かりやすくまとめる=わかりにくい=全文書く方がいい
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
分かりにくくまとめた
>>647 は死ね
>>659 俺の知り合いには通じたが?
こんな簡単な問題文を理解できない
>>659 は小学校から通い直せ。
お願いできないでしょうか? forを使って、ある指定した数以下の素数を 全て出力するプログラムを作成しなさい。 また、作成したプログラムで指定した数をnとした時 プログラム中でどのくらい繰り返しが行われるかを考察しなさい。
>>666 問題の内容と勘違いした部分は全く関係なし。
まだ分かってなかった?
>>667 勘違いした状態で分かりやすくまとめる=わかりにくい=全文書く方がいい
>>669 えっと、記憶障害をお持ちですか?
ってか、そろそろ飽きた。飯食います
>>670 勘違いをする程度のアタマで分かりやすくまとめる=わかりにくい=全文書く方がいい
>>671 飯食わせて下さい
頭の良さと勘違いするのは全く別。小学生ですか?
ほんとに飯食いますんで、んじゃ
>>672 飯食わないで分かりやすくまとめる=わかりにくい=全文書く方がいい
べつにいいじゃん。 自己流の意味不明問題文を書くやつは、誰にも相手にされないだけなんだから。 損するのは自分自身だろ。 出来るだけ冷酷に、それじゃわからん、と言ってあげましょう。
冷酷ねぇ(w
放置がベストだ
>665 「エラトステネスのふるい」というアルゴリズムが一般的。 検索すると多分大量に見つかる。 sqrt(n)の倍数までを弾けば残りは素数である事が保証される事に注意。
じゃ、とりあえず問題の全文を書いてみそ そしたら喪前の言ってることが正しいかどうかわかる
>680 スタックって先入れ中だし 違った、後ろから前から でもない、後入れ先出しって事だよ
>>677 ありがとうございます。検索してみます。。
無向グラフを隣接リストで表現して、2重連結成分を求めるプログラムを作るっていう課題 なんですが、今までグラフやリストを全く扱ったことがないので、さっぱりわかりません。 どなたか助けて下さい。
685 :
デフォルトの名無しさん :04/05/16 21:19
1+3+5+7+ … +n < 500を満たす最も大きなnを求めるプログラム お願いします
バグ発見。本質的なとこじゃないけど。 関数 trim() の中の2行 (誤) memmove(str, p, q - p); *(q + 1) = '\0'; (正) memmove(str, p, q - p + 1); *q = '\0';
#include <stdio.h> int main(void){ int sum, n; for (n = 1, sum = 0; sum + n < 500; n += 2, sum += n); printf("n(max) = %d sum = %d\n", n, sum); return 0; }
688 :
デフォルトの名無しさん :04/05/16 21:54
>>686 まだバグってる。
void trim(char *str){
char *p;
for(p = str; isspace(*p); p++);
if(str < p) memmove(str, p, strlen(p));
for(p = str; isalpha(*p); p++);
*p = '\0';
}
>>690 Toomre Disk というものがなんだかさっぱり分からないけど
for(i=0; i<N; i++)
のあとに
while(i!=N)
だと確実にwhileは実行されないけど、これはいいの?
あと
r=(double)Rmax*(double)rand()/(double)RAND_MAX;
ではどうですか?
>>690 whileループの直前に、i=0;を追加。
>691さん、692さん 690です。 無事、解決いたしました。ありがとうございます。
694 :
デフォルトの名無しさん :04/05/16 23:39
617で質問した者ですが、624で教えていただいたものでコンパイルしたのですが 上手くいきません。教えて下さいお願いします。何度もスイマセン。
#include <stdio.h> #include <string.h>
上手くいきませんじゃ分かりません。
>687 1ループごとにsum+nを二回計算してるので不経済。
>>697 それはわかってたんだが、短くすますためちょっとふざけたコードを書いてしまった。
ひらがな限定/カタカナ限定ならブルートフォースで簡単に見つけられそうだな。4字までだし。 英語の場合はUGに半分足を突っ込んだようなサイトから単語辞書を持ってくればいける。 漢字は辞書を用意しないと絶対無理。文字種混合もきつい。 ソルバーを作るのはそれはそれで楽しいけど、クイズは自力で解くものだと思うぞ。 パズルゲームのソルバーを作る奴は往々にして完成後もプログラム使わず手で解くしな。
プログラムという、パズルゲームなんでしょう。
702 :
名○大学生 :04/05/17 14:24
2次元配列を用いて弾丸を一定速度で打ち出したときに描く軌跡を打ち出し 角度を変えていくつか表示するプログラム。 それぞれの軌跡は別の記号で出力。 ただし、空気抵抗などは考えないものとする。 g を重力加速度とすれば、弾丸のt秒後の位置は、 x = ct + d y = -g t**2 / 2 + et + f と表現できる。 ただし、**は累乗を表し、(c, e)は速度ベクトル、 (d, f)は初期の位置を表すものとする。初期の位置は不変で、 速度ベクトルは打ち出す角度によって、x成分とy成分が異なる。 また、表示に際しては文字の縦横比を考慮に入れるとより現実的な グラフになる お願いします。
703 :
デフォルトの名無しさん :04/05/17 14:53
宿題でビジュアルベーシックを使ってプログラムを作るものがでました。 Do Loopステイトメントを使って、Nを入力して1からNまでの和を求めるものです。 Sum=1+2+3+....+N です。 下のはFor.....Nextを使ったものです。 Dim I As Integer Dim N As Integer Dim Sum As Long N = Val(TextBox1.Text) For I = 1 To N Sum = Sum + I Next TextBox2.Text = Sum MessageBox.Show("1+2+3+...+" & N & "= " & Sum, "Total") 時間が迫っていますのでどうかお早めにお願いします!
704 :
デフォルトの名無しさん :04/05/17 14:54
>>703 For I = 1 To N
Sum = Sum + I
Next
この部分だけ変えればできるそうなんですが。。。。。
>>703 スレタイを250回ほど読んでください。
706 :
デフォルトの名無しさん :04/05/17 15:15
#include <stdio.h> #include <ctype.h> int getch(void); void ungetch(int); int main() { int c,pn; c = getint(&pn); printf("%c\n",'c'); return 0; } int getint(int *pn) { int c, sign; while (isspace(c = getch())) ; if (!isdigit(c) && c != '0' && c != '+' && c!= '-'){ ungetch(c); return 0; }
707 :
706続き :04/05/17 15:16
sign = (c =='-') ? -1: 1; if (c == '+' || c == '-') c = getch(); int d; d = getch(); if (d == '+' || '-') { d = getch(); if ( EOF == d || !isdigit(d) ) { if ( EOF != d ) ungetch(d); ungetch('='); return 0; } } for (*pn = 0; isdigit(c); c = getch()) *pn = 10 * *pn + (c - '0'); *pn *= sign; if (c != '0') ungetch(c); return c; } のプログラムで、getch,ungetchを定義せよっといわれるのですがどうやればいいかわかりません
709 :
デフォルトの名無しさん :04/05/17 16:27
こんな宿題がでています。助けてください。 Yuzo君は1枚のカードを持っており,そのカードには1から1000の自然数のどれか(この数字をxとする)が書かれている. Yasumasa君はそのカードに書かれている数字を当てようとする. Yasumasa君が一つ自然数(これをyとする)を指定すると,Yuzo君はYasumasa君にかくれてサイコロを振り,出た目に応じて次のように答える. 1のとき : 「 黙秘します 」 2のとき : 「 x > y 」 3のとき : 「 x < y 」 4,5,6のとき : 実際に x = y ならば「 x = y 」と答える 実際に x > y ならば「 x > y」と答える 実際に x < y ならば「 x < y」と答える Yasumasa君は予測を何度も繰り返す. どのように予測すれば,Yuzo君は早く「 x = y 」と答えるだろうか ? サイコロの目は1から6であり,どの目が出る確率も 1/6 とする. Yuzo君はカードを見せてはくれない.サイコロの目も見せてくれない. また,Yuzo君のカードに書かれている自然数は「1から1000の整数の一様乱数」により決められるものとする. 課題 : 以下のプログラム(YYtester.c)は説明した状況を模擬するものである. このプログラムにおける Yasumasa.h を書け. ちなみに,Game()の戻り値が「何回の推測で答えを言い当てたか」を表している
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<Yasumasa.h> static const unsigned int MAX=1000000; /* conjecture : Yasumasa君の予想,TheNumber : カードの数字 */ int Yuzo_Answers(int conjecture,int TheNumber){ int dice = ( rand()%6 ) + 1; if( 1 == dice ) return(1); /* 黙秘 */ if( 2 == dice ) return(2); /* 答え(x) > 予想(y) */ if( 3 == dice ) return(3); /* 答え(x) < 予想(y) */ if( TheNumber > conjecture ) return(2); if( TheNumber < conjecture ) return(3); return(4); /* 正解 */ }
711 :
709(続き) :04/05/17 16:33
int Game(void){ int i; int TheNumber; /* 正解 */ int conjecture; /* Yasumasa君の予想 */ int answer=0; /* Yuzo君の返事 */ Yasumasa Y; time_t t; srand( (unsigned)time(&t) ); printf("sizeof(Yasumasa) = %d\n",sizeof(Yasumasa)); printf("20*sizeof(double) = %d\n",20*sizeof(double));
712 :
709(続き) :04/05/17 16:33
Yasumasa_Initialize(&Y); TheNumber = ( rand()%1000 ) + 1; for( i=1 ; i<=MAX ; i++ ){ conjecture = Yasumasa_Conjects(&Y,answer); answer = Yuzo_Answers(conjecture,TheNumber); if( 4 == answer ){ printf("Trial = %d\n",i); printf("The Number = %d\n",TheNumber); printf("Conjecture = %d\n",conjecture); Yasumasa_Clear(&Y); return(i); } } Yasumasa_Clear(&Y); return(0); } int main(void){ int sol; sol=Game(); printf("%d\n",sol); return(sol); }
713 :
デフォルトの名無しさん :04/05/17 17:49
こんな宿題が出ました。手におえません!! 「英単語を入力し、複数形で出力するプログラムを作れ。」 恐らく、child→children見たいなのは無視してもよいです。
714 :
デフォルトの名無しさん :04/05/17 17:49
さっきから709の問題といてる超初心者です。 無塚しすぎて3日はかかるかも
>>713 #include <stdio.h>
int main()
{
char tango[80];
printf("英単語を入力してください >");
scanf("%80s", tango);
printf("複数形は%sesです。\n", tango);
return 0;
}
こんな感じでどうでしょ?
>>713 「そんな大雑把な宿題があるかヴォケー!」と逆ギレしてよし。
パターンとしては
1・後ろに "s"
2・後ろに "es"
3・後ろの "y" を "ies" に
4・後ろの "f" を "ves" に
5・変わらない
6・特殊な変化
の 6 パターンあるが…
558さん、564さん教えてくれてありがとうございます 遅くなってすみませんでした。 参考にプログラミングしてるんですがどう考えても for(mask = 1 << (int_bit - 1); mask != 0; mask >>= 1){ if(mask & n) putchar('1'); else putchar('0'); の部分がわかりません。。どうか教えてください お願いします。
718 :
デフォルトの名無しさん :04/05/17 18:26
2次元配列を用いて弾丸を一定速度で打ち出したときに描く 軌跡を打ち出し角度を変えていくつか表示するプログラムを作れ。 それぞれの軌跡は別の記号で出力せよ。ただし、空気抵抗などは 考えないものとする。g を重力加速度とすれば、弾丸のt秒後の位置は、 x = ct + d y = -g t**2 / 2 + et + f と表現できる。ただし、**は累乗を表し、(c, e)は速度ベクトル、 (d, f)は初期の位置を表すものとする。初期の位置は不変で、 速度ベクトルは打ち出す角度によって、x成分とy成分が異なる。 また、表示に際しては文字の縦横比を考慮に入れるとより現実的なグラフになる (上で示した例ではこの比率を考慮していないのでだ円となっている)。
>>717 for (最上位ビットから最下位ビットまで) {
if (n の該当ビットが立っている) {
'1'を出力;
} else {
'0'を出力;
}
}
具体的にどこがどう判らんか書かないと教えようもない。
いまカレンダーを作っているのですが 閏年の判定で if((year % 4) == 0) && ((year % 100) != 0 || (year % 400) == 0) と言うより簡単な方法ってあるでしょうか?
ない。
>>721 ある。
実用的には4年に一度で充分だ。
何故なら、1900年は未だ現行暦ではなかったし、
2100年まで考慮する必要があるとも思えないから。
ライブラリ使えば?
それだけのことするのに、わざわざライブラリ探したり引っ張ってきたりするより、 721のほうがはるかに簡単と俺も思う。
2100年問題の悪寒。
C言語でWINDOWSとLinux両方でプリントするプログラムを考えています。 Canon LBP-220(レーザープリンタ)を使う予定です。 WIN32APIとMFCとを使わないで、CUIで作りたいのですが、思いつきません。 誰か教えていただけないでしょうか。
win32apiつかわなきゃ無利。
>>729 そうなんですか。
さっそくお答えありがとうございます。
Linuxでも動かせないといけないのですが、考慮するのはAPIの部分だけでしょうか。
そういう時は、システム依存のインタフェースの上にラッパをかぶせて インタフェースを共通化するのが常套手段。
そういう風にするのが常套手段なんですね。 ラッパや、LinuxのAPIは初めて使うので、勉強になると思います。 とりあえず、調べてみます。 ありがとうございました。 また、聞きにくるかもしれませんが、そのときはよろしくです。
733 :
デフォルトの名無しさん :04/05/18 02:51
>>709 サイコロの目が4,5,6の時、それぞれイコール、大なり、小なり
でない時はどう答えるの?
734 :
デフォルトの名無しさん :04/05/18 03:24
乱数を使ってn 個の整数を作成して、そのデータからヒープを作成する プログラムを教えてください。 乱数はvoid rand()を使って生成して欲しいです 煽られています。どなたか助けてください。。。
>>734 >void rand()
そんな餌に(略
736 :
デフォルトの名無しさん :04/05/18 06:56
「長さa,b,cを入力して、ヘロンの公式を用いて三角形の面積を求めるプログラムを書け。 ヘロンの公式:S=√(p(p-a)(p-b)(p-c)) 但し、p=(a+b+c)/2 (p-a)(p-b)(p-c)≦0の時には三角形が出来ないので、入力データに誤りがあることを示せ。」 C言語です。すみませんがお願いします。
>>736 #include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c, p, S;
printf("長さaを入力して"); scanf("%lf\n", &a);
printf("長さbを入力して"); scanf("%lf\n", &b);
printf("長さcを入力して"); scanf("%lf\n", &c);
p = (a + b + c) / 2;
if ((p - a) * (p - b) * (p - c) <= 0)
fprintf(stderr, "三角形が出来ないので、入力データに誤りがあること\n");
S = sqrt(p * (p - a) * (p - b) * (p - c));
printf("三角形の面積 %f\n", S);
return 0;
}
738 :
デフォルトの名無しさん :04/05/18 11:04
>>733 1,2,3の時は嘘を付き、4,5,6の時は真実を言うってことでしょう。
>>738 違う場合は黙秘するということ?
それともイコールではありませんみたいに言う?
あっ、後者の方だと結局答えているようなものだから前者か。
せっかく答えていただいたのにすみません。実はあれから
自分でも考えてみたんですけど、コンパイルしてもエラーが
出てしまいました。
>>737 さんとは違うんですけど、
どのあたりがおかしいか教えていただけますか?
#include<stdio.h>
#include<math.h>
main()
{
float a, b, c, p, s, max, med, min;
printf("input a b c");
scanf("%f %f %f",&a &b &c);
p = (a+b+c)/2.0;
if(p*(p-a)*(p-b)*(p-c) < 0)
printf("no sannkakukei\n");
else{
s = sqrt(p*(p-a)*(p-b)*(p-c));
printf("menseki = %f\n",s);
}
}
scanf("%f %f %f",&a &b &c); ↓ scanf("%f %f %f",&a, &b, &c);
修正はさみうち法と割線法のプログラムを教えて欲しいです。 はさみうち法はできたんですが、修正はさみうち法とかどうやればいいのか。。。
744 :
デフォルトの名無しさん :04/05/18 14:09
バイナリデータのワイルドカード検索(比較)を行いたいのですが・・・ 以下のワイルドカード検索(文字列)にサイズを指定するなりして考えたのですが うまくいきません。 バイナリデータのワイルドカード比較の方法を教えてください。 int StrMatch( unsigned char *ptn, unsigned char *str ) //0:不一致/1:一致 { switch( *ptn ){ case '\0':/* NULL */ return( '\0' == *str ); case '*':/* 任意文字列 */ return( StrMatch( ptn+1, str ) || (('\0' != *str) && StrMatch( ptn, str+1 ) ) ); case '?':/* 任意1文字 */ return( ('\0' != *str) && StrMatch( ptn+1, str+1 ) ); default:/* その他 */ return( ((unsigned char)*ptn==(unsigned char)*str) && StrMatch( ptn+1, str+1 ) ); } }
745 :
デフォルトの名無しさん :04/05/18 14:24
任意のn×n行列Aとn×m行列Bを与えて、方程式AX=Bの解行列X を(完全ピボット選択ではなく、"部分"ピボット選択のGauss−Jordan法により) 求めるプログラムを作成せよ。このとき、n、mや行列A、Bは標準入力 から入力し、また実際に行列A、Xの積を計算することで、得られた絵画正しいか どうかをチェックする昨日も実装せよ。またこのプログラムを用いて線形連立方程式の 解や、逆行列を求めた例も示せ。 すみませんがよろしくお願いします。
746 :
デフォルトの名無しさん :04/05/18 14:40
π(パイ)/4=1-(1/3)+(1/5)-(1/7)+(1/9)-(1/11)+・・・ 上式でπ/4を求めるとき、第何項目まで求めれば、3,14159/4との差の絶対値が 0,0001より小になるか、その項数と、そのときのπ/4の近似値をもとめよ。 上の問題がさっぱりです、最初の式って数列ですよね?どなたか解答お願いします。
あ、コンマだったんですね。
>>742 さんありがとうございました。
>>737 さんもありがとうございました。
板ちがい
749 :
デフォルトの名無しさん :04/05/18 14:54
>746 失せろ。 #include <stdio.h> #include <limits.h> #include <math.h> #define PAI_MODEL ((double)(3.14159/4)) main() { long n; double pai, gosa, l; pai = 1; l = 3; for(n=1; n<LONG_MAX; n++){ if(n%2 == 1){ pai = pai - ((double)1/l); }else{ pai = pai + ((double)1/l); } l+=2; gosa = PAI_MODEL - pai; printf("%5ld, %lf == %lf (%lf)\n", n, PAI_MODEL, pai, gosa); if(fabs(gosa) < 0.0001)break; } printf("項数 %ld, 近似値 =%8lf\n",n+2, pai); return 0; }
氏名,数学,物理,英語,3 教科の合計点の合計5 つのデータをひとまとめに して扱う構造体(struct siken)を定義しなさい.メンバ名は,それぞれsimei, sugaku, buturi, eigo, gokei とする.名前は大きさ20 の文字配列,点数はすべて整数型とする. 定義した構造体の各メンバに対し,キーボードから入力する次の仕様 の関数を作成して実行しなさい.siken input_data( void); 入力したデータをディスプレイに表示する,次の仕様の関数を作成し て実行しなさい.void output_data( siken); siken 型の配列を用いて,問題6,7 の問題を複数人数分扱えるようにしなさい こういう問題なのですがよろしくお願いします。
#include <iostream.h> struct siken { char simei[20]; int sugaku; int buturi; int eigo; int gokei; }; siken input_data( void); void output_data( siken); void main( void) { struct siken s; s = input_data(); } siken input_data( void){ siken data; cin >> data.simei >> data.sugaku >> data.buturi >> data.eigo; data.gokei = data.sugaku + data.buturi + data.eigo; return data; } void output_data(siken so){ cout << so.simei<< endl; cout << so.sugaku<< endl; cout << so.buturi<< endl; cout << so.eigo << endl; cout << so.gokei<< endl; }
こんな感じにしてみたのですが うまく出力できません。関数が理解できていないのでしょうか?
754 :
デフォルトの名無しさん :04/05/18 16:00
>>754 すみません。
定義した構造体の各メンバに対し,キーボードから入力する次の仕様
の関数を作成して実行しなさい.siken input_data( void); が問6
入力したデータをディスプレイに表示する,次の仕様の関数を作成し
て実行しなさい.void output_data( siken); が問7になります。
下の問題について教えてください。 while文使って整数の2乗を描くプログラムを作れ。 0 1 * 2 **** 3 ********* ・ ・ ・ 6 *********************************** こうやって表示させるためにはどうしたらよろしいでしょうか? bar graphでは作れるんですが、、 よろしくお願いします。
>753 mainでoutput_dataを呼んでないぞ。
>>758 助言いただいた通りにすることで1つだけの場合には
うまく動かすことができました。
ただ複数を入力、出力しようとするとうまくいかなくなってしまいます。
760 :
デフォルトの名無しさん :04/05/18 17:56
include <iostream.h> struct siken { char simei[20]; int sugaku; int buturi; int eigo; int gokei; }; siken input_data( void); void output_data( siken); void main( void) { int i ; struct siken data[3]; for (i=0; i<3;i++){ data[i] = input_data(); } output_data(data[i]); }
siken input_data( void){ siken data[3]; for (int i=0;i<3;i++){ cin >> data[i].simei >> data[i].sugaku >> data[i].buturi >> data[i].eigo; data[i].gokei = data[i].sugaku + data[i].buturi + data[i].eigo; } return data[i]; } void output_data(siken s[]){ ;for (int i=0;i<3;i++){ cout << s[i].simei<< endl; cout << s[i].sugaku<< endl; cout << s[i].buturi<< endl; cout << s[i].eigo << endl; cout << s[i].gokei<< endl; } }
こんな風にしてみたのですが q7.obj : error LNK2001: 外部シンボル ""void __cdecl output_data(struct siken)" (?output_data@@YAXUsiken@@@Z)" は未解決です Debug/q7.exe : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー とのエラーが出てしました。
>>763 プロトタイプ宣言ではvoid output_data(siken);
定義してるところではvoid output_data(siken s[])
なのが原因
>>765 実行できました!
ありがとうございました。
>>767 とりあえずさ、実際に実行してみて何がどうなっていけないのかくらいは書こうよ
>>764 #include <stdio.h>
int main(void)
{
int n;
for (n = 0; n < NUM; ++n) {
int tmp;
for (tmp = 0; tmp < n * n; ++n)
putchar('*');
とちゅうで書き込んじゃった。 せっかくだから完成させとく。 #include <stdio.h> #define NUM 6 int main(void) { int n = 0; while (n < NUM) { int tmp = 0; for (putchar(n + '0'); tmp < n * n; ++tmp) putchar('*'); puts(""); } return 0; } printf()の代わりにputs()とputchar()使ってる分高速 ってことはないかな。
#include <iostream.h> struct health_card{ char name[20]; //名前 double height; //身長 double weight; //体重 }; health_card input_card( void); //health_card の各メンバへ入力する関数 void output_card(health_card x); //health_card の各メンバを出力する関数 int search_card( int sw, health_card data[], int n); //構造体の配列のうち,身長が最も高い者,体重の最も重い者を求める関数 //第一引数:sw が0 ならば,身長が最も高い者を求める.そうでなければ体重の重い者を求める. //第二引数:構造体health_card の配列 //第三引数:配列の全要素数 //戻り値:それぞれ最大である配列要素の索引(インデックス) void main( void) { health_card data[10]; //10人分のデータを宣言 int i; for( i=0; i<10; i++){ //配列へデータを入力 data[i] = input_card(); } i= search_card( 0, data, 10); //身長の最も高いものを検索 cout << "身長の最も高い人 "; output_card( data[i]); //出力 i= search_card( 1, data, 10); //体重の最も重いものを検索 cout << "体重の最も重い人 " ;output_card( data[i]); //出力 }
health_card input_card( void) //health_card の各メンバへ入力する関数 { 埋めていただきたいところ 1 } void output_card(health_card x) //health_card の各メンバを出力する関数 { 埋めていただきたいところ 2 } int search_card( int sw, health_card x[], int n) //身長,体重の最大値を検索する関数 { 埋めていただきたいところ 3 } こんな問題なのですが、よろしくお願いします。
774 :
デフォルトの名無しさん :04/05/18 20:43
>>751 意図した出方をしたのかな?と、心配になってしまったり。要らぬ心配ですか。
はいすいません。
775 :
デフォルトの名無しさん :04/05/18 20:51
どうしても大学の講義で分からない問題があります。教えてください。 問 π/4=1-1/3+1/5-1/7+1/9-1/11+・・・・ という計算式でπ/4を求める時、3.14159/4との絶対値との差が0.0001より小になるのは のは何項目か?その項数と、そのときのπ/4の近似値を求めよ。 という問題です・・・・。while文を使って求めるみたいなのですが・・・。 お願いします。
776 :
デフォルトの名無しさん :04/05/18 20:53
777 :
デフォルトの名無しさん :04/05/18 20:53
またマチンの公式かよ・・
779 :
デフォルトの名無しさん :04/05/18 22:33
>>772 俺流かもしれんが。出力も考慮。
//health_card の各メンバへ入力する関数
health_card input_card( void){
health_card st;
cout << "名前(文字):";
cin >> st.name;
cout << "身長(数字):";
cin >> st.height;
cout << "体重(数字):";
cin >> st.weight;
return st;
}
780 :
デフォルトの名無しさん :04/05/18 22:34
>>772 への続き
//health_card の各メンバを出力する関数
void output_card(health_card x){
cout << "名前:" << x.name << "身長:" << x.height << "体重:" << x.weight << endl;
}
//身長,体重の最大値を検索する関数
int search_card( int sw, health_card x[], int n){
int i,ret = 0;
for(i = 0; i < n; i++){
if(sw == 0){
if(x[ret].height < x[i+1].height && x[i+1].height >= 0)ret = i + 1;
}else{
if(x[ret].weight < x[i+1].weight && x[i+1].weight >= 0)ret = i + 1;
}
}
return ret;
}
>>733 ありがとうございます。
非常に助かりました…。感謝感激です。
782 :
デフォルトの名無しさん :04/05/18 23:01
次のプログラムの一つ違う理由はn++がaiやsumの計算が終わってから実行されるからです。 したがってwhileを抜けてからnから1引いたものを項数とする。または nの初期値を1としておきn++を各項の計算の前に書く。 後半がわかりません、教えてください #include <stdio.h> #include<math.h> int main(void) { double sum, x=1.0/5, y=1.0/239, ax, ay; int n=2; double an; double maxerr = pow(10,-14); double err = 1.0;ax=x; ay=y; sum=4*ax-ay; printf("%17.14f\n",4*sum); while(err >= maxerr){ ax=-ax*x*x; ay=-ay*y*y; an = (4*ax-ay)/(2*n-1); sum += an; err = fabs(an/sum); printf("%17.14f\n",4*sum); n++; } printf("π=%.14f ,収束に要した項数%d ,|ai/Si|=%.14E\n", sum*4.0,n,err); return 0; }
キーボードから0〜9の数字dと,正の整数nを読み込み,n以下の整数xで, xとxの2乗の10進数表示の両方にdを含むものをすべて出力するプログラムをつくりなさい。 ただし,次のプロトタイプ宣言で示すように,整数xとdを仮引数として, xとxの2乗の10進数表示の両方にdを含む場合に1,そうでない場合に0を返す関数hit_digitを作成しなさい。 この関数hit_digitの作り方を教えて下さい おながいします
要素数がnである配列aの中から、指定された数bの位置を探し、返却する関数 int find(TYPE a[], int n, TYPE b) を作成せよ。なお、配列aと位置を探すbは関数テンプレートを用いて、int型、double型でも 可能なようにせよ。また、bがaに含まれていない場合には-1を、複数含まれている場合には、 最も小さな位置を返却するものとする。 という問題なんですけど教えてもらえませんか。 while文かfor文か検討が着かないので見通しだけでも教えてください。 よろしくお願いします。
>>784 whileでもforでも出来るけど、とりあえず方針。
for(int i=0;i<n;i++)ってループで判定。ヒットする要素があったらループをbreakで
抜ける。ループを抜けた後、i==nだったら-1を返す。i!=nだったらiを返す。
この問題のヤマはテンプレートっぽいけどね
787 :
デフォルトの名無しさん :04/05/19 03:19
乱数void rand()を使ってn 個の整数を作成して、そのデータからヒープを作成する プログラムを教えてください。 どうかお願いします。
>>787 わけわかめ。n個の乱数を生成するのまではわかったけど、
その乱数をどういう風に利用するんだ?
792 :
デフォルトの名無しさん :04/05/19 10:53
どなたか
>>745 をやっていただけるネ申はいらっしゃらないですか?
793 :
デフォルトの名無しさん :04/05/19 11:36
>>完全ピボット選択ではなく、"部分"ピボット選択のGauss−Jordan法により ってなんですかねぇ・・・無知ですまぬ
794 :
デフォルトの名無しさん :04/05/19 12:05
C++ですが 2次元配列を使って、 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 21 22 23 24 25 というものを作れというものですが、繰り返しがうまくいきません。お願いします。
795 :
デフォルトの名無しさん :04/05/19 13:17
>>792 神神いってるけどさー
Cで作るのかC++でつくるのかはっきりいったらどうなのよ
int a[5][5] = {{1,2,3,4,5,},{10,9,8,7,6},{11,12,13,14,15},{20,19,18,17,16},{21,22,23,24,25}}; 礼はいらぬ。
>794 奇数行と偶数行で分岐。つまり行を埋めるコードを二種類書く。 1行ずつでなく、2行を1セットとして処理。 普通に並べた後、偶数行だけ反転する。
#include <stdio.h> #define SIZE 5 int main(){ int a[SIZE+2][SIZE+2]; int i,j; int posx,posy,count; for(i=1;i<SIZE+1;i++){ for(j=1;j<SIZE+1;j++){ a[i][j]=0; } } for(i=0;i<SIZE+2;i++){ //仮想壁 a[0][i] = 1; a[SIZE+1][i] =1; a[i][0] =1; a[i][SIZE+1] =1; } posx = posy = 1; for(count=1;count<SIZE*SIZE+1;count++){ a[posx][posy] =count; if(a[posx-1][posy]<1) posx--; else if(a[posx+1][posy]<1) posx++; else if(a[posx][posy+1]<1) posy++; else break; } for(i=1;i<SIZE+1;i++){ for(j=1;j<SIZE+1;j++){ printf("%3d",a[j][i]); } printf("\n"); } return 0;} ネタに走ってネズミを走らせてみた。って、C++だったかorz
>>794 for(i = 0; i <= 24; i++)
a[i / 5][i % 10 < 5? i % 5 : 4 - i % 5] = i + 1;
801 :
デフォルトの名無しさん :04/05/19 18:03
799の別バージョン作ってみたんだが理由がわからん。誰か助けて。 #include <iostream> using namespace std; #define SIZE 5 int main(){ int i,u,num; num = u = i = 0; int a[SIZE][SIZE+1];//+1はずせないのはなぜ??回答もとむ //入力 for(u = 0;u < SIZE;){ for(i = 0; i < SIZE;i++){ num++; a[u][i] = num; } u++; if(u < SIZE){ for(i = SIZE; i > 0;i--){ num++; a[u][i] = num; } }else{ break; } u++; }
802 :
デフォルトの名無しさん :04/05/19 18:04
for(u = 0;u < SIZE;u++){ for(i = 0; i < SIZE; i++){ if(u%2 != 1){ cout << a[u][i]; cout << " "; }else{ cout << a[u][i+1]; cout << " "; } } cout << endl; } return 0; }
>>801 >int a[SIZE][SIZE+1];//+1はずせないのはなぜ??回答もとむ
>for(i = SIZE; i > 0;i--){
> num++;
> a[u][i] = num;
↑ i の範囲: 1〜SIZE
804 :
デフォルトの名無しさん :04/05/19 18:51
整数a,整数bを引数として受け取り、aをbで割った商を返す関数をもったプログラムを作成してください
hoge(int a, int b) { return a/b; }
>>787-791 こういうことか?
#include <cstdlib>
const int n = 4;
namespace WhereIsAnEsper {
void rand() { for (int i = 0; i < n; ++i) ::malloc(::rand()); }
}
int main() { WhereIsAnEsper::rand(); return 0; }
#include<stdio.h> int hoge(int a,int b) { return a/b; } int main(void) { int x,y; printf("二つの整数を入力"); scanf("%d %d",&x, &y); printf("%d/%d=%d\n"x,y,hoge(x,y)); return 0; }
808 :
デフォルトの名無しさん :04/05/19 19:58
次の問題の答え教えてください。宜しくお願いします。以下の処理の問題点を記述し、その解決方法を答えなさい。 #include <stdio.h> int main(int argc, char *argv[]) { char s[2], buf[20]; char *ret; FILE *fp; if (argc > 1) { fp = fopen(argv[1], "r"); if (fp == NULL) { strcpy(buf, "ERROR: "); strcat(buf, argv[1]); puts(buf); exit(1); } ret = fgets(s, 2, fp); if (ret != NULL) { printf("A top character code is %d. \n", s[0]); } else { printf("It is an empty file. \n"); } fclose(fp); } else { printf("Processing was not performed. \n"); } return 0; }
アルゴリズムで、文字列のALONGSTRINGSSORTINGANDMARGINGEXSAMPLEを使って置換え選択法で ランを作ってください
角度(x)を引数、戻り値としてsin^2(x)+cos^2(x)を与える関数プログラム
>>813 ∧∧∧∧∧∧∧∧∧∧∧∧∧
/ \ ,,,=;-●-、-、
そんなエサであたしがクマー!! > /-二 _二マ、O、-、
\ アリエナーイ!/ /ィ、,,,"7'、_l,,l l l))
∨∨∨∨∨∨∨∨∨∨∨∨∨ l/> < l l l"
ll rーヽ、 l_l l
_,,..=、、、_ l l lVV、 l / /
\ ,. 'rQ゚=-'''二ニ=、 。 ;1、i、 / _,,/ /
\" / }-==ノ-‐‐、、o /ノノ7ァーr''=‐''"ヽ
l φ、ーlマ ̄,ノ,_,'i、゚ ノイi ,..、 _,..、 l ,くAラ/ l 丿⌒
/l \'イ",.'"。ヽ ̄ ,ィ、l' lミ /__,,.>" / ̄_,, / ⌒ ン⌒
ll"l ノ\l'ゝ,,、.ノ/" l,,,ノィニ"´ 、 `ァ" / ⌒ン ⌒
ヾ、! ヽl\;j='∠;-ァノ,大K~ , iぐ>-、/ /) ⌒ ン⌒
`ヽ、 ヽ、ヽ、,,>''" 'ー^`" ,,.-。−'、ート、 /"//⌒
` ー--‐'''l`'' 、 ( 0r'⌒il ``ー'",,/ ___、、 、、
ヽ ー'⌒)ー---ヽ゚ヽ-'ノ / ┼┼ __
ヽ、_,,.-"  ̄ r、_L_ /\ /
815 :
デフォルトの名無しさん :04/05/19 22:21
816 :
デフォルトの名無しさん :04/05/19 22:30
質問です。 while文を使って、整数を入力し、今、入力した数と、その直前に入力した数を足す プログラムを0が入力されるまで繰り返すプログラムを作れ。 (例) >4 >5 9 >91 96 >−8 83 >0 終了 お願いします。分かりません。
>>813 int hoge(double)
{
return 1;
}
>>816 int n, m;
printf(">");
scanf("%d\n", &n);
if (n == 0) goto END;
while (1) {
printf(">");
scanf("%d\n", &m);
if (m == 0) break;
n += m;
printf("%d\n", n);
}
END:
printf("終了\n");
#include <stdio.h> int main(){ int i,j=0; while(1){ printf("> "); scanf("%d",&i); if(i==0)break; printf("%d\n",i+j); j=i; } printf("終了\n"); return 0; } >819 累計求めてどうする。
>>819 仕様を勘違いしてない?
>>816 #include <iostream>
using namespace std;
int main(int argc, char argv)
{
int i, j;
cin >> i;
if(i) {
cin >> j;
while(j) {
cout << i + j << endl;
i = j;
cin >> j;
}
}
return 0;
}
/*
>>815 これでどうだ*/
#include<stdio.h>
int hoge(int a,int b)
{
return a/b;
}
int main(void)
{
int x,y;
printf("二つの整数を入力?,? ");
scanf("%d,%d",&x, &y);
printf("%d/%d=%d\n",x,y,hoge(x,y));
return 0;
}
#define QUEUE_SIZE 10 /* 最大データ数 */ #define SUCCESS 1 /* 成功 */ #define FAILURE 0 /* 失敗 */ typedef int data_t; /* データ型 */ int queue_data[QUEUE_SIZE]; /* スタック本体 */ int queue_head; /* データ先頭 */ int queue_tail; /* データ末尾 */ 待ち行列を初期化する関数 void queue_initを作り 待ち行列が空であるかどうかを判断する関数 int is_queue_empty は,待ち行列が空であるときに 1 を,空ではないときに 0 を返すものとする。 分からないのでお願いします。
int is_queue_empty(){ return queue_head == queue_tail; }
ありがとうございます! できれば初期化する関数の方もお願いします。
826 :
KEITA :04/05/20 01:31
問1 乱数を利用したモンテカルロ計算 x、yをともに【0,1】区間の一様乱数であるとし、乱数の組(x、y)を多数発生させるとこれらの点は一辺の長さが1の正方形内に一様に分布するはずである。 このことを利用して、直径1の円の面積を計算するプログラムを作りなさい。 #include <stdio.h> /*入出力関数を利用するときに必要*/ #include <stdlib.h> /*乱数を利用*/ #include <time.h> #include <math.h> /*数学関数を利用する時に必要*/ #define START_RAND srand((time_t) time(NULL))/* 乱数発生*/ #define PI 3.14159/*円周率マクロ*/ #define POINTMAX 10000 double rand_1(int n) {return ((double)(rand()%(n+1))/n);} main() {long cnt,cntCir; double x,y,a,b; START_RAND; cntCir = 0; for(cnt = 0;cnt < 10000;cnt ++) { x = rand_1(POINTMAX); y = rand_1(POINTMAX); a = 0.5; b = sqrt(0.25-pow(x-0.5,2)); if(y <= a+b && y >= a-b){cntCir++;}} printf("Point Sqr:%ld Cir:%ld\n",cnt,cntCir); printf("Menseki Sqr:1 Cir:%lf\n",0.5*0.5*PI);} このプログラムに始めのほうにあるみたいに日本語で説明をつけたいんですけどよくわかりません。どなたか御願いします。
827 :
デフォルトの名無しさん :04/05/20 01:33
このやり方わかるかたいますか?自分でやっても無理でした。 問題「四点をクリックし、それらをクリックした順に結ぶ開いたポリラインを描画するプログラムを作成」 という問題です!クリックした順に結ぶことができませんでした。cygwin textpad
828 :
KEITA :04/05/20 01:33
問題2 写像と繰り返し計算 − 相転移現象 − #include<stdio.h> #include<math.h> #define a 0.95 #define V 100 main() { double x; int t; t = 0; fprintf(stderr,"初期値x="); fscanf(stdin,"%lf",&x); for(t=0;t<V;t++){ x = tanh(a*x); fprintf(stdout,"x[%d]=%f\n",t+1,x);}} こっちのほうも御願いします。 マジなきそうなんでホントお願いします。 この行はこうゆうことをしているって感じの簡単な説明をしていただければあとは自力で頑張るので。
829 :
デフォルトの名無しさん :04/05/20 01:41
>>827 #include <TinyFK/TinyFK.h>
int main(int argc, char *argv[])
{
TFK_Windowwin;
TFK_Lineline;
TFK_Vectorstart, end, end2,end3;
double sX, sY, eX, eY, aX,aY,bX,bY;
win.setBaseSize(520, 520);
win.setCanvas(10, 10, 500, 500);
win.open();
start = win.waitMouse(1);
830 :
デフォルトの名無しさん :04/05/20 01:41
end = win.waitMouse(1); end2 = win.waitMouse(1); end3 = win.waitMouse(1); sX = start.x; sY = start.y; eX = end.x; eY = end.y; aX = end2.x; aY = end2.y; bX = end3.x; bY = end3.y; line.create(sX, sY, eX, eY); win.draw(); line.create(eX, eY, aX, aY); win.draw(); line.create(aX, aY, bX, bY); win.draw(); while(win.wait() == true){ } return 0; } ここまではできたのですが、何が悪くて、クリックして線が出ないのかわかりません。
831 :
デフォルトの名無しさん :04/05/20 01:43
TinyFK の検索結果のうち 日本語のページ 約 4 件
>826 何つー糞コード… 概要。 正方形(0,0)(1,0)(0,1)(1,1)の中にランダムに点(x,y)を取り、それが 中心(0.5,0.5)、半径0.5の円の中に入っていればcntCirを1増やしている。 (後半のa,bとyについての関係式が円の中に入っているかどうかの条件式) もし試行回数が充分大きければ、 (円の中にある点の数/点の総数)≒(円の面積/正方形の面積)とできる、ってのがモンテカルロ法。 printf文の時点でのcntが点の総数、cntCirが円の中に入った点の数。 >828 こっちも糞コードだな。なんでSTDERR使う… x[n+1] = tanh(a*x[n])を延々と(今回は100回)繰り返したら値がどうなるか、の実験。 計算は面倒だが、作図は容易。 1)y=sinh(x)とx=sinh(y)を引く。以下、前者をA、後者をBと呼ぶ 2)初期値をx[0]とするとき、直線x=x[0]を引く。 3)x=cとAの交点からX軸に平行に直線を引く。この線はy=x[1]。 4)その線とBがぶつかったところからY軸に平行に直線を引く。この線がx=x[2]。 5)その線とAがぶつかったところからX軸に平行に直線を引く。この線がy=x[3]。 以下、繰り返し。
前言撤回。828はあんまり糞でもない。
835 :
デフォルトの名無しさん :04/05/20 03:45
16 ビットの2 進整数を入力してでこれを10 進数に変換するプログラム Cでお願いします
その入力は文字列でされるのか? 出力も文字列でいいのか?
837 :
KEITA :04/05/20 03:55
833 やっぱり1つめは長すぎますよね…2個目も最初はもっと長かったんですが短くなったほうなんです。 ありがとうございました。
sprintf(out, "%d", strtol(in, in + 16, 2));
>>835 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc > 1) {
printf("%d\n", strtol(argv[1], NULL, 2));
}
return EXIT_SUCCESS;
}
>>838 strtol()の第2パラメータの使い方が大間違い。
>>830 Win32APIごりごりで良いなら,すぐ書けるが?(cygwinのgccでも動く)
そんなマイナーToolKit使っているのは,その講義受けてる連中だけだぞ。
842 :
デフォルトの名無しさん :04/05/20 07:08
自己解決しました^^
>>845 関数setが見つからない。
というか、それを作れという宿題だろ。
847 :
デフォルトの名無しさん :04/05/20 11:53
1〜300までの素数を列挙の仕方を教えてください。 何度挑戦してもうまくいきません。
スレ内を「素数」で検索しる。
for (i = 0; i < 300; i++) { for (j = 0; j < prime_count; j++) { if (i % primes[j] == 0) add_prime(i); } }
>849だけみて勘レス。ゼロ除算。0でなく1から計算しろ。
割り切れちゃったらダメだろ
852 :
デフォルトの名無しさん :04/05/20 12:44
#include <stdio.h> #include <string.h> int compere(char); int main(void){ char name[4][10],char getname[4][10]; int i; for(i=0;i<4;i++){ scanf("%s",name[i]); } getname=compere(name); for(i=0;i<4;i++){ printf("%d%s\n",i+1,name[i]); } } int compere(char name){ char getname[4][10]; getname=name; return getname; } main関数で文字を入力して変数nameに入れたものを、compere関数でgetnameに入れてmainに返したいのですが さっぱりです。お願いします。 本来は文字を比較したものを返すのですが、とりあえず単純な動作すらできないので・・・。
こんぺれー
>>852 char *p;
for(i=0;i<4;i++)
{
fgets( getname[i], 10, stdin );
( p=strrchr(getname[i],'\n' ) ? *p='\0': 0;
}
と直接入れれば良いのでは?
後、「compere」は比較だろ?
名前と違う処理をさせようとするな。
どうしてもうまくいきません。教えてください。 添付ファイルを読み込んで、 全ての数字(整数)の和を求める プログラムを作成してください。 添付ファイル 120 3001 -56 0 -670 5 -98
>>854 >後、「compere」は比較だろ?
違った…。orz
>>855 どううまくいかないのかを書かないのなら、全部やって下さいと書いた方がいい。
>>857 >全部やって下さいと書いた方がいい。
>>855 には「プログラムを作成してください。」と書いてある訳だが…?
860 :
デフォルトの名無しさん :04/05/20 13:51
>>854 レスどうもです。
出来れば関数間でやりとりしたいのですが。
main{
name[0]-[3];
name[0]-[3]をcomへ;
getname受け取る;
printfでgetname[0]-[3]の中身はcomで代入したname[0]-[3];
}
com[
getname[0]-[3]←name[0]-[3];
getnameをmainへ;
}
こんな感じにしたいのですが。
862 :
デフォルトの名無しさん :04/05/20 16:59
863 :
デフォルトの名無しさん :04/05/20 16:59
>>860 のようにはできないんですかね?
最終的にはmain関数からのnameをcom関数で比較、リソートしたものをgetname[0]-[3]に入れて返したいので。
864 :
デフォルトの名無しさん :04/05/20 17:10
>>855 #include <stdio.h>
int main()
{
int s = 0;
int t = 0;
FILE *fp;
fp = fopen("添付ファイル.txt", "r");
if(!fp) return -1;
while(fscanf(fp, "%d", &t) != EOF){
s += t;
}
printf("%d\n", s);
fclose(fp);
return 0;
}
int a[2] = { &b, &c }; int b[4] = { 1,2,3,4 }; int c[4] = { 5,6,7,8 }; をコンパイルすると、1行目でb,cが未定義のため当然エラーになりますが、 メモリ上に、 [aの内容][bの内容][cの内容] ( = [ bの先頭アドレス ][ cの先頭アドレス ][1][2][3][4][5][6][7][8]) との順に並ばせるにはどうしたらよいでしょう。
>>865 規格上無理。ひょっとしたら並ぶかも知れないが、並ばないかも知れない。
>>865 とりあえず、思いつくのは構造体だけど、
パディングが入る可能性もあるしな。
>>865 >int a[2] = { &b, &c };
アドレスを格納したいなら、型は「int *」だろう
>>865 int z = 0;
int a[2] = { &z + 3, &z + 7 };
int b[4] = { 1, 2, 3, 4 };
int c[4] = { 5, 6, 7, 8 };
これじゃ駄目っぽいな
そもそも a, b, c と続けて宣言したらメモリ上に並ぶのか?
>>865 格納するだけなら型は不問
意味的には int * が正解
>>865 リニアで欲しけりゃ,ベタ配列で確保すべき。
int a[]={ a+2, a+6, 1,2,3,4,5,6,7,8 }
>>869 sizeof(int)!=sizeof(int *) ならどうする気かと(ry
865がその点は気にするなと暗に(ry
>>872 肝心なのは int a の時 sizeof(&a)==sizeof(int *) だよ
というか配列の値を後で変更するコード書くのが正解じゃないか?
ごめん全然問題じゃないこといったスマソ
>>866-875 データがどういう並びをするかは処理系に依存するのは承知なのですが、
必ず定義した順にメモリ上に並ぶという前提で、どうにかならないかと思ったのです。
何をやりたいかといいますと、
int *a[] = { &b, &c, &b, &b, &c, &b, &b, ..., null };
int b[4] = { 1,2,3,4 };
int c[4] = { 5,6,7,8 };
のように、データをブロックとして持つことでデータ量を減らし、
1)配列aの先頭から、(aのサイズ)+(bのサイズ)+(cのサイズ) の領域をバイナリデータとしてファイルに保存しておく。
2)アプリケーションは、保存したバイナリデータを一気に読んでメモリ上に置く。
3)データの先頭アドレス(= aのデータの先頭だとする)から int*型のデータを順に読み、そのデータと先頭アドレスとの
オフセットを計算してその先にあるデータ( bやcの中身)を解析する。
…というようなことをやりたかったのです。
こういうやり方の場合、a がファイルの先頭にあると、都合が良いなーと思ったので。。。
>>876 malloc とかで abc のブロックをまとめて取得し、a にはアドレスではなくオフセット値を入れる
書き込みは abc 全ての範囲に対して、読み込みは a のオフセット値をアドレスに書き直す
アドレスは下手すると変化するから、オフセット値のほうが後々便利
これじゃ駄目?
>>876 ファイルに書き出すなら,a,b,cの作成時にそれぞれが
メモリ上で連続している必要はない。
ファイル上で連続になるよう書き出せば,それで十分だろ?
すみません 初歩的な質問ですが あるヘッダファイルに、 typedef struct { char aaa[20]; uchar *hhh; uchar *lll; }STRUCT; という構造体を宣言してるんですが、メインでこれを宣言するのに STRUCT *aaa; ってやるとコンパイルは通るんですが、 後にこのメンバにデータを入れようとするとセグメンエラーになります ヘッダの宣言は変えたくないんですが、どうしたらいいでしょうか? LINUX でボーランドのコンパオら使ってます
ごめんなさい あげます
>>881 Javaならそれはまさに…
∧_∧
( ´∀`)< ぬるぽ
>>883 はあ やっぱそうですか
実態はどこにあるかって話だと思ったんですが
すると
char data[256]とかとって
STRUCT *aaa = data;
とかやってみたんですが意味が違うみたいですね
コンパォラ
>>885 ぬるぽー!は大人しく,ソース全部晒せ。
>>885 >メインでこれを宣言するのに
STRUCT aaa;
と、実体を宣言するのに何か不都合でも?
ソースって これだけなんですが これがヘッダ内で宣言されていて↓ typedef struct{ charaaa[20]; char*lll; char*bbb; }STRUCT; void main() { STRUCT*mona; mona->bbb= 0; } これで死んでしまいます
>>888 ああ えーと
そこでポインタ宣言したいのは、
その *aaa を
次の関数の引数にしたいんです
後だしですみません
>>890 STRUCT giko;
STRUCT *mona = &giko;
>>891 ああ! そうですね
それならデータ渡ります
わーい ありがとうございます みなさん
>>878-880 aの配列のサイズや、b,cのアドレスは、コンパイルするまで不明なので、aの中身に
「あらかじめ計算した【bやcまでのオフセット】」を入れることは困難なのです。
(ちなみに、データセクションの先頭アドレスはいつも固定だと考えてください)
要するに、aの配列の中身である「&b」,「&c」などの値そのものがコンパイラ任せであるため、
アプリケーションでロードした後も、【バイナリファイルとして保存したときと全く同じ状態】で、
かつ、【先頭にaが置かれている状態】でなければ、a,b,cがどこにあるのか分からなくなってしまいます。
int b[4] = { 1,2,3,4 };
int c[4] = { 5,6,7,8 };
int *a[] = { &b, &c, &b, &b, &c, &b, &b, ..., null, (int*)&a };
とやって、ロード後に、(先頭アドレス+ファイルサイズ-sizeof(int*)) のところから a を求めるようにすればなんとかなるのですが、
あまりにもかっこ悪いので、うまいやり方がないかと思っているのですが…。
解決したところで
( ・∀・) | | ガガッ
と ) | |
Y /ノ .人
/ ) .人 < >__Λ ∩
_/し' < >_Λ∩Д´)/
(_フ彡 V`Д´)/ / ←
>>881 / ←
>>884
895 :
デフォルトの名無しさん :04/05/20 19:50
>>894 ええっと ほんとにごめんなさい
一気に 詰まってたロジック抜けました
うれしいです
すまん。未解決な宿題をリストアップしてくださらんか。 簡単そうなのだったら、時間を見て挑戦してみるわ。
>>897 議員年金をなんとかするという大きな問題があるのですが
>>893 a がインデックスセクション/b 以降がデータセクションという解釈でOK?
んで a のサイズが変動する可能性があると (b 以降のサイズは固定?)
&b - &a で b のオフセット、&c - &a で c のオフセットを出して、
後から a に書き込むのは駄目なのかな?
最終手段は、インデックスとデータを別々のファイルに保存する事
意外と使われる手法なので試してみるのも良いかも
>>893 おまいのその考えの方が、よっぽど格好悪い。
単純に領域を確保して、ポインタでアクセスすればなんの問題もないだろ。
>>900 まあそう言うな。俺だって
>>893 の気持ちは分かる。
……まあ、もうちょっと格好良いやり方は思いつきたいところだけどね。
次の問題の答え教えてください。宜しくお願いします。以下の処理の問題点を記述し、その解決方法を答えなさい。 #include <stdio.h> int main(int argc, char *argv[]) { char s[2], buf[20]; char *ret; FILE *fp; if (argc > 1) { fp = fopen(argv[1], "r"); if (fp == NULL) { strcpy(buf, "ERROR: "); strcat(buf, argv[1]); puts(buf); exit(1); } ret = fgets(s, 2, fp); if (ret != NULL) { printf("A top character code is %d. \n", s[0]); } else { printf("It is an empty file. \n"); } fclose(fp); } else { printf("Processing was not performed. \n"); } return 0; }
>>902 問題点:
標準関数のexit(), strcpy(), strcat()を使っているのに、
対応するヘッダファイルを読み込んでいないため、
その関数を使う場所でコンパイラが警告を出すかもしれない。
解決方法:
対応するヘッダファイルを読み込めばよい。
具体的には#include <stdio.h>の後の行に
#include <stdlib.h>
#include <string.h>
を追加する。
問題点その2:
インデントが分かり辛く、人間の読むものではない。
解決方法:
indentコマンドで自動整形する。
(あるいは、
>>902 のリストを理解するのをあきらめる)
全然わからねぇ_| ̄|○ 何勉強してたんだろ
答えが出てました(-_-)ウツダシノウ
>>902 前にどこかで見たような気もするが。
>strcpy(buf, "ERROR: ");
>strcat(buf, argv[1]);
>puts(buf);
ムダ。
あと構造がよくない。
>>902 問題点:
プログラムに与えるファイル名が長い場合、ファイルがオープンできないときの
エラーメッセージ生成の過程でbufの領域を突破する。
対策法:
strcpy(buf, "ERROR: ");
strcat(buf, argv[1]);
puts(buf);
などというアホなことをせず、
printf("ERROR:%s\n",argv[1]);
とする。
>>902 問題点:
コマンドライン引数が2以上あっても1つのファイルしか調べない。
解決法:
・for (i = 1; i < argc; i++) { /* ... */ } とかループさせる。
・ファイルが開けないときは途中でexitしないで警告メッセージを出すようにする。
>>906 puts(strcat(strcpy(buf, "ERROR: "), argv[1]));
よかマシだとは思うが。
素直にprintf("ERROR: %s\n", argv[1]);
ですな。やっぱ。(あ、
>>907 で既出だ)
皆さんレスありがとうございます。902の問題は考えうる限りの問題点を 探し解決する問題だと思うのですが。私自身#include <stdlib.h> #include <string.h> を追加するぐらいしか分からなかったものですから、質問させていただきました。 もっともっと精進したいと思います。
>>907 が判らなかったのは致命的だな
ウツダ、ウツダドンドコド-ン!。・゚・(ノД`)・゚・
致命的ってことはなかろ。
いんや、ちめいてきだぁ
914 :
デフォルトの名無しさん :04/05/20 22:20
main{ name[0]-[3]; name[0]-[3]をcomへ; getname受け取る; printfでgetname[0]-[3]の中身はcomで代入したname[0]-[3]; } com[ getname[0]-[3]←name[0]-[3]; getnameをmainへ; } こんな感じにしたいのですが。
>>914 すまん、俺エスパーじゃないので、その書式は意味がわからん。
>>914 そんな感じにしてみたらいいんじゃない?
535とまったく同じ問題で恐縮ですが、 入力した文字列をアルファベット順に並び替えるプログラムがわかりません。 できるだけ、qsortとか使わずに作ろうと思っています。 どなたか教えて下さい。 今のところこんな感じです。。 #include<stdio.h> #include<string.h> main() { int i,j,temp; char moji[128]; scanf("%s",&moji); for(i=0;i<strlen(moji);i++) { int mi=moji[i]; int mj=moji[j=i+1]; if('mi'<'mj') { temp=moji[i]; moji[i]=moji[j]; moji[j]=temp; } } printf("%s",moji); }
>>899 aのサイズもbのサイズもcのサイズも、あるいは、b,c,d,e,f,...などすべての個数が可変です。
イメージ的には、圧縮ファイルを展開するデコーダのようなアプリを作ろうとしていると考えてください。
sample.bin などのデータセットがあって、それをアプリケーションdeocde.exeにインプットすると、
データセットを解析し、展開されたデータ sample.dat を吐く…そういうアプリケーションです。
ですので、インプットはぜひ「1つ」のバイナリファイルにしたいですし、
ヘッダやオフセット等の情報は1バイトでも小さくしたいと考えています。
(アルゴリズム的なことや、圧縮率云々については置いておいてください)
>>865 >>876 >>893 の一連の例でいうと、配列aがファイルの先頭でない場合、どうしてもファイルの先頭から
aへのオフセット情報(たかだかsizeof(int*)バイトですが)が必要になります。
しかし、インデックス配列であるaがファイルの先頭にあると保障されていれば、
純粋に(【aのサイズ】+【bのサイズ】+【cのサイズ】)のファイルサイズで済むと考えたわけです。
長い時間おつきあいしていただいてすみません。
919 :
デフォルトの名無しさん :04/05/20 22:42
配列の中からその数字を見つけ出し その数字を削除して その削除した所を詰める 作業がしたいんですけど よくわかりまへん。ご教授ください #include<stdio.h> int main(void){ int a[4]={1,2,3,4,5}; int key; int i,j; scanf("%d",&key); for(i=0;i<=4;i++){ if(a[i]==key){ a[i]=a[i+1]; } } for(j=0;j<=4;j++){ printf("%d\n",a[i]); } return(0); }
>>918 だからぁ、、、配列の代わりにポインタでアクセスするだけで済むんじゃないのぉ?
見たけど・・・ プログラミングとPPは相容れない物だと感じますた。
>>921 ありがとうございます。
できれば、アルファベットをどうやって比較するかを教えていただきたいのですが。
よろしくお願いします。
>>918 データを作成するエンコーダー側でアドレス(オフセット)計算して埋め込んでやるのが確実では。
>>920 なんでも「ポインタ」っていえばすむと思っている厨に見えてならない。
具体的に説明してみれ。
925 :
助けてください :04/05/20 23:04
A君は,ある数値計算プログラムを作成していたところ何度もx−sinxの値を計算する必要が 出てきた。そのプログラムではxの値の絶対値が非常に小さな値をとる場合があり,またそ の値を高精度で求める必要があった。x−sinxの演算はそのまま実行すると|x|<<1の条件で桁 落ちがおきるため,マクローリン展開で計算する必要があるが,|x|<<1の条件でないときは x-sinxをそのまま使用するほうがよい。そこでA君はx-sinxの値を計算する実数型関数 xmsin(x)を次の考えで作成することとした。 1)ある適当な正の実数x0を考える。 2)引数xの絶対値がx0より小さいときは,マクローリン展開を使って計算する。 |ai/Si|<<ε(εは1より十分小さい正の実数。)を用いて,収束を判定して計算した値を用いる。 3)引数xの絶対値がx0以上では,x-sinxの値を用いる。 Å君はマクローリン展開の計算をいろいろな場合で計算し,x0=0.1,ε=10e-16として関数を作 成した。また,作成した関数に対し,x=10e-10,10e-7,10e-4,0.0999の条件に対しx,xmsin(x), x-sin(x)の計算値を比較した結果を表示するプログラムをvoid些関数prnrst(x)を用いて作 成し,関数xmsin(x)の動作確認した。 以下にA君が作成したプログラムを,一部を伏せた形で示す。また,実行結果も示す。A 君に成り代わってプログラムを完成しなさい。
926 :
助けてください :04/05/20 23:05
/* Mclaurin展開を使ってx-sin(x)を求める関数を作成するプログラム */ (ここに適当な文を追加すること) void main(void) { printf(" x : xmsin(x) : x-sin(x)\n"); printf("-----------------------------------------------------------------\n"); prnrst(1e-10); prnrst(1e-7); prnrst(1e-4); prnrst(0.0999); prnrst(1.0); } void prnrst(double x) { (ここに適当な文を追加すること) } double xmsin(double x) { (ここに適当な文を追加すること) }
927 :
デフォルトの名無しさん :04/05/20 23:14
#include<stdio.h> int factorial(int); int main() { int i; for(i = 0;i <=10; i++){ print("%2d! = %ld\n", i,factorial} } return 0; } int factorial(int number) { if(number <= 1){ return 1; } else{ return(number*factorial(number - 1) } } このプログラムの階乗関数をローカル関数と再帰呼び出しパラメータをプリントするようにしてください。 格再帰呼び出しごとに改行し、字下げ幅を大きくしていって。
>925 マクローリンそのものを聞きたいのか、 マクローリンの実装方法を聞きたいのか。 前者ならぐぐれ。 後者なら途中まで書いたものを上げなされ。
930 :
デフォルトの名無しさん :04/05/20 23:22
>>927 のプログラムを文のループを15回にし、15!の計算をするプログラムに書き換えてください
>927はプログラムソースとして成立しておりませんが・・・・
>923 charなら普通に>とか<で大小比較できる。ちなみにA<B<.....<Z<a<b<.......<z。 //これができるのは、charの中身が文字コードに対応するintだから //printf("%d\n",'a'); とか実行するとちょっと意味が分かるかも知れないし、混乱するかもしれない >927 完成したが、そもそも自分でやる気が皆無(手元でコンパイルすら通さない)な奴に教える気はない。 書き換えてコンパイルした時の俺の脱力感の責任を取ってくれ。
>>914 は
>>852 かな?
だとすると、レス番くらい名乗れ。手間をかけさせるな。
>>914 を翻訳。
int main() {
char name[4][10],getname[4][10];
とあって、char name[4][10] にそれぞれ入力した文字列を、compere(wという関数を用いて、
char getname[4][10]に代入したい。
しかし、何をとちくるったか、compereなる関数の戻り値で配列に代入したいようなので、
それは不可能だ、といっておこう。
>933 おつです。 >702,718 垂直成分はdy/dt=-gt。水平成分は変わらず。
936 :
デフォルトの名無しさん :04/05/20 23:44
>>927 #include<stdio.h>
int factorial(int);
int main()
{
int i;
for(i = 0;i<=10; i++){
printf("%2d! = %ld\n", i,factorial(i)}
}
return 0;
}
int factorial(int number)
{
if(number <= 1){
return 1;
}
else{
return(number*factorial(number - 1)
}
}
ってやりたいんだろ?
>>918 コノ程度じゃ不満なのか?
FILE *fp=fopen(...);
struct _node{
unsigned char key;
char *data;
size_t size;
} node[100];
node[0].key = 'b';node[0].data = "1234";node[0].size = 4;
node[1].key = 'c';node[1].data = "5678";node[1].size = 4;
node[2].key = 'd';node[2].data = "9012";node[2].size = 4;
............
unsigned char a[]="dabsdagasdtdgjsfgajtlrejasdglkjasraerasgfas...";
fwrite(a,sizeof(a[0]),sizeof(a),fp);
struct _node *ptr;
long offset=0;
for(ptr=node; ptr<node+sizeof(node); ++ptr){
offset += ptr->size;
fwrite(&(ptr->key),1,1,fp);
fwrite(&offset,sizeof(long),1,fp);
}
for(ptr=node; ptr<node+sizeof(node); ++ptr){
fwrite(ptr->data,1,ptr->size,fp);
}
fclose(fp);
938 :
デフォルトの名無しさん :04/05/20 23:48
すいません、お願いします…。「任意の西暦、月日を入力したとき、それが何曜日か出力するプログラムを作成せよ。ただし、西暦1年1月1日は月曜日であるとする。また、閏年は百年に一度ない年があるが、4百年周期ではあるものとする。」
fwriteのsizeof(a[0]),sizeof(a)のところってこの場合はOKだけど、なんか…
ありがとうございました!
>>937 できたバイナリファイルを読み込んで展開しようとしたときに
どこまでがa[]のデータでどこからがnodeなのかわからないと思うけど。
>>943 なんかlength埋める分まで節約したいようなこといってたから,
null文字なり,特定の値で終端判断する気と判断した。
もし,node数が可変になるなら,nodeの数は埋める必要があるけどな。
行儀が悪いのは承知した上で書いてるぞ〜。
>919 int a[]={1,2,3,4,5}; #define TBL_SIZE (sizeof(a)/sizeof(int)) int key; int i,j; scanf("%d",&key); /* 探す */ for(i=0;i<TBL_SIZE;i++) if(a[i]==key) break; /* ずらす */ for(j=i+1;j<TBL_SIZE;j++) a[j-1]=a[j];
947 :
デフォルトの名無しさん :04/05/21 02:48
文字を比較して小さい順に表示するプログラム作って。 ただし、比較処理は比較関数でして結果をmainに戻す。 名前 name1='tanaka' name2='suzuki' name3='satou' name4='isihara'
配列使え strcmp()使え
949 :
デフォルトの名無しさん :04/05/21 03:07
初心者でよくわからないのですが 標準入力からカンマ区切りの整数値を入力として受け取り(入力終了はEOF), 大きい方から順にカンマ区切りで標準出力に出力するプログラムを作成せよという問題で、 #include <stdio.h> int shellsort(int a[],int n); int main() { int n; int a[10]; scanf("%s", a); printf("%s\n",shellsort(a, n)); return 0; } int shellsort(int v[], int n) { int gap, i, j, temp; for(gap = n/2; gap > 0; gap /= 2) for(i = gap; i<n; i++) for(j=i-gap; j >= 0 && v[j]>v[j+gap]; j-=gap) { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } } というプログラムを作ったのですが全然おかしいみたいなので どなたか教えてください!
>標準入力からカンマ区切りの整数値を入力として受け取り >scanf("%s", a); ここがだめ あと、nに値が入っていない
951 :
デフォルトの名無しさん :04/05/21 03:24
結構自分でも勉強してるのですが、そこのところの何がダメなのか わかりません・・・。どういうことでしょうか? もしよければお教えください。
カンマ区切りの意味が 分かってないんじゃないだろーな?
953 :
デフォルトの名無しさん :04/05/21 03:35
はい、K&R第二版も見てるのですが見つけきれずにお聞きしたしだいです。 すみません、これも分からないくらいなら聞かずにもっと自分で 勉強するべきですよね。別の本を探してみます!ありがとうございました!
954 :
デフォルトの名無しさん :04/05/21 03:40
main関数への戻り値は1つだけなんですか? それだと他の関数で順番を計算した結果をmain関数で表示させたくても出来ないのでは。 配列を使えば順番を計算した結果を複数mainに戻せて便利だと思ったんだけど。
955 :
デフォルトの名無しさん :04/05/21 03:53
配列を使ったつもりなのですが・・・。すみません、力量不足です! 戻り値を配列であらわすということですか?詳しくお聞かせください
956 :
デフォルトの名無しさん :04/05/21 04:07
4つの整数を簡単にソートできるプログラム教えて。
>>956 実行モジュールをish変換して張っておくから適当な展開ツールで展開してくれ。
<<< sort4int for MS-DOS ( use non-kana ish ) [ 8 lines ] >>>
!!C(!!9Q!4"P$nkn>GKz<u+d9o!d!$"Hrn[[Q~!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?/@e
!!C(!!9Q!4"P$nkn>GKz<u+d9o!d!$"Hrn[[Q~!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?/@e
!!C(!!9Q!4"P$nkn>GKz<u+d9o!d!$"Hrn[[Q~!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?/@e
"mv緜&=<jo:"q壇3各巖烙@鶏幾揖"HB@!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!DH!+
gap0F@=髪_/(}b&岌=郡<濫m3LP@幹d硯!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1@
iW%}b;6止P:l杣V=克摶畛槊w'<n福淞IM斐t掟壯hV:騾睥内H*ScaQ曼fJCJ臻寨訓32e&翆珀些/
--- sort4int (8/8) ---
>>949 すげぇおかしい。
配列の内容表示すらまともにできてねぇ。
駄目駄目。
ホレ,これでも見て勉強しろ。
#include <stdio.h>
#include <string.h>
//int配列にカンマ区切りで入力した数値を取得する関数(すげぇ適当)
//返り値:実際に取得した値の数
int get_value(int v[], int v_size){ //v:配列, v_size:配列の要素数
int n;
char buf[1024];
fgets(buf,sizeof(buf),stdin);
char *ptr;
for( n=0,ptr=strtok(buf,","); n<v_size && ptr!=NULL; ++n,ptr=strtok( NULL, "," ) ) {
v[n] = atoi(ptr);
}
return n;
}
//配列の内容をカンマ区切りで表示する関数
void print_value(int v[], int v_size){ //v:配列, v_size:配列の要素数
int n;
for(n=0; n<v_size-1; ++n){
printf("%d,", v[n]);
}
printf("%d\n", v[n]);
}
959 :
デフォルトの名無しさん :04/05/21 05:33
文字を比較して小さい順に表示するプログラム作って。 ただし、比較処理は比較関数でして結果をmainに戻す。 名前 name1='tanaka' name2='suzuki' name3='satou' name4='isihara' マジお願いもう眠いもう駄目
960 :
デフォルトの名無しさん :04/05/21 07:00
#include <stdio.h> #include <string.h> int main(void) { char *name1="赤沢太郎"; char *name2="松本三郎"; char *name3="山川四郎"; char *name4="岩下次郎"; char *temp="abcdefghijklmn"; if(strcmp(name1,name2)<0){ /*ここから }else if(strcmp(name1,name2)>0){ temp=name1; name1=name2; name2=temp; }else{ } /*ここまで*4回繰り返してます。 printf("1.%s\n2.%s\n3.%s\n4.%s\n",name1,name2,name3,name4); return 0; } やったぜぇええええええええええええ!!!!!!!!!徹夜した甲斐があった揉んだむほっつ22 でもさ上記の通りnameナンバーこそ違えど同じ処理を繰り返してるわけ。 compare関数を用いたいところなんだけど別の関数からの戻り値は1つだけじゃん? このプログラムは戻り値1つじゃ成り立たないじゃんがんぐ? compare関数に纏めれそうなら教えれ。無理っぽいならこのまま亭主打つwwwwwwwwwwwww低所津wwww亭主打つwwwwwwwwwwうはははhw提出ニダ━━━━━━<ヽ`∀´>━━━━━━ !!!!!
>>959 さっさとねなさい。
#include <stdio.h>
int main(int argc, char argv)
{
char *tmp, *name[4] = { "tanaka", "suzuki", "satou", "ishihara" };
int i, j;
for(i = 0; i < 4; i++) {
for(j = i + 1; j < 4; j++) {
if(strcmp(name[i], name[j]) > 0) {
tmp = name[i]; name[i] = name[j]; name[j] = tmp;
}
}
}
for(i = 0; i < 4; i++)
printf("%s\n", name[i]);
return 0;
}
> このプログラムは戻り値1つじゃ成り立たない
下の条件
> ただし、比較処理は比較関数でして結果をmainに戻す。
は「比較関数で求めた(比較)結果をmainに戻すということだろう。
>>959 配列にして qsort() でソートして解決!(w
963 :
デフォルトの名無しさん :04/05/21 14:54
以下の結果はエラーになる。 理由を述べなさい。 #include <iostream> using namespace std; int main(){ char *a; a = (char*)malloc(256); a = "ppp"; strcpy(a, "ABCDE"); cout << a << endl; return 0; } どうして?
エラーにゃならないかもな。 ただ、メモリは破壊する。
>>963 a = "ppp";が無用の介だから。
(教育用とはいえ、いやなスタイルだな)
966 :
デフォルトの名無しさん :04/05/21 15:11
char *a = "ppp"; と最初にやっておくと、普通に出力できるのはなぜですか?
そんなの実装依存に決まってんだろボケ!
>>963 文字列リテラルの内容を書き換えようとしているからだろ
969 :
デフォルトの名無しさん :04/05/21 16:06
うげ。処理系依存ですか・・・=するな ってことですね。
>>969 処理系依存以前にリテラルは書き換えるな。
>>359 様
ものすごく遅レスですが、本当に有難うございましたm(__)m
972 :
デフォルトの名無しさん :04/05/21 16:39
>>969 > a = "ppp";
これでaが書き換えられていることに注目しろ。
だからmallocで得た領域を指していない。
973 :
デフォルトの名無しさん :04/05/21 16:42
Kitty on your lapの人が同じ間違いをしていたな。 もう直ったけど。
974 :
デフォルトの名無しさん :04/05/21 17:09
整数型の変数a,b,cの値をプログラム上で a=1,b=2,c=3と設定した上で、実数型の変数xをキーボードから入力し、 y=ax^2+bx+c、を計算し、yを出力するプログラム なおこの問題では、実数はdouble型変数で表すものとする。 問題文そのままです。よろしくお願いします。
975 :
デフォルトの名無しさん :04/05/21 17:13
>>974 >>273 を参考に。
ただ、その問題はa=0などの場合を考えなくていいようなので
if(a) 〜 else 〜
は別にいらない。
あ、悪い、解を求める問題じゃなかったか・・・・ それじゃ全然違うな。
int a = 1, b = 2, c = 3; double x, y; scanf("%lf", &x); y = a*x*x + b*x + c; printf("y=%lf\n", y);
>>977 ありがとうございます。
しかし何度見直してもエラーが出ました。
main() とか stdio.h とかを知らないような人にもやさしく教えてあげなければいけないスレなんでしょうか。 ここの答えを丸写しして終了、みたいな香具師は、きっと何度も何度もここに来て、毎回アホな質問ばかりするでしょうに。
別に、回答者も自己満足でやってるんだから。 面倒なら回答しなきゃいいだけ。
>>983 そうやってだめぽなやつが量産されて
社会に出た時今いるPGに迷惑かける罠
つーことで漏れとしてはあんまよくないと思うんだけどね
宿題の丸投げってのは
最低限、
自分はこれこれこう思うんですが、
こうこうなってしまって駄目です。
とか、自分がどこが分かってないのか
分かるやつの質問にしか答えないほうがいいと思うんだけど。
厳しいようでも、結局は質問したやつのためになると思うんだけど
ここで宿題○投げなやつって、PGなんかにならないだろ?
第三者が回答者にケチつけるのは 解答が間違っている場合を除けば大きなお世話でしかないな。
房が必死だな
990 :
デフォルトの名無しさん :04/05/21 23:24
誰か次スレ頼む 漏れたてようとしたけど無理だった 次スレたつまで1000getすんなよ
>>784 で質問させてもらったんですが
for文を使ったときの模範解答みたいなのを教えてもらえませんか
int find(int a[], int n, int b)
{
int x;
for(int i=0; i<n; i++){
if(b == a[i]){
break;
}
}
if(i == n){
x = -1;
}
else if(i != n){
x = i;
}
return x;
}
こんな風でいいんでしょうか
>>993 そんな面倒なことしなくても、
int find(int a[], int n, int b) {
int ret = -1;
for(int i=0; i<n; i++) {
if(b == a[i]) {
ret = i;
break;
}
}
return ret;
}
関数の途中でreturnするのに耐えられるなら、 int find(int a[], int n, int b) { for(int i=0; i<n; i++) { if(b == a[i]) return i; } return -1; }
「10進数を入力し、8ビットの2進数で出力しなさい。」 if分とforを使って作るそうですが・・・・・駄目だす・・・
>>993 実数型を==で比較するよーな回答をしそうだ>漏れ
とりあえず、整数型だけね。
int find(int a[], int n, int b)
{
if (a == NULL || n < 1)
return -1;
for (int i = 0; i < n; i++)
if (a[i] == b)
return i;
return -1;
}
>実数型 fabs(a-b) とかやってほにゃらら未満なら一致とみなす、とか?
/*
>>996 ただし、x が 256以上の場合は知らん */
int i, x;
/* ... */
for (i = 128; i > 0; i >>= 1) {
if (x / i) {
x -= i;
printf("1");
} else {
printf("0");
}
}
では、終了
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。