私がC/C++の宿題を片づけてあげるわよ 15代目
1 :
デフォルトの名無しさん :
03/11/16 11:45
ふざけた終わり方だったなぁ・・・
5 :
デフォルトの名無しさん :03/11/16 12:22
とりあえz age
6 :
デフォルトの名無しさん :03/11/16 12:54
>14代目の976さん スタック使いましょう。 typedef struct node{ int i; struct node *next; }stack; stack *head,*element; int stackInit() { if( ( head=(stack*)malloc(sizeof(stack) ) == NULL ){ return 0; }//メモリーの確保に失敗。 else{ head->next=NULL; return 1; } }
7 :
デフォルトの名無しさん :03/11/16 12:55
int push(int i) { if( ( element=(stack*)malloc(sizeof(stack) ) == NULL ){ return 0; } else{ element->next = head->next; head->next = element; return 1; } } stack* pop() { if(head->next == NULL){ return NULL; } else{ element=head->next; head->next = element->next; return element; } }
8 :
デフォルトの名無しさん :03/11/16 12:56
int main(void) { int i, x, str[255],flag; stachInit(); printf("要素数:"); scanf("%d", &x); for (i = 0; i < x; i++){ printf("%d:", i + 1); scanf("%d", &str[i]); } for (i = 0; i < x && flag==1; i++){ if( flag = push(str[x]) ); } while( pop != NULL){ printf("%d ",elemant->x); free(element); } return(0); }
9 :
◆99HhfDHvsU :03/11/16 13:29
早速ですが、学校の宿題です 課題1 外部ファイルを文字列として読み込み、全てASCIIコードに直して別ファイルに記録するプログラムを作りなさい。 また、この時、元の文字列と、置換語のASCIIコード羅列をコンソール上に明示しなさい。 ex) 元文字列: 例文です。これを全てASCIIコードになおしなさい。 || \/ ASCIIコード: 97e1 95b6 82c5 92b7 8142 82b1 82ea 82f0 9153 92c4 41 53 43 49 49 8352 815b 8368 82c9 82c8 82a8 82b5 82c8 82b3 82a2 8142 これを、半角・全角文字(漢字・平仮名・カタカナ・英数字・記号etc・・・)共に実現しなさい。 ただし、読み込む外部ファイルのファイル名と、書き込み先のファイル名は、対話形式で入力できるようにしなさい。 課題2 課題1と逆に、ASCIIコード→文字列となるプログラムを作りなさい。 もうワケわかんないです(´・ω・`)ションボリ お願いします・・・
10 :
デフォルトの名無しさん :03/11/16 13:34
>>9 腹減ったから後でいい?
ファイル出力の際にいじくれば何とかなると思うよ
11 :
デフォルトの名無しさん :03/11/16 13:35
>>10 ありがとうございます!
無論後でもかまいません!
お願いします・・・ヽ(゚∀゚)メ(゚∀゚)メ(゚∀゚)ノ
12 :
デフォルトの名無しさん :03/11/16 13:39
飯がスパゲティなのでPC前で食う 質問だけどASCIIコードはスペースが入ってるの?めんどくさいね
質問だけど、いつからASCIIに漢字やカナが含まれるようになったの?
14 :
デフォルトの名無しさん :03/11/16 13:43
>>13 機種依存だと思われ。ソコは気にしなくてもよいと思うが
15 :
デフォルトの名無しさん :03/11/16 13:43
つまり 文字コード −> 文字 またその反対といいたいんだと
ShiftJISを仮定しても、例のようには成り得ないんだけど・・・
そこはTypoだろ。
18 :
デフォルトの名無しさん :03/11/16 13:47
>>12 調べてみたんですが、ASCIIにはスペースが入るわけでは無いみたいです。
指定は無いながらも、恐らくこの問題では、各文字のASCIIコードが明示的に分かるように、
一文字一文字のASCIIコードの間にスペースを入れているらしいです。
>>13 ASCIIコードを2つ組み合わせて全角一文字としているそうです。
例:「で」→「82c5」
ASCIIコードの前半分2桁で半角文字か全角文字かの判定が出来るらしいのですが・・・
イマイチその判定方法も分からず、また、その区切り方すらよく分からないんですね
だからソースも全く書きようが無くて・・・・
教えて君ですみません
19 :
デフォルトの名無しさん :03/11/16 13:47
ASCIIなのかUNIなのか微妙に解らないよな・・・これ
20 :
デフォルトの名無しさん :03/11/16 13:48
>>16 元文字列のコード種に指定は無いです。
僕たちのクラスでもそれぞれ開発環境は違うし、
それを教官は知っているので、指定は省かせて頂きました。
分かりづらくてスミマセン
21 :
デフォルトの名無しさん :03/11/16 13:49
>ASCIIコードの前半分2桁で半角文字か全角文字かの判定が出来るらしいのですが できません。っていうか、ASCIIコードは16進2桁です。 文字列を先頭からコードを調べていき、コードがASCIIでなくShiftJISの1バイト目に該当するなら漢字。 そうでないならJISかな。
漢字コードの種別がわからないなら漢字かどうかの判定はできないよ。
24 :
デフォルトの名無しさん :03/11/16 13:52
>>22 すみませんそう言う事です。
どうにも表現が追いつかなくて・・・
ASCIIコードも自分なりにここ3日で調べただけなので
知識が甘いので・・・
>>23 ( ゚д゚)Σハッ!そうなんですか!
この問題おかしいな・・
ちょと教官に聞いてみます。。。
10分ほどお待ち下さい。。。
お騒がせしてすみません
25 :
デフォルトの名無しさん :03/11/16 13:53
>>22-23 釣られすぎ、
一度
#include <stdio.h>
int main()
{
int c1, c2;
FILE *fp = fopen ("test.txt", "w");
for (c1 = 0; c1 < 0xff; c1++)
for (c2 = 0; c2 < 0xff; c2++)
fprintf("%c%c\n",c1,c2);
fclose (fp);
return 0;
}
コレやってみるといいよ。
26 :
デフォルトの名無しさん :03/11/16 13:54
あー!もうムかつく ASCII は 16進数だけど 0x80 まで使ってないのね!んで、あまったところを使って日本語とか漢字とかの判定に使ったりしてるの。 だから、同じプログラムでも国が変わると文字化けがおこったりするのさ。
27 :
◆99HhfDHvsU :03/11/16 13:57
分かりました どうやら教官本人はShift_JISの指定を忘れていた模様。 お騒がせしました・・・ Shift_Jisのみでお願いします・・・・
9をみると、Shift_JISやUNICODEの範囲にあるコードを ASCIIセーフに符号化しろ、というように読める。 ex、てのはあくまで例で、実際はBASE64とかでもえーの?
29 :
デフォルトの名無しさん :03/11/16 13:59
なんかアスキーコードで前の文字の判定する関数あったよなー・・・やべー全然覚えてない
>>27 で、例題が間違っている件はtypoでFA?
32 :
デフォルトの名無しさん :03/11/16 14:06
>>31 ShiftJISでは、1バイト目のコードで漢字の種類の見当がつく。
ex.)
記述用記号→0x81??
ひらがな→0x82??
カタカナ→0x83??
>例文です。これを全てASCIIコードになおしなさい。
||
\/
>97e1 95b6 82c5 92b7 8142 82b1 82ea 82f0 9153 92c4 41 53 43 49 49 8352 815b 8368 82c9 82c8 82a8 82b5 82c8 82b3 82a2 8142
「す」と「て」に注目。
34 :
デフォルトの名無しさん :03/11/16 14:12
>>32 >>33 おお
少し分かったような気がします
どうもありがとうございます。
自分なりに頑張ってみます
またネを上げるかもしれないけど・・・・・(´・ω・`)ションボリ
ネ ↑
37 :
デフォルトの名無しさん :03/11/16 15:13
xib1+yib2+b3-xiXib7-yiXib8=Xi xib4+yib5+b6-xiYib7-yiYib8=Yi という2式に4つ以上の測定値の組(Xi,Yi,xi,yi)(i=1,2...n;n>=4) に対して最小2乗法をはめて係数b1〜b8を求めよ、 という問題なのですが、どなたかよろしくお願いします。
方程式のレベルまで問題を分割しないとレスがつかないような。
40 :
デフォルトの名無しさん :03/11/16 15:23
>36 6を全部光らせるのは不可能だと思うが。。 真理値表つくってみ。5,6,7時のボタンの効能が、 101 011 110 になるから。ここからどのように2つ選び、xorしても、 全部1にはならない。
不可能ですか。それなら違う解き方なのか。 あ、ここからはプログラムじゃなく謎解きなので退散します。 ありがとうございました。
>>36 6面を見たかったのにいらいら棒もどきで躓いてしまった・・・_/ ̄|○
44 :
デフォルトの名無しさん :03/11/16 18:07
>>43 30分ぐらいかかった・・・
しかも、次の面は絶対無理・・・なんか攻略法ないかなぁ
あんなの記憶できないって
>>44 隙間が動いてる間もボタンが押せるから
最初の4,5個は押しながら見れば
なんとか後ろの色も覚えられるよ
前スレ
>>996 それは環境依存。
main では EXIT_SUCCESS や EXIT_FAILURE 使っとけ。
>>6 あの程度のレベルなら,スタックは再帰で済ませるのがイクナイ?
>>44 上部の動いてる目隠しをクリックすると最初に戻るよ。
>45 winice使った。システムレベルデバッガはこーゆーとき便利。
6面の上の動いてるやつもクリックできるではないか
52 :
デフォルトの名無しさん :03/11/16 18:44
>>45 、48
サンクス
でも問題の6面はワケワカランだな
53 :
デフォルトの名無しさん :03/11/16 18:47
あれ?適当に押していったらクリアしたぞ6面 全部は光らなかったけど・・・どういう条件でクリアしたのかすらもわからん・・・
6面は、てきとーにクリックしてたら、そのうち真ん中のボタンが 瞬きするから、その瞬間に、真ん中のを押す、と理解している。
55 :
デフォルトの名無しさん :03/11/16 18:53
56 :
デフォルトの名無しさん :03/11/16 18:58
左上方面から反時計回りに押していったような気がする そしたら、真中が・・・
根拠のある推理はしてないが 正解への方法はメル欄
#include <stdio.h> #define SIZE 8 main() { int n,i,j; char b[SIZE+1]; printf("数字を入力してください(0-255まで):"); scanf("%d",&n); if(n < 0|| n > 255){ fprintf(stderr,"Warning : the renge of \"n\" is 0 <=n <=255.\n"); exit(1); } for(i = 0, j = SIZE -1; i < SIZE && j >= 0; i++, j--){ if((n >> i) & 1) b[j] = '1'; else b[j]='0'; } b[SIZE] = '\0'; printf("10進数:%d\n",n); printf("8進数:%o\n",n); printf("16進数:%x\n",n); printf("2進数:%s\n",b); } ↑これを改良してchar型入力を10進数、8進数、16進数、2進数で表現する プログラムを作るにはどうすればよいのでしょう?
main() { int n, len, i; char word[100]; printf("数字を入力してください\n"); scanf("%s",word); len = strlen(word); for(i = 0; i< len; i++){ n = word[i]-'0'; } printf("あたえられた数字はint型の %d に変換されました.\n",n); return 0; } うまくいかないな・・・・・・
"123"があったら、 '1'を取り出して、nに追加 -> n=1 nを十倍する -> n=10 '2'を取り出して、nに追加 -> n=12 nを十倍する -> n=120 '3'を取り出して、nに追加 -> n=123
>>59 だと、
1+2+3 = 6... もう少し
63 :
デフォルトの名無しさん :03/11/16 19:49
lenが答えだしないの?
あ、ごめん嘘だ。
'1'を見て、n=1
'2'を見て、n=2
'3'を見て、n=3
だね。
>>63 の日本語は意味がわからないです、ごめんなさい...
65 :
デフォルトの名無しさん :03/11/16 21:09
>>64 ごめん、早とちりいい加減直したほうがいいでつね・・・strlenがstrtolに見えた罠
まだ直らない?
#include <stdio.h> #include <string.h> main() { int n,len,i,x,y,z; char word[100]; printf("数字を入力してください\n"); scanf("%s",word); if(word[0] == '0'){ printf("正しく数字を入力してください。\n"); exit(0); } len = strlen(word); for(i = 0; i< len; i++){ if(i == 0){ y = word[i]-'0'; z = y; }else{ x = z * 10; y = word[i]-'0'; z = x + y; if(i < len -1){ n = z; break; } } } printf("n = %d \n",n); return 0; } だめぽ・・・・・・_| ̄|○
67 :
デフォルトの名無しさん :03/11/16 22:23
うーんと、10進数でint(0〜255)の入力を受けて、それをn進数の文字列になおす、ってこと?
69 :
デフォルトの名無しさん :03/11/16 22:29
何で訊ねるの?
>>68 とりあえずコメントをつけるといいよ。何も無いものに毛をはやすみたいな感じだし。みためいいでしょ?
>>67 char型の文字列で打ったものをint型変換して出力しようと思ったら
出力が全然でかい数字になるんですよ。
ね、要領悪いですね、俺・・・・いてきまつ。
71 :
デフォルトの名無しさん :03/11/16 22:36
質問したんだから最後まで付き合え! 途中までやっておいて、そりゃあれだよ。 いかんざき! 質問に答えようとしてる人だっているんだし
72 :
デフォルトの名無しさん :03/11/16 22:39
ソース見る限りだと。。。 進数変えてないよね? これから変えるの?
73 :
デフォルトの名無しさん :03/11/16 22:41
#include <stdio.h> #include <string.h> // メイン関数 int main() { int s_len; // 計算用変数 int se, te, ei, to; // 16用, 10用, 8用, 2用 int result = 0; // 変換後 char s[100]; // 入力文字 printf("数字を入力してください>>>"); if (scanf("%s",s)<=0 || *s){ printf("正しく数字を入力してください。\n"); exit(0); } s_len = strlen(s); // sの長さを取得 for(i = 0; i< len; i++){ result = result * 10 + s[i]-'0'; } printf("n = %d \n",n); return 0; /* 正常終了 */ } とりあえず簡略化した、前にもコレに似た質問してたよね? ソースコードから習えとも言ったけど無理だった?
>>71 じゃあ・・・・・・・・
あの・・・・1000って入力したときint型で1000って出力できるように
したいんですけど・・・
>>66 じゃあ n = 5506524 やら変な数字になってしまい・・・
>>70 文字列変換・表示ブロックだけ。
{
char *ptr=文字列のポインタ入れやがれ;
int n=0;
while( isspace(*ptr) ) ++ptr;
while( isdigit(*ptr) ) n= n*10 + *ptr++ - '0';
printf("n = %d\n",n);
}
76 :
デフォルトの名無しさん :03/11/16 22:45
>>73 間違えた
if (scanf("%s",s)<=0 || *s){
のところを
if (scanf("%s",s)<=0 || !(*s)){ // えらーチェック
として。もしくは
scanf ("%s",s);
で、*s == '0' というのは、0から始まる数字は無いからやめろって言う意味?
0からでもイイと思うので、ソコの部分ははずしてもいいかなぁって勝手に思う
#include <stdio.h> #include <string.h> main() { int n=0,len,i,x=0,y=0,z=0; char word[100]; printf("数字を入力してください\n"); scanf("%s",word); if(word[0] == '0'){ printf("正しく数字を入力してください。\n"); exit(0); } len = strlen(word); for(i = 0; i< len; i++){ if(i == 0){ y = word[i]-'0'; z = y; }else{ x = z * 10; y = word[i]-'0'; z = x + y; if(i == len -1){ n = z; break; } } } printf("n = %d \n",n); return 0; }
>>73 でひらめきました。
初期化をすればよかったんですね。
これで変換できました。
ご迷惑をおかけしました・・・・やぱりいてきまつ・・・・
79 :
デフォルトの名無しさん :03/11/16 22:48
うんとねぇ。。。
>>78 はもっとマトモな変数名つけようぜ、わかりにくいです
>>37 xi*b1 + yi*b2 + b3 - xi*Xi*b7 - yi*Xi*b8 = Xi
+)xi*b4 + yi*b5 + b6 - xi*Yi*b7 - yi*Yi*b8 = Yi
-------------------------------------------------
xi*b1 + xi*b4 + yi*b2 + yi*b5 + b3 + b6 + (-xi*Xi + -xi*Yi)*b7 + (-yi*Xi + -yi*Yi)*b8 = Xi-Yi
で説明変数が8ヶになるから4組のデータ(Xi,Yi,xi,yi)が4個じゃ計算はムリだとおもふ。
少なくとも8ヶないと。。。
>>66 =78
お前の問題点は,あんなに分かり難いforループを書くこと。
もっとコードを単純化することに頭を使え。
複雑なほど,バグ混入の可能性も高い。
1.if(i==0)のブロックはz=0の場合のelseブロックと全く同じ。
2.if(i==len-1)の条件は for(...; i<len; ++i)の最後の条件と全く同一。
つまり,forのループが終わった後にこなす処理だろ?
for(){} ブロックの後方に置け。
>>73 n が未定義なわけだが?
82 :
デフォルトの名無しさん :03/11/16 23:09
>>81 あ、ありがとうございます。
n => result 置き換えてください。。。
いつもコードの最後の直しが無かったりします^^;
気をつけますね。
83 :
デフォルトの名無しさん :03/11/16 23:24
「文字cと文字列strを入力として読み込んだ上で、 文字列中のcの個数を調べるプログラムを作りなさい。」 という問題で、↓のようにstrのみで文字の個数を調べられるようには したんですが、どう改良すれば題意にふさわしいプログラムになるのでしょうか? #include <stdio.h> main() { char str[200]; int i, a; printf("文字列を入力してください。\n"); scanf("%s", str); a = 0; for(i=0; str[i] !='\0'; i++){ if(str[i] == 'c'){ a++; } } printf("文字列 %s 中には、\n 文字cは%d個存在します。\n",str, a); return 0; }
84 :
デフォルトの名無しさん :03/11/16 23:24
>>80 1組のデータ(Xi,Yi,xi,yi)があると2式できるので、
4組あれば未知係数b1〜b8に対して8式できるから解けるんじゃないんですか?
>>83 main()
{
char str[200];
int i, a;
char c;
printf("文字列を入力してください。\n");
scanf("%s", str);
printf("文字を入力してください。\n");
scanf("%c", &c);
a = 0;
for(i=0; str[i] !='\0'; i++){
if(str[i] == c){
a++;
}
}
printf("文字列 %s 中には、\n 文字%cは%d個存在します。\n",c,str, a);
return 0;
}
87 :
デフォルトの名無しさん :03/11/16 23:31
>>83 #include <stdio.h>
main(){
char str;
int a = 0;
printf("文字列を入力してください。:");
scanf("%s",str);
for(str;str++){
if(*str == 'c')a++;
}
printf("文字列%s中には、文字\'c\'は%d個存在します。",str,a);
return 0;
}
>>80 ぶーぶー,4つでもとけるぞぉ。
その1式だけにまとめてしまうと,等価じゃないからな。
>>88 strはポインターね。通るかどうかは調べてないけどw
char str → char *str
ぉぁ・・・for文の条件にも*を忘れている・・・ごめん。もう寝る。
>>92 88か?だとしたらforの中のセミコロンも忘れているぞ
最小2乗法はちょっと難しいので、 4組のデータ(Xi,Yi,xi,yi)(i=1,2,3,4)から 連立方程式でb1〜b8を求めるのを教えてもらえませんか? xib1+yib2+b3-xiXib7-yiXib8=Xi xib4+yib5+b6-xiYib7-yiYib8=Yi
>>95 数学板あたりで、とりあえず C/C++ のコードの書き方抜きで、
問題の解き方を教えてもらったほうがいいような。
解き方がはっきりすれば、
C とかに書き直すのは難しくないと思う。
もう忘れたけど、昔、物理の実験のデータ整理で、
最小2乗法とか使ったから、物理板にも詳しい人がいるかもしれない。
97 :
デフォルトの名無しさん :03/11/17 00:06
標準入力で1行ずつ読みこんでそれを辞書順に並べて1行ずつ標準出力する、 というのを作りたいのですが、 1、行を次から次へと読みこみ配列に記憶 2、辞書順にソート(strcmpとか言うのを使う?) 3、順番に出力 てな感じで最低限の日本語には出来るのですが、 しー言語には出来ません。 簡単なソースでだれか助けてください。
>>84 この場合、b7,b8 が両方に関わってるので、
どうしても、8個まとめて解かないとムリじゃないかな。。
そうすると、b3 と b6 を分けるのが難しくなるとおもう。
>>95 最小2乗法でも最終的には連立方程式でベクトル演算に落ち着く。
漏れ的には,Mathmaticaの使用を推奨する。
100 :
デフォルトの名無しさん :03/11/17 00:11
ハァ? 100げっと
>>96 そうですね、まずは数学板で聞いてみます。
>>99 俺、cしかできないんですよ。それも微妙だけど。
Mathmatica持ってないし…
>>101 だろうな、printf あたりを調べれ
>>104 大丈夫。考え方はそんなに難しくないと思う。
>>95 の2つの式の内、左辺の第4項の未知数(以下x4)と第5項の未知数(以下x5)が同じでしょ。
ここで、この2つの式から、x4を消去してx5だけの式と、同じようにx5を消去してx4のみの式を作る。
こうすれば2式を新たに以下のように書き下せるようになる。
a1x11 + b1x12 + c1x13 + d1x14 = e1
a2x21 + b2x22 + c2x23 + d2x24 = e2
(ここでx14とx24がさっきのx4とx5にあたる)
次に、これらの方程式のペアが全部で4つできるから、
そのうちx14を含む式4つとx24を含む式4つをそれぞれ新たにグループとすると、
(n11 n12 n13 n14)(x?1) (m1)
(n21 n22 n23 n24)(x?2) (m2)
(n31 n32 n33 n34)(x?3) = (m3)
(n41 n42 n43 n44)(x?4) (m4)
みたいな行列とベクトルの式が2つできるから、後は左辺の行列の逆行列を求められれば
各xは求められる。(LU分解etc...)
アルゴリズム自体は割りと平易だけど、すべてをプログラムに落としたい場合は
初心者さんにはきついものがあるかと・・・。
Execelとかである程度データ処理をしてから最後の連立方程式だけプログラムで
処理することをお勧めします。
>>97 ソートは後回しにして、1と3をやってみたらどうかね?
それとも、ぜんぜんわからんのかね?
あのぅ「#include "jish.h"」というインクルードを使いたいんですが、普通に入力しただけでは 「インクルードファイル'JISH.H'をオープンできない」というエラーが出てしまいます。 対処方法を教えてください。おねがいします(_ _;)。。。
jish.h って存在するの?
>>108 jish.h のありかと、コンパイルしようとしたソースプログラムのありかを書け。
話はそれだけだ。
1、3については 1、whileまたはforとgetsを使う 3、同じくwhileまたはforとputsを使う 程度しかわかりません
>>101 printf("文字列 %s 中には、\n 文字%cは%d個存在します。\n",str,c,a);
>>110 jish.hのありか??そんなファイルは知りませんが…。
ひょっとして自分でjish.hというファイルを創らないといけないんでしょうか?
すいませんが初心者なもので・・・。もうちょっと詳しく教えてください。
>>111 getsか。宿題だからまだいいとして…それを書いて見せて。
>>113 察しの通り、もしくは宿題を出した側が提供してたりして
先ほどかいた通りぐらいしかわからないんです。 「getsか」ということは他にもあるのですか?
>>115 サンクス。実はこれの前の講義を休んでしまってやってないんですよ。
たぶんその講義で配布されたと思われ。調べてみまふ。
>>116 int main()
{
system("sort");
return 0;
}
>>102 ありがとうございます。プログラムの参考にしてみます。
>>106 一応すべてプログラムでやろうと思っているので
なんとかがんばります。
できるかなあ…。
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; // 配列 vector<string> hairetu; void tugikara_tugieto_yomikomu() { string s; for(;;) { getline( cin, s, '\n' ); if( s.length() == 0 ) break; else hairetu.push_back(s); } }
121 :
デフォルトの名無しさん :03/11/17 02:03
void jyunbanni_syuturyoku() { vector<string>::iterator p = hairetu.begin(); vector<string>::iterator end = hairetu.end(); while( p != end ) { cout << *p << endl; p++; } } int main() { cout << "読み込み開始" << endl; tugikara_tugieto_yomikomu(); // 次から次へと読み込む cout << "読み込み終了" << endl << endl << endl; cout << "辞書順にソート開始" << endl; sort( hairetu.begin(), hairetu.end() ); // 辞書順にソート cout << "辞書順にソート終了" << endl << endl << endl; cout << endl << "出力開始" << endl; jyunbanni_syuturyoku(); // 順番に出力 cout << endl << "出力終了" << endl; return 0; }
>>86 は
2つ目あたりのscanfあたりで強制終了がかかるようなのです。
scanf("%c", &c)を先に処理させるのかな・・・?
>>122 最後のprintfでcとstrの位置が逆ジャネ?
すいませんがちょっと質問いいでしょうか。 学校の演習ソフトでは、 if(scanf("%d",&n)==EOF){ break; と、いう構文だとCtrl+z入力で「^Z」と表示されてその後Enterキーで終了になるのですが。 家で使ってるC++Builder 5でこのプログラムを使っても当然ながら「^Z」という表示はでませんし 終了もできません。EOFというのは学校で使ってる演習ソフトのオリジナル関数なわけですが これをなんとかC++Builder 5でも使えるようにできないでしょうか?よろしくおねがいします。
125 :
デフォルトの名無しさん :03/11/17 02:54
>124 EOFって関数なのか? EOFってのはマクロされている値では? 終了するにはCtrl+cで終了されるかと思われます。
>>120 C++はあまり触れたことがないので、
できればCでのプログラムをみせてください
本当にすみません・・・
「文字列aと文字列bを入力として読み込んだ上で、 文字列a中のbの個数を調べるプログラムを作りなさい。」 というプログラムを教えていただけませんか? 例) A: programram B: am 2つ存在しています
128 :
デフォルトの名無しさん :03/11/17 04:15
もう自分ではどうにもなりません。どなかかニュートン法のプログラムを教えてください。 問題 次の非線形方程式をニュートン法で解きなさい。 1 x-exp(-x*x/2)=0 2 (1/4)x-sinx=0 ただし 終了条件は|f(xn+1)|<1.0E-8 各反復ごとに反復回数n、近似解xn、誤差|f(xn)|を出力せよ。 反復回数nが30を超えたら強制終了させること。 すでに発狂中なので冷静に考えることができません。誰か助けて・・・
>>125 すいません。EOFは関数ではないですね。たぶんマクロされてる値で合ってると思います。
プログラムを終了するだけならCtrl+cでいいのですが、ループを抜ける方法がないものかと。
そのマクロをC++Builder 5でも登録するわけにはいかないでしょうか?
>>127 #include <stdio.h>
#include <string.h>
#define MAXLEN 64
int main()
{
char target[MAXLEN], sub[MAXLEN];
char* p; int count; int sublen;
if(scanf("%s %s", target, sub) == 2){
count = 0;
sublen = strlen(sub);
for(p = target; p = strstr(p, sub); p += sublen)
count++;
printf("A:%s\nB:%s\nmatch:%d ぬるぽ\n", target, sub, count);
}
return 0;
}
>>126 スリっとおみとおしです
#include <stdio.h>
#include <stdlib.h>
#define LINE_MAX 32
char line[LINE_MAX][64];
int compfn(char *l, char *r) { return strcmp(l, r); }
int main()
{
int i, j;
for (i = 0; i < LINE_MAX && gets(line[i]); i++) ;
qsort(line, i, sizeof(line[0]), compfn);
for(j = 0; j < i; j++) printf("%s\n", line[j]);
return 0;
}
>>128 ニュートン法でぐぐればソースが出てくると思うけど。
134 :
デフォルトの名無しさん :03/11/17 05:17
へんじがない・・・
宿題投げてみんな寝るのか。悲し。
燃料投下してもらってそれかよ。 矛盾してるぞお前ら。
はいはい
>>131 Ctrl+zと入力してみても何やら最大値っぽい値が入力されるだけで
ループを抜けることはできませんでした。
どうもスレの趣旨からずれてきたようなので、続きはC++Builder 5スレで聞いてみます。
ありがとうございました。
>>130 どうもありがとうございます。m(__)m
大変、勉強になりました。
>>128 ニュートン法の反復式は
x_(n+1) = x_n - f(x_n) / f'(x_n)
f には方程式の左辺, f' には方程式の左辺の導関数を代入する
初期値 x_0 には適当な値を入れる
(初期値の取り方によって収束しないことがあるから,反復回数の上限があるのだろう)
例えば,2の場合,
f(x) = (1/4)x - sinx, f'(x) = 1/4 - cosx
だから,反復式は
x_(n+1) = x_n - ( ( (1/4)x - sinx ) / ( 1/4 - cosx ) )
となる
これに適当な初期値 x_0 を与えて,最大 30 回繰り返せばいい
>>141 誤 x_(n+1) = x_n - ( ( (1/4)x - sinx ) / ( 1/4 - cosx ) )
↓
正 x_(n+1) = x_n - ( ( (1/4)x_n - sin x_n ) / ( 1/4 - cos x_n ) )
143 :
デフォルトの名無しさん :03/11/17 13:38
ポインタを用いる問題なのですが、 次の問がどうしても分からないので教えて下さい。 問) キーボードから入力した文字列のうち 前の空白を除いた部分を表示しなさい。 その際入力された文字数および前の空白を除いた 文字数を数え表示するプログラムを作成しなさい。 入出力サンプル ---------------------------------------------- キーボードから文字を入力してください> 23 456 入力文字数は7 23 456 前の空白を除いた文字数は6 ------------------------
配列の問題です。2問でもよろしいでしょうか。 [課題1] 平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み, 原点 (0, 0) からの平均距離を計算した後,平均距離,原点からの距離が(平均距離−3)以上で, かつ,(平均距離+12)以下であるすべての点の座標,及び, その数を出力するプログラムを書いてください(座標は,入力された順に出力)。 (入力例) コメントの部分は除く 3 // 点の数 10 20 // 1 番目の点の x 及び y 座標 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 31.49・・・ // 平均距離 30 20 // 2 番目の点の x 及び y 座標 20 30 // 3 番目の点の x 及び y 座標 2 // 点の数 (課題2に続く)
[課題2] 平面上の点の数 n( n ≦ 100 ),及び,n 個の点の座標を配列 x,及び,y に読み込み, すべての点の間の距離を計算し, その距離が最大になる点の組(2つの点の座標.最初に入力した点の座標を最初), 及び,その距離を出力するプログラムを書いてください。 (入力例) コメントの部分は除く 3 // 点の数 0 10 // 1 番目の点の x 及び y 座標 0 0 // 2 番目の点の x 及び y 座標 20 0 // 3 番目の点の x 及び y 座標 (出力例) コメントの部分は除く 0 10 // 1 番目の点の x 及び y 座標 20 0 // 3 番目の点の x 及び y 座標 22.36・・・ // 2点間の距離 C++です。どちらかひとつだけでもいいので助けると思ってお願いします・・・。
入力した文字列を逆から表示するプログラムを 何方か書いていただきたいのですが…。 自分でも色々やってみてはいるんですが、よくわからないので…。 文字列を入力してください:sum 後ろから出力します:mus といった具合のものです
>>144 #include <iostream>
#include <cmath>
int main() {
double x[100], y[100], d[100], l = 0;
int m, n, i;
std::cin >> n;
for (i = 0; i < n; i++)
std::cin >> x[i] >> y[i];
for (i = 0; i < n; i++)
l += d[i] = sqrt(x[i] * x[i] + y[i] * y[i]);
l /= n;
std::cout << l << std::endl;
for (i = m = 0; i < n; i++)
if (d[i] >= l - 3 && d[i] <= l + 12) {
std::cout << x[i] << " " << y[i] << std::endl;
m++;
}
std::cout << m << std::endl;
return 0;
}
>>145 #include <iostream>
#include <cmath>
int main() {
double x[100], y[100], ml = -1;
int i, j, n, mi = 0, mj = 0;
std::cin >> n;
for (i = 0; i < n; i++)
std::cin >> x[i] >> y[i];
for (i = 0; i < n - 1; i++)
for (j = i + 1; j < n; j++) {
double dx = x[i] - x[j], dy = y[i] - y[j];
double l = sqrt(dx * dx + dy * dy);
if (ml < 0 || l > ml)
ml = l, mi = i, mj = j;
}
std::cout << x[mi] << " " << y[mi] << std::endl
<< x[mj] << " " << y[mj] << std::endl
<< ml << std::endl;
return 0;
}
>>146 #include <stdio.h>
int main() {
char s[1024];
int i;
printf("文字列を入力してください:");
fgets(s, sizeof s, stdin);
printf("後ろから出力します:");
for ((i = strlen(s)) && s[i - 1] == '\n' && i--; i >= 0; putchar(s[--i]))
;
putchar('\n');
return 0;
}
>>143 #include <stdio.h>
#include <string.h>
int main() {
char s[1024], *p;
printf("キーボードから文字を入力してください> ");
gets(s);
for (p = s; *p == ' '; p++)
;
printf("入力文字数は%d\n%s\n前の空白を除いた文字数は%d\n", strlen(s), p, strlen(p));
return 0;
}
>>150 どうもありがとうございました!
助かりました。
>>149 一文字余分に出力してる。
考えきれないなら、凝った書き方しない方が身のためだよ。
155 :
デフォルトの名無しさん :03/11/17 18:31
>>153 は
>>58 の方ですか?
前から同じような事かいてない?
誰が誰だかわからないから
>>153 を見る限りだと
>>58 のプログラムは間違えてるんじゃないの?って発言かもしれないし
>>58 をやってくださいって発言かわからないし。
荒らしかもしれないし
誰も反応のしようがないです・・・
156 :
デフォルトの名無しさん :03/11/17 18:37
>>149 だと s[-1] も出力する罠
i >= 0 → i にすると直る
というか
>>149 初めて見たけど感動したよ
>>153 1.char型入力の入力方法。
2.10進数、8進数、16進数、2進数で表現する。
この2つが>58のコードとどう違うのか良く分からん。
>>156 どこに感動する要素があるんだよ。
むしろ汚いと思うな。
ゼータ関数を表示するプログラムを書きたいのですが・・・ どなたか教えてください
マイトさんですか?
161 :
デフォルトの名無しさん :03/11/17 20:17
>>158 みてわからない?
for ((i = strlen(s)) && s[i - 1] == '\n' && i--; i >= 0; putchar(s[--i]))
i = strlen(s)で真なら s[i - 1] == '\n' が真なら i--をする
i = strlen(s) の長さがあれば真を返すわけで、 s は文字を持ってる(*s が ターミネーターじゃない)
s[i - 1] == '\n'が真なら 改行は入れたくないわけで i-- をする。
感動だ
163 :
デフォルトの名無しさん :03/11/17 20:57
>>163 Cは手続き型の言語なので、実行される順序をよく考えないとだめですよ。
>>164 レスどうもです、順番間違いかなんかでしょうか・・・もうちょっと見てみます
具体的には、ひとつめの for(i=0;?Ai<25;?Ai++) の中身。 tempの中をどんどん書き替えてしまっているよ。 初期化した後に、temp[] ^= a[] とするとうまくいきそう。
雑音除去の問題です。自分でもやってみたのですが、よくわからなくて… 4問あるのですが、ひとつだけでも教えていただけると助かります! 問1)移動平均法(一様重み平滑化法)によって雑音除去を行うプログラムを作成せよ。 問2)ボケを抑制した移動平均法によって雑音除去を行うプログラムを作成せよ。 問3)エッジ保存平滑化法によって雑音除去を行うプログラムを作成せよ。 問4)メジアンフィルタによって雑音除去を行うプログラムを作成せよ。
>>166 tempの中身を書き換えてしまっているというのが分かりません・・・
temp[] ^= a[]とはmemsetの下に
for(i=0; i<25; i++)
temp[i] ^= a[i];
でしょうか?こうやっても変わりませんでした・・・
for(i=0;?Ai<25;?Ai++){ ?A?A?A?Atemp[i]=a[i]^hyou[i]; ?A?A?A?Aif(i?A%?A5?A!=?A0)?A?A?A?Atemp[i]^=a[i-1]; ?A?A?A?Aif(i?A%?A5?A!=?A4)?A?A?A?Atemp[i]^=a[i+1]; ?A?A?A?Aif((i-5)?A>=?A0)?A?A?A?Atemp[i]^=a[i-5]; ?A?A?A?Aif((i+5)?A<=24)?A?A?A?Atemp[i]^=a[i+5]; } 動作検証はしてないけど。
170 :
デフォルトの名無しさん :03/11/17 22:03
スペースじゃないのか、多分。
なんと!違うブラウザで見ると、(2)(2)(2)(2)……逝ってきます
>>169 ありがとうございます、ちゃんと動きました・・・と言いたいのですが
簡単な問題は解けました、けどちょっと難しいものは無理?みたいです
ただ、検索してたまたま見つけた問題ですから間違ってるかもしれませんが・・・
あとは自分で考えてみます
宿題ではないのですが・・・ RPGのモンスターのパラメータを初期化して、適当な行動ルーチンを作り main()関数で実行させて動くようにするにはどうすればよいのでしょうか? 鬼才たる能力を持つ皆様お願い致します
やっぱりさっき試したのは問題間違いのようです、ちゃんとうまくいきました みなさんありがとうございました
177 :
デフォルトの名無しさん :03/11/17 22:28
>>174 RPG政策スレとかたてなよ。
オレが行く。
javaだけど。
178 :
デフォルトの名無しさん :03/11/17 22:31
179 :
デフォルトの名無しさん :03/11/18 00:47
10進数を2進数に変えるプログラムをつくりたいのですがおしえてください。 10進数は15まで表現できればいいので2進数は4ビット限定にしたいのですが… 例えば14ならば1110というように
static const char *bits[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };
181 :
デフォルトの名無しさん :03/11/18 01:08
>>179 ぐらいのだったらいつも自分で悩むんだけど、そういうの質問するのってやっぱ気が引けるよね・・・
質問してもいいの?
182 :
デフォルトの名無しさん :03/11/18 01:08
>>179 tmp=15;
for(i=8;i>0;i/=2)printf("%d",tmp&i);
printf("\n");
かな?
183 :
デフォルトの名無しさん :03/11/18 01:09
185 :
デフォルトの名無しさん :03/11/18 01:11
やば、右シフト使うんだったよ。 tmp=15; for(i=3;i>-1;i--)printf("%d",(tmp>>i)&1); printf("\n");
187 :
デフォルトの名無しさん :03/11/18 01:24
printf内で変数の値を変えるのって結構怖いんだけど、みんな結構やったりする?
4bit限定なら tmp=15; printf("%d%d%d%d\n",tmp&0x8,tmp&0x4,tmp&0x2,tmp&0x1);
情けないんで>186に課題。 >186をprintf()を使わないで書いてみよ。
はぁ・・・
そして>186と同じ轍を踏む>188・・・
>>187 関数の引き数の記述で変数の値を変えるのは副作用が読めないので一般的にやってはいけません。
for(i=0;i<4;i++)printf("%d",(Num&(8>>i))!=0);
192 :
デフォルトの名無しさん :03/11/18 01:30
CFAQ嫁
副作用って?
194 :
デフォルトの名無しさん :03/11/18 01:41
副作用って?
195 :
デフォルトの名無しさん :03/11/18 01:43
>>193 たとえば
i=0;
printf("%d,%d\n", i=5, i++ );
なんてすると、表示結果がある環境では5,5となって、ある環境では5,0に
なるらしいです。(なんかものの本に書いてあったよ)
式の評価順序がi++が先なのか、i=5が先なのかで違うそうだ。
196 :
デフォルトの名無しさん :03/11/18 01:44
char str[14]; tmp=15; sprintf(str, "%d%d%d%d\n",tmp&0x8,tmp&0x4,tmp&0x2,tmp&0x1); これでどう? ところで副作用って?
197 :
デフォルトの名無しさん :03/11/18 01:44
198 :
デフォルトの名無しさん :03/11/18 01:45
199 :
デフォルトの名無しさん :03/11/18 01:46
>>195 訂正
計算結果が 5,6 になるか 5,1のどっちかだね
>>199 i=0;
printf("%d",i++);
この結果は0だよ。
>>200 186も188も関係ない。
187へのレスだ。
203 :
デフォルトの名無しさん :03/11/18 01:48
205 :
デフォルトの名無しさん :03/11/18 01:50
i++で思い出したンだけど、 i++と++iってi++が i+=1 で ++i が i + 1 ってのをどっかで見た気がするんだけど両方 i+=1 ぽい・・・ なぜ?どっかで見たのが間違いだったのかなぁ
206 :
デフォルトの名無しさん :03/11/18 01:51
簡単にいえば、副作用ってのは
ある変数の値を変更するコードを1つの式んなかに複数いれたらやばいってこと。
>>195 >>201 を参照しとけ。
>>205 #include <stdio.h>
int main()
{
int i=0,a;
a=i++;
printf("%d\n",a);
return 0;
}
これとi++を++iに変えたものとで結果を比べてみれば分かる
>>206 評価する順序の決められていない式が前提でね。
大域変数,静的変数,IOの変更など
211 :
デフォルトの名無しさん :03/11/18 01:55
>>205 i++と++iとi+=1とi + 1は全部意味が違う。
ちなみにこの中で明らかな仲間はずれはどれでしょう?
>>211 i + 1 !
【理由】これだけ演算子の間にスペースが入っているから
215 :
デフォルトの名無しさん :03/11/18 01:59
217 :
デフォルトの名無しさん :03/11/18 01:59
やべ、やっちまった! in 215
>>211 i++
式を評価した際に得られる値が他と違う
219 :
デフォルトの名無しさん :03/11/18 01:59
とにかく正解なんだねw
221 :
デフォルトの名無しさん :03/11/18 02:00
i+=1はいつ式のひょうかがされるんですか?
>>211 i + 1
評価後に i の値が変わらない
>>224 それも正解だけど、このスレの流れからいくと・・・ね
227 :
デフォルトの名無しさん :03/11/18 02:08
>>226 いいこと言った、漏れもやってわかった(ってのは遅いか
228 :
デフォルトの名無しさん :03/11/18 02:09
1111 &1000 ------ 1000 = 8なわけだ
229 :
デフォルトの名無しさん :03/11/18 02:09
>>226 >>186 は問題なく実行できたぞ。
#include <stdio.h>
int main()
{
int i;
unsigned int tmp=15;
for(i=3;i>-1;i--)printf("%d",(tmp>>i)&1);
printf("\n");
}
結果:1111
230 :
デフォルトの名無しさん :03/11/18 02:11
(tmpo>>i)の括弧は意図的につけたわけだし
231 :
デフォルトの名無しさん :03/11/18 02:12
これからは tmp と名前をつけず timpo とつけて、ソースを読んだ人を笑わせて見たいと思います
>>229 じゃ正解なんだろ。
やれば分かることをいちいち聞くなと言っているわけで。
233 :
デフォルトの名無しさん :03/11/18 02:14
>>232 自分の環境でうまく動いても他の環境でもうまく動くとは限らないわけで。
それは正解とは呼べないわけで。
んなこと言ったらソフトウェアなんぞ公開できないわけで
235 :
デフォルトの名無しさん :03/11/18 02:15
>>233 どの環境でもうごくんじゃないの?
tmp>>i は代入じゃなくて計算式なわけだし
tmp>>=iじゃないよ
うちだと、両方普通に動くんだけどなぁ・・・・
>>234 公開されているソフトウェアはプラットフォームを提示しているが、出題者は提示していない。
#include <stdio.h> int main() { char *table[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; unsigned int tmp=15; printf("%s\n", table[tmp]); }
なんか今日は特に低レベル。
243 :
デフォルトの名無しさん :03/11/18 02:19
両方はVCとborlandを示すかもしれん
245 :
デフォルトの名無しさん :03/11/18 02:21
>>239 C++.NETだけど、VCとかとは結果が違うんかい?
247 :
デフォルトの名無しさん :03/11/18 02:21
248 :
デフォルトの名無しさん :03/11/18 02:22
>>246 C++.net はVC++.netと同じと解釈するべきだよね?
249 :
デフォルトの名無しさん :03/11/18 02:22
printf("%d%d%d%d\n",(tmp&0x8)&&9,(tmp&0x4)&&99,(tmp&0x2)&&999,(tmp&0x1)&&9999);
>>245 副作用が問題になるのは
副作用を受ける変数を2個以上引数に指定した場合だろうな
引数の評価順は未定義
>>233 すくなくとも試した後に質問するべき。
試したなら
>で、なんで
>>186 と
>>188 は間違いなの?
なんてあほな質問を猿のように繰り返ししない。
少なくとも
>で、なんで
>>186 は間違いなの?
に変わっていたはず。
252 :
デフォルトの名無しさん :03/11/18 02:23
いや、なんで188と186が同じ轍なのかを聞いてるんだけど。
254 :
デフォルトの名無しさん :03/11/18 02:25
そういやそうだな・・
>>186 と
>>188 が==でつながってる発言をしているが、それは本人が間違えたと解釈すれば?
もしくは誤りを謝ってほしいと?
256 :
デフォルトの名無しさん :03/11/18 02:27
>>253 俺もそれが疑問なんだ。
副作用云々は187への回答であって、全く関係ないみたい。
>>254 謝るとかじゃなくて疑問だから。
257 :
デフォルトの名無しさん :03/11/18 02:27
printf("%d%d%d%d\n",tmp&0x8&&1,tmp&0x4&&1,tmp&0x2&&1,tmp&0x1);
259 :
デフォルトの名無しさん :03/11/18 02:28
>>187 だけど、
ありがとうございました。勉強になりました。
261 :
デフォルトの名無しさん :03/11/18 02:28
>>258 面白いね、汚いけど理解するとうまいなって思うけどやっぱ他にイイのありそうだと思うソースコードお見事
188が誤りなのはわかるんだけど(恐らく8421になるだろ)、 なんで同じ誤りが186にあるのかわかんないんだよね。
263 :
デフォルトの名無しさん :03/11/18 02:30
クソスレ化しそうだなぁ・・・ 確かに問題があるのはいいけど問題がないならいいやん みんな鬱憤がたまってそうやね
>>261 9や99を1に変えただけで反応が変わる奴
>>260 試すなら少なくともtmpを0から15まで振って試せ。
266 :
デフォルトの名無しさん :03/11/18 02:30
>>264 うぃ、スマソ
&&に気が付かなかった香具師だよん
printf("%d%d%d%d\n",tmp&0x8||0,tmp&0x4||0,tmp&0x2||0,tmp&0x1);
ダメだ。 ホントのネタ師も現れだした。 寝るか。
TRUE=1 FALSE=0じゃない環境もある…?
>>271 あるかもしれないが、もしそうしたらANSI C準拠でなくなる。
ああ、TRUE,FALSEはもちろん&&の結果のことね。
>>272 dクス。そっかANSIで1と0って決まってんのか。
276 :
デフォルトの名無しさん :03/11/18 02:36
いまどきTRUE!=1 FALSE!=0のコンパイラをあげてみてよ。
これが標準なんだからコレに従ってないコンパイラは仕方ないと思う気持ちがないの?
>>274 大抵の場合はwinでやってたりlinでやってたりするわけだからこの規約が守られてると思うよ
>>276 (゚Д゚)ハァ?
だから仕様だと言ってるだろ
おまいの逝ってることの意味が分からん
279 :
デフォルトの名無しさん :03/11/18 02:50
>>278 のコンパイラ
??仕様で TRUE != 1 FALSE != 0なのか?そりゃ残念だな
だーかーらー、TRUE,FALSEってのは定数のことじゃなくて&&や==などの結果のことを言っているんでしょ。 それなら0か1。
少なくともCでは。C++は知らない。
282 :
デフォルトの名無しさん :03/11/18 03:00
>>280 なるほど、全然話がかみ合ってなかったわけだね・・・
漏れはBASIC上がりなんで、最初(a==a)は-1が返るもんだと思ってたなぁ。。。
285 :
デフォルトの名無しさん :03/11/18 03:11
286 :
デフォルトの名無しさん :03/11/18 03:12
でもって
>>284 がいるプロジェクトは
>>284 がいつも相手が何を理解してないかを理解しようとしないから全然仕事がはかどらないと思われ
>>283 おかげでX=X+(INP(0)=253)*(X<319)とかねw
288 :
デフォルトの名無しさん :03/11/18 03:17
INP(0)=253ってなに?
>>288 ポートの状態を取得する関数だったかな。
その昔、キーボードのどのキーが押されたかをそれで調べてたんだわ。
0とか253はあてずっぽよw。
読解力ない香具師が多いのな。 >186が>182で踏んだのと同じ轍を>188が踏んだのだよ。
292 :
デフォルトの名無しさん :03/11/18 04:21
293 :
デフォルトの名無しさん :03/11/18 04:40
ANSIでは偽は0、真は0以外としか規定してないんじゃなかったっけ?
>>293 &&や==などの結果(それが返す値)のこと
296 :
デフォルトの名無しさん :03/11/18 13:44
学校の課題なんですが、重回帰分析の課題で、全然わからないのでお願いします。 b=(X'X)-1X'y という式で「bを求めるプログラムを作成せよ」という課題です。 ちなみに-1は、(X'X)の逆行列という意味です。 そして、求めた逆行列に行列X'を掛け、それとベクトルyとの積を 求めるということらしいのですが、全くわからないのでお願いいたします。 ちなみに、(X'X)の部分を求めるプログラムとして、 下のプログラムを提供されています。 このプログラムで出てきた答えの逆行列を求め、 X'とyを掛けるというのを付けたし、bを求めるプログラムを作成するのが課題です。
297 :
デフォルトの名無しさん :03/11/18 13:47
#include <stdio.h> #include <math.h> int i,j,k,n,p; double xdat[20][10],xddat[10][20],y[20],xx[10][10]; /**/ main() { FILE *f; f = fopen("kaiki.dat","r"); //データ数 fscanf(f, "%d", &n); //変数の数 fscanf(f, "%d", &p); //データ for (i=1;i<=n;i++) { //目的変数のデータ fscanf(f, "%lf", &y[i]); printf(" %lf ",y[i]); for (j=1;j<=p;j++) {
298 :
デフォルトの名無しさん :03/11/18 13:48
//説明変数のデータ fscanf(f, "%lf", &xdat[i][j+1]);xddat[j+1][i]=xdat[i][j+1]; printf(" %lf ",xdat[i][j+1]); } printf(" \n"); } for (i=1;i<=n;i++) { xdat[i][1]=1.0;xddat[1][i]=1.0; } // 行列の積 for (i=1;i<=p+1;i++) { for (j=1;j<=p+1;j++) { xx[i][j]=0.0; for (k=1;k<=n;k++) { xx[i][j]=xx[i][j]+xddat[i][k]*xdat[k][j]; } } } for (i=1;i<=p+1;i++) { for (j=1;j<=p+1;j++) { printf("%10.4lf ",xx[i][j]); } printf(" \n"); } fclose(f); }
>>297 printfに%lfはないよ。float,doubleは%f(floatはdoubleに格上げされるから)、long doubleは%Lf
300 :
デフォルトの名無しさん :03/11/18 13:49
fopenで呼び出すファイルの内容は、次のものです。 17 4 67.511.5866.8329.521.96 711678.7633.311.97 70.513.8377.4530.871.99 68.112.3668.6530.061.99 70.114.9677.0832.211.96 69.817.5680.0535.011.97 68.511.8868.6529.582.07 70.917.3581.2734.552 69.312.1771.2729.752.09 70.816.9780.2134.081.96 69.515.1175.832.641.95 70.416.5379.7833.651.93 7015.576.4532.911.95 69.312.770.4130.222 69.614.4576.3831.831.95 69.913.2473.4230.522 69.714.0675.431.431.96
301 :
デフォルトの名無しさん :03/11/18 13:53
すみません、スペースが入っていませんでした。 17 4 67.5 11.58 66.83 29.52 1.96 71.0 16.00 78.76 33.31 1.97 70.5 13.83 77.45 30.87 1.99 68.1 12.36 68.65 30.06 1.99 70.1 14.96 77.08 32.21 1.96 69.8 17.56 80.05 35.01 1.97 68.5 11.88 68.65 29.58 2.07 70.9 17.35 81.27 34.55 2.00 69.3 12.17 71.27 29.75 2.09 70.8 16.97 80.21 34.08 1.96 69.5 15.11 75.80 32.64 1.95 70.4 16.53 79.78 33.65 1.93 70.0 15.50 76.45 32.91 1.95 69.3 12.70 70.41 30.22 2.00 69.6 14.45 76.38 31.83 1.95 69.9 13.24 73.42 30.52 2.00 69.7 14.06 75.40 31.43 1.96
302 :
デフォルトの名無しさん :03/11/18 14:06
残念ながら希望にこたえられるだけの実力者がいないもよう・・・夕方、夜になれば来ると思うよ
宿題なんですけど、分かる方お願いします。 自力で考えてたんですけど、時間切れっぽいんで。 「10進数で入力された数値を8桁の16進数で表示するプログラムを作れ ただし、表示にはprintfは使ってはならず、putcharを用いよ」 例:1234567 → 0012D687
304 :
デフォルトの名無しさん :03/11/18 18:16
入力中の「/*」と「*/」に囲まれた部分にのまわり<i>〜</i>というタグを挿入する flexプログラムを作成せよ。 入れ子になっている括弧は考慮しなくても良い。例えば「/* ABC /* DEF */ GHI */」のようになっている場合は、「<i>/* ABC /* DEF */</i> GHI */」でも、「<i>/* ABC /* DEF */ GHI */</i>」でも、どちらでも良い。 逆に/*から*/に囲まれていない部分を囲ってはいけない。特に、入力の最後が、対応する 「*/」なしに「/*」... という形になっているときに注意せよ。 また「/* ABC */ DEF /* GHI */」は、「<i>/* ABC */</i> DEF <i>/* GHI */</i>」であって、「<i>/* ABC */ DEF /* GHI */</i>」になってはいけない。
306 :
デフォルトの名無しさん :03/11/18 18:40
>>303 #include <stdio.h>
int main()
{
int n,i;
char buf[1024];
scanf("%d",&n);
sprintf(buf,"%08X",n);
for(i=0;buf[i];i++)
putchar(buf[i]);
return 0;
}
>>303 #include <stdio.h>
int main(void)
{
int n,i;
char s[8];
scanf("%d",&n);
for(i=7; i>-1; --i,n/=16){
int m=n%16;
s[i]="0123456789ABCDEF"[m];
}
for(i=0; i<8; ++i) putchar(s[i]);
return 0;
}
フリーズしたんでそのままバイト行ってました。 その後学校で見ようとしたらアクセス制限・・・ とゆーことでこんや再度チャレンジします。
>>309 あぁ。ほんとだね。ただなんとなくづらづらっ書いてみただけだから。すまん。
すいません、最後に一つ教えてください フリップってどういう意味でしょうか?スキーや回路の用語とかでてきて調べられませんでした
personal name(名)とfamily name(姓)を読み込んで 「your name is (名) (姓)」と表示するプログラムを 作成して頂きたいのですが…。 ちなみに、問題文に、一次元の配列を用いたプログラムと 二次元の配列を用いたプログラムの 計二通りのプログラムを作成しろ、とあります。 作成例を載せておきます。。 (例) family name:Yamazaki personal name:Ayumu Your name is Ayumu Yamazaki. という具合です。
一応、一つは自分で作れたのですが、 もう一つの作り方がよくわかりません。 何方か代わりに作成して頂けると有り難いです。 (二次元と一次元の区別がよくわからないもので…) ↓自分が作れた方張りますので、使ってください。 よろしくお願いします。 #include <stdio.h> { char name[2][50]; printf("family name : "); scanf("%s", name[0]); printf("family name : "); scanf("%s", name[1]); printf("Your name is %s %s.\n", name[1], name[0]); return (0); }
>>319 なんとなく、分かりました、ありがとうございました
static char name[0x20000000]; printf("family name : "); scanf("%s", name); printf("family name : "); scanf("%s", &name[0x10000000]); printf("Your name is %s %s.\n", name, &name[0x10000000]);
322 :
デフォルトの名無しさん :03/11/18 23:49
char name[100]; char *p[50]; p=name; printf("family name :"); scanf("%s", p); printf("family name :"); scanf("%s", p+1); printf("Your name is %s %s.\n", p, p+1 ); じゃだめだっけ。
まちがい。 char name[100]; char (*p)[50]; p=name; printf("family name :"); scanf("%s", p); printf("family name :"); scanf("%s", p+1); printf("Your name is %s %s.\n", p, p+1 );
324 :
デフォルトの名無しさん :03/11/19 00:17
素直に2つの一次元配列使えばいいんでないのか? char Pname[50]; char Fname[50]; と・・・
>>317 のが、2次元配列。
1次元の場合は下のでいかがか。
char fname[100];
char pname[100];
printf("family name:");
scanf("%s", fname);
printf("personal name:");
scanf("%s", pname);
printf("Your name is %s %s.\n", pname, fname);
326 :
デフォルトの名無しさん :03/11/19 00:57
>317さん あなたの書いたプログラムには誤りがあります。 318で書いたプログラムちゃんとチェックしましたか? 最大文字数以上に入力してチェックしてみて下さい。(scanfの所で50文字以上入力してみる) 結果がおかしくなるはずです。 #include <stdio.h> int main(){ char name[2][50]; printf("personal name : ");fgets(name[0],50,stdin);rewind(stdin); printf("family name : ");fgets(name[1],50,stdin); printf("Your name is %s %s.\n", name[1], name[0]); return (0); } 文字列入力の時は気をつけないといけません。
327 :
デフォルトの名無しさん :03/11/19 01:01
こっちの方がエレガントかもしれませんね。^^; #include <stdio.h> #define max 50 int main(){ char name[2][max+1]; printf("personal name : ");fgets(name[0],max,stdin);rewind(stdin); printf("family name : ");fgets(name[1],max,stdin); printf("Your name is %s %s.\n", name[1], name[0]); return (0); }
>>304 入れ子を意識しない
#include <iostream>
#include <string>
using namespace std;
string let_flex(const char *in_str)
{
string str(in_str);
string::size_type start, begin, end;
start = 0;
while((begin = str.find("/*", start)) != string::npos &&
(end = str.find("*/", begin + 2)) != string::npos){
str.insert(begin, "<i>"); str.insert(end + 3 + 2, "</i>");
start = end + 3 + 4;
}
return str;
}
int main()
{
char buffer[1024];
cin.getline(buffer, sizeof(buffer));
cout << let_flex(buffer).c_str() << endl;
return(0);
}
入れ子を意識する場合 /* /* */ は?
329 :
デフォルトの名無しさん :03/11/19 01:16
まただよ・・・1
どうしたんだよ・・・2
>>304 こんな感じ?
%%
\/\*([^*]|\/\*)*\**\*\/ fprintf(yyout, "<i>%s</i>", yytext);
. ECHO;
\n ECHO;
%%
改行の問題が残ってました。以下の物を追加して下さい。 #include <string.h> //以下の文は入力の終わったあとに追加 i=strlen(name[0]);j=strlen(name[1]); if(name[0][i]=='\n')name[0][i]='\0'; if(name[1][j]=='\n')name[1][j]='\0';
更に間違うし・・・ 餅搗け>327
>>328 ,331 有難うございます
今日以下のようにヒントが出たのですがどのように定義を書いたらいいんですか?
/* ここは正規表現の定義(良く使う正規表現に名前をつける) */
delim[ \t]
ws{delim}+
letter[A-Za-z]
digit[0-9]
ident{letter}({letter}|{digit})*
number{digit}+(\.{digit}+)?(E[+\-]?{digit}+)?
%%
/* ここに動作記述を書く。*/
{ws}{ putchar('_'); }
{number}{ printf("</b>"); ECHO; printf("</b>"); }
{ident}{ printf("</i>"); ECHO; printf("</i>"); }
"."{ ECHO; exit(1); }
.{ ECHO; }
すみません判らないからよろしくお願いします。m(__)m エラトステネスのふるいを使って素数を求める。プログラム 実行例------------------------------------ いくつまでの素数を求めますか?max=10 10までの素数の個数は4個です。 ------------------------------------------ このとき10を入力したものとします。 ホントに判らないのよろしくお願いします。
337 :
デフォルトの名無しさん :03/11/19 13:59
>>336 自分で調べるということはしないの?
それって、アルゴリズムの本を見ると1番か2番もしくは5・6番ぐらいに出てくる問題だよ
338 :
デフォルトの名無しさん :03/11/19 14:03
入力>
>>100 √100 = 10
だから、2・3・5・7の倍数を振るい落とすプログラムを作りましょう。
振るい落とされなかった物が素数です
339 :
デフォルトの名無しさん :03/11/19 17:09
1.以下のプログラムの関数func()を引数付きマクロ定義で書き直せ。 main() { int i = 1; double a; double func(double); a = 0.1; while(i < 10); { at = func(a) i++; } printf("%lf", a); } double func(double x) { doubule y; y = x * x; return(y); } 2.上記のプログラムの先頭で"DEBUG"が定義されたときに while文の中の変数aの値を表示するように書き直せ。 をよろしくお願いします。
340 :
デフォルトの名無しさん :03/11/19 17:18
学校で宿題で出ていろいろやってみたのですが どれもうまくいかなくて、もし↓の問題を 作れる方がいましたら教えていただけないでしょうか? 課題1:標準入力からテキストファイルを読み込み、 行を辞書順に並べ直して標準出力に出力しなさい。
>>340 はい。作ったよ。
課題1:標準入力からテキストファイルを読み込み、
行を辞書順に並べ直して標準出力に出力しなさい。
しかも、答えはすでにガイシュツしてるような気がする
[問題]配列要素の加算 まず、24 個の整数データを1次元配列 a に入力します。 次に、以下に示す操作, a[0] += a[16]; a[1] += a[17]; ・・・・・ a[?] += a[23]; を行った後、配列 a の各要素の値を1つ以上のスペースで区切って出力するプログラムを書いてください。 ただし、上記の加算は、間接演算子を使用して行ってください。 よろしくお願いします。
343 :
デフォルトの名無しさん :03/11/19 17:41
>>341 答えが13代目と14代目に出ていると思うのですが
2chViewerじゃないと見れないと出てしまっているんです。
もし見れる方がいたら教えていただけないでしょうか?
344 :
デフォルトの名無しさん :03/11/19 18:26
わかってる方からしたらすごく単純な問題かもしれませんが 何遍やってもうまくいかないので助けてください。 期限が明日の朝8時半までなんです 次のポインタによるるプログラムをはいれつを使って表しなさい #include <stdio.h> main() { char s[10]; char *p; strcpy(s,"ABCD"); p=s; ここからは課題と関係ないと思われるプログラムが続きます printf("kadai\n"); while(*p){ *p=*p+1; ++p+ } printf("s=%s\n",s); } どうかよろしくお願いします
自分ではこうしてみましたがうまくいきません お手間でなければこのプログラムのどこがおかしいなども指摘して ください。 printf("kadai\n"); while(s[i]!=0) {s[i]=s[i+1]; ++i;} while(s[i]!=0) {printf("%d\n",s[i]); ++i;}
あと14時間ほどあるわけですね
家ではできないのでここで回答が得られなければ 朝の八時に学校に行き実質三十分で考えなければなりません
あ、わかりにくい文章ですね 「ここからは課題と関係ないと思われるプログラムが続きます」 とありますがそれらは省略しました。 ここからはの次からが大切なんです。 配列が一つずれるはずが駄目なんですね
>>347 >while(s[i]!=0)
>{s[i]=s[i+1];
while(s[i]!='\0')
{s[i]=s[i]+i;
こうじゃないの
しかも、 >while(s[i]!=0) >{printf("%d\n",s[i]); >++i;} コレで表示するとなると printf("%c\n",s[i]);こうでしょう。
正確にいえば int i; for(i=0; s[i]; ++i) putchar(s[i]); putchar('\n');
>>342 インデントとか適当になおしてちょ。
「間接演算子」ってアスタリスク(*)のことだったのね。
言葉の勉強になりました。
#include <stdio.h>
int main(void)
{
enum {SIZE = 24, START = 16};
int a[SIZE];
int i, *from, *to;
/* 入力 */
for (i = 0; i < SIZE; i++)
scanf("%d", &a[i]);
/* 計算 */
for (from = a+START, to = a; from < a+SIZE; from++, to++)
*to += *from;
/* 出力 */
for (i = 0; i < SIZE; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
>>344 自宅PCにコンパイラ入れることを推奨。
#include <stdio.h>
main()
{
char s[10];
int i;
strcpy(s,"ABCD");
printf("kadai\n");
for (i = 0; s[i] != '\0'; i++)
s[i] = s[i+1];
printf("s=%s\n",s);
}
ありがとうございます。 規制がかかって書き込めないので携帯から御礼を申し上げます これからコンパイラを入れてやってみます
ありがとうございます。 規制がかかって書き込めないので携帯から御礼を申し上げます これからコンパイラを入れてやってみます
356 :
デフォルトの名無しさん :03/11/19 20:38
いくら考えても思いつきません。 助けてもらえると助かります。お願いします。 次の展開式を使って対数関数の色々な値の近似値を 求めるプログラムを作れ。 ∞ log(1+x)=(-1)^n*x^(n+1)/n+1 n=1 この場合は、xに適当な数をいれた数列{Cn}を以下のように 定義するとき、|Cn+1-Cn-1|が初めてある小さい数εより 小さくなったときのCnの和を近似値とする。 Cn=x^2n+1*(2n+1-2nx)/{2n(2n+1)} n=0,1,2,…
すみません、ずれてしまいました。 ∞は狽フ上に付きます。n=1は狽フ下です。 お願いします。
>>356 問題はしょっていない?日本語がよくわからない。
>>340 ここで既出のコードを使った課題は、基本的に『怪しい』と見なしますので
丸写しして出すのは止めて下さいね。
指摘がありましたので……
>>340 #include <stdlib.h>
int main(void)
{
return system("sort");
}
この問題ってば、K&Rにあった気がする。
Cアンサーブック第2版(共立出版)にマジメな答えがある。
学校の課題を丸投げしてる人たちは、何で直接先生に質問しないの? ここで聞くよりも丁寧に教えてくれると思うよ。 それに、嫌がられるほど通いつめればポロリもあるかもしれないし。 教師をこき使わないのなら、何のために学費を払っているんだろうか……
>>361 それを言ったらこのスレそのものがなくなってしまうだろ。
>>362 スマソ。
ただ、
>>340 とかの問題は随分前から出てるみたいだし
先生に質問する時間は十分にあるんじゃないかなぁ、と思ってしまったので。
364 :
デフォルトの名無しさん :03/11/19 22:01
C言語でのプログラムをご教授ください。 次の自然数eを求めよ。 e = 1 + 1/1! + 1/2! + 1/3! + … よろしくお願いします。
365 :
デフォルトの名無しさん :03/11/19 22:05
>>339 1は
#define func(x) (x*x)
使う時は
at=func(a);
2は問題の意味分からん。
366 :
デフォルトの名無しさん :03/11/19 22:07
コンパイルが通らないんですけどどこが悪いんでしょうか? #include<stdio.h> #include<math.h> #include<stdlib.h> #define EPS 1.0E-8 void main(void) { int n ; double x_0; double x_n; double x_(n+1); double f(x_(n+1)); printf("syokichi x_0 = "); scanf(" %lf " , & x_0); x_n = x_0; for(n=0 ; n<=29 ; n++); { x_(n+1) = x_n - (x_n - eps(-1 * (x_n) * (x_n) / 2)) / (1 + (x_n) * eps(-1 * (x_n) * (x_n) / 2)) f(x_(n+1)) = fabs(x_(n+1) - x_n); printf("n = %d \n " , n+1); printf("x_(n+1) = %f \n " , x_(n+1)); printf("|f(x_(n+1))| = %f \n " , f(x_(n+1))); if(f(x_(n+1)) <= EPS) exit(1) } }
>>340 #include <fstream>
#include <iostream>
#include <list>
main()
{
using namespace std;
list<string> lst;
string str;
for(;;)
{
getline(cin, str);
if(!cin)
break;
lst.push_back(str);
}
lst.sort();
for(list<string>::iterator it = lst.begin(); it != lst.end(); ++it)
cout << *it << endl;
}
double x_(n+1); double f(x_(n+1));
問題はあのままでした。 for文と数学関数という回の授業の宿題でした。
>>356 log(1+x)=(-1)^n*x^(n+1)/n+1
多分、nは0から始まると思うです。
>356 Σのところはfor(i=1 ;; i++) 近似値の条件になったらbreak;しないと無限ループになるから注意 ^のところは#include <math>してpowを使う ・・・解答になってないかな?
>365 要するに、 at = func(a) #ifdef DEBUG printf("a=%f\n",a); #endif ってことでは?
374 :
デフォルトの名無しさん :03/11/19 22:33
>>364 #include <stdio.h>
double kaijou(double x)
{
if(x<2){ return 1;}
else{return x*kaijou(x-1);}
}
int main ()
{
double e=0;
double i;
for (i=0;i<6;i++){
e += ( 1/kaijou(i) );
}
printf("%lf\n",e);
return 0;
}
こんなもんでいかが?
375 :
デフォルトの名無しさん :03/11/19 22:39
>>369 Cは専門外でわからないですよ。
いきなりCの課題出されてプログラムの辞書片手にここまでがんばったですが、
エラーメッセージの意味がさっぱりです。
教えてください・・・
>357 エラーメッセージを教えてください…
377 :
デフォルトの名無しさん :03/11/19 22:49
>375さん 変数宣言のところの書き方変です。 変数を宣言する時に計算させてはいけません。
ゴメン、logの話きいてて、ギモンに思ったんで、横から質問させてください。 log(1+x) = x - x^2/2 + x^3/3 - x^4/4 ... って log(y): 0<y≦2 の範囲なら収束するでしょうが、 log(10)とかって収束するかしら・・・オーバーフローしそうな気配なんですが。 解説ページとかあれば、教えてください。
double x_(n+1); double f(x_(n+1)); これだな
380 :
デフォルトの名無しさん :03/11/19 22:53
>>376 コンパイル作業は学校でやってたのでちょっと覚えてないです。
家のパソコンにコンパイラインストールしようと思ったのだけどなせかうまくいかなくて
家で考えて学校でコンパイル挑戦の繰り返しが現状です。
あと6こぐらいエラーが残っていたような・・・
>>378 「log テイラー展開 収束 不定」でぐぐった一番上。
>378 log(10)って普通に計算すると1だよね? ってゆ〜かlogの底って10だっけ? 近似計算中で最大の桁は10^11になるからlong型だとオーバーフローするけど double型なら問題ないんじゃないかな? (桁の少ない部分との加減算で丸め誤差がでちゃうけど) ↑の文章はてけとーなんで根拠はないっす
>>340 このスレくらい読(ry
Ctrl+F で sort くらい検索してもいいんじゃないか
>>381 サンクス。分かりやすいページですね。感謝。
読んで思ったのは・・・
>>356 の問題は定義だけでは組めませんな
けっこう難易度高いっすね・・・。
>>382 うーむ。log10ではなく、lnのほう。
logの底はeでお話すすめてるです。
文化によって底が変わるんですよね(^^;;
385 :
デフォルトの名無しさん :03/11/19 23:40
386 :
デフォルトの名無しさん :03/11/19 23:54
387 :
デフォルトの名無しさん :03/11/19 23:56
388 :
デフォルトの名無しさん :03/11/19 23:59
296の書き込みをしたものですが、いくら考えても全然わからないので どなたかわかる方よろしくお願いいたします。
389 :
デフォルトの名無しさん :03/11/20 00:02
>>388 誰もやってくれないみたいだよ
あきらめが肝心
391 :
デフォルトの名無しさん :03/11/20 00:03
>>378 確かにx^1, x^2, x^3, ..., x^n, ...
というので分解するとxが1より大きいと発散しますね。
sin(2nπx), cos(2nπx), ....
や、
exp(i2πx), exp(i4πx), ..., exp(i2nπx), ...
というので分解すれば、収束するかな?
大学1年でやったはずだがもうすでに忘れている自分がなさけないよ。
392 :
デフォルトの名無しさん :03/11/20 00:13
>>390 bを求めるというのが課題なんですけど逆行列を求める
プログラムを関数形式で呼び出すようなことを言われました。
あとは残りのX'の行列とyベクトルとの積を求めるみたいです。
393 :
デフォルトの名無しさん :03/11/20 00:15
>>296 よく分からないけど、
「C言語によるアルゴリズム辞典」奥村晴彦著 技術評論社
あたりを読めば何か分かるんじゃないか?
394 :
デフォルトの名無しさん :03/11/20 00:16
>>296 >>394 要は、「逆行列」と「行列の積」を計算する部分を作れ
ということではないの?
それならこの本に載ってるよ。
>>395 ならあなたが答えてあげましょうよ。ここはそういうスレッドなんだから。
>>396 ごめん。
でもすごく長いので打ち込めません。
この本は役に立つのでこの際買った方がいいと思うよ。
400 :
nanasi :03/11/20 00:36
質問があります #include <stdio.h> int add(int n); void main(void) { int i= 1; printf("1st time ; i=%d,address=%x\n",i,&i); i = add(i); printf("2nd time ; i=%d,address=%x\n",i,&i); i = add(i); printf("3rd time ; i=%d,address=%x\n",i,&i); } int add(int n) { int i=0; printf("add function; i=%d,address=%x\n",i,&i); i+=n;←なんでここにnを代入するのかわかりません教えてください・・ほんとに・ ここにnを代入する必要があるのでしょうか? nを代入する意味が知りたいのです このプログラムの意味は1つの引数を与えて加算する関数ですちなみに自動変数です return i;
401 :
デフォルトの名無しさん :03/11/20 00:40
>>400 nを代入するんじゃなくてiとnを足したものを代入するんだがな・・・
i+=n; というのは、C言語独特の書き方で、 i=i+n; の意味だよ。
>>400 なんとなく入れたいから。
もしくは宗教または思想上の理由があるから
logの雛型。やりすぎちゃうと、log(1+x) = x - x^2/2 + x^3/3 ... が原型をとどめないので、この程度にしとく。 あとは・・・εがらみは誰かやってつかぁさい・・・数列の定義がわからないので、括弧で意味を明瞭にしてくれると、だれかやってくれるでしゃう。 double mylog(double x) { double u, y = 0; int i; if (x <= 0) return 0.0; if (x >= 2) { /* xが大きいと定義のままでは発散するので x = (1+u) / (1-u)とし、 log((1+u)/(1-u)) = log(1+u) - log(1-u)として解く */ u = (x - 1.0) / (x + 1.0); return mylog(1.0 + u) - mylog(1.0 - u); } for (i = 1; i < 1000; i++) y += pow(-1.0, i+1) * pow(x - 1.0, i) / i; return y; }
406 :
デフォルトの名無しさん :03/11/20 00:49
>>400 その関数の意味が不明。
関数に何をさせたいのか詳しく書くべし。
>>400 えーっと。いいところに目をつけてます。
>>401-402 のとおりです。
一応、補足。
この場合、iは自動変数で、すぐリターンしちゃってますから、
i += n;
return i;
と
return i + n;
は同じ意味になります。
マルチポストに徹底的にレスするのが流行なのか?
>>408 お前みたいなやつは荒らし扱いされるのが今の風潮
iが自動変数だってことになんか意味あんのか?
>>412 質問者の意図はstaticでない変数(=自動変数)にreturn直前に代入すんのは意味無いじゃんとゆーことでわ?
staticな変数だったら次に関数が呼ばれたときも、値は有効ってことだし・・・。
ここ、試験でます(笑)
415 :
nanasi :03/11/20 01:14
なぜi=i+nをする必要があるのですか?
418 :
デフォルトの名無しさん :03/11/20 01:17
>415 意味ないね。 コンパイルのとき最適化したらそこの部分省かれそう.
つ、つまんねぇ…
宿題スレでなにやってるんだ?これは
VC6の出力結果です。 =============== 1st time ; i=1,address=12ff7c add function; i=0,address=12ff20 2nd time ; i=1,address=12ff7c add function; i=0,address=12ff20 3rd time ; i=1,address=12ff7c ================== 要は、初期値付き自動変数は関数を呼び出すたびに初期化されちゃうよ っていうのを試したかったのでは? i=0;を static i=0; にしたり、 関数の外で宣言すると結果が変わるよ。
>>414 あぁ、そゆことかぁ…。処理的に意味あんのかと思ってた(w。
てか宿題なのか?これ?
ちゅーか >このプログラムの意味は1つの引数を与えて加算する関数ですちなみに自動変数です 加算してないよね、このソースだと。
>>423 間違い探しか?
「このプログラムは足し算をしようとして作ったのですが
結果が思った通りになりません。なぜでしょう。理由を述べなさい」
みたいな。
まぁ
>>400 は釣りで荒らしでスレちがいってことだな
なるほど、寝よ寝よ....
428 :
デフォルトの名無しさん :03/11/20 01:59
文字列の配列と文字列の数を引数としてとり、最 の文 字列の文字数を す関数を作成せよ。関数プロトタイプ を使うこと。
429 :
デフォルトの名無しさん :03/11/20 02:00
↑訂正 文字列の配列と文字列の数を引数としてとり、最大の文 字列の文字数を返す関数を作成せよ。関数プロトタイプ を使うこと。
430 :
デフォルトの名無しさん :03/11/20 02:01
>>429 最大ってのは最長という意味でいいのか?
それとその関数のプロトタイプを示せ。
ポインタ配列(へのポインタ)を受けて最長の文字列へのポインタを返すならこんな感じ。 #include <string.h> #include <stddef.h> char *f(char **a,size_t n) { size_t i; char *max=a[0]; for(i=1;i<n;i++) if(strlen(max)<strlen(a[i])) max=a[i]; return max; }
>>428 テストしとらんが。
#include <string.h>
int maxstrlen(char *str[], int nstr)
{
int max = 0;
int i;
for (i = 0; i < nstr; i++) {
if (strlen(str[i]) > max)
max = strlen(str[i]);
}
return max;
}
文字"数"を返すのか。勘違いした。
434 :
デフォルトの名無しさん :03/11/20 03:26
「キーボードから行列式を入力して、その逆行列を求める プログラムを作成せよ。」という課題なのですが、 さっぱりわからないのでどなたかわかる方いらっしゃいましたら 教えていただけないでしょうか。よろしくお願いします。
>>356 おいら、数学苦手なんで、適当に補完&分解して理解してみる。
log(1+x) = Σ{(-1)^n * x-(n+1)/(n+1)} (Σはn=0から∞)
これは、
log(1+x) = x - x^2/2 + x^3/3 - x^4/4 ...
ということ。
んで、数列{Cn}は、
C0 = x - x^2/2
C1 = x^3/3 - x^4/4
C2 = x^5/5 - x^6/6
C3 = x^7/7 - x^8/8
とゆーことで、logの項、2つずつですね。
終了条件が面倒ですが・・・ここまで解析すれば、だれか作ってくれるはずー
>>434 ひょっとして、
>>296 ?
すまん、行列はもうわすれちった。
とりあえず、行列「式」はつらいかも、行列だけなら読み込めるかも。
>>297 あたりに読み込み例があるよん。
逆行列は
>>393 >>399 のgjmatinv.cがあるよん。
436 :
デフォルトの名無しさん :03/11/20 05:16
>>435 297の読み込み例はどーいう意味なんだろ・・・。
行列「式」ではなく、行列を読み込むみたいです。
書き間違いで申し訳ないです。
gjmatinv.cを見てみたのですが、これってmain関数がないのですが
どーやって実行すればいいのですか?
297ではベクトルYと行列X、ついでにXの転置行列(X')をを読み込んでます。 ファイルから読み込んでるけれど、テキスト形式なので、応用できるはず。 gjmatinv.cの書籍版では関数の一部ってことで、あのソースが載っている。 松坂大のftpサイトに置いてあるやつは、mainとかユーティリティとかついてるんで、参考になるかも。 (でも、297がわからんのなら、読んでも分からんかも) んで、説明するのは俺には荷が勝ちすぎる。スマン。 行列関係のプログラムは1からやると、手間が結構かかるし 説明するのも大変なので、おいらはパス・・・。 余裕のあるかたよろしくー。
438 :
デフォルトの名無しさん :03/11/20 11:24
>>437 松坂大のページにはいけるのですが、ftpサイトはがわからないので
教えていただけないでしょうか?
>>438 松坂大っつーとアルゴリズム辞典の奥村教授がいなかったっけ?
440 :
デフォルトの名無しさん :03/11/20 15:24
おい、おまいら。 LPSTRってなによ。 教えていただきたい。
441 :
デフォルトの名無しさん :03/11/20 15:29
fscanfを使ってファイルからデータ(数字)を読み取りたいのですが そのファイルが a=[TAB]4.0 b=[TAB]5.0 … となっているときどうやったら"a="や"b="を飛びぬいて 数値を読み取ればいいでしょうか? 教えてくださいまし。
442 :
デフォルトの名無しさん :03/11/20 15:50
>>440 名前がわかってるなら[LPSTR]でぐぐれ
>>441 fscanf (fp, "%s %f", s, &d);
とかじゃないかなぁ?
fscanfを絶対使わなければならないなら、しょうがないので
>>442 そうでなければ、1行まるまるfgetsしたあとstrstrでタブを探してそこからatofかな?
444 :
いなむらきよし :03/11/20 16:15
キケー!
このスレで、まだ未処理の課題ってナニよ?
446 :
デフォルトの名無しさん :03/11/20 17:59
すいません、どうしても解けない問題があります。教えてください。 PIC16F628を用いパソコンからデータをRS−232経由で入力し文字だったらパソコンにその文字を表示し、それ以外ならば、パソコンにSONOTAを表示する。 また、データ入力が5秒間なかったらパソコンに入力を促すメッセージを表示する。 なお、RS232のプリプロセッサは #USE RS232(BAUD=9600,XMIT=PIN_B2,RCV=PIN_B1,PARITY=N,BITS=8) delayは #USE delay(CLACK=10000000)とし メインプログラム上に kbhit() と getc() 関数を使用する。 開発環境はマイクロチップ社製のMPLABです。 よろしくお願いします。
447 :
デフォルトの名無しさん :03/11/20 18:03
448 :
デフォルトの名無しさん :03/11/20 18:09
int変数へのポインタを渡すとその変数の値0にリセットする関数resetを 作成しなさい。次のプログラムは0を出力する。 #include <stdio.h> int main (void) { int x = 3; reset(&x); printf("%d", x); return 0; } すみませんが、教えてください。 よろしくお願いします。
お前らプログラミングなんてしてないで、FF12の動画でも見てろよ。
>>446 うーん。説明を聞くと、
データをパソコン→PIC16F628の方向で転送。
表示はパソコンで行う・・って読めるのでヘンだぞ。
あと、PICマイコンのネタだろうから、その手のスレなりサイトなりにいかれたほうがよいよん。
#include <stdio.h> void reset(int *ip) { *ip = 0; } int main (void) { int x = 3; reset(&x); printf("%d", x); return 0; }
452 :
デフォルトの名無しさん :03/11/20 18:22
失礼します。 ある化学計算の結果を出力したファイルがあるんですが、今のフォーマットだと 横の要素が多すぎてエクセルで読むときに256列に収まらないんです。 そこで行と列を入れ替えるプログラムを作れ、と言われたんですが・・・ ファイルの中身は下にある通りです。 <ここから> Ce 0.000000e+00 2.199287e-23 3.044799e-23 ・・・ 7.181741e-22 7.227594e-22 O 0.000000e+00 1.329526e-22 1.693419e-22 ・・・ 1.923636e-21 1.935146e-21 Sm 0.000000e+00 2.587025e-23 4.084738e-23 ・・・ 1.024761e-21 1.032128e-21 <ここまで> 実際には数字が1000個とか各行に並んでます。 どなたか助けてください。
>>352 (お礼)遅れましたが、どうもありがとうございます。
スクリプト向きな問題だなぁ。C/C++でないといけないのか?
>>453 #include <iostream>
int main(void)
{
std::string word;
while (std::cin >> word)
std::cout << word << std::endl;
}
C言語で数式計算するプログラムを 明日まで作らなくてはならないのですが fを代入してxを求めよ。(r1,r2は定数) x = √(1/(2πf*2πf*r1*r2)) よろしくおねがいします。
>>458 #include <stdio.h>
#inlcude <math.h>
#define PI 3.1415
#define r1 1
#define r2 2
double calc(double f){
return sqrt(1 / (2*PI*f*2*PI*f*r1*r2));
}
in main(){
double x = calc(10);
printf("x = %f\n",x);
}
461 :
デフォルトの名無しさん :03/11/20 21:00
めちゃくちゃ初歩的な質問なんですが。 #include <stdio.h> int main(void) { int i,no; printf("整数を入力してください。:"); scanf("%d,",&no); i=1; while(i<=no){ printf("%d",i*2); /*--- iを二倍にする---*? } return(0); } と、いうソースでコメントが書いてあるように変数iを二倍にしていくにはどうしたらいいのでしょうか? ただ、1を足すだけなら ++ ですむのですが。二倍にはできません。よろしくお願いします。
補足 printf("%d",i*2); ←これだと、2が永遠に出るだけでした。
間違えた…すいません、コメントの部分ですけど。 #include <stdio.h> int main(void) { int i,no; printf("整数を入力してください。:"); scanf("%d,",&no); i=1; while(i<=no){ printf("%d",i*2); /*--- iを二倍にする---*/ } return(0); }
i *= 2; をしなさい
>>464 はprintfの中に入れられないので注意(^^;;
>>463 printf("%d",i*=2);
とか
printf("%d",i<<=1);
とか
printf("%d",i+=i);
とか
printf("%d", i);
i = i * 2;
とか
>>465 日本語が少しおかしい。
>>463 要するに i * 2 の値を表示してるだけで、i の値は何も変わってないってことだ。
ふみー。
>>453 の解答つくったんだけれど、90行くらいあるー。
なさけないのでお蔵入り。
>>468 入力部:
行=列=0
while (ファイルの終わりまで) {
項目を受け取る。
項目を表(行、列)に登録。
列++;
空白を読み飛ばす(このとき改行があれば、行++;列=0とする)
}
出力部:
入力の列と行を入れ替えて表示
いじょ!
>>469 態々アリガトン、参考になった。
やっぱドドーンって感じだね。
>>453 int main(int argc, char *argv[])
{
int i, j;
int m = atoi(argv[1]);
int n = atoi(argv[2]);
char **tab, s[100], fmt[20];
sprintf(fmt, "%%%ds", (int) (sizeof(s) - 1));
tab = (char **) emalloc(sizeof(char*) * m * n);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
scanf(fmt, s);
tab[i*n+j] = estrdup(s);
}
for (j = 0; j < n; j++) {
printf("%s", tab[j]);
for (i = 1; i < m; i++)
printf(" %s", tab[i*n+j]);
printf("\n");
}
return 0;
}
>>473 の前にこれが必要。
コマンドライン引数に行、列の数を渡してやる必要あり。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void *emalloc(size_t size)
{
void *p = malloc(size);
if (p == NULL) {
printf("no memory\n");
exit(2);
}
return p;
}
char *estrdup(char *s)
{
char *t = emalloc(strlen(s)+1);
strcpy(t, s);
return t;
}
ダブルポインタを使って入力された文字列(2個以上)を 先頭文字(同じなら次の文字)順にソートして出力すると言う課題を出されたんですが ソート関数に渡した後、文字列を一括で変換するのはどうすればいいんでしょう? 私がやれたのは buf[cnt1] = **(spstr+cnt1); **(spstr+cnt1) = **(spstr+cnt2); **(spstr+cnt2) = buf[0]; って感じのをforで回して一文字ずつ変換していく事しかできませんでした どなたかヒントを頂けないでしょうか(´・ω・`)
>>460 ありがとうございました。
って誤字直してもうまく動かないです…。
fを入力して、xを求めたいのですけど。
in main(){ double f,x; y = 10; x = sqrt(1 / (2*PI*f*2*PI*f*r1*r2)); printf("x = %f\n",x); }
入力?代入と違うのかよ int main(){ double f,x; scanf("%lf",&f); x = sqrt(1 / (2*PI*f*2*PI*f*r1*r2)); printf("x = %f\n",x); }
>>475 こんなのどう?
#include <stdio.h>
#include <string.h>
#define NDATA 5/* 配列の数 */
char *testdata[NDATA] = {"ACC", "ABB", "ABC", "ABCD", "ABD", };
void strsort(char **data, int ndata)
{
int i, j;
char *tmp;
for (i = 0; i < ndata - 1; i++) {
for (j = i + 1; j < ndata; j++) {
if (strcmp(data[i], data[j]) > 0) {
tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
}
}
void main(void)
{
int i;
strsort(testdata, NDATA);
for (i = 0; i < N; i++) {
puts(testdata[i]);
}
}
>>475 部分だけ書かれてもよくわからない。
ややこしくなってるのは、方針がおかしいせいかもしれない。
すいません、説明不足でした
引数つきmain()を使いコマンドラインから入力する奴です
>>479 ありがとうございます
早速試してみます
問1)C言語プログラムソース中の識別子のみ出力するプログラムを書け。 問2)問1のプログラムを発展させ、C言語プログラムソース中の任意の識別子を置き換えるプログラムを書け。 よろしくおねがいします。
483 :
デフォルトの名無しさん :03/11/20 23:34
あほらしい質問でわるいんですが 1/2 でなぜか0.000000となってしまうのですが・・・。1/2なども同様の結果でした 。しかし10/10などはしっかりと1と表示されたのですが。もちろん floatも使用してます
>>482 英数字の連続を取り出して予約語を取り除く
487 :
デフォルトの名無しさん :03/11/20 23:40
>>485 ,486
ありがとうございます。
できればそのようにしなければならない理由を教えていただけないでしょうか
488 :
デフォルトの名無しさん :03/11/20 23:44
>>489 確か、専門学校の先生が作ってるんだってね。
492 :
デフォルトの名無しさん :03/11/20 23:49
>>488 一番上の図が見る角度によって無色だったり青色だったりするんだが、
俺の目がおかしいのか?それともディスプレイ(液晶)のせいなのか?
>>482 ここからはじめてみれば?
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
return 0;
}
>>490 >文字列やコメントは除かんとダメだろ。
これって、やったことあるけどすごい大変だった覚えがある。
宿題のレベルでそこまでやるのかな?
>>482 問題にソースの例はついてないの?
>>494 #if 0 ならともかくコメントのネストはできないからそんなに大変じゃないだろ?
496 :
デフォルトの名無しさん :03/11/21 00:00
>>482 まず、文脈(変数宣言、関数、式、for文、while文、if文、文字列リテラル...etc)ごとに解析関数を作成する。
文脈ごとの解析関数は
1.文脈が終了するまでの文字列をバッファに読み込む。
2.文字列を「区切り文字列」を使用してトークンに分割する。
3.トークンはそれぞれキーワード、演算子、識別子などに分割されているので、
それを解析する。
4.解析が終了したら解析モードを適当なものに遷移させる。(このとき解析用のスタックを使ったりする)
おっ、なんかだんだんコンパイラができるような気がしてきたよ。
文字列モード,コメントモード,通常モードの3つのモードを切り替えながら 通常モードの時だけ英数字の連続を読み取り,識別子として格納する 1-passで済ませるならね
コメントの最中に'/'やら'*'が単発で入ってくることもあるので、 それを除くために状態遷移で処理するようにしたような... 難しく考えすぎたのか?もっと簡単にできるのか?
>>442 fscanf(fp, "%*s%f", &d);
// sは要らん。
解析用のスタック → 状態遷移用のスタック
501 :
デフォルトの名無しさん :03/11/21 00:11
もっと気合い入れて500ゲットせんかい!!
>>489 労作かも知れんが、間違いと勘違いだらけだ。
回答例も解説が間違っているし、こんな香具師に教わる奴がかわいそうだ。
503 :
デフォルトの名無しさん :03/11/21 00:14
504 :
デフォルトの名無しさん :03/11/21 00:15
普通のC入門レベルの出題なら、 文字列定数とコメント中の識別子風文字列も、 識別子として扱ってよいとかなんとかいう但し書きをつけるな そうじゃなきゃ、ちゃんとCPPかました上でパーズしろ!って出題か
505 :
デフォルトの名無しさん :03/11/21 00:15
パースです。
アフォにアフォって言われた。悲しい。
マジにやるとつらそう。識別子問題。
状態遷移でやるのが簡単そうだけれど・・・数の後に来る接尾辞(1UL)、ワイド文字列L""とかがつらいよねぇ・・。
コンパイラ作るのが最終課題なの?
>>482 そしたら、
>>496 のよーな形になると思うんだけれど。
>>503 float使う癖がついたらどうする。
(long) a + b が a + b をキャストしていると信じたらどうする。
513 :
デフォルトの名無しさん :03/11/21 00:41
>>508 プリプロセッサの ## によるトークンの結合はどうすんの?
>>513 プリプロセッサを考慮したら面倒だから無視だろ
ギロンもいいが、ソースみせれ。
>>515 ギロンも固まらないうちにコーディングにとりかかるのか
立てよ国民!
ガノタは帰れ。帰れよぅ。
ついワラタ
つまり、曖昧な仕様ってことか
任意ヲタは帰れ!
つまり、出題ミスってことか
つまり、帰れって事か
めぞん一刻の管理人さん = しょくぱんまん
問題が出てもソースが得られない。 なぜだ!
教えて君は嫌いだ!ずうずうしいから!
マジレスつまんねぇです
>>527 日頃面白いことばっかだと、それこそつまらんぞ。
だからこそのクソレスだ。覚えとけ。
再帰アルゴリズムを1つ選び、アルゴリズムの説明とC言語による実装を示せ。 という宿題出されました。 学校での例は、PC98でTouboCつかって、グラフィックでした。 フラクタルとか先生いってました。 グラフィックはめんどくさそうなので、やりたくないです。 なにか楽で面白そうなものはないでしょうか。
しんぷるにはのい
更にシンプルに階乗計算
再帰の説明に階乗なんて使ってる参考書は糞。
>>531 ハノイの塔 - Tower of Hanoi -
#include main(void)
{
printf("インドに梵天の塔という・・・");
/* ... */
return 0;
}
階乗計算
int kaijou(int n)
{
int k = 1;
while (n > 1)
k *= n--;
return k;
}
マンデルブローとかどうよ
537 :
デフォルトの名無しさん :03/11/21 03:21
538 :
デフォルトの名無しさん :03/11/21 03:27
>>531 // コンビネーションのプログラムを解説してみたら?
#include <stdio.h>
int combi(int l, int r)
{
if (r <= 0)return 1;
return l / r * combi (l - 1, r - 1);
}
int main()
{
int i, n;
printf ("nCiを入力>>>");
scanf ("%d %d", &i, &n);
printf ("%d\n", combi (i, n));
return 0; /* 正常終了 */
}
>>535 すべってる。
>>538 うまい。特に、計算できないところがマル。
ネタ系プログラム好きだなァ。
540 :
デフォルトの名無しさん :03/11/21 05:01
>>539 あっ、まじで?
元々combi (5,3)とか実数で入れてたから、これで動作確認してない罠
複雑な再帰呼び出しを操れる奴ってやっぱり頭が良いんだな。
542 :
デフォルトの名無しさん :03/11/21 06:23
>>539 お褒めの言葉ありがたく受け取るよ
#include <stdio.h>
int combi(int l, int r)
{
if (r < 1)return 1;
return l * combi (l - 1, r - 1) / r;
}
int main()
{
int i, n;
printf ("nCiを入力>>>");
scanf ("%d %d", &i, &n);
printf ("%d\n", combi (i, n));
return 0; /* 正常終了 */
}
これなら文句ないでしょ?
l*combi(l-1,r-1)ってrの倍数なのか。頭いいなぁ。 パスカルの三角形のほうで考えてたから、でてこなかった。 ああ、そうか。 combi(5,3) = (5 * 4 * 3) / ( 3 * 2 * 1) の式で考えたんだね。納得。
ある数の数字の和が、それらの数を構成する素因数の数字の和に等しい場合をスミス数と呼ぶ。例えば、 9985 = 5 x 1997 9 + 9 + 8 + 5 = 5 + 1 + 9 + 9 + 7 6036 = 2 x 2 x 3 x 503 6 + 0 + 3 + 6 = 2 + 2 + 3 + 5 + 0 + 3 なので9985や6036はスミス数である。 このような数を出来るだけ多く見つけよ。
>>544 Cマガ電脳パズル? 読んでわかんねーけど。
546 :
デフォルトの名無しさん :03/11/21 07:37
平均値を出したいんですが、でません。 ↓何処がいけないんでしょうか? float List::Average() { int sum = 0; for ( temp = head; temp != NULL ; temp = temp->next ){ sum = sum + temp -> item; } return ( sum / float(count)); }
547 :
デフォルトの名無しさん :03/11/21 07:39
>>546 あなたの質問の仕方がいけないんでしょうか
548 :
デフォルトの名無しさん :03/11/21 07:41
struct _hoge{ int item; struct _hoge *next; } かなとは思うけど countはナニ? (float)sumともしなくちゃまずくない?
>>548 拙くない。全く問題ない。
寧ろ、floatにすることの方が問題。
>>546 教えてもらうときは、相手のことも考えましょう。
必要な情報がないので、答えられません。
ソースリストのすべてを貼ると答えてもらえるかもしれません。
でも、40行を越えると読むのも大変なので、
40行以内のプログラムにしてから、ソースを貼ってみましょう。
552 :
デフォルトの名無しさん :03/11/21 08:45
C/C++ Win32API のソース用のうpろだが一つほしいね。 あと C と C/C++ スレを統一するといいかなって思うけどどう?
>>434 (もしかするともう遅いかもしれないが)次でどうだ?(整形・修正は自分で)
/*逆行列の計算*/#include <stdio.h>#include <stdlib.h>#include <math.h>
#define N 5#define EPS 0.0000001#define abs(d) ((d)<0.0?-(d):(d))
#define FORALL(i) for((i)=1;(i)<=N;(i)++)
#define FORALL2(i,j) FORALL(i) FORALL(j)double m[N+1][N+1],im[N+1][N+1]
,kz[N+1][N+1];double ScnDbl(){char s[512];scanf("%s",(char*)&s);return
atof((char*)&s);}void PrtMat(char *s){int i,j;printf("%s\n",s);FORALL(i)
{FORALL(j)printf("%f ",m[i][j]);printf("\n");}}void sc(int i,double r)
{int j;FORALL(j){m[i][j]*=r;im[i][j]*=r;}}void sca(int i,int j,double r)
{int k;FORALL(k){m[i][k]+=r*m[j][k];im[i][k]+=r*im[j][k];}}void InvMat()
{int i,j,k;double r,s;FORALL2(i,j)im[i][j]=0.0;FORALL(i)im[i][i]=1.0;
FORALL(j){if(abs(m[j][j])<EPS){r=0.0;for(i=j+1;i<=N;i++){if(r<(s=abs(
m[i][j]))){k=i;r=s;}}if(r<EPS){printf("\nNon-Reversible matrix\n");exit(
-1);}else sca(j,k,1.0);}sc(j,1.0/m[j][j]);FORALL(i)if(i!=j)sca(i,j,
-m[i][j]);}FORALL2(i,j)m[i][j]=im[i][j];}void Kenzan(){int i,j,k;
FORALL(i)FORALL(j){m[i][j]=0.0;FORALL(k)m[i][j]+=im[i][k]*kz[k][j];}}
int main(){int i,j;FORALL(i)FORALL(j){printf("(%i,%i)=>",i,j);m[i][j]
=ScnDbl();}PrtMat("Entered:");FORALL(i)FORALL(j)kz[i][j]=m[i][j];
InvMat();PrtMat("\nInversed matrix=");Kenzan();PrtMat("\nCheck");
return 0;}
#include <stdio.h> int hoge(int n) { int x = 0; for (; n > 0; n /= 10) x += n % 10; return x; } int smith(int n) { int x = hoge(n), y = 0, z; for (z = 2; n > 1; ) if (n % z == 0) { y += hoge(z); n /= z; } else z++; return x == y; } int main(void) { int i; for (i = 0; i <= 10000; i++) if (smith(i)) printf("%d\n", i); return 0; }
557 :
デフォルトの名無しさん :03/11/21 10:04
次のように処理させるプログラムを書きたいのですが、当方頭が足りないため かけません。だれか教えてください。 _____________________ 二つの整数を入力してください。 整数1:37(任意の数) 整数2:28(任意の数) 28以上37以下の全整数の数の和は325です。 _______________________ 誰か教えてください。
558 :
デフォルトの名無しさん :03/11/21 10:06
あ、C言語で書きたいです。
559 :
デフォルトの名無しさん :03/11/21 10:13
マズ、大きいほうを選ぶ 大きいほうまでの階上を求める。 小さいほうの階上で引く じゃない?
int hoge(int x, int y) { return (x==y)?x:(x<y)?x+hoge(x+1,y):hoge(y,x); }
561 :
デフォルトの名無しさん :03/11/21 10:15
あっ、階上じゃなかったんだね・・・ごめん
562 :
デフォルトの名無しさん :03/11/21 10:19
563 :
デフォルトの名無しさん :03/11/21 10:23
みなさんありがとうございます。 do関数を使ってやってくれたらうれしいです。
564 :
デフォルトの名無しさん :03/11/21 10:30
>563 do{}while();ですか? 二つの数が等しい時どう処理するんでしょ? 頭が足りないので分かりません。
>>560 int hoge(int x, int y) {
int n = y - x;
if (x > y) { x = y; n *= -1; }
return n * (n+1) / 2 + x * (n+1);
}
>>563 どれを?
関数じゃないというつっこみは禁止なんだ
int hoge(int x, int y) { int n; if (x > y) return hoge(y, x); do n += x++; while (x != y); return n; }
while (x != y);は while (x < y);
569 :
デフォルトの名無しさん :03/11/21 10:34
>>565 557です。まだプログラム習いたてで…。
初期化忘れた。 int hoge(int x, int y) { int n = 0; if (x > y) return hoge(y, x); do n += x++; while (x <= y); return n; }
571 :
557できません>_< :03/11/21 10:41
#include <stdio.h> int main(void) { int x,y,n; printf("input?\n");scanf("%d",&x); printf("input?\n");scanf("%d",&y); int hoge(int x, int y) { int n = 0; if (x > y) return hoge(y, x); do n += x++; while (x <= y); return n; } printf("和は %d です\n",n); return (0); }
>>557 main関数は適当に作って
int sowa(int x,int y)
{
int total=0;
do{
total+=x;
x++;
}while(x<y);
return total;
}
#include <stdio.h> int main(void) { int x,y,n; printf("input?\n");scanf("%d",&x); printf("input?\n");scanf("%d",&y); n = 0; if (x > y) x ^= y ^= x ^= y; do n += x++; while (x <= y); printf("和は %d です\n",n); return (0); }
574 :
ありがとうございました :03/11/21 11:50
みなさんありがとうございます。助かりました!
575 :
デフォルトの名無しさん :03/11/21 19:43
1.以下のプログラムの関数func()を引数付きマクロ定義で書き直せ。 main() { int i = 1; double a; double func(double); a = 0.1; while(i < 10); { at = func(a); i++; } printf("%lf", a); } double func(double x) { doubule y; y = x * x; return(y); } 2.上記のプログラムの先頭で"DEBUG"が定義されたときに while文の中の変数aの値を表示するように書き直せ。 をよろしくお願いします。
577 :
デフォルトの名無しさん :03/11/21 20:15
1秒未満の時間をカウントする関数ってありますか? time(NULL)だと全部0秒になってしまうので
>>339 >>575 at = func(a);
じゃなくって、
a = func(a);
だべ?
問2は
#ifdef DEBUG
#define DPRINTF printf
#else
#define DPRINTF (void)
/* 中略 */
while(i < 10);
{
DPRINTF("a = %f\n", a);
a = func(a);
i++;
}
/* 略 */
>> 577 clock()
ファイルの入出力の宿題で「入力しそれをデータに書き込み、(次回起動時に)そのデータをロードできる」ってのが出てる。 (実際はもう少し細かいけど、そのへんは割愛) んで、その場合って「データを直接改変した」時のことは考えなくても良いんかな。 宿題の設計仕様には入ってないから拡張機能になるけど・・・。 変にファイルから取得するデータ型が長かったときにだけ「データが改変された可能性があります」とかエラー出せば良いんかな。 いろんなことに対応してこうとすると切りがないよ……_| ̄|○ こんなことは最終的に教師に聞くべきなんだろうが、意見求む。
#endif… つかassertのが好き
ほんと。書き忘れ<#endif assertだと処理が終了しちゃわない? デバッグプリント入れるときってみんなどーしてる?
>>581 データ全体のMD5をヘッダとして書いといて、読み込みの時に比較ってのは?
>>581 >んで、その場合って「データを直接改変した」時のことは考えなくても良いんかな。
考えなくて良い。
宿題の範囲外でそーゆーことを考える人は好き。
誤って書き換えられたかをチェックするにはファイル内にチェックサムやらmd5やらを入れる。
不正に書き換えられたかをチェックするのは、対象ファイルだけでは無理。
>>581 宿題には必要ないが、仕事になったら必要。
というか、仕事で作るプログラムの大半はエラー処理が占めている。
考え方は正しい。
その心がけは忘れないように。
>>586 同意。
俺の書き込みで勘違い君を作るところだたよ。
588 :
デフォルトの名無しさん :03/11/21 23:32
C++で、テキストファイルを読み込み、値が大きいもの順にソートし、 テキストファイルに出力する宿題がでました。 わかりませんので、お願いします。 (例)入力ファイル(data.txt) 23 池田 25 山田 100 斎藤 出力ファイル(output.txt) 100 斎藤 25 山田 23 池田 と出力するプログラムです。 お願いします。
589 :
デフォルトの名無しさん :03/11/21 23:38
>>557 sum=(x>y)?(x+y)*(x-y+1):(x+y)*(y-x+1);
遅すぎ...
590 :
デフォルトの名無しさん :03/11/21 23:42
Cで基数ソートを使って10文字以下のアルファベットの文字列を 辞書式順序で出力するプログラムを作れ。 この問題が分かりません。誰か教えて下さい。 例)入力 出力 ehtudml abk iukll abkd abkd ehtudml abk iukll
>>557 1〜n の和は n*(n+1)/2
( n*(n+1) - (m-1)*m ) / 2
>>588 一応動く。/* sort.c : sort 入力ファイル名 出力ファイル名 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXITEM 100/* 最大行数 */
int main(int ac, char *av[]){
int i, j, nitem = 0;
FILE *fp;
char buf[BUFSIZ+1], char *item[MAXITEM], *p;
/* 読み込み */
fp = fopen(av[1], "rt");
while (fgets(buf, BUFSIZ, fp) != NULL) {
if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';/* 改行コードを取り除く */
item[nitem] = strdup(buf);
}
fclose(fp);
/* バブルソート */
for (i = 0; i < nitem - 1; i++) {
for (j = i + 1; j < nitem; j++) {
if (atoi(item[i]) < atoi(item[j])) {
p = item[i]; item[i] = item[j]; item[j] = p;
}
}
}
/* 出力 */
fp = fopen(av[2], "wb");
for (i = 0; i < nitem; i++) {
fprintf(fp, "%s\n", item[i]);
}
fclose(fp);
return 0;
}
#include <xxx.h> int main(int argc, char *argv[]) { >>>>int a; >>>>for(a=0; a<100; a++) >>>>>>>>func(); >>>>return 0; }
>>594 みやすいね。
受け取った側は>>>>をタブまたは空白に置換すればいいのね。
1タブ5カラムってK&Rの初版だっけ?
>>595 いいよね、こんなのも。
K&Rはわかんないけど、タブはこんくらいがいいと思ふです。
597 :
デフォルトの名無しさん :03/11/22 00:56
//Sort by using tree.(2分木を使ったソート) struct node { char *item;struct node *right;struct node *left;}; char *words[3]={"ehtudml","iukll","abkd","abk"}; struct node nodes[3],*root; root=&(nodes[0]); for(i=0;i<4;i++){node[i].item=words[i];node[i].right=NULL;node[i].left=NULL;} for(i=1;i<4;i++){addtree(root,&(nodes[i]));} pre_order_scan(root); void addtree(current_node,new_node){ if(strcmp(current_node->item,new_node->item)>0) { if(current_node->left==NULL){current_node->left=new_node}else{addtree(current_node->left,new_node);} } else { if(current_node->right==NULL){current_node->right=new_node}else{addtree(current_node->right,new_node);} } } void pre_order_scan(current_node) { if(!(current_node->left==NULL)){pre_order_scan(current_node->left)} printf("%s\n",current_node->item); if(!(current_node->right==NULL)){pre_order_scan(current_node->right)} }
俺から宿題
標準入力からCソースよ読み、
>>595 の形式で標準出力に書くプログラムを作成してちょ。
ポイントは以下
1)行頭のタブは>>>>って変換(複数タブがあるかもしれんから注意)
2)&て文字があったら、&って変換。
3)<って文字文字があったら、<って変換。
・・・てめぇでやれといわれそーだが(^^;;
まあ、暇つぶしだと思って、だれか作ってちょ。
全角ブランクでいいような気もするが・・・ #include <xxx.h> int main(int argc, char *argv[]) { int a; for(a=0; a<100; a++) func(); return 0; }
おしえてください。よく既存のアプリケーションをカスタマイズしてある フリーソフトとか既存のソフトの補助ソフトをよく見ますがC++でそういたものを作りたいのですが 既存のソフトのソースなしで作れるんですか?もし作れるのなら簡単な仕組みお教えてください たとえば真空波動拳とかWinMXのモニター見たいなやつです
全角ブランクのほーが見やすい。 が・・・コピペで使うひとで「異物」が入ってると分からんひとも居るかも。
>>600 その2つのソフトは知らんけど、グローバルフックでメッセージ横取りしてんじゃね?
というか、ソースがあれば、本体を変造したほうが楽。 簡単な仕組み、というと、アプリとOSの間に割って入って、 情報を収集したり、加工したりするわけ。
すみません。Cで質問です。 問題文 プログラムファイルと、出力結果ファイルを結合して1つのファイルに出力するプログラムを作成する。 コマンドラインからファイル名を指定する実用的な処理が出来るプログラムにする。 特に2文目が良く理解出来ません…お願いします。
>>604 この2つのパラメータの意味はご存知?
↓ ↓
int main(int argc, char *argv[])
606 :
デフォルトの名無しさん :03/11/22 01:28
>>606 ビルドしたら、コマンドプロンプト窓から
C:\>プログラム名 入力ファイル名 出力ファイル名
とやってくれ。
VCから実行時引数を渡せればいいのだけどやり方知らないので。
>>606 または、av[1]を"data.txt"、av[2]を"output.txt"に変更してみてくれ。
ファイル名が決め打ちになってしまうけど。
>>606 char buf[BUFSIZ+1], char *item[MAXITEM], *p;
は
char buf[BUFSIZ+1], *item[MAXITEM], *p;
の間違い。charが余計。これでコンパイルは通るはず。
あと、
/* 出力 */
fp = fopen(av[2], "wb");
は
fp = fopen(av[2], "wt"){
の間違い。
"wt"→"w" 環境依存のネタだが、VCにもstrdup()あったんだねぇ・・・
>>593 int main(int ac, char *av[]){
int i, j, nitem = 0;
FILE *fp;
char buf[BUFSIZ+1],*item[MAXITEM], *p;
/* 読み込み */
fp = fopen("data.txt", "rt");
while (fgets(buf, BUFSIZ, fp) != NULL) {
if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';/* 改行コードを取り除く */
item[nitem] = strdup(buf);
}
fclose(fp);
/* バブルソート */
for (i = 0; i < nitem - 1; i++) {
for (j = i + 1; j < nitem; j++) {
if (atoi(item[i]) < atoi(item[j])) {
p = item[i]; item[i] = item[j]; item[j] = p;
}
}
}
/* 出力 */
fp = fopen("output.txt", "w");
for (i = 0; i < nitem; i++) {
fprintf(fp, "%s\n", item[i]);
}
fclose(fp);
return 0;
}
としたのですが、output.txtには、何も出力されていませんでした。なにが、違うのでしょうか?
>>606 if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';/* 改行コードを取り除く */
item[nitem] = strdup(buf);
}
を
if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0';/* 改行コードを取り除く */
item[nitem] = strdup(buf);
nitem++;/*ここが抜けてた */
}
にして。
それから、ファイル名はとりあえず絶対パスで。このとき\記号は\\に換える。
>>593 うまく、いきました。
どうも、ありがとうございました。
615 :
デフォルトの名無しさん :03/11/22 12:26
>>590 >>591 radsort.cを実行したのですがうまくいきませんでした。
コンパイルエラーは出ませんでしたが実行しても動きませんでした。
>>615 1)あなたの環境は?(OS、コンパイラなど)
2)どのように実行しましたか?
3)どのような状態だったので「動かない」と判断したのですか?
学校の課題なのですが、 個人番号、名前をメンバとする構造体を作成し データの入力及び表示を行うプログラムを作成。 1件分の入力処理、表示は関数を作成すること。(表示は1件ずつではなく入力分まとめて出しても良いそうです 10件分の入力か、More input?(y/n)の問いかけに対してn(N)と答えた場合に 入力処理を中断し、データを表示します。 個人番号は1〜100の範囲で範囲外番号か登録済み番号が入力された場合は再入力。 さっぱりわかりません。よろしくお願いします
struct Person { int id; char name[100]; }; struct Person person[10] = {0}; int nperson = 0; void input(void) { int i; for (nperson = 0; i < sizeof(person)/sizeof(person[0]); nperson++) { /* ここは考えて */ } } void output(void) { for (i = 0; i < nperson; i++) printf("%-3d %s\n", person[i].id, person[i].name); } int main(void) { intput(); output(); return 0; }
わはは。やっぱコンパイラ通さんと、ミス多いわ・・・(泣)
がんばって、なおしてくれ。
>>617
struct Person person[10] = {0}; = {0}はいらない。
= {0} あってもいいじゃん。
622 :
デフォルトの名無しさん :03/11/22 14:05
>>616 OSはWindows XP,コンパイラはBorlandです。
実行したのですが何も出力されず、だからといって止まる気配もなかった
のでCtrl+Cで止めました。
623 :
デフォルトの名無しさん :03/11/22 14:07
>>622 main関数を読めば分かると思うが、データを入力していないだろ?
624 :
デフォルトの名無しさん :03/11/22 14:57
>>623 データはファイルから読み込んでるはずなんですけど。
radsort > datafile のように。
625 :
デフォルトの名無しさん :03/11/22 15:00
>>624 ネタ?
radsort < datafile
626 :
デフォルトの名無しさん :03/11/22 16:04
ここでプログラム書いてる人って、 どーゆーときお答えプログラム書く? 俺の場合 1)手間がかからない 2)興味はあるが今までほっといた分野 のどっちか。
>>627 それなりに自分のためにもなりそうなもの
>>598 #include <stdio.h>
int main(void)
{
int ts = 4; /* tab width */
int i = 0;
int c;
while ((c = getchar()) != EOF) {
switch (c) {
case '\n': putchar(c); i = 0; break;
case '&': printf("&"); i++; break;
case '<': printf("<"); i++; break;
case ' ': printf(" "); i++; break;
case '\t': for (i = ts - (i%ts); i > 0; i--) printf(" "); break;
default: putchar(c); i++; break;
}
}
return 0;
}
ファイルを読み込んで、中身の1バイト毎の値を出力する。 その値を文字コードと見て、対応する文字がある場合にはその文字も出力する。 こういうプログラムを作ったんですが、 これを1行を10バイト、1バイト毎の値、対応する文字、1バイト毎の値、・・・・・・という順番で出力するには どうすればいいんでしょうか? こういう風に出力したいんですが。(4桁ずつ右詰にしてます) 10 20 20 32 97 98 99 100 23 32 a b c d お願いします。
>>630 配列に持つか ncurses 使うしかないんじゃない?
出力の方法がさっぱり分からないです・・・。 #include <stdio.h> #include <stdlib.h> int main(void) { int c; char FileName[16]; FILE *fp; printf("入力ファイル名>>>"); scanf("%s", FileName); if((fp = fopen(FileName, "r")) == NULL){ printf("ファイルが見つかりません。--- %s\n", FileName); exit(1); } while((c = fgetc(fp)) != EOF){ printf("%4d", c); printf("%4c", c); } fclose(fp); return 0; }
char buffer[10]; size_t n; while((n = fread(buffer, sizeof(buffer[0]), sizeof(buffer)/sizeof(buffer[0]), fp)) != 0){ int i; for(i = 0; i < n; i++){ printf("%4d", c); } printf("\n"); for(i = 0; i < n; i++){ printf(" %c", isprint(c) ? c : ' '); /* 空白3個 + %c ね */ } printf("\n"); }
>>633 すいません。
出力をそれに変えてみたんですが、どうも上手くいかないみたいです。
>>634 1)あなたの環境は?(OS、コンパイラなど)
2)どのように実行しましたか? (実行時のコマンドライン、入力など)
3)どのような状態だったので「上手くいかない」と判断したのですか?
>>630 いちおう、ソース全体を見せとく。使い方はソース読んでわかるはず。
#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
FILE *fp;
unsigned char buf[10];
int i, len;
if (argc != 2) {
fprintf(stderr, "コマンドライン引数で読み込みファイルを1つ指定してください\n");
exit(2);
}
fp = fopen(argv[1], "rb");
if (fp == NULL) {
fprintf(stderr, "ファイル'%s'が開けません\n", argv[1]);
exit(2);
}
while ((len = fread(buf, 1, sizeof(buf), fp)) > 0) {
for (i = 0; i < len; i++)
printf("%4d", buf[i]);
printf("\n");
for (i = 0; i < len; i++)
printf(" %c", (isprint(buf[i])) ? buf[i] : ' ');
printf("\n");
}
fclose(fp);
return 0;
}
>>636 OSはXP、コンパイラはBorland C++ Compiler 5.5です。
試しに「1234abc」と書かれたテキストファイルを読み込んでみました。
49 50 51 52 97 98 99
1 2 3 4 a b c
と表示されるはずなんですが、
4251844425184442518444・・・(以下省略)
と数字の羅列が表示されたので、「上手くいかない」と判断しました。
コンパイルしたときに「符号付き値と符号無し値の比較」と警告が出ましたが、
一応コンパイルできました。
>>630 相手が、再現できるように書くのがミソ。
環境はわかりました。実行結果も、あなたのいうように、うまくいってないみたいですね。
多分、プログラムが間違っています。
あなたがコンパイルしたソースがわかんないから、どうしたらよいとアドバイスできないです。
>>633 のソースを上手くとりこめてないのかも。・・・ってか633のプログラムってwhileの中で変数cに値、入ってないんですが(^^;;
>>637 のプログラムは動作するみたいだよ。こっち試したら?
>>639 >
>>633 のソースを上手くとりこめてないのかも。・・・ってか633のプログラムってwhileの中で変数cに値、入ってないんですが(^^;;
ほんとだ、すまん。
>>637 未定義の関数exitを呼び出した、とエラーが出るが・・・?
#include <stdlib.h>が入ってないんじゃない?
643 :
デフォルトの名無しさん :03/11/23 11:10
>>641 んな事にも臨機応変に対応できないのか?
>>641 げげ。
>>642 そだね。入れなきゃね。
ごめん。今度からコンパイラの警告レベル上げるよ。
645 :
デフォルトの名無しさん :03/11/23 11:33
宿題です。C言語でお願いします。 キーボードから打てる入力は全て受け付ける。 (A〜Z、a〜z、+−*;、リターン)等 アルファベットの大文字が入力されたとき 小文字を表示し、小文字が入力されたとき 大文字を表示するプログラムを書きなさい。 そのほかの入力(+など)が入力されたときは 入力されたものをそのまま表示させなさい。 またCtrl+z(EOF)が入力されたとき プログラムを終了させなさい。
#include <stdio.h> #include <ctype.h> int main(void) { int c = getchar(); putchar(isupper(c) ? tolower(c) : toupper(c)); return 0; }
putchar(...); を if(c != EOF) で囲んでおいてちょ・・・。忘れてた。
>>646 EOFの検出がないじゃん。と思ったら一文字だけしか処理してないのね。w
649 :
デフォルトの名無しさん :03/11/23 11:43
>>648 なんでもかんでも完璧なプログラムを求めない事。
ヒントだけでもくれるから後は自分の好きなように改造するべし
>>648 まあ、コアの部分見せたら後は自分で出来るかと。
>>605 さんありがとう。
ノート見たらそれらしいものがありました。
うちの先生一応例文あげるんですがあまり説明しないもので…。
そのパラメータについても殆ど何もいわず。
ファイルの入出力のことを学んでいるんですが、ファイルの実数を読み込むのは どうやってするのでしょうか? 問題 テキストエディタを用いて、20個の実数をdata.txtに保存せよ。 ただし、各実数は空白か改行で区切られているものとする。 data.txtから20個の実数を読み込んで、合計と平均を求める関数を作成せよ。 ただし、平均は問1で作成した関数を使い、合計の関数は新たに作成せよ。 合計を求める関数も実数型の配列とその要素数を引数として取るものとする。 自分である程度作ったんですが、実行できません。 教えて頂けませんか?
Cの宿題です。 ファイルから1レコード読み込みます。 レコードの中身はPackedBCDです。 レコードの定義にしたがってフィールドから値を取得します。 フィールドはバイト境界に関係なく定義されています。 取得した値をBCDからint型の数値に変換します。 今は文字列にしてから数値へ変換というふうにしてるのですが 効率が悪いので何かいい方法ないでしょうか?
#include <stdio.h> double heikin(double a[], int x) { int i; double h = 0.0, r = 0.0; for (i = 0; i < x; i++){ h = h + a[i]; } r = h / i; return(r); }
続き double goukei(double a[], int x) { int i; double f = 0.0; for (i = 0; i < x; i++){ f = f + a[i]; } return(f); }
続き int main(void) { FILE *fp; int i, x = 0; double a[255]; fp = fopen("data.txt", "r"); for (i = 0; i < x; i++) { fscanf(fp, "%lf", &a[i]); } fclose(fp); printf("合計は%lf\n", goukei(a, x)); printf("平均は%lf\n", heikin(a, x)); return(0); }
658 :
デフォルトの名無しさん :03/11/23 13:57
プレイヤーに二つの日付を入力させて、その間の日数を出力する プログラムを作りなさい。このとき西暦を4で割り切れる年をうるう年とする。 ただし、100で割り切れるが400で割り切れない年は除く。 このプログラムをMicrosoft Visual C++で作ったらどうなりますでしょうか?
無事解決致しました。 また何かあったら教えて下さい。 ありがとうございました。
>>659 =652
%lfは間違い。
平均処理内で、合計処理と全く同じ事をするなら合計処理を呼ぶべき。
>>653 無難じゃない?<文字列を介して変換
どう効率が悪いと言いたいのか分からないのだけど、
宿題なら一般的に効率よりも解かりやすさを求めるべきじゃないのかな?
>>649 私は>648だけど質問者じゃないよ。
661 :
デフォルトの名無しさん :03/11/23 17:33
C言語で小数点以下を四捨五入するには どうしたらいいでしょうか?
皆さんありがとうございました。
>>653 フィールドがバイト単位で区切られてないのは辛い・・適当に直して。
int bcd_to_int(unsigned char *p)
{
enum {PLUS = 0xc, MINUS =0xd};
int val = 0;
int d;
for (;; p++) {
d = *p >> 4;
if (d > 9)
break;
val = val * 10 + d;
d = *p & 0xf;
if (d > 9)
break;
val = val * 10 + d;
}
return (d == PLUS) ? val : -val;
}
#include <stdio.h>
int main(void)
{
unsigned char bcd1234[] = { 0x12, 0x34, 0xc0 };
unsigned char bcd_987[] = { 0x98, 0x7d };
printf("%d\n", bcd_to_int(bcd1234));
printf("%d\n",bcd_to_int(bcd_987));
return 0;
}
>>584-587 レス遅れてスンマソ&サンクス。
とりあえず文字列が許容量より超えてたら「ファイル変だよ」って事を伝える程度にしときました。
> 仕事で作るプログラムの大半はエラー処理が占めている
大変なんですね……
>>658 だいたいの流れ。 自力で日付の差を求めるのはミスが多いのでオススメしない。
1)日付Aの入力。日付の範囲チェックをし、変だったら再度入力を促す。
2)日付Aを struct tm 経由で time_t 型へ変換。ここはmktime()を利用。
3)日付Bも同様
4)time_t型にした日付Aと日付Bの差を計算する ここはdifftime()を利用。
5)差を表示(difftime()の戻り値は秒数なので、日数に戻しましょう)
俺は1)を組む気力がないんでパス
どっちかっつーと、うるう年の算出がメインなんじゃなかろ〜か
どこかからアルゴリズムを取ってくればいいんじゃないの?
669 :
デフォルトの名無しさん :03/11/23 20:48
セールスマン 閏年
誤爆スマン・・・
GUI激ムズ………。
console(MFC使用できる版)でやって見れ。ついでにこの解答だと、多分先生の評価はすごく良いか、やりなおし。 int iYear,iMonth,iDay; cout << "入力された二つの年、月、日の差を日数で表示します" << endl; cout << "日付を年、月、日の順番にスペースを空けて入力してください" << endl; cout << "日付1" <<endl; cin >> iYear; cin >> iMonth; cin >> iDay; CTime time1( iYear, iMonth, iDay, 0, 0, -1 ); cout << "日付2" <<endl; cin >> iYear; cin >> iMonth; cin >> iDay; CTime time2( iYear, iMonth, iDay, 0, 0, -1 ); CTimeSpan diffTime; diffTime = time2 - time1; cout << "日付2 − 日付1 の日数は" << diffTime.GetDays() << "日です" <<endl;
int leap(int y) { return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0)); } int nissuu(int y1, int m1, int d1, int y2, int m2, int d2) { int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, n = 0; for (; y1 > y2; y2++) n += 365 + (leap(y2) ? 1 : 0); for (; y1 < y2; y1--) n -= 365 + (leap(y1) ? 1 : 0); for (; m1 > m2; m2++) n += days[(m2-1)%12] + (m2 == 2 && leap(y2) ? 1 : 0); for (; m1 < m2; m1--) n -= days[(m1-1)%12] + (m1 == 2 && leap(y1) ? 1 : 0); return n + d1 - d2; }
さ〜てここで問題です。 >for (; y1 > y2; y2++) n += 365 + (leap(y2) ? 1 : 0); と >for (; y1 < y2; y1--) n -= 365 + (leap(y1) ? 1 : 0); >for (; m1 > m2; m2++) n += days[(m2-1)%12] + (m2 == 2 && leap(y2) ? 1 : 0); と >for (; m1 < m2; m1--) n -= days[(m1-1)%12] + (m1 == 2 && leap(y1) ? 1 : 0); は同時に通ってもいいもんなんでしょ〜か?
> for (; y1 < y2; y1--) って、無限ループしないの?
そっか、ツッコミOKなのか。
>>674 0時0分-1秒ってなっとる
バグには突っ込まんと教えてもらった香具師が困るだろ…
681 :
デフォルトの名無しさん :03/11/23 23:04
まだ始めたばかりの素人だから長いけど、こんなんどうだい?
>>658 #include <stdio.h>
char line[100];
int first_year,last_year;//入力された、年
int first_month,last_month;//入力された、月
int first_day,last_day;//入力された、日
int answer;//計算結果
int main()
{
printf("入力する二つの日付の間が何日あるか調べます。"
"_年_月_日の入力になります。\n(注)入力のさいは間をスペースで空けて下さい\n\n");
printf("一つ目の入力です。\n");
fgets(line,sizeof(line),stdin);
sscanf(line,"%d %d %d",&first_year,&first_month,&first_day);
if(first_month==0 || first_month >12 || first_day==0 || first_day >31){
printf("そんな日付ねぇよ!!\n");
return 0;}
else
printf("あなたが入力したのは %d年%d月%d日です。"
"\n\n",first_year,first_month,first_day);
つづく
つづき printf("二つ目の入力です。\n"); fgets(line,sizeof(line),stdin); sscanf(line,"%d %d %d",&last_year,&last_month,&last_day); if(last_month==0 || last_month >12 || last_day==0 || last_day >31){ printf("そんな日付ねぇよ!!\n"); return 0;} if(last_year < first_year || last_year == first_year && last_month < first_month ||last_year == first_year && last_month == first_month && last_day < first_day){ printf("一つ目の方が二つ目よりデカイじゃん!気きかねぇなぁ(゚Д゚)\n"); return 0;} else printf("あなたが入力したのは %d年%d月%d日です。" "\n\n",last_year,last_month,last_day); if (last_year==first_year) answer = 0; else answer = (last_year - first_year) * 365; つづく
つづき if(first_month == 1) answer -= first_day; //最初の月の計算これで1月1日までもっていく if(first_month == 2) answer -= 31, answer -= first_day; if(first_month == 3) answer -= 59, answer -= first_day; if(first_month == 4) answer -= 90, answer -= first_day; if(first_month == 5) answer -= 120 , answer -= first_day; if(first_month == 6) answer -= 151, answer -= first_day; if(first_month == 7) answer -= 181, answer -= first_day; if(first_month == 8) answer -= 212, answer -= first_day; if(first_month == 9) answer -= 243, answer -= first_day; if(first_month == 10) answer -= 273, answer -= first_day; if(first_month == 11) answer -= 304, answer -= first_day; if(first_month == 12) answer -= 334, answer -= first_day; つづく
つづき if(last_month == 1) answer += last_day; //最後の月の計算これで1月1日までもっていく if(last_month == 2) answer += 31, answer += last_day; if(last_month == 3) answer += 59, answer += last_day; if(last_month == 4) answer += 90, answer += last_day; if(last_month == 5) answer += 120 , answer += last_day; if(last_month == 6) answer += 151, answer += last_day; if(last_month == 7) answer += 181, answer += last_day; if(last_month == 8) answer += 212, answer += last_day; if(last_month == 9) answer += 243, answer += last_day; if(last_month == 10) answer += 273, answer += last_day; if(last_month == 11) answer += 304, answer += last_day; if(last_month == 12) answer += 334, answer += last_day; つづく
つづき if(first_year%4==0 && first_year%100==0 && first_year%400!=0) answer += 0; else{ if(first_year%4!=0) answer += 0; else { if(first_month == 1 || first_month == 2 && first_day <= 28) answer += 0; else answer -= 1;} } for(first_year ; first_year == last_year - 1 ; first_year++){ if(first_year%4==0 && first_year%100==0 && first_year%400!=0) answer += 0; else{ if(first_year%4!=0) answer += 0; else answer += 1;} } つづく
つづき if(last_year%4==0 && last_year%100==0 && last_year%400!=0) answer += 0; else{ if(last_year%4!=0) answer += 0; else { if(last_month == 1 || last_month == 2 && last_day <= 28) answer += 0; else answer += 1;} } printf("%d日間だね\n",answer); return 0; } 長くてすまんが、一応正常に動作する(汗) 一緒にプログラムがんばろう!
>>679 あ、すまん。夏時間かどうかのフラグを自動にしたつもりで間違えた。
最後らへんを 0,0,-1 から 0,0,0,-1 にでもしてくれ。
っていうかこういうやり方でもいいのか?
>>687 プログラムで一番大事なのは「ちゃんと動く」こと。
最初はブラッシュアップなど二の次でいい。
>>675 も始めたばかりの素人なんかなぁ。
それにしてもヒドイが。
664さん ありがとうございました。
>>674 >>688 CTimeの使い方の参考になった。ありがと。
> っていうかこういうやり方でもいいのか?
たぶん、課題だから「アルゴリズムを実装しなきゃ」ということだろうけど、この手の考え方が素直だと思う。
ライブラリ(time_t とか CTime)を使わないでやるなら、次ような関数作るかなぁ。
long days_of_epoch(int year, int month, int day)
機能:紀元(1年1月1日)からの経過日数を返す
引数: year 年(>=1), month 月(1 - 12), day 日(>=1)
メモ:
すべての日付をグレゴリオ暦として扱う。
day_of_epoch(1,1,1)は0を返す。
存在しない日付(0年1月2日、1年2月29日、1年13月1日など)のときは-1を返す。
これなら、変数もすくないし、ややこしいことしなくて済むでしょう・・・でも、バグ入りやすそうだねぇ・・・。
>>687 おつかれさま。次は、配列とforを使ってプログラムを短くしてみよう。作るときの手間もへってくるよ。
ウィンドウを作って、そこに文字を表示させなさい。という宿題なのですが。
OSは?UNIX系ならToolKitは何を使うの?
>>691 誤)days_of_epoch
正)days_from_epoch
はづかちぃ
Windowsです。
MessageBoxで一発だな。まあどんなGUIでも似たような引数の 似たような関数はあるだろう。
>>692 #include <windows.h>
int PASCAL WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
MessageBox(NULL, "( ´_ゝ`)ふーん ", "キタ━━━━━(゚∀゚)━━━━━!!", MB_OK);
return 0;
}
>>695 WINならDC取得してTextOutかDrawText
WM_PAINT位教えてやれよ
つーか、MFC使っていいんなら話は別だが。。。
701 :
デフォルトの名無しさん :03/11/23 23:42
先ほど、書き込む場所を間違えてしまいました。マルチではありませんので。 こんな宿題がでました。 テキストファイルを読み込み、小さい値の評価がよく、大きい値の評価が悪いようにし、テキストファイルに出力する プログラムを作る。 評価は5段階で、5点満点の点数方式とする。(入出力のテキストファイルは固定とする) (例)実行前のファイル 10.980204 Aさん 7.698948 Bさん 12.546429 Cさん 12.848141 Dさん 6.472327 Eさん 14.32538 Fさん 2.3568 Gさん 実行後のファイル 5点Gさん 5点Eさん 4点Dさん 3点Aさん 2点Cさん 2点Dさん 1点Fさん どのように作るかわからない課題が出ました。 ぜんぜん、わかりませんのでお願いします。
>>699 それは人から教えてもらうものじゃなくて自分で学ぶべき範囲だと思う
>>701 4点のはDさんでなくBさん?
評価の幅が分かるなら簡単そうだな
>>702 このスレにそんな常識は通用しないよ。
意義がなくなるから。
>>658 は解決したの?作ったので一応貼っておきます。
#include <stdio.h>
/* 1900年1月1日からの日数を計算する */
int daytbl[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long days_from_1900(int year, int month, int day)
{
int i;
long days;
days = (year - 1900) * 365 + (year - 1900) / 4;
for (i = 1; i < month; i++) days += daytbl[i];
days += day - 1;
return days;
}
int main(int ac, char *av[])
{
int y0,m0,d0,y1,m1,d1;
printf("開始年-->");scanf("%d", &y0);
printf("開始月-->");scanf("%d", &m0);
printf("開始日-->");scanf("%d", &d0);
printf("終了年-->");scanf("%d", &y1);
printf("終了月-->");scanf("%d", &m1);
printf("終了日-->");scanf("%d", &d1);
printf("日数=%ld\n", days_from_1900(y1, m1, d1) - days_from_1900(y0, m0, d0));
return 0;
}
それは・・・・。
Cでランダムで分岐する方法を教えてください。 あと確立で分岐する方法も教えてください。
>>707 自分で検索汁といいたいとこだが、注意を受けたので
int rand() でランダムに数字を返す
srand ((unsigned)time(NULL));とすることランダム関数を初期化
switch (rand() % 10)
{
case 1:
break;
case 2:
....
default:
breka;
}
で分岐
ボケっとしてたら間違えた。ゴメン。 もともとはこんなんだった。 int leap(int y) { return (y % 400 == 0) || ((y % 4 == 0) && (y % 100 != 0)); } int nissuu(int y1, int m1, int d1, int y2, int m2, int d2) { int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; return y1 == y2 && m1 == m2 ? d1 - d2 : y1 > y2 ? nissuu(y1, m1, d1, y2+1, m2, d2) + 365 + (leap(y2) ? 1 : 0) : m1 > m2 ? nissuu(y1, m1, d1, y2, m2+1, d2) + days[(m2-1)%12] + (m2 == 2 && leap(y2) ? 1 : 0) : - nissuu(y2, m2, d2, y1, m1, d1); }
>>708 素早い対応ありがとうございます。
早速やってみます。
>>704 2000/2/28 2000/3/1 → 2
2100/2/28 2100/3/1 → 1
2000/1/1 2001/1/1 → 366
1999/1/1 2000/1/1 → 365
上のようになるか、レッツてすと!
>>712 一番上と一番下の差を5 - 1で割って5段階に分けるんだと思う。
716 :
デフォルトの名無しさん :03/11/24 00:20
>>701 >>703 >>711 ファイルを読み込んで、平均を出し平均値近い評価を3と計算して、
もっとも小さい値の評価を1とし、 最大を5としたらどう?
そして、平均から最大値までにある数値を4として
平均から最小値までを評価を2としたらどうかな?
>>712 ならない。ごめん。まちがってる。ショボーン
705はつかわないで。
間違えた。 >>もっとも小さい値の評価を1とし、 最大を5としたらどう? じゃなく、 もっとも小さい値の評価を5とし、 大きい値を1としたらどう?
順位から得点を与える。 2/7まで5点 3/7まで4点 4/7まで3点 6/7まで2点 7/7まで1点
まさか偏差とか出てくる。。。とか。。。
>>658 >>712 これでどう?
#include <stdio.h>
/* 0000年1月1日からの日数を計算する */
int daytbl[12]={31,28,31,30,31,30,31,31,30,31,30,31};
long days_from_0000(int year, int month, int day)
{
int i;
long days;
days = year * 365 + (year / 4) + (year / 400) - (year / 100);
if ((month <= 2) && ((year % 4) == 0) && !(((year % 100) == 0) && ((year % 400) != 0))) days--;
for (i = 1; i < month; i++) days += daytbl[i-1];
days += day - 1;
return days;
}
int main(int ac, char *av[])
{
int y0,m0,d0,y1,m1,d1;
/* テストデータ
printf("日数=%ld\n", days_from_0000(2000, 3, 1) - days_from_0000(2000, 2, 28));
printf("日数=%ld\n", days_from_0000(2100, 3, 1) - days_from_0000(2100, 2, 28));
printf("日数=%ld\n", days_from_0000(2001, 1, 1) - days_from_0000(2000, 1, 1));
printf("日数=%ld\n", days_from_0000(2000, 1, 1) - days_from_0000(1999, 1, 1));
*/
printf("開始年-->");scanf("%d", &y0);
printf("開始月-->");scanf("%d", &m0);
printf("開始日-->");scanf("%d", &d0);
printf("終了年-->");scanf("%d", &y1);
printf("終了月-->");scanf("%d", &m1);
printf("終了日-->");scanf("%d", &d1);
printf("日数=%ld\n", days_from_0000(y1, m1, d1) - days_from_0000(y0, m0, d0));
return 0;
}
つっこみでもなんでもないけど、西暦0年って紀元前1年なんだよな。 紀元前1年の翌年は西暦1年…なんだかなぁ。
>>724 でもその手のことを言ったら途中で暦法が変わってることまで考えなくてはいけないわけで。。。
>>725 そうなんですが、和暦も0オリジンで始まってほしい…とか考えるのは
やっぱ職業病なのかなぁ…
あらら、
>>726 さんに先をこされた < 和暦の話
>>727 そしたら月も日も0オリジンにしなきゃねw
零は悪魔の数字なんだ!
確かに人が時刻や日付自体に意味を持たせていることはそうそう多くないのかな、と。 誕生日とかの記念日はこの例には当て嵌まらないと思うけど、 日常生活で知りたいのは今から○○時までの「時間」であり ○○年○○月○○日までの「期間」という相対的なものだったりして。 スレ違いスマソ
>>727 それよりも、旧暦と新暦が同じ年に共存するのを何とかして欲しいとは思わんか?
1989年1月1日は昭和で、1989年12月31日は平成なわけだが。
一年の日数に規則がないなんて最悪やん・・・。
737 :
デフォルトの名無しさん :03/11/24 10:35
>>720 701と似てる課題が出たのですが、私の場合の課題は、
ソートしないで入出力させる問題なんですが、
720のプログラムを参考にすると、どこを変更すればいいのでしょうか?
ソートせずに、max, min を取得すれば良いよ。
>>738 う〜ん、うまくいかない。
>>ソートせずに、max, min を取得すれば良いよ。
ってどうやってやるのですか?
変更するところのプログラムを教えてください。
京大生でも宿題丸投げするのか。
>>740 ファイルを出力するのはできました。
ファイルを読み込む場合
FILE *fp;
fp=fopen("data.txt","r");
を加えればいいのですが、入力のプログラムをファイルを読み込む場合、
どのように変更すればいいのでしょうか?
// 入力
while (getline(cin, linebuf)) {
istringstream iss(linebuf);
struct record recordbuf;
iss >> recordbuf.score >>recordbuf.name;
table.push_back(recordbuf);
}
fclose(fp);
ファイルオープンしたりするのは面倒だから、リダイレクトを利用すれば良い。 a.exe < data.txt > result.txt それでもファイル処理がしたければ、ifstream, ofstream で。
>>741 明日までの宿題だから、至急取り掛かかるべし。
これじゃあんまりなので・・・
main()とその上をちょこちょこっと書き換えるだけでOKだと思うよん。
>>741 アルファベットをバケットソートする方法が分からないのです。
mを27(_(スペース)とa〜z)にすればいいという方針は分かるのですが
具体的に実現する方法が分かりません。
アルファベットには、A-Zもあるのでもう少し種類が多い。 で、入力された文字を数値に変換するフィルタを作成するという方法もある。 例えば'a'は0, 'b'は1, 'c'は2, ... 'z'は25というように。 'A'は26か。 ガンガーリ
>>745 ファイル処理で行いたいのですが、ifstreamでやる場合、
プログラムはどのようにしたらよいのでしょうか?
>>748 変換もへったくれも文字はASCIIコードという数値で表現することになっている。
751 :
おねがいします・・・。 :03/11/24 15:15
#include <stdio.h> int fibo(int n); void main(void) { int n, i; printf("please input max number: n= "); scanf("%d", &n); for(i=1; i<=n; i++) { printf("fibo(%d)=%d\n", i, fibo(i)); } } int fibo(int n) { int x=1; int y=1; int i=3; for(i=3; i<=n; i++) { y = x + y; x = y - x; } return y; } プログラム中の関数 fibo() における内部処理を再帰処理に変更せよ。(ソースコードを示せ。) 定番?のfibo...なんですが問題の意味も答も分かりません・・・。 おねがいします。
「整数を引数として受け取り、その整数の各桁の数の和を返す関数」 ってのはどう作ればいいのですか? それと、↑で出来たプログラムを改良して、 「文字(列)として20桁のまでの整数値を受け取って、 各桁の数の和を返す関数」をつくりたいのですが、 どのようにすればいいのでしょうか?
int total(int x) { int ret = 0; while (x != 0) ret += x % 10, x /= 10; return ret; } int totalstr(char *s) { int ret = 0; while (*s != '\0') ret += *s++ - '0'; return ret; }
マイナスに対応してなかった・・・。まあいいや。
>>752 こんなんでどう?
unsigned sum_of_columns(unsigned x) {
unsigned s = 0;
while( x > 0 ) {
s += x % 10;
x /= 10;
}
return s;
}
>>752 一旦文字列に変換して(コマンドライン引数なら端から文字列)1文字ずつ取り出し数値に変換して足し算。
かぶった・・まあいいや。w
758 :
デフォルトの名無しさん :03/11/24 15:40
>751 フィナボッチ数列か。 fibo関数のfor文を再起処理すればいいのか? それともfibo()を再起すればいいの?
>変換もへったくれも文字はASCIIコードという数値で表現することになっている。 わざわざ、コードで0〜255の全てに対応させる必要は無い。 仕様は「アルファベットに対応」なので、まあいいじゃん?
>758 私が問題の意味がわからないといったのは、そこなんですが・・・。 たぶんfibo()を再帰だと思います・・・。
>>751 int fibo(int n)
{
if(n < 3)
return 1;
else
return fibo(n - 1) + fibo(n - 2);
}
n が大きくなると激しく時間かかりそうだな…。
>761 ありがとうございます。 同時に 「再帰処理を用いることの利点と欠点について考察せよ。」 とありますが、欠点についてはそこですか?
>>762 そういうこと。
この場合、見て分かりやすくはなるが、
時間量が O(n) → O(2^n) という風に増えてしまう。
(顕著な例としてこのフィボナッチ数列を示したのだろうけど。)
765 :
デフォルトの名無しさん :03/11/24 16:23
>762 再起の利点はコードが簡潔にかけること。 駄目な点はスタックにつんで行くので時間がかかる。
>>765 さん、ありがとうございます。
今まではギリギリ大丈夫でしたが再帰処理から・・・。
自分で解決できるようにがんばりますっ!
ありがとうございました。
今回私は解答書いてないけど、
>>751 みたいにこう、打てば響くようなレスが返ってくると
解答書くほうとしても嬉しいよねぇ。
君のセンスなら今後も(恐らく)大丈夫、がんばりや〜
>>751
>>764 > 時間量が O(n) → O(2^n) という風に増えてしまう。
はぁ ?
>>769 O(n)→O(2〜n)
でしょうね。
はぁ?って・・・。
>>748 「27個のバケット」と言われたので多分スペース+小文字26個で十分だと
思います。
あ〜、時間がない。誰か助けて下さい。
O(2^n) すさまじいオーダーですね。
n が十分に大きいと、
>>761 の計算時間は fibo(n) の値と同じように増加するわけだから、
実際は O(1.618…^n) ぐらいになるのかな?
*buf *num等、ポインタ関数をNULLで初期化する方法を2つ考えてこい って言われたんですが (´・ω・`) どうやるんでしょうか… 普通にbuf = NULL;って言ったら考え直してこいと言われますた
>>751 int fibo(int n)
{
if (n <= 1) return 1;
else return _fibo(n, 1, 1);
}
int _fibo(int n, a1, a2)
{
if (n == 2) return a1;
else return _fibo(n-1, a1+a2, a1);
}
ポインタ関数というのはなんだろー
結論を言うと O(n^2) で正しいわけだが
C言語的には間違いでは。
すまん O(2^n)
^は排他論理和
VC++のwin32コンソールアプリケーションで オブジェクト指向を使ってブラックジャックの プログラムを作ってください。お願いします。
>>784 じゃあ O( pow(2,n) ) って書かないといけないのかYO!?
そんな宿題出した奴が悪い!!
>>786 math.h をインクルードして libm をリンクしる
785を放置するスレになりますた。
ちょっとお聞きしますが。C++仕様書は ISO/IEC 14882:1998 ( ISO ) ISO/IEC 14882:1998 ( ANSI Electronic Standards Store ) ISO/IEC 14882:1998 ( TECHSTREET ) X3J16/96-0225 WG21/N1043 ( AT&T ) X3J16/96-0219R1 WG21/N1037 ( Commnuication Networks ) などがあるようですが、日本語版って存在するのでしょうか? それとも存在しないのでしょうか?
>>792 仕様書の日本語版は存在しない。
仕様書の翻訳ならあるかも。しかし、それは仕様書ではない。
794 :
デフォルトの名無しさん :03/11/24 20:31
>>791 int main(int argc,char* argv[])
{
//この中で、getc/putc,fgets/fputs,fprintf/fscanfなどを使ってファイルを読み書き。
}
>>791 ifstream,ofstreamで検索して、サンプルプログラムを読んでから書き込め。
>>791 mainの先頭に、
ifstream cin("infile");
ofstream cout("outfile");
を追加汁
(infile,outfileは実際のファイル名に置き換えろ)
C言語でいろんなAPIを見ますがJAVAで言うJAVADOCみたいな関数の仕様が書いてあるドキュメントってないんですか?
API…ですか?
関数の仕様のドキュメントです
ヒント等を教えていただきありがとうございました。 645がいまだに完成しないので、完全なプログラムを書いて くださいませ。 よろしくお願いします。
801 :
デフォルトの名無しさん :03/11/24 21:34
>>799 何のAPI?
それともCのANSIの関数の仕様か。
Cでkbhitを使いたいんだけど、 どうしてもうまくいきません。 RS232Cや設定もあってるんですけど 通信できません。 考えられる原因ありますか?
>>801 プログラミング中に使えそうな関数がないか調べたいんですが・・・
807 :
デフォルトの名無しさん :03/11/24 22:13
>>805 APIはOSに依存するものだから、環境を書かないとわからん。
それとも、どの環境でも動作するANSIの関数を知りたいのか?
>>804 これは実習です。
宿題みたいなものかな
RS232Cで通信できない問題とkbhit()がうまくいかない問題の関連性について述べてくれ
RS232Cでは,数秒間応答がないとPICから,入力を促す メッセージが出るプログラムはできたのですが、 PC側からRS経由で文字を取り込んでくれないのです。 RS232Cで通信はできていると思うんですが…
>>810 まず、Windows付属のハイパーターミナルでちゃんと受信できるかどうか
調べたらどう?
while (!kbhit()) { //入力が無い間ずっとこの間を動作汁 if (x)//終了条件 break; } とすればいいんじゃないの?
>>812 パイパーターミナルでは受信動作はできています。
>>813 while (!kbhit() && (++timeout < 50000))
delay_us(100)
if (kbhit())
こんなプログラムなんですが
どうっすか?
delay_us(100)って何やるの? if (kbhit())の処理は何するの? もしループ無いならば重複しなくて片方にだけ kbhit 入れればいいよ
>>814 ははぁ、これはPIC側のプログラムだね。
while (!kbhit()) {
delay_us(100);
if (++timeout > 50000) {
/* 入力を促す */
timeout = 0;
}
}
としたらどうでしょうか?
delay_us(100)は待ち時間で if (kbhit())は、このあと return(getc());って続いてまして のちにgetc()でPICに文字を取り込ませるものです やはりkbhitの重複がいけないのでしょうか?
>>817 あと、9600bpsの1ビット(104μs)に対して
100μsの待ち時間が長すぎるのかもよ。
819 :
デフォルトの名無しさん :03/11/24 23:14
>>818 そうなんですか
では,どのぐらいの値がよろしいのでしょうか?
>>812 カットアンドトライでいろいろやってみるべし。
とりあえず10μsとかで。
816 820 ありがとうございます。
822 :
デフォルトの名無しさん :03/11/24 23:51
本当に房な質問ですまないんですが、 テキストファイルから200個の氏名を読み取らせたいんですけど、 ファイルポインタからcharポインタに一つずつ読み込んだ後に、 charポインタ配列に入れていくにはどうしたらいいんですか?
>>822 ファイルに200個の氏名がどのように入っているの?
とりあえずファイルサイズを調べて、そのデータが丸々コピーできる
char配列を動的に作成して、ファイルを全てそれにリードして、ファイルは閉じる。
そのデータ配列から名前を抜き取っていく処理を随時していく。
ってのが普通のやり方。
苗字 名前(改行) です。 データ全体をその一つの配列に入れてしまうってことですか?
>>822 悪いことは言わん。あんたにC/C++は無理だ。
>>802 #include<stdio.h>
main()
{
charresult[100];
charstr[100];
inti1;
printf("文字列 : ");
gets(str);
for(i1 = 0; ; i1++){
if(str[i1] >= 'A' && str[i1] <= 'Z')
result[i1] = str[i1] - 'A' + 'a';
else if(str[i1] >= 'a' && str[i1] <= 'z')
result[i1] = str[i1] - 'a' + 'A';
else
result[i1] = str[i1];
if(str[i1] == '\0')
break;
}
printf(">>>%s\n", result);
}
ここまでです。
>>826 もうちょっとだよ。良く見てないけど Ctrl+Z まで繰り返すには
gets(str); を while(gets(str) != NULL){ に変えて
printf(">>>%s\n", result); の下に閉じカッコ } を入れれば?
828 :
デフォルトの名無しさん :03/11/25 00:44
>826 for分の中に終了条件入れなされ。 if(str[i] == '\0'){ break;} じゃなくて for (i1=0;str[i1]!='\0';i1++)
829 :
デフォルトの名無しさん :03/11/25 00:45
test
>822 この程度の話? char names[200][50] (略) for(int i=0;i<200;i++) if(fgets(names[i],50,fd)==NULL) break; fclose(fd); (略) もっと凝ったこと求めてるのかな?
自己解決しますた。 ありがとうございました。
832 :
デフォルトの名無しさん :03/11/25 00:52
>826 gets();って必ずヌル文字が入るのか?
入る
オーバーフローしてでも入るんじゃないかな。
けど
>>826 自身が多分そこまで気が回らない悪寒。
>>822 解決おめでと。こんな方法もある・・・
#define NELEMS(a) (sizeof(a)/sizeof((a)[0]))
static char buf[100];
static char *line[200];
static int nline = 0;
for (nline = 0; nline < NELEMS(line) && fgets(buf, sizeof(buf), stdin); nline++) {
line[nline] = estrdup(buf); /*
>>474 のemalloc(), estrdup()を使用 */
}
>>827 ,828
ありがとうございます。
やっと一つ分からない部分が分かりました。
>>800 「行単位」で考えるから難しいのではないかな・・・文字単位で考えると楽。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF) {
if (isupper(c))
c = tolower(c);
else if (islower(c))
c = toupper(c);
putchar(c);
}
return 0;
}
>>828 それだと \0 がresultの配列に入らないような
>>837 それが出題者の意向に沿ったコードだろうね
>>837 すごいコンパクトですね。
とりあえず意味分からないんで文法調べてきます。
そんな難しいことできん。
>>837 遅れましたが
やっと意味が分かりました。
分かりやすいプログラムありがとうございます。
勉強になりました。
改行処理… 忘れてた…。
改行文字の処理なんか必要あるの???
そういう課題なんだってば。
釣られてんじゃない!
この三連休、課題があったんだけれど、出来てないんです・・・・。 朝がくるまでに終わらせなきゃ〜・・・って人は居ないか? この三連休、昼夜逆転しちゃったよ・・・もう眠ると朝起きれないから、 宿題でも手伝ってやろうか・・・って人は居ないか?
難しくなければどうぞ
851 :
デフォルトの名無しさん :03/11/25 02:14
>849 見るだけみてやる。簡単ならやるぞ。
テキストファイルの最終行だけを削除するには どうすれば良いですか? C でお願いします。
いつもだとあと45分くらいでだいたいこのスレは眠る模様… 06 |*** 3 07 |****** 6 08 |**** 4 09 |******** 8 10 |************************ 24 11 |***************** 17 12 |*********** 11 13 |************************************************* 49 14 |*************** 15 15 |************************** 26 16 |***************** 17 17 |************** 14 18 |******************************************************** 56 19 |************************** 26 20 |********************************** 34 21 |********************************** 34 22 |************************************************************************ 72 23 |************************************************************************************* 85 00 |******************************************************************************************* 91 01 |************************************************************************************************************************************ 132 02 |************************************************************************************** 86 03 |****************** 18 04 |************* 13 05 |******** 8
リノアたんかわいい
855 :
デフォルトの名無しさん :03/11/25 02:32
>852 int main() { char c; fpos_t pos; FILE *fp; fp=fopen("ファイル名","r+"); while( (c=getc(fp)) != EOF){ if(c=='\n')fgetpos(fp,&pos); } fsetpos(fp,&pos); fprintf(fp,"\0"); return 0; } テストしてないがこんなもんか?間違ってたらすいません。
NULL書き込んだからってEOFにはならんのじゃあ
っていうか、それ以前に書き込んでないな・・・。
ファイルを切り詰める命令ってANSI Cにあったかしら? truncateだかftruncateだかがUNIX系統にはあると思うが。 無いなら、こんな感じかなぁ。 バッファに1行分入力 while (ファイルの終わりまで) { バッファを出力 バッファに1行分入力 }
fopen(tmpnam(NULL), "w"); でテンポラリ作成、 最終行を除く内容をコピー、 remove(), rename() で置き換え。 こんな感じかな。
tmpnam(NULL) の戻り値を保存しとかないとダメか。
最終行が改行だったりしないよな
>>861 気にするには最終行に改行がある場合とない場合
(中略)
行って何?という話になる
レスありがとうございます。
>>862 cat -e テキストファイル とすると
hoge "huga"$
で終わってます。
$ のあとには、空の行はありません。
Linux や、cygwin の gcc で動けばいいので、
ftruncate とか使えそうです。
ファイルサイズの所得方法が良く分かってないですけど。
調べてみます。
行の定義を勘違いしているような・・・
>>858 どちらもUNIXにはある。対象がファイル名かfdかの違い。
不定長のデータを扱うときはC辞めたくなる。 #include <stdlib.h> int main(void) { system "perl -e '@a = <>;pop @a;print @a'"; return 0; }
教えていただきたいことがあります。 どうかよろしくお願いいたします。 500x500のサイズのウインドウを作成し、ファイルから700x700のサイズの画像を読み込み、縮小して 一旦、メモリ上に置きたいのですが、どのようにすればよいのでしょうか。 かなりいろいろ いじっているうちに、訳が分からなくなり、混乱状態です。どうか、お力をお貸し下さい。 HDChdc, memDC; PAINTSTRUCTps; HBITMAPhBit;//メモリへ読み込んだ画像を識別するためのハンドルを保存 HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwndBase1, GWL_HINSTANCE); hdc = GetDC(hwnd); memDC = CreateCompatibleDC(hdc); hBit = (HBITMAP)LoadImage(hInstance, "test.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); SelectObject(memDC, hBit); hdc=BeginPaint(hwnd, &ps); StretchBlt(hdc, 0, 0, 500, 500, memDC, 0, 0, 700, 700, SRCCOPY); //ウインドウに 画像を縮小して表示 EndPaint(hwndBase1, &ps);
>>868 あ、なるほど。 丁寧にありがとうございました。
次の問題が解けないのでお願いします。 問) wordを数える関数を作りなさい. プロトタイプ宣言は以下の通り。 int wordCnt(char *s); なおこの関数をチェックするためのmainも作成しなさい。 出力サンプル ------------------------------------------------------- 入力文字列は :And on that clear day You can see forever word数は 9 -------------------------------------------------------
スペースの数+1とかじゃダメなんかな
>>871 ごめいとう
空白が続いた場合にぃゃんな感じ
空白の数ね isspaceでかぞれれ
>>873 そんなのを打つのがわるい
あとその対処法ぐらい楽だろ…
打つのが悪いって、あんた(w
int cnt = -1; while (*s) { cnt++; while (*(s++)) { if (isspace(*s) && !isspace(*(s-1))) break; } } みたいな具合でいいのかなぁ?ちと下手れなソースですまそ
レスありがとうございます。 恥ずかしながら上のヒントだけではまだ解けません。 もう少しヒントをいただけるとあり難いです。
でもさ、こういうのがわからないのに問題やってるってえらいよなぁ 俺はプログラミング始めたときは問題をやるとかじゃなくて自分の好きなように組んでたからこういうような場面に合うことが少ない プログラミングと関係ないけど 結局根性無しになったがな
isspaceってスペースだけのことじゃなかったような記憶があるんだが、気のせいかな。
881 :
デフォルトの名無しさん :03/11/25 16:34
>>878 strtok使うのはどうだ??
#inclue <string.h>
int WordCnt(char *s)
{
int cnt;
if(!strtok(s," \t\r\n"))
return 0;
for(cnt=1,strtok(NULL," \t\r\n),cnt++)
;
return cnt;
}
おっと、二重引用符閉じ忘れた #inclue <string.h> int WordCnt(char *s) { int cnt; if(!strtok(s," \t\r\n")) return 0; for(cnt=1,strtok(NULL," \t\r\n"),cnt++) ; return cnt; }
・・・・・・・。なんでforをこんな風に書いているんだよ。。。 #include <string.h> int WordCnt(char *s) { int cnt; if(!strtok(s," \t\r\n")) return 0; for(cnt=1;strtok(NULL," \t\r\n");cnt++) ; return cnt; }
やっぱり元の文字列を書きかえちゃまずいかな? しかもstrtokの戻り値受けていないし。 もう鬱だ寝よう。
>>880 当たり前な事いってないでよ・・・・改行が入っても単語が分かれるでしょ?だからisspaceを使うの
じゃあこれで。今度はきちんと動作確認した。 #include <string.h> int WordCnt(char *s) { int cnt=0; while(1){ s+=strspn(s," \t\r\n"); if(!*s) break; cnt++; if(!(s=strpbrk(s," \t\r\n"))) break; } return cnt; }
>>753 遅レスですが・・・ありがとうございます。
ポインタ使うと簡単に出来るんですね・・・
使わないと結構面倒なことになるのですか?(main関数に入力する部分も含んで)
888 :
デフォルトの名無しさん :03/11/25 17:28
f(1)=f(2)=1 (n = 1,2) 、f(n) = f(n-1)+f(n-2) (n≧3) このフィボナッチ数列を再帰的呼び出しを使って解く関数を作りたいのですが、 どうすればよいのでしょうか?
この問題が解けないので、教えていただけませんでしょうか? 「スタック構造を利用した、逆ポーランド記法で入力された計算式の 演算プログラムを作成しなさい。」 という問題なんですけども、お願いいたします。
逆ポーランド記法で入力された計算式を演算するプログラムを、スタック構造を用いて作成する?
>>890 数字だったらスタックにPUSH、演算子だったら二つPOPし計算した後PUSH
最終的にスタックの底に計算結果が残っているはず。
>>892 ついでに
演算子のときにスタック中に2つ以上の数がなかったらエラー
計算終了時にスタック中に2つ以上の数があったらエラー
894 :
デフォルトの名無しさん :03/11/25 19:36
1.以下のプログラムの関数func()を引数付きマクロ定義で書き直せ。 main() { int i = 1; double a; double func(double); a = 0.1; while(i < 10); { at = func(a); i++; } printf("%lf", a); } double func(double x) { doubule y; y = x * x; return(y); } 2.上記のプログラムの先頭で"DEBUG"が定義されたときに while文の中の変数aの値を表示するように書き直せ。 をよろしくお願いします。
>>894 1
#define func(x) ((x)*(x))
二回評価するがしかたない。
2
main()
{
int i = 1;
double a;
double func(double);
a = 0.1;
while(i < 10);
{
at = func(a);
i++;
#ifdef DEBUG
printf("%f\n",a);
#endif
}
printf("%lf", a);
}
atは。なんだ?
897 :
デフォルトの名無しさん :03/11/25 19:50
>894
その課題みたことある。お前と同じ課題質問したやついるぞ。
>>365 お前らの学校の人間は根性ねーな。
コピペじゃねーか(怒)
899 :
デフォルトの名無しさん :03/11/25 20:50
(a|b)*abbという正規表現を認識する DFAの状態遷移表は次のようになる。 ACB D E aBBBB bACDEAC 開始状態は AC、終了状態は Eである。 この状態遷移表を用いて、引数として渡された文字列が、正規表現 (a|b)*abbにマッチするならば 1をそうでなければ 0を返す関数 int ababb(char*)を定義せよ。 プログラムはこんな感じ #include <stdio.h> int table[?][?] = {?}; /* 遷移表を配列として表現 */ int ababb(char* str) { ? } int main(int argc, char** argv) { int i; for (i=1; i<argc; i++) { char* str = argv[i]; if (ababb(str)) { printf("%sは正規表現 (a|b)*abbにマッチします。\n", str); } else { printf("%sは正規表現 (a|b)*abbにマッチしません。\n", str); } } return 0; } ?の部分を埋めてください。
>>899 すまんがその状態遷移表の読み方がわからん
少し説明してくれ
ああ意味がわかった a b A B A 初期状態 B B C C B D D B A 受理状態 ってことか
int table[2][4] = { {1,1,1,1}, {0,2,3,0} }; /* 遷移表を配列として表現 */ int ababb(char* str) { int s = 0; /* 初期状態 */ while ( *str ) { if ( *str != 'a' && *str != 'b' ) return 0; s = table[*str-'a'][s]; str++; } return s == 3; }
入力されたデータがリストの中にある場合にそのセルを削除する関数を作成しなさい。 最初に一致したセルだけを消せば良い。 うすっ
セルの構造体を晒しなさい、さすれば解答があるでしょう うすっ
905 :
デフォルトの名無しさん :03/11/25 22:39
CYGWINでのコンパイルのやり方を教えてください。
>>904 struct LIST{int data; struct LIST *nextptr};
うすっ
昨日教えていただいたので少しばかり貢献をば。 昔作ったんで、そのまま乗せます。 >890 逆ポーランド記号電卓 /*スタックの実現*/ /*スタックを応用した逆ポーランド電卓プログラム*/ #include<stdio.h> #include<stdlib.h> #include<ctype.h> typedeflongELEM;/*スタック要素の型*/ #defineSTACK_SIZE 100/*スタックの大きさの定義*/ ELEMstack[STACK_SIZE]; intn; /*エラー時の表示*/ void error(char *s) { fprintf(stderr,s); exit(1); }
続き /*スタックの初期化*/ void init(void) { n=0; } /*スタックにデータを積む*/ void push(ELEM x) { if(n>=STACK_SIZE)error("stack overflow\n"); stack[n++]=x; } /*スタックからデータを降ろす*/ ELEM pop(void) { if(n<=0)error("stack underflow\n"); return stack[--n]; } /*stackが空かどうかを調べる*/ int empty(void) { return n==0; }
続き /******************************************************/ /*逆ポーランド記号電卓プログラム*/ void main(void) { int c; long x,a,b; init();
while((c=getchar())!=EOF){ if(isdigit(c)) { ungetc(c,stdin); scanf("%ld",&x); push(x); } else { switch(c) { case '+': b=pop();a=pop();push(a+b); break; case '-': b=pop();a=pop();push(a-b); break; case '*': b=pop();a=pop();push(a*b); break; case '/': b=pop();a=pop();push(a/b); break; case '\n': if(! empty()) printf("答えは%ldです\n",pop()); init(); break;
case ' ': case '\t': break; default: printf("再入力してください"); while((c=getchar())!=EOF&&c!='\n') ; break; } } } }
>>906 基本方針
・リストの先頭セルが該当したらリストの先頭へのポインタを書き換えてセルを解放する
・現在のセルと現在よりも一つ前(previous)のセルを指すポインタを用意して
先頭の次のセル,先頭のセルを指すように初期化する
・該当するセルが見つかる,または現在のセルが空になるまで
現在のセルと一つ前のセルを指すポインタを進める
・該当するセルが見つかったら,一つ前のセルが一つ次のセルを指すようにつなぎ換え
現在のセルを解放する
・現在のセルが空になったなら,エラー処理などを行う
915 :
デフォルトの名無しさん :03/11/25 23:14
>>903 データを登録する関数とかデータを保持しておく大域変数があるはずなので、
そういう出題時に提示されてるデータを見せてよ。。。
>>911-913 ふむ・・・俺はargv[]からデータを読むのが好き・・・。
C言語の質問でもよろしいでしょうか? 「実数値をキーボードから複数入力し、配列へ格納し、その最大値と 最小値をモニタに表示するプログラム」を作りたいのですが、まったく歯がたちません。 C言語でよろしければ、お答え下さい。
>>917 全く歯が立たないのなら諦めろ。お前には流動食がお似合いだ。
ま、このスレとその過去ログを丹念に見ていけばヒントくらいはあるはずだ。
#つーか、似たような宿題あったような気がする。
>>918 スレのタイトル読めんの?
ここは君のような人が来られる場所じゃないよ
>>918 2日考えたんですが、結局わかりませんでした・・・
おっしゃるとおり、このスレと過去ログをみて自力で解きたいと思います。
>917 分からんのはどれ? ・実数値をキーボードから入力 ・入力文字を数値へ変換 ・実数値を配列に格納 ・最大値と最小値を探す ・最大値と最小値を表示
実数値を複数入力っていうのがどうもわからないです。 while文を使うところまではわかったのですが・・・
>>903 delete(int data, struct LIST *list)
{
if (list == NULL) return NULL;
if (list->data == data) {
struct LIST *nextptr = list->nextptr;
free(list);
return nextptr;
}
list->nextptr = delete(data, list->nextptr);
return list;
}
head = delete(data, head); みたいに使う
次のコードの@の行のtypedefの意味はどういう意味なんでしょうか? HOGEをtypeidで型を表示させようとすると、unsigned longになります。 それは、なぜでしょうか? よろしくお願いします。 #include <stdio.h> #include <conio.h> #include <iostream> #include <typeinfo> using namespace std; typedef long unsigned int HOGE; // @ int main(){ cout << "type of HOGE is " << typeid( HOGE ).name() << endl; getch(); return 0 ; }
>917 超適当だけど、繰り返し入力だけヒント。 キーボードからリターンのみ入力で、whileを抜ける。 char buf[50];double num[20];int i; for(i=0;i<20;i++){ printf("%d>",i);gets(buf); if(buf[0]=='\0') break; sscanf(buf,"%lf",&num[i]); }
927 :
デフォルトの名無しさん :03/11/26 00:19
>922 入力だけだったらこれでどう? #define size 10 int M[size]; int i=0; while(scanf("%d",&M[i++])!=EOF && i<size);
>>923 挙動が変。ついでにこんなんで再帰つかわんよーに。
>>926 ,927
夜遅くに質問に答えていただいてありがとうございました。
あとは自力でがんばります。
>>924 long unsigned int==unsigned long int
>>929 変?一応 Scheme で試したんだけど…
ワラタ。<リスプ方言・・・いいよねぇ。末尾再帰がちゃんと展開される言語は。 挙動が変というのは、削除対象の前にあるセルがどっか消えちゃうから。
struct LIST *delete(int data, struct LIST *list) にしてもまだ変?
>>929 #include <stdio.h>
#include <stdlib.h>
struct LIST {
int data;
struct LIST *nextptr;
};
struct LIST *delete(int data, struct LIST *list)
{
if (list == NULL) return NULL;
if (list->data == data) {
struct LIST *nextptr = list->nextptr;
free(list);
return nextptr;
}
list->nextptr = delete(data, list->nextptr);
return list;
}
struct LIST *cons(int data, struct LIST *list) { struct LIST *cell = (struct LIST *)malloc(sizeof(struct LIST)); if (!cell) { fprintf(stderr, "malloc failed\n"); exit(1); } cell->data = data; cell->nextptr = list; return cell; } void print(struct LIST *list) { while (list != NULL) { printf("%d\n", list->data); list = list->nextptr; } } int main(void) { struct LIST *head= cons(4, cons(3, cons(2, cons(1, NULL)))); print(head); head = delete(4, head); print(head); return 0; }
試した感じまともに動くけど?
>>933 いや今回のは末尾再帰形になってないけどな
リスプ?マジですか・・・そーですか。
>>936 head = delete(4, head);
を
head = delete(2, head);
と変更したら、
4 3 1
という結果になるかなぁ?
>>939 1, 2, 3, 4, 5 で一通り試した
空リストが通るのは明らかだし
同じ値を複数入れて最初だけ消えるかどうかも試した
941 :
デフォルトの名無しさん :03/11/26 01:52
こんなプログラムできますか? 二つのファイルを読み込んで、そのファイルの中の数値をたして、合計が大きい順にソートするプログラムですが・・・。 例として、input1.txtとinput2.txtあるとしてその中身は、 (input1.txt) 78佐藤 81泉 83 斎藤 86池田 83山田 input2.txtの中身は 2Satou 1Izumi 2Saitou 3Ikeda 3Yamada があります。そして実行してファイルに出力するとこんなふうにできますか? 89池田 86山田 85 斎藤 82泉 80佐藤 と大きいもの順にソートするのですが、作ることできますか?
数字と名前にはスペースがあります。
>>941 漢字とローマ字の対応はどうやって取る?
って単純に同じ行の数字を足すのか
>>943 同じ行を足してもいいです。お願いします。
946 :
デフォルトの名無しさん :03/11/26 03:00
#include <limits.h> #define size 10 typedef struct{ int NO; char name[30]; }meibo; void swap(meibo* p1,maibo *p2,meibo *p3,meibo *p4 ){ meibo *sw; sw=p1;p1=p2;p2=sw; sw=p3;p3=p4;p4=sw; } int main () { meibo a[size],b[size]],*p; FILE *fp1,*fp2; int i; fp1=fopen("input1.txt","r");//エラー処理は自分で fp2=fopen("input2.txt","r"); for(i=0;i<size;i++){ if(fscanf(fp1,"%d%s",&a[i].NO,&a[i].name)==EOF)break; if(fscanf(fp2,"%d%s",&b[i].NO,&b[i].name)==EOF)break; a[i].NO=a[i].NO+b[i].NO; } for(j=0;j<i;j++){ for(k=j+1;k<i;k++){ if(a[k].NO<a[j].NO){ swap(&a[j],&a[k],&b[j],b[k]); } } } }あってるかどうかシランが
947 :
デフォルトの名無しさん :03/11/26 03:02
#include <limits.h> ↑消しておいて。 あとは自分でやって下さい。
まず、10 行 9 列の int 型配列に対して、データを入力します。 その後、9 行目と 7 行目のデータを入れ替えて、 次に、4 列目と 7 列目を入れ替えた結果を出力するプログラムを書いてください。 結果は、下記の入力例と同様の形式で出力すること。 ( 2 行 3 列の場合に対する入力例) ※コメントの部分は除きます。 10 20 30 // 1 行目のデータ 40 50 60 // 2 行目のデータ 誰かお願いします。
ほいほい。6時くらいまでなら付き合うよ。 えーっと。配列の宣言の仕方は習いました? それを見せて欲しい。 そっちの流儀にあわせてみましょう。
#include <iostream> int main() { int a[9][8]; 宣言でいうと、こんな感じなんですが。
0も含まれるので、9と8で10行9列になるのではないでしょうか?
あ、すいません。10と9でいいみたいですね。なにか勘違いしてました。
はい、了解。ちょっとまってねー。
>>948 #include <iostream>
inline void swap(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
using namespace std;
const int M = 10;
const int N = 9;
int a[M][N];
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < N; j++)
cin >> a[i][j];
for (j = 0; j < N; j++)
swap(a[8][j], a[6][j]);
for (i = 0; i < M; i++)
swap(a[i][3], a[i][6]);
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++)
cout << a[i][j] << " ";
cout << "\n";
}
return 0;
}
#include <stdio.h> /* 関数 sum_dgt */ long int sum_dgt(long int x) { long int y, ret = 0; if(x < 0){ y = -x; while (y != 0){ ret += y % 10, y /= 10; } return ret; }else{ while (x != 0){ ret += x % 10, x /= 10; } return ret; } }
/* main関数による演算 */ long int main(void) { long int num; printf("整数を入力してください。\n"); scanf("%ld",&num); printf("与えられた各桁の数の和は、%ldです。\n", sum_dgt(num) ); return 0; } 問題は 「20桁までの整数値を文字として受け取って、各桁の整数を返す関数をつくりなさい。main関数における入力も文字列で行うこと。 数値として変換できない文字が引数として与えられた場合は、関数の結果に-1を 返すようにする。-1が返された場合はmain関数でエラーが出るようにしなさい。 」とのことなのですが・・・ここからどう改良すればいいのでしょうか?
入力からしておかしくないか?
まず
/* main関数による演算 */
long int main(void)
{
char *s;
printf("整数を入力してください。\n");
scanf("%s",&num);
printf("与えられた各桁の数の和は、%dです。\n", sum_dgt(s) );
return 0;
}
>>959 (ソース参照用)
次に sum_dgtが行う事を整理してみる ・引数で文字列を受け取る ・文字列の格文字がすべて整数なら全ての文字を足した数字を返す ・一つでも整数で無いものが入っていたら -1 を返す という事です。 最初はループを使ってみましょう もし時間があれば整数で受け取って再帰を使って全桁を受け取るプログラムも作ってみるとイイね。 ちなみに整数で入力を受けたら20桁まで計算できないんじゃないかなぁ
>>959 間違えた
/* main関数による演算 */
long int main(void)
{
char s[21];
printf("整数を入力してください。\n");
scanf("%s",&num);
printf("与えられた各桁の数の和は、%dです。\n", sum_dgt(s) );
return 0;
}
>>961 (ソース参照用)
二つの数字を入力し一つ目の数字と二つ目の数字の差を何等分するか入力し 例えば 8.2と0で2等分だったら4.1が出力するプログラム 簡単なんだけど小数点ではできない。
縦と横で力の分解をしろ
>>961 細かいことを言えば、
scanf("%20s", s);
>>957 コンパイラすら通してないが、こんなん。
#include <stdio.h>
#include <ctype.h>
int sum_dgt(char *s)
{
int retval = 0;
int d;
for (;*s != '\0'; s++) {
if (!isdigit(*s))
return -1;
sscanf(s, "%1d", &d);
retval += d;
}
return retval;
}
作っても出力が0.000000しかでない。
int sum_dgtnum (int n) { static int k += n; static int flag = 1; if (n<0) flag = -1; } int sum_dgt (char *s) { if (*s) sum_dgt (s+1); if (!isdigit(*s)) sum_dgtnum (-1); sum_dgtnum (*s-'0'); return sum_dgtnum (0); } これはだめぽ?
とりあえずソースだそうぜ
#include<stdio.h> int main(){ double a,b,c,d,e; scanf("%f",&a); scanf("%f",&b); c=a-b; scanf("%f",&d); e=c/d; printf("%f\n",e); return 0; }
scan()の場合 float *は"%f",double *は"%lf",long double *は"%Lf" printf()の場合 floatは"%f",doubleは"%f",long doubleは"%Lf" とりあえず、ANSIではそうなのよん。規格とか規格の解説で確認されたし。 ・・・scaf()とprintf()で書式指定が似てるけれど異なるんで、それも確認してちょ。 みなさんのよーに、URLパッっと出せればかっこいいのだろうが。
>>974 の説明はわかりやすいので参考資料よりもそっちのがカッコイ
すみませんが 下記の問題はいったい何が問題で、何をどうすればいいのでしょうか。 ちなみにC言語今日がはじめて。全く意味不明。本は高いし何の本買ったらいいか分からないし。 あぁ、これから先、やっていけるだろうか・・・。まずパソコン買わなきゃな。 int a = 55 ; という式がある。 これは整数である。 この整数を 文字型にして。 char b[3]="55"; はダメ。
PCはマル紅で19800円だよ
LSI-C86 -> VC++6.0 -> MS-C -> MinGW gcc3.2 漏れのコンパイラ経歴。結局はフリーに落ち着いたという罠。
>>977 はい。買ったら行きます。行きますのでおしえてくらさい。
もしかして、”文字型にして” が問題なのかなぁ。
数値55と文字列定数の"55"の違いを言いたいんじゃ?
そうか、 a は整数型 で それを文字型にしろと言ってるのかぁ。 そうですよね? それが問題になってるんですよね? うーん、自力で理解できるのはここまでだな。。。。
VC++6.0 -> LSI-C -> VC++6.0 -> LSI-C -> VC++6.0 -> BCC55 -> VC++6.0 -> gcc -> BCC55 -> VC++6.0 結局使いやすいところに落ち着いたという罠
>>981 そうですか。そういうことですか。
つまり、整数型と文字型の違いを説明しろ、と言う問題なんですか。
そかそか。なるほど。
で、答えはどのように答えたらいいのでしょうか。
>>984 整数型と文字列型があまり違うように見えない俺はどうしよう…別にいいよね?
>>985 OS入れなおしたりしまくってたから気分変わりまくるよ。CygWin 入れた時はもう何がなんだかわからなかったりした
結局gcc というか linux でほんの数回コンパイルした程度だから gcc は入ってないも同然ですが。。。
>>984 char b[3]={'5', '5', '\0'}";
C言語で、実数値を表示させる際、整数部を5桁、小数部を2桁表示する為のprintfの書式は、 printf("%8.2f")でよろしいでしょうか?
>>987 って思ったら }" という部分が間違えてる。別に間違いを笑ったわけではないのであしからず
printf ("%5.2f");
>>976 文字「列」への変換の場合。
int a = 55;
char b[10];
sprintf(b, "%d", a);
初日にしちゃ高レベルな問題だぁね。
あるいは・・・文字型への変換。
int a = 55;
char b = a;
>>984 ネタかもしれんが、マジレス。
それは char b[3] = "55";と同じ。
>>989 printf("%8.2f", 12345.1234);して 実際に確かるのが吉。
だれかそろそろ次スレたててちょ。
スレ立てるのってきめ台詞いるの?・・・
>>992 printf("%8.2f", 12345.1234);ですると、12345.12と表示されますが、
printf("%5.2f", 12345.1234);でも、12345.12と表示されます。
どちらが正しいのでしょうか?
そーゆーときは、整数部の桁数減らしてみる。
>>995 12345.1234 を、1234567890.12345 とかにしてみたら?
スレ立てられない・・・
C/C++の宿題ならおいどんに任せろ 16代目
おいどんはC++房でおわす。
こんにちの技術は日進月歩、どんどん進むでごわす
わからない宿題はどんとこーい。
【注意点】 -------------------------------------------------
・問題はしっかりと解いてもらう方にわかりやすいように
問題文などの省きはやめ、エラーなどは適切に書きましょう
全文を書いてしまうか、分かりやすくまとめましょう。
・後になって問題につけたしをするのはやめましょう。
解いてもらっている方に失礼になってしまいます。
------------------------------------------------------------
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://do.sakura.ne.jp/%7Ejunkroom/cgi-bin/megabbs/lounge/index.html 【歴代スレは
>>2 】
1000 :
デフォルトの名無しさん :03/11/26 16:22
カッコイイきめ台詞でこのスレ終わろうぜ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。