2 :
デフォルトの名無しさん :2006/09/21(木) 22:37:47
3 :
デフォルトの名無しさん :2006/09/21(木) 22:40:13
乙ぬるぽ!
5 :
◆jG/Re6aTC. :2006/09/22(金) 08:17:25
[1] 授業単元:ネットワーク
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2679.txt [3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: Visual Studio 2005
[3.3] 言語: ベターCとしてC++
[4] 期限: 2006年09月25日12:00まで
[5] その他の制限: Winsock2を使用します。
ライブラリは、Cの標準ライブラリとSTLは使って大丈夫です。
基本的にコンソールアプリになります。
コーディングに関してはほとんど教えられておらず、Winsock FAQやMSDNを参考にして組め、と言われています。
言語はC++ですが、別にstdio.hを使っても大丈夫です。cstdioでもいいです。
あと、Winsock2ってことですが、無理にWinsock2の新機能を使わなくても、Winsock1の機能の方が使いやすければそれでも大丈夫です。
どうか、よろしくお願いいたします!
(前スレに間違えて投稿してしまったので、移動してきました。すみません。)
6 :
デフォルトの名無しさん :2006/09/22(金) 13:43:48
質問ですが、C++を使ってACCESSからデータを取り出す方法があるのでしょうか?
8 :
デフォルトの名無しさん :2006/09/22(金) 14:03:43
9 :
(^-^) ◆MONSOON/qo :2006/09/22(金) 14:37:34
10 :
素人です :2006/09/22(金) 14:53:50
11 :
デフォルトの名無しさん :2006/09/22(金) 15:07:18
念のために聞いておこう。 どんなエラーが出るんだ?
12 :
(^-^) ◆MONSOON/qo :2006/09/22(金) 15:12:03
>>10 関数MyGetAddressとMyOutputがない
MyGetAddressをMyCountに置換すればコンパイルエラーは起こらなくなるけどさ このプログラム、多分それだけじゃ正常な動作はしない。
ひまなんで誰か問題ください
15 :
デフォルトの名無しさん :2006/09/22(金) 21:36:38
>>5 テーブルってなんですか?DBでも連携させるのかな?
16 :
デフォルトの名無しさん :2006/09/22(金) 21:50:41
>>5 それと仮IPと実IPの定義がわからない。
>「ホスト」から仮 MAC アドレスと仮 IP アドレスが送られてきたら
これはどういう意味でしょうか
>>5 あと
>(注意)練習のため、サーバーはデフォルトポート(システムに指定させる)を使用して
ください。
これの意図するところがわかりません。
問題を作った人はSOCKETの知識はあるんですか?
18 :
デフォルトの名無しさん :2006/09/22(金) 23:20:39
>>17 空いてるポート使うってだけでしょ
勝手にOSが割り当ててくれる
21 :
デフォルトの名無しさん :2006/09/23(土) 00:17:28
C言語で、自然数nを読み込んで、1/nを少数で割り切れたところまで表示するプログラムを教えてください。
23 :
(^-^) ◆MONSOON/qo :2006/09/23(土) 01:00:33
>>21 #include <stdio.h>
#define keta 30
main(){
int i,s,n,m;
for(n=2;n<15;n++){
s=1;
printf("1/%d = 0.",n);
for(i=0;i<keta;){
while(1){
s*=10;
if(n<=s)break;
printf("0");i++;}
m=s/n;
printf("%d",m);
s-=m*n;i++;
if(s==0)break;}
printf("\n");}}
24 :
5 ◆jG/Re6aTC. :2006/09/23(土) 03:41:45
>>9 すいません。確かに長いですね。
>>15 テーブルといってもDBではありません。
vectorやmapを使ってメモリ内に「概念的な」テーブルを作ります。
とにかくIP→MACの変換ができれば何でもいいと思います。
>>16 仮とか実っていうのは、自分もよくわかりません。
たぶん、仮というのは、そういうIPアドレスが存在するフリをする、って感じのことだと思います。
25 :
5 ◆jG/Re6aTC. :2006/09/23(土) 03:42:49
>>17 デフォルトポートの意図に関しては、自分もよくわかりません。
0を指定したら自動的に割り当ててくれるっていうのを、知らしめたい(?)んでしょうか。
>>18 取り組んでくれたんですね!!
ありがとうございます。
正直言うと、ネットワークは自分の専門でもないので、こんな長々したプログラムやってる時間がなくなってしまったのです。
もし、ちょっと時間を割いていただける方や、ネットワークの得意な方などいらっしゃいましたら、超猛烈に大感謝です!!
26 :
デフォルトの名無しさん :2006/09/23(土) 10:46:38
>>27 ありがとうございます、動きました
でもよくわからないところがあるんですがこの「free(table)」って命令は何をやってるんですか?
さすがは丸投げクオリティw
後期なのに、「命令」とか言ったり標準関数のfree()を知らなかったり・・・ いますぐ大学辞めた方がいいぞ。
>>28 tableをfreedomしてます
動物愛護の精神です
>>28 malloc で、確保したメモリを開放してる。
最近の OS はプログラム終了時メモリを強制的に開放するから、短いプログラムしか
書かない授業段階じゃ、一々 free() をさせてないんだろ。このスレじゃ珍しく
貰った答え読んで動作理解しようと努力してる奴をあんまり叩くなや><
ゆとり教育
なんでもかんでもゆとり教育のせいにするのはよくないと思います
牛肉食って脳が腐り始めた人間が増え始めただけだろ
37 :
デフォルトの名無しさん :2006/09/23(土) 21:18:20
ここで宿題教えてくれといったK、N、Y、I、I お前ら単位やらないから俺の講義でなくていいぞ
K,N,Y,I,Iってただ打ちやすい位置にキーがあっただけだろ。
打ちにくい位置のキーってどんなのだろう・・・ Qとかかな?
>>41 個人的にはZXCが苦手
リファクタリングとかやってると関数名や変数名にzxcの使用頻度が低い事に良く気が付く
打ちやすいように腕と掌の位置をシフトさせるからそういうのはあんまり無いなぁ。
_ |とかは? そうでもないか。。
俺は6かな左手で打つか右手で打つか迷う
>>45 "6"は右手で打ちたいんだけど、MSナチュラルキーボード使ってるから強制的に左に…
!をうつのが苦手 みんなどうやってうってるの? 左手小指でシフト、薬指で1を押してるんだけど…
親指 - シフト 人差し指 - 1
>>47 左小指でSHIFTを、左薬指を軽くTabに当てて姿勢制御、左中指で突き立てるように1を突く。
>>49 例えば、
if(!
ってうつ場合、
(をうつときは左手の小指でシフト、右手中指で8を押して、
次に!をうつとき、左手の小指のシフトは押しっぱなしになるから、
薬指で1を押すことになっちまうんだよ><
どこかおかしいよね
>>50 なれるまでは薬指でタブっちゃいそうだけど、
そっちのがよさげだね。
参考にさせてもらうよ
右小指でShift、左薬指で1押す俺はきっと異端
よお俺w
本来はそれが正しいというかまともっぽいんだけどねえ 自分は右シフトの存在に気付く前に一通りタイピングを覚えちゃった
左小指でSHIFT+左中指で1は俺だけじゃないはずだ
それ上にあったような。。+俺もw
C言語の宿題です。 インタフェースはvoid wait( int time )で、 引数 time で渡された遅延時間(msec単位)だけ待って 処理を上に返す仕様です。 処理待ちの関数を作る課題でどうやって処理待ちをするか困ってます。 CPU速度に依存しない(ポーリングは使わない)やり方があったら教えてください。 WindowsのBCC32コンパイラを使っています。
59 :
58 :2006/09/25(月) 00:35:53
火曜日までなのでまた今晩来ます。 今日はもう寝ます、ごめんなさい
Sleep()を実装しろということかな?
>>58 これじゃダメ?
void wait(clock_t wait)
{
clock_t total = wait + clock();
while(total > clock());
}
62 :
素人です :2006/09/25(月) 08:33:26
>>12 >>12 コンパイルの『ステータスは終了しました』という文は直りましたが、期待するものは得られませんでした。
精進します。どうもありがとうございました。
案外、Sleep() 「で」 実装する、というのが正解だったりして。
Cの標準ライブラリ&ポーリング無しでできるの?
66 :
デフォルトの名無しさん :2006/09/25(月) 12:24:50
>>58 ホントに宿題か? ゲーム作ろうとして一定時間でメインループを
まわす方法を調べてるんじゃないの?
ならこれで1/60とかで回せる。 #include <windows.h> void wait(DWORD r) { DWORD s = timeGetTime(); while(timeGetTime() - s < 1000 / r); } int main(void) { for(;;){ wait(60); } return 0; }
1/60じゃなくてfps60だった。 1secあたり60回更新ね。
平気でビジーループを作る人たち。
void wait( int time ) { sleep(time); } これが答えだったら出題者の釣りか罠だな。
>>70 単なるサンプルなのにそこまで書くのめんどい。
Winでゲーム作る場合は、DoEvents()関数とか作ってイベント強制通知すればいい。
アッー!
75 :
デフォルトの名無しさん :2006/09/26(火) 10:34:22
アッー!
吹いたw
アッー!
c言語の宿題なんですが Word等のワープロソフトでは、 文章中の文字(単語)のミスや変更などをする場合、 その文字検索して置き換える(検索→置換)機能を持っている. 単語と単語の間には必ずスペースが入っているものとして考えて, これはどのように処理しているんですか?
>>79 文章の構成単語が、辞書に登録されているものと合致する、もしくは固有名詞としての体裁を整えているか確認。
>>79 strstr()とかで検索してその部分を置き換えればいいんじゃないの?
一瞬、形態素解析の話かとおもた
83 :
デフォルトの名無しさん :2006/09/26(火) 17:47:44
[1] 授業単元:計算科学 [2] 問題文 ランダムウォークの長さ? 5 シード? 3098 とすると,3098 を seed として, 長さ 5 の1次元ランダムウォークを行い, 0 0 0 0 0--------|------------------- 0 0 * 1 -1 * 2 0 * 3 +1 * 4 +2 * 5 +1 * のように表示するプログラムです. (図がずれてる時の説明です) 基本の*はlの下にくる形になります -1だったら左にずれて+1だったら右にずれる形です。 +2ならふたつ右にずれます。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C [4] 期限: 2006年10月02日09:00まで
84 :
デフォルトの名無しさん :2006/09/26(火) 17:54:24
83はこれを参考にしてつくるそうです #include <stdio.h> #include <stdlib.h>/* 乱数を使うために include */ double get_uniform_random(void); int main(int argc, char **argv){ int n;/* 繰り返し回数 */ unsigned int seed;/* 乱数のシード */ int i; int s; printf("繰り返し回数?\n"); scanf("%d",&n); if(n<0){ n=0; } printf("シード?\n"); scanf("%d",&seed); srand(seed); for(i=0; i<n; i++){ if( get_uniform_random()<0.5 ){ s=-1; } else { s=+1; } printf("%d %+3d\n",i,s); /* %+d はいつでも+-をつける. %3d は3桁確保*/ } return 0;/* 必ず何か返す */ } double get_uniform_random(){ return ((double)rand())/((double)RAND_MAX+1.0); }
いい加減に書くが、こんな感じで伝わるだろうか? 標準関数使ってるから、関数の意味はググって調べてくれい。 #include <stdio.h> #define ZERO_POINT 9 #define LENMAX 80 /* 中略 */ int* s; s = malloc(n * sizeof(int)); /* ここで先のプログラム流用して、s[i]にそれぞれ累計が保存されてるとおもいねえ */ /* +1 -1 +1 +1 +1 という結果だったら s[0]=1, s[1]=0, s[2]=1, s[3]=2, s[4]=3となる感じでひとつ */ { int i; char exstr[LEXMAX+1]; char blankstr[]=" "; for(i=0; i!=n; i++){ if(i==0){ /* <-------> ここのながさ、ZERO_POINT=9文字分 puts(" 0 0 0"); puts(" 0 0---------|-------------------"); puts(" 0 0 *"); continue; } strcpy(exstr, ""); strncpy(exstr, blankstr, ZERO_POINT + s[i]); strcat(exstr, "*"); printf("%3d %+3d%s\n", i+1, s[i], exstr); } free(s); }
87 :
デフォルトの名無しさん :2006/09/26(火) 20:26:58
[1] 授業単元: 発展プログラミング [2] 問題文(含コード&リンク): UNIXを今動かしていて、プログラムはCで書いています。 問題:echoクライアント・サーバとあり、echoサーバでクライアントから読み込んだ行を逆順にして返すようなサーバを作れ 。(プログラムを書け) 例えば、ABC\としたら\CBAのようになるようにプログラムを書き換えるということです。 ABC←打ち込む CBA←表示 これは駄目である。 正しくは ABC←打ち込む CBA←表示 つまり改行してはならない。 echoサーバでは文字を逆にするプログラムをC言語で書き、echoクライアントでは、null等を使って改行を無くす。 注:echoサーバで文字を逆にするプログラムはreverse()を使い、buf,buf2を使うこと。 [3] 環境 [3.1] OS: (Windows/Linux/等々) XP(ちなみに家のPCはMEです) [3.2] コンパイラ名とバージョン: teletarm←UNIX C言語を書いてるのはメモ帳 [3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語です [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 今日中 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 一応、C言語は浅く広く習っています。スレ違いかもしれませんが、よろしくお願いします。
すいません・・・ageてしまいました。 echoクライアントのプログラムです #include <stdio.h> extern int errno; #define LINEBUF 1024 main(argc,argv) int argc; char *argv[]; { int s,n,oc,ic; char buf[LINEBUF+1]; s=connectTCP(argv[1],argv[2]); while(fgets(buf,LINEBUF+1,stdin)){ write(s,buf,oc=strlen(buf)); for(ic=0;ic<oc;ic+=n) { n=read(s,&buf[ic],oc-ic); if(n<0) errexit("socket read failed: %s\n",strerror(errno)); } fputs(buf,stdout); } }
89 :
デフォルトの名無しさん :2006/09/26(火) 20:29:19
echoサーバのプログラムです #include<sys/types.h> #include<sys/signal.h> #include<sys/socket.h> #include<sys/time.h> #include<sys/resource.h> #include<sys/wait.h> #include<sys/errno.h> #include<netinet/in.h> #include<stdio.h> #define QLEN 5 #define LINEBUF 4096 extern int errno; main(argc,argv) int argc; char *argv[]; {struct sockaddr_in fsin; int ms,ss,alen,cc; char buf[LINEBUF]; int heaven();
ms=passiveTCP(argv[1],QLEN); signal(SIGCHLD,heaven); while(1){ alen=sizeof(fsin); ss=accept(ms,(struct sockaddr*)&fsin,&alen); if(ss<0){ if(errno==EINTR) continue; errexit("accept failed: %s\n",strerror(errno));} switch(fork()){ case 0: while(cc=read(ss,buf,LINEBUF)){ if(cc<0) errexit("echo read: %s\n",strerror(errno)); if(write(ss,buf,cc)<0) errexit("echo write: %s\n",strerror(errno)); } exit(0); default: close(ss); break; case -1: errexit("fork: %s\n",strerror(errno)); } } } heaven() { int status; while(wait3(&status,WNOHANG,(struct rusage *) 0) >=0) ; signal(SIGCHLD,heaven); }
>>87 [3]がめちゃくちゃだぞ。
推敲して再書き込みしろ。
>>91 [3] 環境
[3.1] OS: (Windows/Linux/等々) OSはWindowsXP(学校のです)
[3.2] コンパイラ名とバージョン: C言語のコンパイラは使っていません。telatarmというソフトでワークステーションに
接続して、メモ帳に書いたC言語のプログラムをUNIX上に貼り付けて動かしています
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C言語
です。
>>92 上がechoクライアントのプログラムで、下がechoサーバのプログラムです。
echoクライアントは、端末から入力を貰い、echoサーバに送りつけて、echoサーバの返してきたものを端末に表示する
ものです。
>>93 いや、コンパイラは使ってるだろうし、上のコードはどうみてもUnix/Linuxのものだぞ。
>>94 例えば、コンパイラと言えばvisual studioのような物ですよね?授業では、telatarmというソフトとメモ帳しか使ってない
んですよね。telatarmを起動し接続してemacsで書くのがいつもで、特にvisual studioのようなC言語コンパイラは使って
ないんです。
wWwWwWwW
[1] 授業単元: 情報科学基礎 [2] 問題文(含コード&リンク): 2つの配列を作り,周波数の異なる2つの正弦波形 を描くプログラムを書け。 [3] 環境 [3.1] OS: (Linux [3.2] コンパイラ名とバージョン: (gcc) [3.3] 言語: (C) [4] 期限: ([2006年9月27日) [5] なし したのプログラムの続きからお願いします。 #include<stdio.h> #include<math.h> int main(void){ int i; float x[3600],y[3600];
>>95 お前の知識レベルはわかったからもう環境に関して説明しなくていいよ。
ただ、reverse()というのが何者かわからないと、解けないから説明しろ。
>>95 visual studioはコンパイラではなくIDE(統合開発環境)と呼ばれるものです。
これには、エディタ、コンパイラ、リンカ、デバッガ、UIデザイナなどソフトウェア開発に必要なもの一式が含まれます。
C言語のプログラムを実行するには、C言語のコンパイラか、C言語のインタープリタが必要になります。
一般にC言語のインタープリタが使われることは滅多にないので、普通はコンパイラを使います。
C言語のソースコードを実行ファイルに変換するときに"cc hogehoge.c"とか、"gcc hogehoge.c"とかのコマンドを実行していると思います。
この"cc"や"gcc"がコンパイラと呼ばれるものです。
>>98 reverse()に関する説明があるので書きます。
echoサーバで、逆順に返すohceもちゃんと作るように。cでまともに手をいれる最初です。 バッファー用の配列をもう1つ作
って、逆順につめて戻す関数reverse()を作 成してそれを使うという手と、元の配列の上で逆順にしてしまう という手の2つ
が考えられます。
echoサーバは入力が文字列であることは仮定していません。ですから、reverse()するときは、文字数であるccも引数に
渡してやるべきです。reverse(buf,buf2,cc); さて、単純にリバースすると、今のクライアントから送られる文字列 としては
最後に改行コードがあるので、先頭に改行がきてあまり良くないです。 つまり、入力が"ABC\n"を単純にリバースすると
"\nCBA"となります。
そこで、最後の文字が改行だったら、それは折り返さないというtipsを入れることにして、 "ABC\n"を"CBA\n"となるように
するのは駄目です.
ということで、最終的には、エコー逆順は本当に逆順にするだけ。クライアントが送るときに改行はサーバーに送らずに、
戻ってきたら最後に改行も表示とします。
reverserを使わない例として書くと、 int i; char c;を仮定して for(i=0;i<cc/2;i++) {c=buf[i];buf[i]=buf[cc-1-i];buf[cc-1-i]=c;}
で反転します。
クライアントは、fgets()でbufに読み込んだ時点で、最後が改行になっているから、 文字列の長さがstrlen(buf)で、bufの
最後の場所は長さ引く1だということに注意して、そこに'\0'を入れて やると、最後の改行がつぶせます。あとは逆順から
でも普通のエコーでもサーバに送ってやって 戻ってきたらその文字列を書いて、がfputs()あたりかな、その後ろに改行文
字を書き出す。つまり、putchar(`\n`);すれば いいと思います。
>>99 すいません・・。ありがとうございます。ということは、デフォルトがtestとすればgcc test test.c〜のようにコンパイル
しています。
102 :
デフォルトの名無しさん :2006/09/26(火) 22:25:28
66はスルーですか?
簡単だしほっときゃ誰かやるんじゃね?
104 :
デフォルトの名無しさん :2006/09/26(火) 22:53:10
簡単なんですか? 今日一日考えましたが、無理ぽでした。
簡単だけどC言語でやるのはイヤン
まちがった。「C++」。鬱(ry
>>66 俺の理解力が足りないのか・・・
意味分からん。
108 :
デフォルトの名無しさん :2006/09/26(火) 23:07:07
ファイルが書き込めない・・・誰か助けて。 【環境】 VC++6.0 MFC(ダイアログベース) 【コード】 void CXfile_MotionReaderDlg::OnButton2() { CString str1, str2; UpdateData(TRUE); str1 = m_text1; //IDC_EDIT1 メンバ変数 str2 = m_text2; //IDC_EDIT2 メンバ変数 TRACE( "%s\n", str1 ); TRACE( "%s\n", str2 ); CStdioFile fout( "file.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ); fout.WriteString( m_text1 + "\n" ); fout.WriteString( m_text2 ); fout.WriteString( "\x1a" ); } TRACEの表示ではちゃんと自分が欲しいデータが表示されているのにも かかわらず、ちゃんとカキコみできない。
>>108 多分関係ないと思うけどCloseはしないのか?
110 :
デフォルトの名無しさん :2006/09/26(火) 23:19:28
>>107 どこがわからないのですか?
補足しますが。
ぜんぜん分からないので、アドバイスだけでもお願いします!
111 :
108 :2006/09/26(火) 23:22:32
>>109 自分素人なもんで・・・、closeなんてあるんでつか?
エディットボックスに直接「文字列」を入力したら
ちゃんとファイルを保存できるんだけど、
エディットボックスへ、文字情報を渡して保存ボタン(OnButton2)を
押すととたんにファイルの保存ができなくなる。
112 :
108 :2006/09/26(火) 23:26:08
エディットボックスへ文字列を渡す処理は 以下のように行っておりまつ。 この処理を行うとファイルが書き込めなくなります。 OnButton1() { CString FileName; CFileDialog *dlgFile; dlgFile = new CFileDialog( TRUE,_T("wav"),_T("*.wav"),OFN_FILEMUSTEXIST,_T("Wave(*.wav)|*.wav|全て(*.*)|*.*||")// フィルタ ); if(dlgFile->DoModal() == IDOK) { FileName = dlgFile->GetPathName();//選択ファイル名取得 m_text2 = FileName; UpdateData(FALSE); } delete dlgFile; }
113 :
108 :2006/09/26(火) 23:33:05
>> 連続カキコすまそ。 Closeわかりまつた。
>>97 描くってgnuplotを呼び出して描くのかなー
#include<stdio.h>
#include<math.h>
int main(void){
int i;
float x[3600],y[3600];
FILE *fp;
if( (fp=fopen("tmp.dat","w"))==NULL){
printf("ファイルオープンエラー");
return EXIT_FAILURE;
}
for(i=0;i<3600;i++){
x[i]=sin(i);y[i]=sin(2*i);
fprintf("%d %f %f\n",i,x[i],y[i]);
}
fclose(fp);
めんどくさくなった続きよろ
>>114 ×:x[i]=sin(i);y[i]=sin(2*i);
○:x[i]=sin(i*3.14/360);y[i]=sin(2*i*3.14/360);
117 :
108 :2006/09/27(水) 00:26:26
原因をここまで突き止めました。 下記のソースコードを実行しても ファイルがカキコミできません。 どなたか、ファイルが書き込みできない理由を 教えてください。 void CXfile_MotionReaderDlg::OnButton1() { CFileDialog *dlgFile; dlgFile = new CFileDialog( TRUE, // 種類 TRUE : FileOpen _T("jpg"), // デフォルトの拡張子 _T("*.jpg"),// 初期ファイル名 OFN_FILEMUSTEXIST, // ダイアログの設定フラグ:既存のファイル _T("Wave(*.jpg)|*.jpg|全て(*.*)|*.*||")// フィルタ ); if(dlgFile->DoModal() == IDOK) { CStdioFile fout( "file.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary ); fout.WriteString( dlgFile->GetPathName() ); fout.Close(); } delete dlgFile; }
118 :
デフォルトの名無しさん :2006/09/27(水) 00:50:53
119 :
97 :2006/09/27(水) 00:58:08
>>114 そうです。gnuplotでグラフを描きます。
よろしくお願いします。
118が寝ている間に宿題やれってよwwww
121 :
◆ccqXAQxUxI :2006/09/27(水) 01:04:03
>>117 今試してみたが、
file.textに、CFileDialogで選択したファイルのフルパスが、きちんと書き込まれたぞ。
file.textを排他ロックしてるか、読み取り専用属性になってるんじゃね?
125 :
デフォルトの名無しさん :2006/09/27(水) 01:34:06
>>123 ありがとうございます!!
ほんとに感謝です!
これを参考に解析のプログラムをこれから頑張ってみたいと思います。
126 :
97 :2006/09/27(水) 01:40:58
>>122 ありがとうございます。
早速実行してみます。
>>118 よ、ほれ。
---- analyze.c ----
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
char buf[2048];
sprintf(buf, "cmd.exe /c C:\Python25\python.exe analyze.py %s", argv[1]);
return system(buf);
}
---- analyze.py ----
import os, os.path, sys, datetime
tagMacTable = {}
tempFileNames = set()
dirname = "RFIDTAG"
for line in file(sys.argv[1], "r"):
line = line.strip()
y, m, d, hh, mm, ss, tagid, mac, batflag, id = line.split(",")
fn = os.path.join(dirname, tagid + ".txt")
tempFileNames.add(fn)
print >> file(fn, "a"), line
tagMacTable.setdefault((tagid, mac), []).append(line)
for (tagid, mac), log in tagMacTable.items():
ts = []
for line in log:
y, m, d, hh, mm, ss, tagid, mac, batflag, id = line.split(",")
ts.append(datetime.datetime(*tuple(map(int, [y, m, d, hh, mm, ss]))))
if (max(ts) - min(ts)).seconds >= 5 or mac == "001047FB18CB":
for line in log: print >> file(os.path.join(dirname, tagid + mac + ".txt"), "w"), line
map(os.remove, tempFileNames)
おっと失敬、最後から2行目、 for line in log: print >> file(os.path.join(dirname, tagid + mac + ".txt"), "w"), line は for line in log: print >> file(os.path.join(dirname, tagid + mac + ".txt"), "a"), line の間違い。
C++って言ってるのに、CとかPythonとか提示するやつがいるな。
130 :
デフォルトの名無しさん :2006/09/27(水) 08:15:19
87です。echoクライアントの改行の所をやってみたのですが・・・。 #include <stdio.h> extern int errno; #define LINEBUF 1024 main(argc,argv) int argc; char *argv[]; { int s,n,oc,ic; char buf[LINEBUF+1]; s=connectTCP(argv[1],argv[2]); while(fgets(buf,LINEBUF+1,stdin)){ buf[strlen(buf)-1]='\0'; write(s,buf,oc=strlen(buf)); for(ic=0;ic<oc;ic+=n) { n=read(s,&buf[ic],oc-ic); if(n<0) errexit("socket read failed: %s\n",strerror(errno)); } fputs(buf,stdout); putchar('\n'); } } どうでしょうか?
それだとファイルの最後が改行で終わってないと、最後の1文字を 処理できない。それに、空行時はスキップするようにした方がいいと思う。
>>131 すいません・・・これ以上思いつかないんですがヒントをいただけませんか?
>>129 拡張子を.cppか.ccに変更+Pythonというランタイムが必要、
と言い放てばいいんじゃね?
134 :
デフォルトの名無しさん :2006/09/27(水) 09:14:47
>>127 ありがとうございます!
みなさんほんとに親切な方ばかりで、、、
助かりました。何とか今日中にレポートとして仕上がりそうです。
ほんとにほんとにありがとうございました!!!
135 :
デフォルトの名無しさん :2006/09/27(水) 16:37:07
文字列を反転させる関数なんですが、もっと効率良く書けますか? スワップの所はxorのが速いでしょうか? それか配列の[]のアクセスよりポインタの*の方が速いでしょうか? void reverse(char *s) { int l = 0, r = strlen(s) - 1; char t; while(l < r){ t = s[l]; s[l] = s[r]; s[r] = t; ++l; --r; } }
>>135 xor使うな。s[l] == s[r]の時ゼロになってしまうぞ。
配列とポインタは、どちらを使っても最近のコンパイラは同じようなコードを吐く。
>>136 そうですか。
という事はこれが一番効率良いコードでしょうか?
138 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 16:58:06
139 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 16:59:50
C/C++分かる人ってアセンブラも分かる人が多いんですかね? ここで教えてくれてる人ってアセンブラも使えますか?
>>136 > s[l] == s[r]の時ゼロになってしまうぞ。
排他論理使ってもスワップはできる
>>140 アセンブラも少しはできるけど、激しくスレ違い
現代CPUの都合から言えばxor swapはアウトオブオーダー実行できないから遅い。 普通のswapですむ状況ならそっちを使うほうがマシ
これは遅い? a = b - a; b -= a; a += b;
146 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 18:00:51
交換が正しく行われているかは不明だけど マクロの方が4倍以上速い #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 1000 #define reverse_macro1(s) l=strlen(s)-1;for(n=0;n<l/2;n++){temp=s[n];s[n]=s[l-n];s[l-n]=temp;} void reverse(char *s){ int l = 0, r = strlen(s) - 1; char t; while(l < r){ t = s[l];s[l] = s[r];s[r] = t; ++l;--r;}} main(){ char a[N+1]; register char temp; int n,l; clock_t s=0,t=0; for(n=0;n<N;n++)a[n]=rand()%75+48;a[N]='\0'; s=clock();for(n=0;n<1000000;n++)reverse_macro(a);s=clock()-s; t=clock();for(n=0;n<1000000;n++)reverse(a);t=clock()-t; printf("macro no speed = %d \n135 no code = %d\n",s,t);}
>>138 register宣言はコンパイラによって無視されるか余計なお世話。
>>139 今時のコンパイラは積極的にインライン展開するから余計なお世話。
>>146 マクロを展開した後の形をみて己の馬鹿さ加減を悔いれ
>>146 複文マクロをdo while(0)でくくる常識も知らない奴は消えてほしいです。
150 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 18:13:04
スマソ 勉強になった
最近は、大抵の CPU がそもそもエクスチェンジの命令持ってるから。
x86系なら XCHG
http://www5c.biglobe.ne.jp/~ecb/assembler/9_2.html コンパイラがよっぽど馬鹿じゃない限り、一時領域使おうが加減の演算使おうが
xor 使おうが、この種のエクスチェンジ命令に最適化されるはず。
よっぽどコンパイラが信用ならんのなら、実際に計測してみてコーディングに拘ってみたら。
大抵の CPU がエクスチェンジ命令を備える現在、高級言語のでもエクスチェンジを行う
演算子があれば便利なんだけどね。
というか、リソースかつかつの20年前のプログラミングや、物理的にリソースが制限される
組み込み系ないら話しは分かるけど、現代の学校の宿題レベルでそんな所に拘る必要は
皆無だろうと。
叩かれてるなぁw
153 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 18:17:31
しかも交換してるか確認してなかったから 無限ループしてるっぽい
154 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 18:29:15
修正したらマクロが鈍くなった #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #define N 1000 #define reverse_macro(s) l=strlen(s)-1;for(m=0;m<l/2;m++){temp=s[m];s[m]=s[l-m];s[l-m]=temp;} void reverse(char *s){ int l = 0, r = strlen(s) - 1; char t; while(l < r){ t = s[l];s[l] = s[r];s[r] = t; ++l;--r;}} main(){ char a[N+1]; register char temp; int m,n,l; clock_t s=0,t=0; for(n=0;n<N;n++)a[n]=rand()%75+48;a[N]='\0'; s=clock();for(n=0;n<1000000;n++){reverse_macro(a);}s=clock()-s; t=clock();for(n=0;n<1000000;n++)reverse(a);t=clock()-t; printf("macro no speed = %d \n135 no code = %d\n",s,t); }
こやつの言っている高速化が、 手法として古くさい上に、どうでもいい部分だからな 最近じゃ小手先のコーディングテクニックの高速化なんて、 膨大なCPUクロック上の些末な変化でしかない よほどアホな書き方をするとか、実行環境がチープでない限り実測時間には影響しない
マクロ覚えて三日目ぐらいの初心者が書いたような最低なゴミコードだな。 せめてmain関数のスコープを汚すな。そして{}でくくるのはマクロでやれ。 ついでに複数回評価の弊害を起こすコードもやめろ 本当はコードの中身も訂正したいけど。正直酷すぎるからその辺は放置 #define reverse_macro(a) \ do{ char*s=(a);int l=strlen(s)-1,n;char temp;\ for(n=0;n<l/2;n++){temp=s[n];s[n]=s[l-n];s[l-n]=temp;}}while(0)
157 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 18:51:24
2の方が速いんですけどなぜでしょうか? #define reverse_macro1(s) {l=strlen(s)-1;for(m=0;m<l/2;m++){temp=s[m];s[m]=s[l-m];s[l-m]=temp;}} #define reverse_macro2(s) {l=0;r=strlen(s)-1;while(l<r){temp=s[l];s[l]=s[r];s[r]=temp;l++;r--;}}
にほんごでおk
Cって変数全部スタックに積んじゃうんじゃないの?
>>159 さぁ?
レジスタ使うかもしれんし、スタック使うかもしれんし、そもそもスタックという概念のない環境もあるかもしれんし
>>157 forループで毎回「l/2」「l-m」[l-m]やってるからでしょ。
猥談はそのへんにしといて 次の宿題まだー?
163 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 19:15:05
[宿題] 改行区切りで、一行1000文字以下のファイルが2つあります ファイルの一方に存在しない行を抽出してください
締め切り過ぎた問題もってこられても困る。
ヒント:PM
168 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 19:36:49
>>165 ファイルサイズが20Mバイト以上とかだとアルゴリズムが
大事だと思うんですけどどういった戦略でいけばいいんでしょうか?
169 :
デフォルトの名無しさん :2006/09/27(水) 19:50:41
>>169 if(max < *p++) max = *p;
これは
if(max < *p++) max = p[-1];
こうだね。
なんなんだ、このウンコな問題は。
date[i] = value;i++; ↑これ、date[i++] = value;でいいのでは? for(i = 0 ;date[i] != 0 ; i++) printf("%9d\n",date[i] ); /* 配列要素の表示 */ ↑これ、参照用ポインタ使わなくていいの? while(*p ){ ↑個人的にこの無神経な書き方は許せない。 いや、わざとなんだろうけどさ。
暫くこのスレご無沙汰だったがなんだこの糞コテは?
>>163 え・・・こんな質問されると普通に萎える。
>>169-170 どうもありがとうございました
こんなに早く回答してもらえるとは思ってたなかっただけに嬉しかったです
でもこれがうんこな問題なんですか…
どこが駄目なのか全然分からないorz
あぼーんだらけw
178 :
デフォルトの名無しさん :2006/09/27(水) 20:50:24
>>177 if(argc != 2){
printf("\n使用法 : プログラム名 入力ファイル名\n");
exit(-1);
が、閉じてない。
179 :
(^-^) ◆MONSOON/qo :2006/09/27(水) 20:51:27
>>177 括弧がたらないよ
最後に } をつける
通るまで自分でいじれよ・・・
コンパイルもせずに回答アップするなよw
>176 漏れもw
>>178-179 警告は出ましたがコンパイル通りました
本当に何から何までありがとうございました
そろそろ真面目に自分で勉強しないとまずいと思い始めてきました
ここにいる皆さんは独学でプログラミングできるようになったんでしょうか?
大学の授業についていけてないので危機感を持つようになりました…
>>183 僕は授業についていけませんでしたが、
こんなんあったら便利だろうなという作りたいものが後々でてきたので
C言語を勉強しなおしてある程度のものは作れるようになりました。
スレ違いですどうもありがとうございました。
>>183 プログラムを仕事や趣味でやるつもりなら、教わらないとできないのはヤバい。
そんなつもりがなければ、なんとか単位とるまで頑張って、試験終わったら忘れればいい。
C言語で記述された以下のプログラムの実行結果(画面の出力結果)を記してください。 #include<stdio.h> void main(void) { int x[6]={7,3,5,4,1,9},i=0; i=x[i=2]; printf("x[%d]=%d x[%d]=%d\n",i,x[i],i-3,x[i-3]); } よろしければ解説もよろしくおねがいします。
>>186 出力結果
x[5]=9 x[2]=5
#include<stdio.h>
void main(void)
{
int x[6]={7,3,5,4,1,9},i=0;
i=x[i=2];/*x[2]は5なのでiに5が代入される*/
printf("x[%d]=%d x[%d]=%d\n",i,x[i],i-3,x[i-3]);/*配列xの5番目の要素は9。 配列xの5-3=2番目の要素は5。*/
}
っていうか}が}になってるみたいだけど自動的に変換されるのか?のテスト。
5番目だとちょっとわかりにくくね?そこらへんはすでに勉強してると思うけど・・・
>>186 解説
全角の記号が各所に埋め込まれており、C言語の体裁をなしていないため、コンパイル不能です。
当然プログラムの実行も不可能なので、解無し。
>>187 わかりやすい解説でよくわかりました、ありがとうございます。
{が{になっているのはC言語のソフトをもっていなくて今自分で書いたからです。
>>184-185 そうなんですか
将来プログラム関係の仕事につきたいので真面目に勉強してみます
どうもありがとうございました
あとすれ違いすいませんでした
もう2つあるんですができればおねがいします。 #include<stdio.h> void main(void) { int i=0,j=1; while(i<5){ i++; j=j*i; } printf("1*2*・・・*5=%d\n",j); printf("i=%d\n",i); } できれば解説も書いていただけるとありがたいです。宜しくお願いします。
>>192 の問題はプログラムの実行結果(画面の出力結果)を記してください。
1*2*・・・*5=120 i=5 1x2x3x4x5を電卓で計算してみればわかるんじゃない?
195 :
デフォルトの名無しさん :2006/09/27(水) 23:40:37
>>192 while(i<5){ // 5未満の間ループする
i++; //i=1
j=j*i; //1*1=1
i++; //i=2
j=j*i; //1*2=2
i++; //i=3
j=j*i; //2*3=6
i++; //i=4
j=j*i; //6*4=24
i++; //i=5
j=j*i; //24*5=120
こんな風に分解して考えると分かりやすいかも?
197 :
デフォルトの名無しさん :2006/09/27(水) 23:46:28
追加 data01〜05まではそれぞれ20*20の数値データ。 <考え方> data01 data02 data03 1 2 3 4 5 6 7 8 9 4 5 6 7 8 9 1 2 3 7 8 9 1 2 3 4 5 6 <sum.txtには> A B C D E F G H I たとえばAには1+4+7の結果が入る Fには6+9+3の結果が入る。 Average.txtにはそれぞれの平均値が入るので、この場合 和を取った結果AからFをそれぞれ3で割ったものが入る。 (問題文では5で割ったもの)
198 :
195 :2006/09/28(木) 00:54:01
>>168 std::set_symetric_difference()
200 :
199 :2006/09/28(木) 01:04:03
綴りを間違った。set_symmetric_differenceだった
>>198 指針
・Matrixを次のように定義する
int rows, cols;
int[][] m;
・テキストファイルからMatrixを読み込めるようにする
・Matrixに実数倍のMatrix加算をできるようにする
・Matrixを実数倍できるようにする
・Matrixをテキストファイルに書き出せるようにする
これだけなんだが、めんどう
202 :
195 :2006/09/28(木) 01:47:18
>>201 そうなんですよ。
特に割るのと引くののやり方がよくわかりません。
涙が出そうです。
203 :
デフォルトの名無しさん :2006/09/28(木) 01:47:19
>203 そのURLで、ダミーの .urlファイルを作成し、ShellExecuteすれば開ける
>>202 ううーん…
typedef struct _matrix{
int rows, cols;
int[][] m;
} Matrix; //のように定義しちゃう
----------------------------------------------------------
Matrixを総なめするには
Matrix* m=CreateMatrix(10,10); //みたいな関数があるとして、
int row,col;
for(row=0;row<m->rows;row++){
for(col=0;col<m->cols;col++){ printf("%d ",m->m[row][col]); }
printf("\n");
}
みたいにすればいい
-----------------------------
void add(Matrix* src_out, int by, const Matrix* src){ //みたいにすれば整数倍だってできた
if(!checkSameModel(src_out,src)) return; //同型じゃない
for(…) //row
for(…) //col
src_out->m[row][col]+=by*src->m[row][col];
}
-----------------------------
void writeFile(FILE* fp, const Matrix* src){ //ほら、ファイルに書けた。
for(…){ //row
for(…){ //col
printf("%d\t",src->m[row][col]);
}
printf("\n");
}
}
-----------------------------
>>205 トチ狂っとるwwwwwwwwwwwwwwww
寝れwwwwww
207 :
195 :2006/09/28(木) 02:18:01
>>205 大変ありがたいご助言ですが、
私にはなんだか余計に理解できないのですが・・・。
すみません。
もっと初心者向けの解説をお願いいたします〜(涙)
208 :
◆sUfWYz9MSA :2006/09/28(木) 03:15:47
209 :
デフォルトの名無しさん :2006/09/28(木) 03:27:15
210 :
209 :2006/09/28(木) 03:43:55
211 :
デフォルトの名無しさん :2006/09/28(木) 03:44:14
>>209 ひとつずつ書くのじゃなく、もっとエレガントな方法ないかな。
一個ずつやんないと無理かね?
freadとか使ったらどうだ?
212 :
(^-^) ◆MONSOON/qo :2006/09/28(木) 03:59:35
213 :
デフォルトの名無しさん :2006/09/28(木) 04:03:52
214 :
デフォルトの名無しさん :2006/09/28(木) 08:35:30
>204 色々試したのですが、どうもうまくいきません。 具体的にはどのようなプログラムになるのでしょうか? 教えて頂ければうれしいです。 どうぞどうぞ宜しくお願いいたします。
>>203-204 WindowsならShellExecuteに直接URLを渡せば動く。
ShellExecute(0, TEXT("open"), TEXT("
http://www.google.com/ "), 0, 0, SW_SHOW);
IE以外を標準のブラウザにしている場合はそれで開かれる。
強制的にIEで開かせる(単純な)方法もあるが。
>>208 stdio.hっていつから関数になったの?
基礎力付けなきゃな。かえれ
>>208 問題3、4だけやった
double absdiff(double a, double b)
{
return a>b ? a-b : b-a;
}
int count(int target, int data[], int num)
{
int cTarget = 0;
if (num < 1) return 0;
while (num-- >= 0)
if (data[num] == target) ++cTarget;
return cTarget;
}
int max(int data[], int num)
{
int iMax;
--num;
for (iMax=num--; num>=0; --num)
if (data[num] > data[iMax]) iMax = num;
return data[iMax];
}
int mylen(char str[]) { int cLen = 0; while (*(str++)) ++cLen; return cLen; } void casecpy(char fromstr[], char tostr[]) { while (*fromstr) { if (isupper(*fromstr)) *tostr = tolower(*fromstr); else if (islower(*fromstr)) *tostr = toupper(*fromstr); else *tostr = *fromstr; ++fromstr, ++tostr; } *tostr = '\0';
将来マになりたいのなら、ここに丸投げする時点で見込み無し。 大学辞めて働け。
激しく同意。 丸投げしてくる内容は糞簡単なものばかりだしな
>>212 しょしんしゃはくちだししなくていいよ^^
>>208 (1)
#include <stdio.h>
struct stable{
float bmi; char comment[30];
};
int main(void)
{
stable table[] = {
{18.5, "体重を増やしましょう"},{25.0, "体重を維持しましょう"},{30.0, "体重を減らしましょう"},{9999, "大幅に体重を減らしましょう"},
};
float h, w, bmi;
printf("身長を入力して下さい(単位cm)\n");
scanf("%f", &h);
printf("体重を入力して下さい(単位kg)\n");
scanf("%f", &w);
bmi = w / (h / 100.f) / (h / 100.f);
for(int i = 0; i < sizeof(table) / sizeof(stable); ++i){
if(table[i].bmi > bmi){ printf("BMI: %f\n%s\n", bmi, table[i].comment); break; }
}
return 0;
}
223 :
195=197=198 :2006/09/28(木) 13:13:35
どなたかどうぞよろしくお願いいたします。 ちっともうまくいきませぬ。。。
224 :
デフォルトの名無しさん :2006/09/28(木) 13:20:16
プログラム学ぶ大学なんてあんの? 授業のうちの一つでプログラムがあったってだけで、単位得するくらいじゃね? 別にプログラマー目指してるわけじゃないだろwwwwwwwwww プログラマーになりたいのに丸投げしてるんだったら終わりだな
>>224 最後の1行には同意だが、情報系の大学でもコピペで提出する奴は多いぞ
俺の大学では、パクリかどうか検出するソフトでチェックされると脅されていたので、コピペはできなかった。
コピペチェックソフトって作るのおもしろそうだね
229 :
デフォルトの名無しさん :2006/09/28(木) 13:52:34
>>226 情報系の大学があったか。
実態を知らないけど、情報の専門学校となにが違うんだ?
プログラマ目指しててコピペするやつは人として終わってるな。
なんのための授業で、なんのための宿題かがわかってないな。
自分に何の利益がないことも、目の前の「提出しないとやばい」って事だけに目を向けすぎ
それに騙される学生も学生だよな。 チェックするって言ったって、出来るのは精々、部分一致のチェック位だろ。 一致したとしてもパクリとは限らないしな。
>>229 別にC言語がすべてじゃないし、将来C言語は使う気がないなら捨てても構わないと思う。
もっと高級なことに力を費やすのは悪くない。
>>229 プログラムの勉強だけをやる→専門学校
主にプログラムの勉強をする(他にも勉強する)→情報系の大学
あとはあれだ、勉強する期間の違いとか、学士が貰えるとかそこらへんじゃない?
まぁ人として終わってるのは同意だけど、いまさらそれを言ったところで意味無いわけで。
>>230 アメリカではパクリに対する認識が厳しくて(アカデミックな提出物でパクリと見なされると、犯罪になることもある)、パクリの傾向を統計的に集めている機関もある。
そういう統計に基づいてるから、けっこう当たるみたいよ。
>>233 それ面白いな。
日本もやればいいのに・・・。あほ学生があほのまま卒業して、
はりぼての学歴振りかざして社会に出てこられてもね・・・。
ようするに高卒プログラマの無能高学歴に対するひがみかwwwwwwwwwwww
236 :
デフォルトの名無しさん :2006/09/28(木) 14:17:35
>>231 C言語が大事とか関係ないし。
授業の一つもまともにこなせない事に問題があるって話だ。
>>235 プログラマに学歴なんて関係ない
まぁ大学出るだけで給料変わってくるし少しはひがみたくもなるわな
高卒が紛れ込んでる、とかあり得ない予想はよそう。
>>230 普通にdiff取ったら、関数まるごとレベル…
いや、全ソース、改行位置すら同じだったりするんじゃないか?w
吐き気がする
学歴コンプレックスのニートが相変わらず多いようだな。
243 :
242 :2006/09/28(木) 15:03:34
>>242 補記
上のプログラムじゃ、dataファイルと出力ファイルを DATA フォルダに纏めてるけど、
それだと問題あったらそこは自分で変えちくれ。
筋が悪いにもほどがある。
245 :
242 :2006/09/28(木) 19:22:43
fclose(sum_file); と fclose(ave_file); を忘れてるんで、 while ループの後にこの fclose() を入れといて。
つか、宿題レベルのコードなんて目でみりゃわかるだろ。
100人くらいの規模となると目だけはつらい
問題を使い回すと、先輩から貰った過去の解答をそのまま提出する奴とかもいるしな
250 :
◆sUfWYz9MSA :2006/09/29(金) 00:45:21
251 :
デフォルトの名無しさん :2006/09/29(金) 02:31:49
>215
度々申し訳ございませんが、よく分かりません。。。
私が考えたプログラムは下の通りですが、エラーばっかりです。
具体的にプログラムを教えて頂ければ大変大変うれしいです。
どうぞ宜しくお願いいたします。
#include <stdio.h>
int main( char argc, char* argv[] ){
char URL[256];
scanf("%s",URL);
ShellExecute(NULL, _T("open"), _T(URL), NULL, NULL, SW_SHOWNORMAL);
return 0;
}
203 :デフォルトの名無しさん :2006/09/28(木) 01:47:19
複雑で申し訳ございませんが、Cで以下のことが出来るでしょうか?
Cで作成したexeファイルをURLを引数に実行したら、
そのURLがインターネットエクスプローラーで開く。
イメージはtest.exeという名前のCのexeファイルを作って
test.exe
http://www.yahoo.co.jp を実行したら、インターネットエクスプローラーで
http://www.yahoo.co.jpのページが開くということです 。
難しいですが、どうぞ宜しくお願いいたします。
オレコウソツナンダヨナ │ω・`))))))
253 :
デフォルトの名無しさん :2006/09/29(金) 03:45:42
↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 251です。 申し訳ございませんが、スレ違い(私は宿題ではなく、 個人的に勉強をしております)でしたので、 【ANSI-C】 C言語なら俺に聞け! Part 129) の804番目のスレに改めて書かせて頂きます。 また、そちらのスレにも、最初ここに書き込んで、 ShellExecuteを使用すれば良い旨を聞いていることを お伝えさせて頂こうと思います。 お手数をお掛けして誠に申し訳ございませんが、 204様、215様、【ANSI-C】 C言語なら俺に聞け! Part 129) の804に回答を頂ければ嬉しいです。 どうぞ宜しくお願いいたします。
>>253 ニートノモレガ、モマエノタメニネットハイカイシテキタヨ
/*---- NEET.C ----*/
/* usege: NEET
http://www.neet.org /*
#include <windows.h>
int main( char argc, char* argv[] ){
ShellExecute(NULL, "open", argv[1], NULL, NULL, SW_SHOWNORMAL);
return 0;
}
/*---- END OF NEET.C ----*/
>>255 惜しいな、それを書くなら"usage"だ。失せ毛ではなく兎毛と覚えておくといいぞ。
usuge: 禿進行中の方へ
usoge:もう禿げ散らかっちゃってかぶりものを常用してる人へ
259 :
デフォルトの名無しさん :2006/09/29(金) 13:41:55
文系とかいう以前に学生として終わってる。
264 :
(^-^) ◆MONSOON/qo :2006/09/29(金) 17:05:00
宿題 50メガ超の改行区切り一行1000文字以下のテキストファイルが2つのあります 一方に存在しない行をできる限り速く抽出するプログラムを作ってください
テンプレ使え。
>>264 <?php
$diff = array_diff(file("file1.txt"), file("file2.txt"));
foreach ($diff as $line)
echo $line;
?>
267 :
(^-^) ◆MONSOON/qo :2006/09/29(金) 17:23:49
速いやつないですか?
テンプレ書け
>>267 お前ネットワークの質問スレでしったかぶりで適当な回答してたやつだろ。
サイテーだな。
>>264 50M超の改行区切り一行1000文字のテキストファイルを二つ用意したらつくってやらんでもない
>>264 #include <stdlib.h>
int main(void) { system("diff file1 file2"); return 0; }
50M程度なら全部メモリに乗せちゃえば?
アンカー使ってくれよ
>>272 そんな贅沢な環境はツマラン。
フリーエリア48KB以下の環境で考えようぜ。
ファイルシステムはCDFSと仮定してみようぜ
277 :
(^-^) ◆MONSOON/qo :2006/09/29(金) 19:45:19
いま50M超のファイルを生成してますから待っててくださいね
278 :
お願いします! :2006/09/29(金) 22:36:56
279 :
お願いします! :2006/09/29(金) 22:39:06
上のようにして#defineで指定してまわせばいいのでしょうけど、 どうもファイルのオープン書き込みなどがうまく行きません。 どなたかお願いいたします。
>>278 >[5] その他の制限: 二重配列を使用すること
こういう必須条件は最初から書いてくれ><
281 :
お願いします! :2006/09/29(金) 22:43:29
ごめんなさい! 本当にすみません。
>>278 二重配列って変な言葉だな。
これって規格でもこの用語を使ってんのかね。
面倒なんで自分では調べないけど。
>>278 アレだろ、100要素くらいの配列へ生の値与えて演算してたやつだろ?
forでくくるなり別のファイルに隠蔽するなりすればいいんじゃね?
特に動かないわけでもないし、用件も満たしていたようだし。
>>278 出したら却下って、提出したら教官に却下されたってことか?
それなら担当教官もこのスレみてるんじゃね。それと
> 二重配列を使用すること
って後付されるとすげーはらたつ。
286 :
お願いします! :2006/09/29(金) 23:01:34
>>284 提出したら、、
「もっと簡単な方法あるでしょ」
ごちゃごちゃごちゃと言った後、
「二重配列使ってやってこい」
とつき返されました。。。。。。。
>>286 なるほど。
別に、おまいが条件を書き忘れてたわけじゃなく、駄目出しの改善策として
二次元配列を使うよう指示されたわけね。
[1] 授業単元: データ構造とアルゴリズム [2] 問題文: 1からNまでの整数の和を求める以下のプログラムを(i)for文(ii)while文(iii)do while文を用いて書き改める。 指定されたとおりに書き直していることがわかる部分さえあればいちいち全文書き直さなくてよい。 #include<stdio.h> #include<stdlib.h> #define N (100) int main(void){ int i; int sum; sum = 0; i = 1; loop1:if(!(i <= N))goto loop1end; sum = sum + i; i = i + 1; goto loop1; loop1end; fprintf(stdout,”sum=%d\n”,sum); return(EXIT_SUCCESS) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C言語 [4] 期限: 2006年10月2日まで [5] その他の制限: 授業に向けてのC言語の復習らしいのですが, 前段階の科目より難易度が大幅に上がっていてさっぱりです。よろしくお願いします
講義内容にあわせたコーディングをするために 課題が出された時の講義風景をちゃんと聞き取れる音声付きで まるごと動画を併せてうpすることが望ましい。 講義内容の理解度を把握するための課題なんだから そこからかけ離れてちゃダメだろう。
>>290 > 前段階の科目より難易度が大幅に上がっていてさっぱりです。よろしくお願いします
釣りだよな?
これが出来ないって、漢字で自分の名前書けません、九九が全部言えませんってレベルだぞ?
前段階の科目ではfor文もwhile文もdo while文も扱わなかったってか?
293 :
290 :2006/09/30(土) 00:01:37
[1] 授業単元: データ構造とアルゴリズム [2] 問題文:以下のプログラム中のfor文で示される部分を関数を用いて書き改めよ。 ただし、関数名はsetvalueとし、引数として配列と配列サイズの2つをとるものとする。 #include<stdlib.h> #define N(100) int main(void){ int A[N]; int i; for(i=0;i<N;i++){ a[i]=i; } return (EXIT_SUCCESS); [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語:C言語 [4] 期限: 2006年10月2日まで [5] その他の制限: 290の2問目です。
int main(void){ int i; int sum = 0; for(i=1;i<=N;i++) sum += i; fprintf(stdout,"sum=%d\n",sum); return(EXIT_SUCCESS); } int main(void){ int i; int sum = 0; i = 1; while(i<=N) sum += i++; fprintf(stdout,"sum=%d\n",sum); return(EXIT_SUCCESS); } int main(void){ int i; int sum = 0; i = 1; do sum += i++; while(i<=N); fprintf(stdout,"sum=%d\n",sum); return(EXIT_SUCCESS); }
お前らニートはごちゃごちゃ言わずに宿題解いてりゃいいんだよ
296 :
290 :2006/09/30(土) 00:11:55
クラス全体の理解度はかるためのテスト問題で、テスト終了後に そのまま宿題としてだされたんです。 この授業は1個目、2個目ときて3個目の段階の授業なのですが、 1個目を再履修したため2個目を今受けている最中なんです。そしてそれと平行して3個目を 受けているので状況なんです。クラスには受かった人と、落とした人の混同クラスで 再履修組みとそうでない者と、どれだけわかるのかを測るために作った問題らしく、 上の人たちにあわせて作られているのでさっぱりわからないんです。 290の問題だと loop1:if(!(i <= N))goto loop1end; sum = sum + i; i = i + 1; goto loop1; loop1end; fprintf(stdout,”sum=%d\n”,sum); return(EXIT_SUCCESS) の部分が直していいのか全くわからないんです。 決してつりではないです。よろしくおねがいします
>for (i = 0;i < LOW; i++){ > for (j = 0;j < COLUMN;j++){ >fscanf(fp, "%d",&a[i][j]);} >} >for (i = 0;i < LOW; i++){ >for (j = 0;j < COLUMN;j++) { >fscanf(fp1,"%d",&b[i][j]); } >} 余計なお世話ですが、LOW(低い) は ROW(行数)の方が普通かと。 ROWとCOLUMNは良くペアで使われます。
298 :
お願いします! :2006/09/30(土) 00:14:39
>>288 >>289 ありがとうございます!
288の3重配列は無事に動きました。
これから289を試してみます。
どうもありがとうございました!!
>>293 #include<stdio.h>
#include<stdlib.h>
#define N (100)
void setvalue(int*, int);
int main(void)
{
int A[N];
int i;
setvalue(A, N);
return (EXIT_SUCCESS);
}
void setvalue(int *a, int n)
{
if(n)
{
n--;
a[n] = n ;
setvalue(a, n);
}
return;
}
何というのか、理解力を見たいというだけの課題なら習ってなくて分からない部分は
素直にそう申告した方がいい話しな気がするが。
>>210 のやつはコピペ+置換でがんばってかいたのになー
301 :
290 :2006/09/30(土) 01:02:45
>>294 ありがとうございます。292の人が言ってたことがわかりました。
こんなに初歩的なことだったんですね・・・。
それでも解いてくれて本当にありがとうございました。
302 :
290 :2006/09/30(土) 01:06:57
>>299 理解力を見るのはテストで終わりで、この宿題はテスト問題の正解答を
しらべるなりなんなりしてかいていかないといけなくて・・・。
こっちを間違えると減点されてしまうんです。
ところで
void setvalue(int*, int);
の
int*
の部分は何を表しているんですか?せっかく教えていただいたのに
知識不足ですみません・・・
ポインタ習ってないから駄目ということなら、こっちで。 #include<stdio.h> #include<stdlib.h> #define N (100) void setvalue(int[], int); int main(void) { int A[N]; setvalue(A, N); return (EXIT_SUCCESS); } void setvalue(int a[], int n) { if(n) { n--; a[n] = n ; setvalue(a, n); } return; }
C++もCもド素人なもので、下記の宿題が全くわかりません。 どなたか、お手数をおかけしますが どうかよろしくお願いします。 [1] 授業単元: ソフトウェア [2] 問題文(含コード&リンク): ランジサーチング(range searching)はマウスによる ディスプレイ操作のときに使われる基本ルーチンの一つである。 平面上で多数の点を与えられ、指定された長方形領域に含まれる点のみを出力する問題である。 二分探索法やヒープ法などによるソーティング法を利用して、 Cプログラムを作成し、実行結果を出力する。 [3] 環境 [3.1] OS:windowsXP [3.2] コンパイラ名とバージョン:Visual Studio.NET2003 [3.3] 言語:CでもC++でも可 [4] 期限:10月3日 [5] その他の制限:ソーティングと探索については高速アルゴリズムを 用いたプログラムにする。 ソーティング−クイックソート 探索−二分探索法
>>305 何がしたいかわからん。
出された問題って、本当にこれが全文?
そろそろ、報酬は?ってのを復活させた方がいいんじゃない?
308 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 01:08:57
>>306 点 z(1)=(x(1), y(1)), ・・・, z(n)=(x(n), y(n))が与えられているとする
長方形領域 p(i)=(a(i), b(i)) i=1,2,3,4が入力されたとき
その内部にある点z(k)をすべて出力せよ
>>308 換言しただけじゃないか
やっぱりまだ行間読むことは出来ないんだねMONSOON
>>304 ポインタ習ってないです、ありがとうございます。
これならなんとか大体理解できます。
そしてまた質問なのですが
#include<stdlib.h>
はどこでつかわれているんですか?
何度も何度もすみません。
311 :
デフォルトの名無しさん :2006/10/01(日) 01:23:43
stdlib.hでEXIT_SUCCESSが定義されてる
312 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 01:30:47
>>305 を途中までやったあとは頼んだ
#include <stdio.h>
#define N 1000
#define range 100000
int rnd(int m) {return (1664525*m+1013904223)%range;}//乱数生成ルーチン
main(){
int *x=new int[N];
int *y=new int[N];
int i,m=8;
int p[4],q[4];
for(i=0;i<N;i++){x[i]=m=rnd(m);y[i]=m=rnd(m);}//N点を与える
for(i=0;i<4;i++){p[i]=m=rnd(m);q[i]=m=rnd(m);}//長方形領域の入力
//続きをよろしく
}
313 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 01:33:43
>>306 それで全文です;
ソーティングして範囲内の点を切り出すだけ
らしいですが・・・;
ちなみに↓が単純アルゴリズムです #include<stdio.h> #include<stdlib.h> #include<time.h> void sort(int f1[], int f2[], int fa[], int min, int max); void search(int f[], int *min, int*max, int fmin, int fmax); int main(void) { int i, range, a[50000], x[50000], y[50000]; int min, max; int left, right; int down, up; FILE *fp; clock_t start, end; //時間を保持する変数を定義 fp=fopen("output.txt","w"); //結果出力用のファイルをオープン printf("座標の数を入力してください:"); scanf("%d", &range); printf("xの範囲についての最小値を入力してください:"); scanf("%d", &left); printf("yの範囲についての最大値を入力してください:"); scanf("%d", &right); printf("yの範囲についての最小値を入力してください:"); scanf("%d", &down); printf("yの範囲についての最大値を入力してください:"); scanf("%d", &up); start=clock(); //時間の計測を開始
fprintf(fp, "%d個の座標をランダムに設定\n\n", range); srand((unsigned)time(NULL)); //乱数を初期化 for(i=0;i<range;i++){ x[i]=rand() % range; a[i]=i; } for(i=0;i<range;i++){ y[i]=rand() % range; } //↓ランダムに設定したファイルの出力 for(i=0;i<range;i++){ fprintf(fp, "%5d(x,y)=%5d %5d\n", a[i], x[i], y[i]); } fprintf(fp, "\nについてソート\n\n"); min=0; max=range-1; sort(x,y,a,min,max); for(i=0;i<range;i++){ fprintf(fp, "%5d(x,y)=%5d %5d\n", a[i], x[i], y[i]);
} fprintf(fp, "\nXについて検索\n\n"); fprintf(fp, "(left, right)= (%d,%d)\n", left, right); search(x, &min, &max, left, right); for(i=min;i<=max;i++){ fprintf(fp, "%5d(x,y)=%5d %5d\n", a[i], x[i], y[i]); } fprintf(fp, "\nYについてのソート\n\n"); sort(y,x,a,min,max); for(i=min; i<=max; i++){ fprintf(fp, "%5d(x,y)=%5d %5d\n", a[i], x[i], y[i]); } fprintf(fp, "\nYについて検索\n\n"); fprintf(fp, "(down, up)=(%d,%d)\n", down, up); search(y, &min, &max, down, up); for(i=min;i<=max;i++){ fprintf(fp, "%5d(x,y)=%5d %5d\n", a[i], x[i], y[i]); } end=clock(); //時間の計測の終了 //↓実行時間[sec]をファイルに出力 fprintf(fp, "\ntime=%f\n", (double)(end - start) / CLOCKS_PER_SEC); fclose(fp); //結果出力用のファイルをクローズ return 0; }
void sort(int f1[], int f2[], int fa[], int fmin, int fmax) { int i, j, temp; for(i=fmin;i<=fmax;i++){ for(j=i+1;j<=fmax;j++){ if(f1[i]>f1[j]){ temp=f1[i]; f1[i]=f1[j]; f1[j]=temp; temp=f2[i]; f2[i]=f2[j]; f2[j]=temp; temp=fa[i]; fa[i]=fa[j]; fa[j]=temp; } } } } void search(int f[], int *min, int *max, int fmin, int fmax) { int i; for(i=*min;f[i]<fmin;i++){ *min=i+1; } for(i=*max;f[i]>fmax;i--){ *max=i-1; } }
おk、やっぱりバックグラウンドが大量にあるんだな… 俺は降りる
>>315-318 高速アルゴリズムにしたら、この単純アルゴリズムの処理時間が
どうなるか
が問題みたいです;
いろいろとすいません;
>>322 もう宿題出した教官に「日本語でおk」とでも言っとけ
条件が少なすぎる
324 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 01:58:40
>>322 すべての点に対して長方形領域内にあるかどうかをチェックする方がはやいかもしれないよ
ソートするのは再利用をする目的があるためだろうし
条件は不足なく出てると思うけど。
>>325 いや不足ありまくり
「長方形」とか「座標」とかソースに落とすにはちと曖昧
高速化するのならバイナリサーチで全数検索するんじゃなくて、
まずはスクリーンを16×16大のタイルが敷き詰められたものとみなして、
「どのタイルに属するのか」という値を先ず作っちゃう。
長方形というか矩形領域が与えられたら、その領域を含むか未満で最大となるのタイル群を選択し、
選択されたタイル群の点を列挙すれば結構速い
と経験で語ってみる俺
まぁバケツソート使ってるわけだが…
328 :
(^-^) ◆MONSOON/qo :2006/10/01(日) 02:45:34
>>328 ホントにめでたい奴だな
有名なヒキニートとかいう奴か?それともただのガキ?
ソースが出てるのがそんなに嬉しいか?
>>327 [5] その他の制限:ソーティングと探索につゐては高速アルゴリズムを
>ソーティング−クイックソート
>探索−二分探索法
これを見る限り、点入力と探索の処理は別々で、
まぁ大体、x, yが入った配列それぞれをソートして二分検索で挟んで(ry みたいなことやれって事だろ。
見方によっちゃアルゴリズムも指定してるわけだし、そういう小細工を仕込む余地はないのでは。
>>330 んだね
いまさら何書いても遅いけど、
>>324 とかにいいt(ry
うわぁ、俺もMONSOONと同類だぁwww
エヘヘ |門|λ,,....
<rem>
ああ、座標の点を表す型をTにしてtemplate使えばいいのか…
さらにいえばCのqsort()使えば(ryry
</rem>
>>311 なるほど、そういうことですか。
これからはこんな質問しなくていいように、もっと勉強しておきます
ありがとうございました。
>>327 >
>>325 > いや不足ありまくり
> 「長方形」とか「座標」とかソースに落とすにはちと曖昧
ソース読めないのかよ
まあドンマイってことで。
セジウィックのアリゴリズム第2巻にある、2D木探索なのかな?
レンジ、だよね。。
問題としては情報は全部出てるな.これで分からないのは理解する気が無いんだろ. 長方形が一つだけ与えられてその中から探すのなら, データの前のほうから包含チェックが最速.O(n). 長方形がたくさん与えられて,各入力に対して答えるのなら データをフラクショナルカスケーディング付きの領域木に入れておく. これで構成 O(n log n),質問 O(log n + k).ただし k は領域内の点の数.
>>337 なんで2者択一になってんの?
情報が全部でてればコーディングするだけでいいじゃん。
そういう風に決められない部分があることこそ、情報が全部でてない証拠じゃないの?
何故に必死なんだ。 気に食わなければスルーしろ。
別に必死に見えない件。
いや、全部出てるだろ
開発環境はVC++ の6.0なんですが… ファイルから、変数をとり込むのはどうすればできますか?
誘導されたので、こちらで質問させていただきます。 問い:コンピュータの整数は、ある数までしか表現できない。 その数を上回ると負の数になってしまう。 最大公約数を求めるプログラムを使って、データを少しずつ大きくしていき、 どの数まで正しく表現できるか調べる場合、どのようにすればよいか。 最大公約数を求めるプログラムはコチラです。 #include<stdio.h> int gcd(int a, int b) { int r; r = a % b; while(r > 0) { a = b; b = r; r = a % b; } return(b); } int main(void) { int x, y; scanf("%d%d", &x, &y); printf("%d\n", gdc(x,y)); return(0); }
345 :
344 :2006/10/02(月) 03:26:58
自分でもいろいろと試行錯誤してみたのですが、さっぱりでして… よろしくお願いいたします。
質問させてください。 [1] 授業単元:C言語基礎 [2] 問題文: プログラム内で 初期化された配列A[3] と 文字列"TEST" を ダイナミックアロケーションによって確保されたメモリへ格納するプログラムを作成せよ。 [3] 環境 [3.1] OS: WindowsXP Pro SP2 [3.2] VC++ 2005EE [3.3] 言語: C言語 [4] 期限: 本日中 [5] その他の制限: 特になし 自分でなんとかコードは書け、ビルドには成功するのですが、いざ実行すると 「ヒープが壊れていることが原因として考えられます。kadai1-1.exe または読み込まれた DLL にバグがあります。」 というエラーが free(pt_c); の時点で発生し、正常に動作しません。 直接起動してもだめでした。 自分では原因が特定できないので、どうか対処方法を教えてください。 ソースは次の書き込みに記載します。 どうかよろしくお願いします。
348 :
347 :2006/10/02(月) 07:47:27
void main(void) { int A[3] = {3, 5, 7};// 配列を定義、初期化 // ポインタ定義 int *pt_i;// 配列用 char *pt_c;// 文字列用 pt_i = (int *)malloc(sizeof(int)*4);// 配列分のメモリを確保 pt_c = (char *)malloc(sizeof(char)*5);// 文字列分のメモリを確保 pt_i = A;// 配列を確保したメモリに代入 strcpy(pt_c, "TEST");// 文字列を確保したメモリに代入 // 確保したメモリ領域を解放 free(pt_c); free(pt_i); //ここでエラー発生 return; }
349 :
347 :2006/10/02(月) 07:49:15
>>347 すみません、間違いがありました。
>というエラーが free(pt_c); の時点で発生し、正常に動作しません。
ではなく、
>というエラーが free(pt_i); の時点で発生し、正常に動作しません。
でした。
それでは改めてよろしくお願いします。
配列を解放してどうする。
>>347 >pt_i = (int *)malloc(sizeof(int)*4);// 配列分のメモリを確保
したのに、
>pt_i = A;// 配列を確保したメモリに代入
したら、mallocした領域が漏れる。
memcpyとか使ってちゃんとコピーしないと意味なしだよ。
>free(pt_i); //ここでエラー発生
この時点で、pt_iが指す領域は、A。
解放できないのでこけている。
353 :
347 :2006/10/02(月) 08:08:31
>>350-351 うーん、なんだかよくわからないのですが、
*pt_iは解放する必要はないんでしょうか?
pt_i = A; で、配列Aの先頭ポインタが格納されて
free(pt_i) で結果的にpt_Aではなく配列Aを解放している?ということでしょうか?
すみません、もう少しだけ詳しく教えてもらえないでしょうか・・・。
354 :
347 :2006/10/02(月) 08:10:24
>>352 あああ、なるほど!
そういうことですか、わかりました。
修正してみます。
皆さんお答えくださって本当にありがとうございます。
助かりました!
(^-^)をNGワードにしたらスレがすごくすっきりしたような気がしたんですが どうしてですか?
高 学 歴 余 裕 だ な ってほめてみるテスト
度々学歴の話を持ち出すけど、何なの?
所詮学歴、社会に出て学歴だけじゃ通用しない現実を知るべきだね ってことだ
コンプレックスの塊のような発言だな
相手を低学歴だと思いこまないとやっていけないらしい。
受験勉強に無駄に苦労した人とかがそういうコンプレックス持つのかな?
現実的に低学歴な奴がコンプレックス持つんだろ
低学歴っていうけど、どれくらいから低学歴なの?
少なくとも専門以下は低学歴。
あと、理系なのに院に行ってないやつ
院卒は使えないのが常識
365と367と俺
まぁ、自分の頭脳に自信のあるやつは他人の学歴とか見ちゃいないわな
学閥のあるとこに行けば、いやでも意識するがな
ここに丸投げするようなのは高学歴とは言えないだろう。 Fランク大学なんて高校と同じ扱いだぜ?
で、宿題はまだかね?
丸投げしてるヤツは全て低学歴だと思いたいが、極まれに・・・
東工大で低学歴ですか
俺の童貞は高学歴なんだが
丸投げってのはカンニングと同じだってちゃんとわかってんのかね? 興味もなくついていく努力もする気ないんなら、最初っから講義とるなよ。
378 :
◆8zHol6NAOo :2006/10/03(火) 07:47:07
どうやらこっちでした。 お願いします [1] 授業単元: C [2] 問題文(含コード&リンク):標準入力で入力された最後5だけを表示する [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: 1003
まぁもちつけ 問題は誤解がないよう丸写し推奨なんだぜ
5の単位を書けよ。
381 :
デフォルトの名無しさん :2006/10/03(火) 08:14:29
[1] 授業単元: 応用プログラミング
[2] 問題文(含コード&リンク):
http://up.spawn.jp/file/up42525.jpg [3] 環境
[3.1] OS:Linux
[3.2] コンパイラ名とバージョン: gcc-4.1 ?
[3.3] 言語: C++
[4] 期限: 10月4日まで
[5] 配列、クラス、ポインタなどは習っていません。
簡潔な方法がうまく思いつきません。
ヒントだけでもいいのでお願いします。
382 :
◆8zHol6NAOo :2006/10/03(火) 08:30:37
落ちてました… 5行です。
>>381 遅いけど。
int next_unit(int n)
{
switch(n)
{
case 1: return 5;
case 5: return 10;
case 10: return 50;
case 50: return 100;
case 100: return 500;
default: return -1;
}
}
int change_with(int amount, int min_unit)
{
if(amount < 0) return 0;
if(amount == 0) return 1;
int next = next_unit(min_unit);
int with_min = next == -1 ? 0: change_with(amount, next);
int without_min = change_with(amount - min_unit, min_unit);
return with_min + without_min;
}
int change(int amount)
{
return change_with(amount, 1);
}
k 番目のコインまでを使って c+v[k] 円支払う方法の数は k-1 番目のコインまでを使って c+v[k] 円支払う方法の数と k 番目のコインまでを使って c 円支払う方法の数の和になる. ただし v[k] は k 番目のコインの価値. ↑これをプログラムにすればいい.下から構成すれば O(ck). int change(int c) { int v[] = {1,5,10,50,100,500}; int table[c+1]; for (int i = 0; i <= c; ++i) table[i] = 0; table[0] = 1; for (int k = 0; k < 6; ++k) for (int i = 0; i+v[k] <= c; ++i) table[i+v[k]] += table[i]; return table[c]; }
386 :
デフォルトの名無しさん :2006/10/03(火) 16:21:27
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 整数を入力し、1の位から順に表示するプログラム [3] 環境 [3.1] OS:Linux [3.2] gcc [3.3] 言語: c [4] 期限: 明日[5] その他の制限:ナシ
void main() { char ln[256]; int n; gets(ln); n = strlen(ln); while(0 <= --n) printf("[%c]\n", ln[n]); }
絶望した! 数字を入力させて適当に100まで表示させようかと思っていた自分に絶望した
389 :
デフォルトの名無しさん :2006/10/03(火) 20:26:44
[1] 授業単元:計算科学 [2] 問題文 確率変数 Dは, 値 D=1,2,3,4,5,6 を, それぞれ 1/6 の確率でとる (業界によってはフェアなサイコロともいわれる) 乱数を利用して, サンプルの個数? 6 シード? 203098 と入力すると, Dのサンプルを6個生成し, Dのサンプル確率分布( (値 1,2,3,4,5,6 の出た回数)/(振った回数) )を, # サンプル数 p(1) p(2) p(3) p(4) p(5) p(6) 6 0.333333 0.000000 0.500000 0.000000 0.000000 0.166667 のように出力するプログラム(区切りはスペース). [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio.NET2003 [3.3] 言語: C [4] 期限: 2006年10月010日09:00まで
390 :
389 :2006/10/03(火) 20:34:54
/***************************************************************/ /* ヒストグラム作成用変数 hist[] の初期化 埋めてね */ /***************************************************************/ は for(i=0;i<DMAX;hist[i++]=0); /***************************************************************/ /* 乱数を引いて, 結果に応じて hist[] を更新 埋めてね */ /**************************************************************/ は hist[(int)(6*get_uniform_random())]++; かと
392 :
デフォルトの名無しさん :2006/10/03(火) 20:52:10
>>391 ありがとうございます。
このfor(i=0;i<DMAX;hist[i++]=0);
{
}
の範囲を教えてほしいのですが・・・
>>392 とりあえず書いてみて、動かしてみてよ
話はそれからじゃ
>>393 デバックしたらdとrがつかわれてませんと出て
実行結果は
サンプルの個数?
6
シード?
203098
6 0.000000 0.166667 0.333333 0.166667 0.000000 0.333333 Press any key to continu
e
でした
>>394 ということでコンパイルできたから、文法上は問題ないことが保証されたわけですね
正解と微妙に数値は違いますが、アプローチは大体OKのはずです
もし暇があれば、
> このfor(i=0;i<DMAX;hist[i++]=0);
> {
> }
> の範囲を教えてほしいのですが・・・
これに対して、今のプログラムの見比べて納得できる回答を考えてみてください。
学校って丁寧に手抜きしてるよな
398 :
デフォルトの名無しさん :2006/10/04(水) 00:21:29
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):要素数3の1次元配列を用いて3次元ベクトルを表すこととする。 このとき、3次元ベクトルa[3]とb[3]の内積を求めて表示するプログラム [3] 環境 [3.1] OS:Linux [3.2] gcc [3.3] 言語: c [4] 期限: 明日[5] その他の制限:ナシ
まさか、内積がわからないとかいうアホな話じゃないだろうな?
>>398 int a[3] = {1, 2, 3}, b[3] = {4, 5, 6}, i, result = 0;
for (i = 0; i < 3; i ++) result += a[i] * b[i];
printf("%d", result);
数学板で線形代数の質問スレでもさがしたらいいと思うよ
402 :
デフォルトの名無しさん :2006/10/04(水) 00:47:07
>>404 どうでもいいけどワードファイルって作成者の名前も保存されてるんだよね。
まぁ偽名だろうけど。
マクロを無効にしとけばいいじゃん
課題 ● int型の変数にキーボードから正の整数を入力し、 unsigned short型の変数に代入してから16進数で表示 する。さらに、上位バイトと下位バイトを反転し、結果を16 進数と10進数で表示するプログラムを作成しましょう。 ● 印刷したソースコードと自分の学籍番号下4桁で試した結 果を記入して提出しましょう。 ● プロジェクト名:03byte ファイル名:03byte.c
409 :
デフォルトの名無しさん :2006/10/04(水) 13:10:13
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): @本の名前と値段を格納する構造体BookDataを定義し、標準入力から構造体に値を読み込む関数 readBookと構造体の値を表示する関数showBookを作成して、それを利用して5冊分のデータ入力を おこない、vその結果を表示するプログラムを作成せよ。 A関数の『引数として構造体を使用する際、1構造体そのものを引数とる場合 2構造体のポインタを 引数にとる場合で本質的にどのような違いがあるか、メモリ上で引数の構造体及び仮引数の構造体 がどのように確保されているかという観点に基づいて説明せよ [3] 環境 [3.1] OS: Linux [3.2] gcc 3.4) [3.3] C++ [4] 期限: 明日 [5] その他の制限: 構造体習いました。なるべく簡単なプログラムでお願いします。
2に関しては完全に板違いだな。 自分で絞殺しろ。
[1] 授業単元:応用C [2] 問題文(含コード&リンク) fscanfを使わないで指定されたデータファイルから データを読み込みデータ件数、最大データ長、最大値、最小値 を出力するプログラム: [3.1] UNIX 3.3]C [4] 来週の火曜日 [5] break文continue文fscanf です。お願いします
fscanfでデータファイルから読み込んではいけないが [5]により、fscanfを使わなければならないんだな?
普通に考えてfscanfまで習ってるって事だろ
415 :
412 :2006/10/04(水) 14:38:24
はいfscanfは習っています しかし制限でfscanfを使わないでやれとのことです
ということはfgetsとsscanfの組み合わせはおkなんだな。
417 :
414 :2006/10/04(水) 15:28:11
はい ダイジョウブです
419 :
412 :2006/10/04(水) 15:56:12
データファイルの書式ってなんですか? ごめんなさいわからなくて
宿題出されたときにデータファイルのサンプルとかもらってないかお? それを上げちまえばいいんだぜ
421 :
412 :2006/10/04(水) 16:05:24
そんなものもらっていないです ただ問題が書いてあるプリントをもらっただけですので
タブか改行かで数字が並んでるだけのファイルと受け取ってよいのかのう
424 :
412 :2006/10/04(水) 16:18:14
あ、はい思い出しました 数字が並んでるデータなんですけど 数字の中にアルファベットが含んであるとデータ件数に含まれないです 数字は小数点も含まれています
426 :
425 :2006/10/04(水) 18:46:11
428 :
デフォルトの名無しさん :2006/10/04(水) 19:46:54
>>425 減算を加算でやってみれば?
たとえば
A - B = A + (-B)
てのと
-B = (B xor (-1)) + 1
をつかえばAとBから
A - B ができるきがするけどホントかどうかは知らないんだから!
>>408 #include <stdio.h>
int main(void){
int i;
unsigned short us;
scanf("%d",&i);
us = i;
printf("0x%04x\n",us);
us = ( us >> 8 ) | ( us << 8 );
printf("0x%04x\n%u\n",us,us);
return 0;
}
430 :
404 :2006/10/04(水) 21:39:04
明日ケンタッキーに行ってルンゲ・ダックを買ってみよう
433 :
デフォルトの名無しさん :2006/10/05(木) 08:24:50
434 :
デフォルトの名無しさん :2006/10/05(木) 10:28:55
[1] 授業単元:計算科学
[2] 問題文
サンプルを書きかえて, プログラムを完成させよう.
t=0にx=0からスタートするランダムウォークを考えよう. ただしx → yとジャンプする遷移確率は,
1/2(y=x+1,右に1進む),
W(y|x)=1/2(y=x-1,左に1進む),
0(それ以外)
とします.
ランダムウォークは nn=1000回繰り返してサンプルを得ます.
各ウォークで, hist_interval=19 歩ごとに, x に関するヒストグラムを作ることにします.
つまり, hist_interval × 0,1,2, ... (n_hist-1) 歩目に x にいた回数を配列 hist に記憶していきます.
最後に, hist/nn を次の形で出力しますここで, いちばん左の列は, 位置 x(歩) を表します. ここで,
左から2番目の列は, hist_interval×0=0歩目に, それぞれの位置 x(歩) に,
ウォーカーがどれだけいるかを表しています(サンプル全体を1とする比率,
つまり相対頻度, 統計的確率で). 0歩目には必ず x=0 にいるので, 1.0000 です.
3,4,5,6列目は, hist_interval×1,×2,×3,×4 歩目の結果です. だんだん広がっていきます.
仮に100歩目までやっても, ぎりぎりでx=±100までしか広がりません.
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 2006年10月10日09:00まで
サンプルです
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2737.txt
ちょっと質問を。 ある関数の中でchar型のバッファをcallocで作ったのですが、 このバッファをreturnしなければならないんですけど freeはどうやってやるのでしょうか?returnの前にfreeしたら意味ないし、 returnのあとに記述しても遂行しないしどうすればいいのかわかりません。
char *foo(void){ char *buf; buf = calloc(SIZE, sizeof(char)); return buf; } int main(void){ char *p; p = foo(); /* なんか処理 */ free(p); return 0; }
>>429 あ(・∀・)り(・∀・)が(・∀・)と(・∀・)う!ございます!
440 :
437 :2006/10/06(金) 00:22:17
>>438 さんどうもです。書いてくださったコードとほとんど同じだったのですが、
なるほど、呼び出し側のpをfreeするとbufもfreeされるということですね。何で気づかなっかたんだろ。
ひとつ勉強させていただきました。ありがとうございます。
>>440 いいえ、その理解は間違っています。
スレ違いなので詳細は割愛。
442 :
437 :2006/10/06(金) 00:54:24
あ、違うんですか?pとbufが指しているところが同じなので pを開放することでbufを開放できると理解したのですが・・・
>>442 つ 誘導
じゃあわざわざpなんて定義して使わないで、bufを直接使えばいいだろ?
444 :
◆wSaCDPDEl2 :2006/10/06(金) 01:35:50
じゃ、まあ使えそうな関数だけ 問題1 int DifMin(int a,int b,int c,int d){ //5時20分から10時2分までの差:5時間と-18分=5*60+(-18) return (c-a)*60+(d-b); } 問題2 ※面倒を考えずに小数点以下1桁にしますた int Round5_4(double n){ return (int)(n+0.5); } 問題3 int isTriangle(int a,int b,int c){ return (a>0 && b>0 && c>0) && (a+b>c); } 問題4 int isValidDate(int year,int month){ return (1<=year && year<=64) && (1<=month && month<=12); } たぶん
[1] C言語 [2] 再帰(int factorial)を用いて nCrを導けるプログラムを作れ nCr = n!/r!*(n-r)! int combination(int n, int r)と置く よろしくお願いします
447 :
(^-^) ◆MONSOON/qo :2006/10/06(金) 01:56:45
>>446 nCr = n-1Cr + n-1Cr-1じゃなかった?
>>447 nCr=n-1Cr + ・・・の漸化式じゃなくて、n! = n * (n-1)!の漸化式の方で再帰しろ、
と問題文で指定しているのではないのか?
なぜそんな問題にしたのかはわからんが。
>>446 こんなんでいいのかな?
int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
int combination(int n, int r) {
return factorial(n) / (factorial(r) * factorial(n - r));
}
>>450 factorialは用いるんじゃなくて参考かよ!
まあそっちのほうが自然だけどさ。
参考というか用いる方でお願いします
つか
>>449 に有るけど
int factorial(int n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
この?って何だ?
三項演算子ってショートサーキットするっけ? しなければifで書くしかないよな
>>450 まあいいや。とりあえずfactorialは使わないバージョン。
int combination(int n, int r) {
int s = n - r;
if (r > s) {s = r; r = n - r;}
if (r <= 0) return 1;
return combination(n - 1, r - 1) + combination(n - 1, r);
return combination(n, r - 1) * (s + 1) / r; /* ←こっちの方が高速 */
}
#include <stdio.h> int factrial(int n); int combination(int n, int r); int main(void) { int k; for(k=1; k<=3; k++) printf("%d\n",factrial(k)); } int factrial(int n) { if (n > 0) return n * factrial(n-1); else return 1; } int combination(int n, int r) { return factorial(n) / (factorial(r) * factorial(n - r)); } int main と int factorial の部分をどう変えればいいのか分かりません お願いします
>>458 その前に何のために変えたいのかわからん
教えても良いが、そのまえに大学名学部名学科名学籍番号を言え。
宿題スレなのに何を言ってるんだw
もし宿題ならテンプレ見て書いて欲しいよな
[1] 授業単元:C言語実習U [2] 問題文 2次元文字配列を用意して、5つの文字列を入力する。 入力された文字列を文字コード順(辞書順)に並び替えて、 順番に出力するプログラムを作成せよ。 尚、break,goto,continue命令と、string関数<string.h>は 使わないものとする。 [3] 環境 [3.1] OS: Windows Ver5.1 SP2 [3.2] コンパイラ名とバージョン: Visual Studio .NET 2005 [3.3] 言語:C 言語 [4] 期限:4日後 [5] その他の制限:無し
#include<stdio.h> #define SIZE 100 int main(void) { char data[5][SIZE+1]; int i,j,k,s[5],t; /* input */ for(i=0; i<5; i++) scanf("%s", data[i]); /* sort */ for(i=0; i<5; i++) s[i]=i; for(i=0; i<4; i++) { for(j=i+1; j<5; j++) { /* compair */ k=0; while ((k < SIZE) && (data[s[i]][k]==data[s[j]][k]) && (data[s[i]][k]!='\0')) k++; if (data[s[i]][k] > data[s[j]][k]) { t=s[i];s[i]=s[j];s[j]=t; } } } // output for(i=0; i<5; i++) printf("%s\n", data[s[i]]); return 0; }
465 :
463 :2006/10/06(金) 22:22:07
>>464 さん、どうもありがとうございました。
それにしてもString関数使わないで仕上げるとか神ってる…
compair -> compare
467 :
至福 :2006/10/07(土) 00:40:25
質問します〜 Rabin法を用いた1億以下の素数の高速判定アルゴリズムが欲しいです C言語でお願いします
>>467 テンプレみて出直せ。
まぁ出直してきたところでこたえる気はないがな!!
まさに外道!
470 :
デフォルトの名無しさん :2006/10/07(土) 02:35:29
[1] 新人課題 [2] 問題文 UNIXのcatコマンドと同等機能のmycatコマンドを作成せよ という課題で mycat file | mycat >file2 の | 機能をどう実現すればよいのか…悩んでいます 宜しくお願いします [3] 環境 [3.1] OS: UNIX [3.2] 言語:C 言語 [4] 期限:4日後 [5] その他の制限:無し
>>470 パイプはシェルさんが担ってる機能であって、catやもちろんmycatは一切関与しない
キーボードから誕生年を入力して、年齢(2006年12月31日における)を10歳幅の年代に分け、その幅に何人いるかをカウントするプログラムを作成してください。 実行結果 誕生年を入力してください 1960 1910 1930 1958 1970 1941 1920 1980 2003 ^Z 0代 : 1 10代 : 0 20代 : 1 30代 : 1 40代 : 2 50代 : 0 60代 : 1 70代 : 1 80代以上 : 2 期限 来週水曜日 よろしくおねがいします
>>472 t[9];main(i){for(puts("誕生年を入力してください");scanf("%d",&i)>0;)++t[(i=2006
-i)>80?8:i/10];for(i=0;i<9;++i)printf("%d代%.*s : %d\n",i*10,i&8,"以上",t[i]);}
475 :
◆t7E0r9geLg :2006/10/07(土) 21:21:55
[1] 授業単元:計算機科学 [2] 問題文(含コード&リンク): 以下のc言語プログラムは、論理演算のみを用い下位桁からの桁上がりを考慮した 2進数1桁の加算プログラムをmain関数として作成しなさい。 そして、17166の5文字を10進数値として、上位3桁を被加数(または被減数)、 下位2桁を加数(または減数)として、作成したプログラムの動作を確認しなさい。 なお、2進数16桁の被加数(被減数)および加数(減数)は、キーボードから入力し、 加算結果をディスプレイに表示できるプログラムとして作成すること。 ただし、入力する文字は、ASCIIコードの0と1およびスペースと改行のみとする。 /*下位桁からの桁上がりを考慮した2進数1桁の加算*/ void fadder( unsigned int *s /*加算結果*/ unsigned int *s /*上位桁への桁上げ*/ unsigned int *s /*被加数*/ unsigned int *s /*加数*/ unsigned int *s /*下位桁からの桁上がり*/ ) { unsigned int h ; h = (*x) ^ (*y) ; *s = h * (*ci) ; *co = (*x) & (*y) | h& (*ci) ; return ; } [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Visual Studio.NET2003 [3.3] 言語:C [4] 期限:今日中 [5] その他の制限: なし よろしくお願いします
これはひどい
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): #include <stdio.h> main(){ int day; char *dname[]={ "Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday", "Saturday" }; printf("Input a number (0-6) :"); scanf("%d", &day); if(day<0 || day>6){ printf("そのような曜日はありません。\n"); } else{ printf("%d番目の曜日は %s です。\n",day,dname[day]); } } このプログラムを、整数dayと整数letterを入力day番目の曜日名のletter文字目とday番目の曜日名のletter文字目以降を表示するプログラムにせよ。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 明日 [5] その他の制限: ポインタを使う お願いします
#include <stdio.h> main(){ int day; int letter; char *dname[]={ "Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday", "Saturday" }; printf("Input day (0-6) :"); scanf("%d", &day); printf("Input letter :"); scanf("%d", &letter); if(day<0 || day>6){ printf("そのような曜日はありません。\n"); }else{ printf("%d番目の曜日の%d文字目からは %s です。\n",day,letter,dname[day] + letter); } }
479 :
◆t7E0r9geLg :2006/10/08(日) 00:24:18
>>475 問題文間違ってました('A`)
以下のc言語プログラムは、論理演算のみを用い下位桁からの桁上がりを考慮した
2進数1桁の加算を行う関数です。このプログラムを用い2進数16桁の
加減算プログラムをmain関数として作成しなさい。
そして、17166の5文字を10進数値として、上位3桁を被加数(または被減数)、
下位2桁を加数(または減数)として、作成したプログラムの動作を確認しなさい。
なお、2進数16桁の被加数(被減数)および加数(減数)は、キーボードから入力し、
加算結果をディスプレイに表示できるプログラムとして作成すること。
ただし、入力する文字は、ASCIIコードの0と1およびスペースと改行のみとする。
/*下位桁からの桁上がりを考慮した2進数1桁の加算*/
void fadder( unsigned int *s /*加算結果*/
unsigned int *s /*上位桁への桁上げ*/
unsigned int *s /*被加数*/
unsigned int *s /*加数*/
unsigned int *s /*下位桁からの桁上がり*/
)
{
unsigned int h ;
h = (*x) ^ (*y) ;
*s = h * (*ci) ;
*co = (*x) & (*y) | h& (*ci) ;
return ;
}
宜しくお願いします
……まあ、落ち着け。
481 :
デフォルトの名無しさん :2006/10/08(日) 02:44:11
[1] 授業単元: プログラミング言語 [2] 問題文(含コード&リンク): eのx乗を計算するプログラムを作成せよ。 [3] 環境 [3.1] LINUX [3.2] gccc [3.3] どちらでも可 [4] 期限: 10/10(火) よろしくお願いします
>>481 #include <stdio.h>
int pow (int e, int x)
{
if (x<1)
return 1;
return e * pow(e, x-1);
}
int main()
{
int e=2,x=3;
printf("%d", pow(e, x));
return 0;
}
>>481 #include <stdio.h>
#include <math.h>
int main()
{
double x;
scanf("%lf",&x);
printf("%e",exp(x));
return 0;
}
これでいいのか?
マクローリン展開とかを使ってexp()を自作しろって課題なんかな。
486 :
481 :2006/10/08(日) 03:50:58
>>484 そみません。
テーラー展開を使ってexp()です。
お約束の後出し条件が出て、盛り上がって参りました
しかし時間も時間なので盛り上がらない悪寒 次の方どうぞー?
>>486 かなり手抜きだが。
テーラー展開した式を1000項まで計算する。無論遅い。
#include <stdio.h>
#include <math.h>
double my_exp(double x)
{
int i;
const int n = 1000;
double px = fabs(x);
double t = 1.0;
double sum = t;
for(i=1; i<=n; i++){
t *= px/i;
sum += t;
}
if(x<0.0){
return 1/sum;
}else{
return sum;
}
}
int main()
{
double x;
scanf("%lf",&x);
printf("%e",my_exp(x));
return 0;
}
490 :
481 :2006/10/08(日) 06:43:01
>>489 何度もすいません
天下一武道会でexp()です。
>>489 doubleの精度なら10項でも多すぎるくらいではあるまいか。
>>478 letter文字目のみも表示しないといけないんですが、お願いできますか?
>>492 #include <stdio.h>
main()
{
int day;
int letter;
char *dname[] = { "Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday",
"Saturday"
};
printf("Input day (0-6) :");
scanf("%d", &day);
printf("Input letter :");
scanf("%d", &letter);
if(day < 0 || day > 6)
{
printf("そのような曜日はありません。\n");
}
else
{
printf("%d番目の曜日の%d文字目は %c であり、それ以降の文字列は %s です。\n", day,
letter, dname[day][letter], dname[day] + letter);
}
}
494 :
デフォルトの名無しさん :2006/10/08(日) 09:52:49
>>493 あと以降についてなんですが、Mondayの1文字目以降だったらMは入らないんですかね?
>>494 Mを入れるなら0文字以降と指定するべし。
0文字目の概念は、コード書く人間にしてみりゃ当然なんだがな 不満があるなら、大した修正じゃないんだし、自分で直せば良いんじゃないかな?
>>496 何が言いたいか分からん。
Mondayの0文字目はMで、0文字目以降はMondayだろ?
「a以降」にa自体が含まれるのが普通の日本語の解釈だと思うが。
それとも、MondayのMは1文字目として考えろ、ということ?
>>498 配列の添え字では0から始まるから、そういう風なんだと思いますが、
日本語では0文字目とは言わないので・・・・
a以降にはaが含まれるんですね。わかりました。
dname[day]+letter-1って風に修正します
>>499 いちおう指摘しておくと、元の問題文では曜日を0番目〜6番目で指定させている。
数学的「以降」なら対象を含むし 文章的「以降」なら対象は含まないな そういうことでしょ? 問題文には0から始まるという仕様が書かれているから日本語的に正しいかどうかで 回答を曲げるのは違うと思うんだが
ひっこみつかなくなっただけでそ
[1] 授業単元:無し [2] 問題文(含コード&リンク): コンパイラのオプションで警告メッセージが最も詳しくでるように設定する [3] 環境 [3.1] OS: WindowsXp [3.2] コンパイラ名とバージョン: BorlandC++Builder 5 [3.3] 言語: C++ [4] 期限: 無期限 [5] その他の制限: 特に無し コマンドプロンプトから bcc32 -Ox と入力してみたのですが、ファイル名が指定されていないといわれます。 ここから手詰まりに……スレ違いとは分かっていますが、ボスケテ。
505 :
デフォルトの名無しさん :2006/10/08(日) 11:36:10
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 下のデータをエディタで入力してテキストファイルを作成 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 10月11日水曜日まで [5] その他の制限: 特に無し
506 :
505 :2006/10/08(日) 11:40:48
13 安藤 12月24日 17 奥田 2月14日 15 村上 5月6日 19 谷 3月14日 11 新村 3月3日 12 サントス 1月31日 10 田中 1月30日 14 亀村 6月8日 18 西口 11月3日 16 藤村 12月23日 @ 左の番号順にソートするプログラムを作れ(構造体を用いる・結果はファイル出力) A 誕生日順にソートするプログラムを作れ B Aの結果を用いて誕生日を入力し、氏名・番号を2分探索法により検索するプログラムを作れ
ここはアプリケーションの使い方の宿題スレではないのだが。
509 :
505 :2006/10/08(日) 11:43:38
>>507 全角でお願いします
説明不足ですいません・・・
>>507 >505を読む限り、>506の全てがデータなのだろうからそれをファイルにすればいいんでね?
512 :
デフォルトの名無しさん :2006/10/08(日) 12:39:09
>>490 ちょっとだけおもしろかった。ちょっとだけな。
>>510 エディタで入力してテキストファイルを作成
したら
そのテキストファイルに対して処理をしろっつーことでいいのかもしれない
「[2] 問題文」のテンプレに本来の問題文
>>506 の先頭一行だけをindex的に入れちゃったのかなと
ハングルでも良いですか?
>>505 の問題の狙いがみえてきた
構造体つかって
>>506 を全部読み込ませて
パースまでさせようっていう魂胆だな
きっとこういう構造体なんじゃないか?
N(02) //番号
N(01) //スペース
N(04) //名前
N(01) //スペース
N(02) //月
N(01) //補助単位("月")
N(02) //日
N(01) //補助単位("日")
COBOLで書いちゃったけど意味は通じると思う
ソートのことを考えると1レコードずつメモリを動的に確保するのが正解だろう
[1]C言語U [2]5個の文字列を入力し、その中で最も長いものを表示するようなプログラムを作成すること。 実行例 1回目:abc d 2回目:efghi jkl 3回目:mn op 4回目:qr s 5回目:tuv wxyz 一番長いものは、9文字の「efghi jkl」です。 [3] [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Visual Studio.NET2003 [3.3] 言語:C [4]10月12日まで [5]なし よろしくお願いします。
>>519 入力する文字列は必ず5個でいいの?
入力するのはアルファベットだけ?
>>519 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *str[5], buf[512];
int i, len = 0, index;
for (i = 0; i < 5; i++) {
gets(buf);
if ((str[i] = strdup(buf)) == NULL)
exit(1);
if (strlen(str[i]) >= len) {
index = i;
len = strlen(str[i]);
}
}
puts(str[index]);
for (i = 0; i < 5; i++)
free(str[i]);
return 0;
}
523 :
505 :2006/10/08(日) 18:54:15
結局入力データはファイルなのか標準入力なのか初期化なのか・・
525 :
519 :2006/10/08(日) 19:20:33
[1] 工学実験
[2] 画像の2次元フーリエ変換とパワースペクトル
[3] 環境
[3.1] OS: WindowsXP
[3.2] コンパイラ名とバージョン:Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 来週
コード、その他↓
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2756.zip 書いてある事が分かりにくいかもしれませんが、よろしくお願いします。
ファイル(実験.rar)のpassはtest
補足:test(修正).rarのほうはスタックが原因かもしれないといわれたので、修正したものです。
目的:家のPCでtest.rarのpow2の画像を得られるようにすること。
デバッグやれってことか…
[1]計算機演習 [2]整数iの平方根を挟み撃ち法により求めるプログラムを作成し、1〜30までの平方根を求めよ。 [3] [3.1] OS:LINUX [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4]10月12日まで [5]なし よろしくお願いします。
strdupという関数をこのスレで初めて知った
残念俺のCコンパイラは整数と虚数しかサポートされてないんだ
533 :
516 :2006/10/08(日) 21:43:28
#include <stdio.h> double func(double x, double a) { return (x*x - a); } double sqrt_(int j) { int i; double left = 0, right = (double)j, tmp; for (i = 0; i < 50; i++) { tmp = (left*func(right, j) - right*func(left, j))/(func(right, j) - func(left, j)); if (func(left, j)*func(tmp, j) <= 0.0) right = tmp; else left = tmp; } return tmp; } int main() { int i; for (i = 1; i <= 30; i++) printf("sqrt(%d) = %g\n", i, sqrt_(i)); return 0; }
>>528 #include <stdio.h>
#include <math.h>
#define EPS 0.0000005 /* 最大誤差 */
int main(void)
{
double x1, x2, x;
int i;
for (i = 1; i <= 30; i++) {
x1 = 0.; x2 = i * i;
while (1) {
if (fabs(x1 - x2) < EPS) {
printf("sqrt(%d) = %f\n", i, (x1 + x2) / 2);
break;
}
x = (x1 + x2) / 2;
if (x * x > i)
x2 = x;
else if (x * x < i)
x1 = x;
else /* x * x == i */ {
printf("sqrt(%d) = %f\n", i, x);
break;
}
}
}
return 0;
}
>>505 #define FILENAME_IN "birth_in.txt"
#define FILENAME_OUT "birth_out.txt"
#include <stdio.h>
#include <string.h>
typedef struct tagBIRTHDAY
{
char num[4];
char filler1[2];
char name[8];
char filler2[2];
char month[4];
char month_unit[2];
char day[4];
char day_unit[2];
char crlf[1];
} BIRTHDAY;
void swap(BIRTHDAY *left, BIRTHDAY *right)
{
BIRTHDAY tmp;
memcpy(&tmp, left, sizeof(tmp));
memcpy(left, right, sizeof(left));
memcpy(right, &tmp, sizeof(right));
}
>>536 int main()
{
FILE *fp;
BIRTHDAY birthday[10];
int i,j;
memset(birthday, 0, sizeof(birthday));
//ファイル入力
fp=fopen(FILENAME_IN, "r");
if (fp==NULL)
{
printf("入力ファイルが開けません\n");
return 1;
}
fread(&birthday, sizeof(birthday[0]), 10, fp);
fclose(fp);
//numをキーにソートする
for (i=0 ; i<10 ; i++)
{
for (j=i ; j<10 ; j++)
{
if (strncmp(birthday[i].num, birthday[j].num, sizeof(birthday[i].num)) > 0)
{
swap(&birthday[i], &birthday[j]);
}
}
}
>>537 //ファイル出力
fp=fopen(FILENAME_OUT, "w");
if (fp==NULL)
{
printf("出力ファイルが開けません\n");
return 1;
}
fwrite(&birthday, sizeof(birthday[0]), 10, fp);
fclose(fp);
return 0;
}
>>539 なんでやねん
メモリ内では常に\nだけだぞ。
WindowsのCOOKED MODEに騙されてるな。
>>539 テキストモードで開いている限り、fread()で読もうがfgetc()で読もうが、改行コードは'\n'だ。
>>541 別にそれが保障されているわけではない。
環境による。
>>542 テキストモードが存在するなら、保証されているだろ?
普通のOSなら、テキストモードなんてやくざなものそのものがないが。
俺の童貞モードは存在していますが、卒業は保証されていません(´・ω・`)
>>543 C/C++規格にはtext/binaryモードの区別があるけれども
どこに?
powを使ったアルゴリズムでプログラムしてこいといわれたのですが
たとえば
>>535 のプログラムに
#include <stdio.h>
#include <math.h>
#define EPS 0.0000005 /* 最大誤差 */
int main(void) {
double x1, x2, x;
int i;
for (i = 1; i <= 30; i++) {
x1 = 0.; x2 = i * i;
while (1) {
if (fabs(x1 - x2) < EPS) {
printf("sqrt(%d) = %f\n", i, (x1 + x2) / 2);
break;
}
x = (x1 + x2) / 2;
if (x * x > i)
x2 = x;
else if (x * x < i)
x1 = x;
else /* x * x == i */ {
printf("sqrt(%d) = %f\n", i, x);
printf("%d",pow(x,y)); /*と、こんな感じで突っ込んじゃって*/
break;
}
}
}
return 0;
}
こんな風でも使ったことになるのでしょうか?変な質問ですみません
知るか.そんなん出題者に聞け.
powを使ったアルゴリズムで何でも良いなら、自然対数を求めるアルゴリズムを書いてみたけど。 #include <math.h> .......... void diff_e(int diffacc=10000000){ int cnt; double e_val=2.0; for(cnt=2; cnt<diffacc; cnt++){ e_val=(pow(1.0+1.0/cnt,cnt)+e_val)/2.0;} printf("e niareicorl\n\t%.16f\n\n",e_val); }
>>548 C++98規格§27.4.2.1.4.1 の static const std::ios_base::openmode binary; の説明で
→ perform input and output in binary mode (as opposed to text mode)
とあるし
C99規格§7.19.5.3.3 の fopen() の説明では text と binary の区別が書いてあるよ
>>549 二人プレイだと開始直後になくなっちゃうよな
554 :
526 :2006/10/09(月) 15:15:20
gccでコンパイルしたら目的のものが得られました。 ロダのファイルは消しておきました。もし考えてくれた人がいたら申し訳ないですが・・・。
555 :
デフォルトの名無しさん :2006/10/09(月) 18:55:17
[1] 授業単元:C言語 [2] 問題文(含コード&リンク): 名前をローマ字で入力し、その名前に含まれる母音の数を出力せよ 例 hiroyuki nishimura 8 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 10月11日水曜日まで [5] その他の制限: なし
>>555 # include <stdio.h>
# include <string.h>
# include <ctype.h>
int vowel(char c)
{
switch(tolower(c))
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return 1;
default:
return 0;
}
}
int main(void)
{
char input[0x100];
int i, n;
fgets(input, 0x100, stdin);
n = 0;
for(i = 0; input[i]; i++)
if(vowel(input[i]))
n++;
printf("%d\n", n);
return 0;
}
557 :
555 :2006/10/09(月) 19:06:26
>>556 ありがとうございます。
こんな簡単そうな問題で質問ですいません・・・
#include <stdio.h> #include <string.h> int main(void) { char buf[256], *p; int i, n = 0; gets(buf); p = buf; while (1) { i = strcspn(p, "aiueoAIUEO"); if (i == strlen(p)) break; n++; p += i + 1; } printf("%d\n", n); return 0; }
>>558 それだとO(n^2)になって重いな
if(p[i]=='\0')break;
にしとけばO(n)で抑えられる。
そう変えても最悪O(n^2)だと思うが。
strcspn()自体がO(N^2)だからな。
>>562 strcspnは普通に実装すればO(n)だと思うが。
まあ文字列集合の長さを無視すればO(N)だな。
母音かどうかのフラグを配列に割り当ててcount += index[name[i]]のようにするのが最速
何を n とおいてるのかはっきり書こうぜ
>>566 それをはっきりと書かないのがO記法というもの。
うそこけ。
何で今頃、王さんはともかく長島まで話題になってんの?
OreとNanji。 #ってのは誰のネタだったかなぁ……
>文字列集合の長さ O記法はこういうのを無視するってばっちゃが言ってた
ていうか考慮してもO(n)で普通に書ける気がするけど。 int strcspn(char*src,char*key){ int in_key[256]={0},i; while(*key)in_key[*key++&255]=1; for(i=0;src[i];++i) if(in_key[src[i]&255])break; return i; }
|A| < 256
ボインと聞いてすっ飛んできました(`・ω・´)
576 :
デフォルトの名無しさん :2006/10/10(火) 04:57:08
>>576 通常課題2-1
# include <string.h>
# include <stdio.h>
int main(void)
{
int i;
char buf[100];
fgets(buf, sizeof(buf), stdin);
i = strlen(buf) - 1;
if(buf[i] == '\n')
i--;
for(; i >= 0; i--)
putchar(buf[i]);
putchar('\n');
}
通常課題2-2
# include <stdio.h>
int main(void)
{
int i;
for(i = 65; i < 91; i++)
putchar(i);
putchar(10);
}
>>576 応用課題2-A1
# include <stdio.h>
# include <string.h>
int main(void)
{
int i, j;
char buf[100];
fgets(buf, sizeof(buf), stdin);
i = 0;
j = strlen(buf) - 1;
if(buf[j] == '\n') j--;
for(; i < j; i++, j--)
if(buf[i] != buf[j])
{
printf("no\n");
return 0;
}
printf("yes\n");
return 0;
}
579 :
デフォルトの名無しさん :2006/10/10(火) 11:42:20
はじめまして。 わけあってC++でプログラミングをしなければならなくなった者です。 プログラミングの完全なる初心者で、参考書の最初のほうの初歩レベルでストップしてます。 …こんなプログラムを作りたいんだけどどうしたら良いですか? みたいな質問も受け付けてくれますか?
>>579 受付ません。
「ど素人の俺をC++ハッカーに育てるスレ」とか立てたほうがよろし。
>>579 そういう質問は大抵ウザがられるので、もっと具体性を絞って質問した方が良い。
10代の女ならなんでも許す
584 :
デフォルトの名無しさん :2006/10/10(火) 12:53:15
[1] 授業単元:C言語実習 [2] 問題文(含コード&リンク): 異なるn個の整数からr個の整数を取り出す組み合わせの数 nCrを求める関数 int combination(int n, int r){ /* ・・・ */} を作成せよ。なおnCrは以下のように定義される。 nCr = n-1Cr-1 + n-1Cr (ただし nC0 = nCn =1、nC1 =n ) (新版 明解C言語 入門編(柴田望洋 著) P.197 演習8-6) [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年10月15日20:00まで [5] その他の制限: 特になし よろしくお願いいたします。
>>585 書き忘れましたが、もしお時間がありましたら
nCr = n-1Cr-1 + n-1Cr (ただし nC0 = nCn =1、nC1 =n )
が成り立つ数学的説明もお願い申し上げます。
587 :
デフォルトの名無しさん :2006/10/10(火) 14:45:56
>>585 int combination(int n, int r)
{
if((n>r) && (r>0)){
return combination(n-1,r-1) + combination(n-1,r);
}
else if(n==r || r==0){
return 1;
}
}
>>586 ここは数学板じゃないよ
n-1Cr-1 + n-1Cr = (n-1)!/(n-r)!(r-1)! + (n-1)!/(n-r-1)!r!
= {(n-1)!r + (n-1)!(n-r)}/(n-r)!r! = (n-1)!n/(n-r)!r! = n!/(n-r)!r! = nCr
>>586 板違い
n-1Cr + n-1Cr-1
= (n-1)!/r!(n-r-1)! + (n-1)!/(r-1)!(n-r)!
= (n-r)n!/nr!(n-r)! + rn!/nr!(n-r)! // (n-1)! = n!/n, (n-r-1)! = (n-r)!/(n-r)
= nn!/nr!(n-r)!
= n!/r!(n-r)!
= nCr
>>586 板違いぎみだが。
n個の候補からr個選んでくる組合せは、
n個の候補をn-1個と1個にわけておくと、以下のいずれかになる。
(1) n-1個の候補からr個選んで、かつ、1個の候補は選ばない場合。
(2) n-1個の候補からr-1個選んで、かつ、1個の候補を選ぶ場合。
(1)の場合の組合せの数はn-1Cr、(2)の場合の組合せの数はn-1Cr-1だから、
これらの合計n-1Cr + n-1Cr-1がnCrに等しくなる。
593 :
585 :2006/10/10(火) 16:45:09
594 :
デフォルトの名無しさん :2006/10/10(火) 16:48:26
595 :
デフォルトの名無しさん :2006/10/10(火) 16:49:10
[1] 授業単元:C++プログラミング [2] 問題文(含コード&リンク): 1.プレイヤーとコンピューターが交互にダイスを振る。 2.1なら1点、2なら2点、6なら6点もらえる。 3.どのターンでも、1が出たらそのターン中のポイントは加算されず、相手のターンへ移る。 4.プレイヤーはダイスを振る毎に、再び振るかやめる(コンピューターにターンが移る)か決められる。 5.コンピューターは同一ターンで20点以上取るあるいは1が出るまでやめない。 6.先に100点取った方の勝ち。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン:Microsoft Visual Studio C++ 2005 [3.3] 言語: C++ [4] 期限:明日 [5] その他の制限: 次の3つのライブラリーを使えと書いてあります。 #include <cstdlib> #include <ctime> #include <iomanip> どなたかお願いします。
[1] 授業単元:C言語演習 [2] 問題文(含コード&リンク):複利計算で元金が10年で2倍になる年利率を求めよ(Newton法を使って) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年10月11日13:00まで [5] その他の制限:ニュートン法を使って求めなくてはいけない。
>>588 この関数を使うと
5C3と入れた時はいいですが、3C5と入れた時におかしな数字になってしまいます
あと一つ質問なのですが
何故else ifを使ったのでしょうか?(なぜelseではいけないんですか?elseに書き換えたらコンパイルするときにエラーになりました)
>#include <cstdlib> >#include <ctime> >#include <iomanip> 嫌がらせとしか思えないな。
>>598 複利計算なんかに縁がないのであってるかは知らんが
#include <stdio.h>
#include <math.h>
double f(double rate)
{
return pow(1.0+rate,10)-2.0; /*f(x)*/
}
double g(double rate)
{
return 10.0*pow(1+rate,9); /*f'(x)*/
}
int main()
{
const double eps = 0.0000001;
const int maxloop = 30;
double xb,xa;
int i;
xb = xa = 1.0;
for(i=0; i<maxloop; i++){
xa = xb - f(xb)/g(xb);
if(fabs(xa-xb)<eps) break;
xb = xa;
}
printf("%f\n",xa);
return 0;
}
603 :
588 :2006/10/10(火) 17:59:18
>>この関数を使うと
>>5 C3と入れた時はいいですが、3C5と入れた時におかしな数字になってしまいます
そりゃなるだろうよ。
2項係数をnCrと表すとして
条件は0 <= r <= n
だかんな。
だから、不満があれば、それに条件不一致の時のreturn文も書きなはれ。
>>あと一つ質問なのですが
>>何故else ifを使ったのでしょうか?(なぜelseではいけないんですか?elseに書き換えたらコンパイルするときにエラーになりました)
C言語を勉強しよう。
1と2と6しか得点は入らないっぽいね。
>>605 でも、それだとコンピュータがすごく弱いぞ
>>607 なるほど。
>>597 修正
int dice(void)
{
int a[3] = {1,2,6};
return a[(rand() % 3)];
}
授業単元:C言語 問題文:キーボードから誕生年を入力して、年齢(2006年12月31日における)を10歳幅の年代に分け、その幅に何人いるかをカウントするプログラムを作成してください。 OS:WindowsXP コンパイラ名とヴァージョン:visual stdio.net2003 言語:C言語 期限:今週の木曜日 その他:配列までならったので配列を使ってください。 よろしくおねがいします。 実行結果 誕生年を入力してください 1960 1910 1930 1958 1970 1941 1920 1980 2003 ^Z 0代 : 1 10代 : 0 20代 : 1 30代 : 1 40代 : 2 50代 : 0 60代 : 1 70代 : 1 80代以上 : 2
終了時はわざわざ ^Z って書かなきゃいけないのか?
Ctrl+Zだろう。
上のほうで似たのを見たヤカン
613 :
597 :2006/10/10(火) 19:01:33
>>604 さんどうもありがとうございます。
言葉が足りませんでした。
1なら1点、2なら2点、3なら3点、4なら4点、5なら5点、6なら6点入ります。
簡潔に書いたつもりだったんですが、書き忘れていたことがありました…
ダイスを振る前にコイントスで順番を決める、ダイスは一度に二回振る、
プレイヤー(プレイヤーだけに適用ルール)の振ったダイスが両方1なら今まで加算した全ての点を失う、というものです。
問題文を全て載せなかったことを反省しています…なにせ英語なので自分で和訳して載せるしかなくて…
>>604 さん、もしよかったらもう一度お願いできませんか?
>>609 #include <stdio.h>
int main(void){char* seinen[5]; int i, ages[9]={0};
puts("誕生年を入力してください");
while(gets(seinen)!=0){sscanf(seinen,"%4d", &i); i=(2006-i)/10;if(i>8)i=8;if(i<0)i=0;ages[i]++;}
for(i=0; i!=8; i++) printf("%d代 : %d\n", i*10, ages[i]);
printf("80代以上 : %d\n", ages[8]);
return 0;
}
>>602 ありがとう。
できれば複利計算でのニュートン法の使用法について解説つけてくれると
ありがたいです。
618 :
597 :2006/10/10(火) 19:35:50
>>616 さん、本当にありがとうございました!
ここの人ってみんな凄く優しい方ばかりで、2ちゃんねるじゃないみたいです。
>>602 金額 = 原価*(1+利率)^年数 が式だから
原価 = 1円, 年数 = 10年 とおいて、2倍なので金額は2円
2 = (1+利率)^10
利率をxとしてこの式をニュートン法で使えるように f(x) = 0の形に直すと、
f(x) = (1+x)^10-2
ニュートン法ではさらに微分したf'(x)も必要だからそれも求める
f'(x) = 10(1+x)^9
あとは適当なxの初期値を与えてニュートン法を適用する。
620 :
619 :2006/10/10(火) 19:39:24
>2ちゃんねるじゃないみたいです。 固定観念は捨てなさい。 2chには良い人も悪い人も居る。
623 :
585 :2006/10/10(火) 20:39:42
>>599 自己解決しました。ありがとうございました。
>>588 else if(n==r || r==0){
っていうのは削っても正常に実行できましたが、ここでは
何を行っているのでしょうか??
>>C言語を勉強しよう。
ifを使うときは
if→eise if →else の順に使って
2つの時は if→else と使っていたのですが
これでは、どこが違いますか??
教えてください。よろしくお願いいたします。
//A if(n&&A){ nにAが含まれている時 }else if(n&&B){ nにAが含まれていずかつBが含まれている時 }else if(n&&C){ nにAが含まれていずかつnにBが含まれていずかつCが含まれている時 } //B if(n&&A){ nにAが含まれている時 } if(n&&B){ nにBが含まれている時 } if(n&&C){ nにCが含まれている時 }
625 :
デフォルトの名無しさん :2006/10/10(火) 21:47:58
[1] 授業単元:プログラミングU [2] 問題文(含コード&リンク): 以下の3箇所のコメントの指示に従って、実行結果としてBが2行表示される プログラムを完成させなさい。 #include <stdio.h> void test(char *ptr) { printf("%c\n", /* ptrを使った表現 */); } int main(void) { char c='B'; char *p = &c; test(/* pを使った表現 */); test(/* cを使った表現 */); } [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: 不明 [3.3] 言語: C [4] 期限: 明日の朝 よろしくお願いします。
>>625 #include <stdio.h>
void test(char *ptr)
{
printf("%c\n",*ptr);
}
int main(void)
{
char c='B';
char *p = &c;
test(p);
test(&c);
return 0;
}
627 :
625 :2006/10/10(火) 23:26:49
>>626 ありがとうございます。
助かりました。
[1]C言語プロミング [2]アルファベット2文字を文字列として入力して、2文字のコードを足し あわせ、その結果を10進数で表示します。さらに、100の位、10の 位、1の位に分けて表示するようにプログラムを作ろう。 ● 文字列の配列要素は、最低3個分は必要! ● ソースコードの印刷と、自分のイニシャル(大文字と小文字)で試した 結果を記入して提出しましょう ● プロジェクト名:04string ファイル名:04string.c ● 画面出力例) Input your initial : AA (入力) Additional Code : 130 (結果) 100 grades : 1 10 grades : 3 1 grades : 0 [3] [3.1]OS:WindowsXP [3.2]コンパイラ名とバージョン:Visual Studio 2005 [3.3]言語:C言語 [4]期限:10月17日
630 :
デフォルトの名無しさん :2006/10/11(水) 11:55:29
>>629 #include "stdafx.h"
#include <stdio.h>
int main(){
char i[2];
int red;
printf("Input your initial : ");
scanf("%s",i);
red=(int)(i[0]+i[1]);
printf("Additional Code : %d\n",red);
for(int j=1,k,l;;j++){
for(k=l=1;k<j;k++){l*=10;}
if(red<l){break;}else{printf("%d grades : %d\n",l,red/l%10);}
}
return 0;
}
>>631 ×char i[2];
○char i[3];
宿題を提出する時ってやっぱり、成績のあまり良くない人が 教えられてもいないポインタや関数を多用していると怪しまれたりする?
そんなのきちんとなんて見ないよ。 適当に起動させて動いたら○付けて次の生徒。
635 :
デフォルトの名無しさん :2006/10/11(水) 14:51:33
大学生の友人から聞いたんだが、最近の大学はどこでもプログラム言語教えてるらしいな
basicとかだったらヘコむ
>>629 これってもしかして「プロジェクトごとupしてください」って言うんじゃないだろうな・・・
>>636 いま、そういうのを普通化の高校で教えてるんじゃなかったっけ?
選択科目だと思うけど。
ベーシックは確かに 電脳のやつやったな、、高校で。 //暫くやってC++に変更になっちゃったけどw
>>633 少なくとも俺はしっかりと見てるよ.
まあ一言一句同じコードが飛んできたりするから気にはしない.
俺は課題程度を自力で解けない人は,そういうのが得意な友人を探すほうが
重要だと思ってるから,写したコードであっても評価を減らしたりはしていない.
641 :
デフォルトの名無しさん :2006/10/11(水) 17:52:15
TAです
644 :
デフォルトの名無しさん :2006/10/11(水) 18:44:53
[1] 授業単元:計算科学
[2] 問題文
サンプルを書き換えて, プログラム中に定義された10個のデータ
int data[]={8,3,2,0,9,10,4,12,4,1};
のサンプル平均とサンプル分散を出力するプログラムにしよう.
[3] 環境
[3.1] OS: Windows XP
[3.2] コンパイラ名とバージョン: Visual Studio.NET2003
[3.3] 言語: C
[4] 期限: 2006年10月17日09:00まで
[5] その他
今度はタブありません。以前は迷惑をかけてすみませんでした。
サンプルです
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2762.txt
#include<stdio.h> #include<math.h> int main(int argc, char **argv){ int data[]={8,3,2,0,9,10,4,12,4,1}; int nn=10;/* サンプル数 */ int i; double average=0;/* data[] の平均 */ double variation=0;/* data[] の分散 */ for (i=0; i<nn; i++) average+=(double)data[i]; average/=nn; for (i=0; i<nn; i++) vatiation+=pow(data[i]-average,2); vatiation=sqrt(vatiation/nn); printf("平均=%lf\n",average); printf("分散=%lf\n",variation); return 0;/* 必ず何か返す */ }
#include<stdio.h> #include<math.h> int main(int argc, char **argv){ int data[]={8,3,2,0,9,10,4,12,4,1}; int nn=10;/* サンプル数 */ int i; double average=0;/* data[] の平均 */ double variation=0;/* data[] の分散 */ for (i=0; i<nn; i++) average+=(double)data[i]; average/=nn; for (i=0; i<nn; i++) variation+=pow(data[i]-average,2); variation=sqrt(variation/nn); printf("平均=%lf\n",average); printf("分散=%lf\n",variation); return 0;/* 必ず何か返す */ }
>>646 普通、分散は√を取らない。
int i;
average = 0;
variation = 0;
for (i = 0; i < nn; ++i) {
average += data[i];
variation += data[i]*data[i];
}
average /= nn;
variation /= nn;
variation -= average * average; // Var[X] = E[(X-E[X])^2] = E[X^2] - E[X]^2
649 :
デフォルトの名無しさん :2006/10/11(水) 19:20:21
>>644 カッコ悪いけど・・・
#include <stdio.h>
int main(int argc, char **argv){
int data[]={8,3,2,0,9,10,4,12,4,1};
int nn=10;/* サンプル数 */
double average;/* data[] の平均 */
double variation;/* data[] の分散 */
int i;
double sum;
for(i=0,sum=0;i < nn;++i) sum += data[i];
average = sum / nn;
for(i=0,sum=0;i < nn;++i) sum += (data[i] - average)*(data[i] - average);
variation = sum / nn;
printf("平均=%lf\n",average);
printf("分散=%lf\n",variation);
return 0;/* 必ず何か返す */
}
650 :
デフォルトの名無しさん :2006/10/11(水) 19:21:46
2回のループを作ってる時点でイタイ
>>629 ちょっと遅いけど
#include <stdio.h>
int main(void)
{
char str[3];
int sum,i=100,j=10;
printf("Input your initial:");
gets(str);
sum=str[0]+str[1];
printf("Additional Code:%i\n",sum);
for(;i>0;i/=j)printf("%i grades:%i\n",i,sum/i%j);
return 0;
}
このコードじゃだめかなぁ?
Cはじめて半月の俺にはこれが限界だった…
間違っちゃいないけど代入箇所と使用箇所は近づけたほうがいいよ。 今回のなら for (i = 100; i > 0; i /= 10) { ... } としたほうが分かりやすいんじゃないかな。
平方根取ると分散ではなくて偏差になっちまうのか
654 :
651 :2006/10/11(水) 20:19:42
>>652 なるほど。ありがとう。
これからも精進します。
655 :
631 :2006/10/11(水) 20:44:11
Cを始めて数ヶ月なのに651よりも汚いコードを書いてしまった俺はどうすれば・・・。 だから俺ってニートなのかなぁ・・・。
リアルニートの俺よりも学習能力もセンスもねーな♥
[1]C言語プログラムB [2] 問2-1:ある文字列を逆順に出力するプログラムを作成せよ。 問2-2:問2-1で作成したプログラムを、str2を動的メモリ割付に変更せよ。 問2-3:二つの文字列が与えられたとする。 一方のテキスト文字列に含まれるもう一方の照合文字列の開始位置を求めるプログラムを作成せよ。 長さxの文字列中の位置は、0,1、・・・、x−1と数えるようにする。 [3]Linux gcc3.4 [4]本日中 [5]配列・ポインタ・構造体の基礎まで習っています
2-1: 文字列はどこまでが入力?改行まで?EOFまで? 2-2: 動的割り当てって最初に malloc するだけでいい? relloc も必要? 2-3: アルゴリズムの指定は?複数照合文字列があった場合は?照合しない場合は?
660 :
658 :2006/10/12(木) 07:08:39
>>659 2-1は改行までです
2-2はmallocだけです
2-3は特に指定は無かったと思います
複数照合される場合は最初のものだけかかればいいです
照合しない場合はそのまま終了で・・・
よろしくお願いします
>>660 2-1,2-2。 main の str の定義を切り替えると 2-1, 2-2 が切り替わる。
#include <stdio.h>
#include <string.h>
void print_reverse(char *p) {
if (*p != 0) {
print_reverse(p+1);
putchar(*p);
}
}
int main() {
char str[256];
//char *str = (char *)malloc(256*sizeof(char));
fgets(str, 256, stdin);
print_reverse(str);
return 0;
}
2-3。gets が行末の \r とか \n まで読み込むので trim をかませる。 #include <stdio.h> #include <string.h> void trim(char *p) { // erase \r or \n if (*p) { if (*p == '\r' || *p == '\n') *p = 0; trim(p+1); } } int find(char text[], char pattern[]) { int i, j; int n = strlen(text); int m = strlen(pattern); for (i = 0; i+m <= n; ++i) { for (j = 0; j < m; ++j) // text[i..i+m) == pattern[0..m) ? if (text[i+j] != pattern[j]) break; if (j == m) return i; // j == m <=> compare successed } return -1; // not found } int main() { char text[256], pattern[256]; int pos; fgets(text, 256, stdin); fgets(pattern, 256, stdin); trim(text); trim(pattern); pos = find(text, pattern); if (pos >= 0) printf("found at position %d\n", pos); return 0; }
>>640 >そういうのが得意な友人を探すほうが重要
(´A`)…
野球のトライアウトでソロバン能力を評価するようなもんか。
>>633 基本的に作文と同じで人が書き上げたコードには筆跡が残る。
だから見ようと意識しなくても自然に見える。
実際に、コピペで済ませたり、他人に丸投げした奴は呼び出されて厳重注意を受けてる。
うちでは必修で出席者の点呼を取るんだが、懲りずにコピペした連中は名前呼ばれずに自動的に欠席扱いにされてた。
うぜぇ
過去問が飛び交うのはOKで、このレベルの宿題をやってもらうと罵倒されるのかw
大学行ったこと無いやつの妄想はもういいよ
[1] 授業単元: プログラミング [2] 問題文: #include <iostream> #include <string> class Maker{ protected: char name[30]; char industry[30]; char president[20]; public: Maker(char *p="",char *q="",char *r="") { strcpy(name,p); strcpy(industry,q); strcpy(president,r); } void print(); };
669 :
668 :2006/10/12(木) 21:23:34
class Product:public Maker { char pro1[20]; int sales1; char pro2[20]; int sales2; public: Product(char *p="", char *q="", char *r="", char *s="", int x=0, char *t="", int y=0):Maker(p,q,r) { strcpy(pro1,s); sales1=x; strcpy(pro2,t); sales2=y; } void print(); };
670 :
668 :2006/10/12(木) 21:25:24
oid Maker::print(){ cout<<"社名"<<name<<endl; cout<<"業種"<<industry<<endl; cout<<"社長名"<<president<<endl; } void Product::print(){ Maker::print(); cout<<"商品名"<<pro1<<endl; cout<<"売上"<<sales1<<"億円"<<endl; cout<<"商品名"<<pro2<<endl; cout<<"売上"<<sales2<<"億円"<<endl; } int main () { Maker a("日本(株)", "電気", "大山太郎"); Product b("関東(株)", "機械", "和田浩二", "コンピュータ", 210, "ディスク", 150); a.print(); b.print(); return 0; }
671 :
668 :2006/10/12(木) 21:26:43
35行目と43行目に main.cpp:35: error: 'cout' was not declared in this scope main.cpp:35: error: 'endl' was not declared in this scope main.cpp:43: error: 'cout' was not declared in this scope main.cpp:43: error: 'endl' was not declared in this scope というエラーが出ます。よろしくお願いします。 [3] 環境 [3.1] OS: Mac OS X 10.4.8 [3.2] コンパイラ名とバージョン: Xcode 2.0 [3.3] 言語:C++ [4] 期限: 今日中がうれしいです [5] その他の制限:長いので分割させていただきました。全部つながっています。みにくくて申し訳ありません。
>>671 using namespace std;
>>671 using namespace std;
が足りないんじゃないかとよく読まずに書いてみる
674 :
668 :2006/10/12(木) 21:39:54
ありがとうございます!!こんな単純なミスだったなんて…orz VCを学校で使っていたので基本を忘れてました。本当にありがとうございます!
この場合 #include <string> じゃなくて #include <cstring> の方が適切じゃないかと書いてみる
676 :
668 :2006/10/12(木) 21:47:37
>>676 1. <string>はstd::stringを使うためにincludeするものであり、提示されたコード
では使われていない。よって#include <string>は必要ない。
2. <cstring>は<string.h>をstd名前空間に入れたもので、いわゆる「レガシーCの
文字列」(char*を利用した文字列)を操作するための関数が宣言されている。
3. 2.と、提示されたコードにおいてレガシーCの文字列関連の関数(strcpy)が
使われていることから、#include <cstring>とせねばならない。
4. 1.〜3.より、本来は、提示されたコードはstrcpyを使用する部分でコンパイル
エラーになるのがコンパイラの正しい挙動である。
>4. 1.〜3.より、本来は、提示されたコードはstrcpyを使用する部分でコンパイル > エラーになるのがコンパイラの正しい挙動である。 標準ヘッダは適宜ほかの標準ヘッダをincludeしても良いんじゃなかったか。
それだと処理系依存になっちまうからまずいってことじゃまいかと
>>678 が言いたいのはコンパイルエラーになる必要はないということじゃないのか
682 :
668 :2006/10/12(木) 23:14:39
>>677 さん
なるほど。そういうことですか。わざわざ説明していただきありがとうございます!
早速コーディングしなおします!
683 :
デフォルトの名無しさん :2006/10/13(金) 02:31:28
(通常課題3-1)だけ。case分少なくしといたぞ。 #include <stdio.h> int main () { static const char * str1[3] = { "1st", "2nd", "3rd" }; static const char * str2[4] = { "spring", "summer", "autumn", "winter" }; int month; scanf("%d", &month); switch ( (month >= 1) & (month <= 12) ) { case 1: if ( (month -= 3) < 0 ) month += 12; printf("%s month of %s\n", str1[month % 3], str2[month / 3]); break; default: puts("そんな月ない!"); break; } }
3-3だけ。乗除回数は0にした。 #include <stdio.h> #include <math.h> #define N 1000 #define SQRN 32 /* sqrt(N)より大きい最小の整数 */ int main(void) { int sieve[N], i, j; for (i = 2; i < N; i++) sieve[i] = 1; sieve[0] = sieve[1] = 0; for (i = 2; i <= SQRN; i++) for (j = i + i; j < N; j += i) sieve[j] = 0; for (i = 0; i < N; i++) if (sieve[i]) printf("%d ", i); puts("\n乗除回数 : 0"); return 0; }
あれー先越されちゃったか。でも、
>>685 ファイルに書き出すの忘れてるんで一応書いとくね
#include <stdio.h>
int main()
{
static const int maxcount = 1001;
int count = 0;
int num[maxcount];
num[0] = num[1] = 0;
for(int i=2; i<maxcount; i++){
num[i] = i;
}
for(int i=2; i<maxcount; i++){
if(num[i]!=0){
for(int j=i+i; j<maxcount; j+=i){
num[j] = 0;
}
}
}
FILE* fp = fopen("prime.txt","w");
for(int i=2; i<maxcount; i++){
if(num[i]!=0){
fprintf(fp,"%d ",num[i]);
}
}
fprintf(fp,"\n乗除回数: %d\n",count);
fclose(fp);
return 0;
}
3-A1のみ。ループはCtrl+Cか何かで止めてくれ。永久ループになっとる。 #include <stdio.h> #include <limits.h> int main(void) { short s; int i; unsigned m = SHRT_MIN & USHRT_MAX, mask; while (1) { printf("integer => "); scanf("%hd", &s); for (i = 0, mask = m; i < sizeof(s) * CHAR_BIT; i++, mask >>= 1) putchar((s & mask) ? '1' : '0'); putchar('\n'); } return 0; }
3-2 if文をswitch文で置き換えた部分だけ。 switch(c){ case 'i': case 'I': printf("1 \n"); break; case 'v': case 'V': printf("5 \n"); break; case 'x': case 'X': printf("10 \n"); break; case 'l': case 'L': printf("50 \n"); break; case 'c': case 'C': printf("100 \n"); break; case 'd': case 'D': printf("500 \n"); break; case 'm': case 'M': printf("1000 \n"); break; default: printf("not a Roman numeral\n"); break; }
>>683 退学すりゃいいじゃん。
高等教育は義務教育と違って卒業出来ることは前提になってない。
ついていけない者は去る。これがあたりまえ。
690 :
デフォルトの名無しさん :2006/10/13(金) 10:26:54
[1] 授業単元:プログラミング応用
[2] 問題文(含コード&リンク):
配列を用いた画像の表示
使用画像:国土地理院「ウオッちず」
http://watchizu.gsi.go.jp/ 国土地理院より自分の好きな場所の地図画像を数枚(最低4枚)bmp形式で保存する.
(ただし、選択する地図画像同士は上下左右に隣接するものとする)
1つの要素の縦×横が緯度経度の30秒×30秒になるよう配列を設定する.
設定した配列に画像を入れる.
GUIで1枚の大きな画像として表示する.
注意事項
国土地理院の地図画像は隣接する部分で重なり合っているので,その部分は削除または重ね合わせて表示すること.
[3] 環境
[3.1] OS:Windows
[3.2] コンパイラ名とバージョン:VC++6.0
[3.3] 言語:C++
[4] 期限:2006年10月19日(木)13:00
[5] その他の制限:なし
今回はGUIまでは進めなくてよいとこのことなので、GUIに組み込む前までのところでお願いします。
> 今回はGUIまでは進めなくてよいとこのことなので、GUIに組み込む前までのところでお願いします。 授業受けてる人にしか伝わらない雰囲気をたった一言で言われてもなぁ
692 :
690 :2006/10/13(金) 10:57:29
>>691 そうですね。失礼しました。
この次にGUIに組み込んで地図を画面上に表示させる予定だそうで、
実際に画面上で表示させるのはまだいいという意味です。
まずはプログラムとして動かせということです。
693 :
ニャー :2006/10/13(金) 12:22:50
[1] 授業単元:計算機数学U [2] 問題文(含コード&リンク): main関数を使う。 int型のchange()を用いて、x,yの値を 入力した結果... aの値はx、bの値はy aの値はy、bの値はx となるように表示する。 注意:change関数の返却値はない。 [3] 環境 [3.1] OS:WindowsXP [3.2] VC++6.0 [3.3] 言語:C++ [4] 期限: 2006年10月16日まで [5] その他の制限:なし 久しぶりですけど、お願いします!
>>694 int *を二つとる関数と言うことでしょ。どっかで同じ問題見た気がするし。
696 :
ニャー :2006/10/13(金) 12:55:48
>>694 すみません
void change( int& , int& ) を使えということらしいです。
どうかよろしくお願いします。
697 :
デフォルトの名無しさん :2006/10/13(金) 13:10:59
すっげーイラッと来る名前やな。 ググレばいろんなとこに解説載ってるから この程度のことは自分で調べろや。
>>693 VS2005で通る。VC6.0では分からない。
#include "stdafx.h"
#include <stdio.h>
int change(int x,int y);
int main(){
change(15,200);
return 0;
}
class red{
public:
int x,y;
char str[0xFF+1];
red(int x,int y){
str[0x00]=102;str[0x01]=117;str[0x02]=99;str[0x03]=107;
str[0x04]=32;str[0x05]=121;str[0x06]=0;str[0x07]=(char)x+1;str[0x08]=111;str[0x09]=117;str[0x0A]=33;
str[0x0B]=33;str[0x0C]=33;str[0x0D]=0;str[0x0E]=(char)y+1;str[0x0F]=33;str[0x10]=0;
this->x=str[0x07]*y;
this->y=str[0x0E]*x;
}
};
int change(int x,int y){
red blue(x,y);
printf("aの値は%d、bの値は%d\n aの値は%d、bの値は%d\n%s%s%s\n",
(blue.x/blue.str[7]),(blue.y/blue.str[0x0E]),(blue.y/blue.str[0x0E]),(blue.x/blue.str[7]),
&blue.str[0],&blue.str[8],&blue.str[15]);
return 0;
}
699 :
698 :2006/10/13(金) 13:14:48
こっちの方が良いかも(いろんな意味で) #include "stdafx.h" #include <stdio.h> int change(int x,int y); int main(){ change(15,200); return 0; } class red{ public: int x,y; char str[0xFF+1]; red(int x,int y){ str[0x00]=102;str[0x01]=117;str[0x02]=99;str[0x03]=107; str[0x04]=32;str[0x05]=121;str[0x06]=0;str[0x07]=(char)x%10;str[0x08]=111;str[0x09]=117;str[0x0A]=33; str[0x0B]=33;str[0x0C]=33;str[0x0D]=0;str[0x0E]=(char)y%10;str[0x0F]=33;str[0x10]=0; this->x=str[0x07]*y; this->y=str[0x0E]*x; } }; int change(int x,int y){ red blue(x,y); printf("aの値は%d、bの値は%d\n aの値は%d、bの値は%d\n%s%s%s\n", (blue.x/blue.str[7]),(blue.y/blue.str[0x0E]),(blue.y/blue.str[0x0E]),(blue.x/blue.str[7]), &blue.str[0],&blue.str[8],&blue.str[15]); return 0; }
>>699 fuck you!!!!!
どうだ、これで満足か?
こういうこと? 全然見当違いだったら無視してくれ #include <stdio.h> void change( int& x, int& y){ x = y - x; y -= x; x += y; } int main(void) { int a = 102, b = 100; printf("aの値は%d、bの値は%d\n", a, b); change(a, b); printf("aの値は%d、bの値は%d\n", a, b); return 0; }
fuck youワロス
706 :
わん :2006/10/13(金) 16:59:06
>>704 これでOKじゃね
#include <stdio.h>
void change( int& x, int& y){
printf("aの値は%d、bの値は%d\n", x, y);
printf("aの値は%d、bの値は%d\n", y, x);
}
int main(void)
{
int a = 774, b = 7743;
change(a, b);
return 0;
}
#include <stdio.h> ↓ #include <iostream> using namespace std;
[1] 授業単元:情報処理 [2] 問題文(含コード&リンク):2つの整数を入力すると相加平均と相乗平均を実数で表示し、戻り値として2つの 値の差を返す関数avg()を作成 (2つの値の差は絶対値を求めるabs()関数を使う) [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: c言語 [4] 期限: 無期限 [5] その他の制限: なし
711 :
709 :2006/10/13(金) 20:40:30
>>710 #include <stdio.h>
#include <math.h>
double avg(int x, int y)
{
double addavg = (x+y)/2.0;
double mulavg = sqrt((double)x*y);
printf("相加平均 : %f\n",addavg);
printf("相乗平均 : %f\n",mulavg);
return abs(addavg-mulavg);
}
int main()
{
int x,y;
printf("1つ目の整数 => ");
scanf("%d",&x);
printf("2つ目の整数 => ");
scanf("%d",&y);
printf("avg(%d,%d) : %f\n",x,y,avg(x,y));
return 0;
}
>>710 #include <stdio.h>
#include <math.h>
#include <stdlib.h>
int avg(int x, int y) {
printf("%dと%dの相加平均は%fです。\n", x, y, (x+y)/2.0 );
printf("%dと%dの相乗平均は%fです。\n", x, y, sqrt(x*y) );
return abs(x-y);
}
int main(void) {
int x,y;
printf("1つ目の整数 : "); scanf("%d", &x);
printf("2つ目の整数 : "); scanf("%d", &y);
printf("2つの値の差 : %d", avg(x,y));
return 0;
}
714 :
712 :2006/10/13(金) 21:02:09
>>713 なるほど。整数の差をとるのか。
相加と相乗の差だったらfabsじゃないかと思ってたんだが、それなら納得。
[1]授業単位:C言語 [2]問題文:2つの整数x、yを入力して、xのy乗(x^y)を求める。ただし、yが負の時には、0乗(x^y)した値1を出力する。 @とAの部分のプログラムを考えてください。 #include<stdio.h> void main(void) { int i,x,y,ans; @; printf("2つの数を入力してください>>"); scanf("%d %d",&x,&y); A printf("答え=%d\n",ans); } } [3]環境 [3.1]OS:WindowsXP [3.2]visual C++ [3.3]言語:C言語 [4]期限:10月23日 [5]その他の制限: よろしくおねがいします。
716 :
715 :2006/10/13(金) 22:22:44
>>715 すいません、for文を使って考えてください。
>>715 1. の部分っているの?
2. の部分
ans=1;
for(i=0;i<y;i++)
ans*=x;
以上
void main(void) → int main(void)
1 いらね。あと破壊的に使ったおかげで変数 i もいらね。 2 の部分: for (ans = 1; y > 0; y >>= 1) { if (y & 1) ans *= x; x *= x; } 計算量は O(log n)。
719 :
715 :2006/10/13(金) 22:41:20
>>717 >>718 ありがとうございます、しかし問題文が穴埋めになっていて@とAを考えるようになっているので
@もつかわないといけないんです。@を使う考え方も教えてください。
720 :
◆HYwgg5QUFo :2006/10/13(金) 22:42:40
【質問テンプレ】 [1] 授業単元: C言語 [2] 問題文(含コード&リンク): 始点と終点、およびその間に複数個の頂点と、2つの頂点間に正の重み(コスト) がつけられた辺からなる有向グラフにおいて、始点から終点に至る経路の中で 以下の処理を実行するプログラムを作成する。 (1)最大コストになる経路を深さ優先探索法で求める。 (2)最小コストになる経路を深さ優先探索法で求める。 (3)最小コストになる経路をダイクストラ法で求める。 なお、グラフの作成の際には、画面の適当な位置をマウスで順次クリックして ゆくと頂点とその間の枝が登録でき、結果の経路をその上に表示できるような GUIを作成する。グラフ作成時には有向グラフであるから枝の終端には 矢印をつけて枝の向きがわかるようにする。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: borland C++Builder 5 bcc32 [3.3] 言語: C言語 [4] 期限: ([2006年10月18日] [5] その他の制限: 特になし グラフがわからず、とても困ってます。どうかおねがいします。
723 :
質問 :2006/10/13(金) 22:59:18
[1]構造体とファイルとストリーム(?) [2] 名前と国語、算数、英語の点数をメンバに持つ構造体studentを 宣言し、テキストファイル"meibo.txt"から10名分のデータを読み込み画面に表示せよ。 また、3教科の平均点を返す関数を作成せよ。ただし、関数の引数は構造体への ポインタとし、関数内では->演算子を用いること・・・・ [3] 環境 [3.1] OS:Windows xp [3.2] コンパイラ名とバージョン:bcc [3.3] 言語:C [4] 期限:10/14朝まで [5] その他の制限: 特にないと思います。
724 :
質問続き :2006/10/13(金) 23:00:04
#include <stdio.h> typedef struct { charname[20]; doublekokugo; doublesansu; doubleeigo; doublehei; } student; void ave(student *std) { std->hei=(std->kokugo+std->sansu+std->eigo)/3; }
725 :
質問続き :2006/10/13(金) 23:00:43
int main(void) { FILE*fp; char name[20]; double kokugo=0,sansu=0,eigo=0,hei=0; int ninzu=0; fp = fopen ("meibo.txt","r"); while(ninzu!=10) { student hito = {*name,kokugo,sansu,eigo,hei}; fscanf(fp,"%s%lf%lf%lf",&hito.name,&hito.kokugo,&hito.sansu,&hito.eigo); ave(&hito); printf("%s %5.1f %5.1f %5.1f %5.1f\n",hito.name,hito.kokugo,hito.sansu,hito.eigo,hito.hei); ninzu++; } fclose(fp); } 一応ここまでできたのですが、 無駄がないかをチェックください。お願いします。
726 :
710 :2006/10/13(金) 23:03:05
>>720 無限ループ対策有り?
到達不能チェック有り?
GUIの部分は問題無しってことでおk?
729 :
709 :2006/10/13(金) 23:11:22
>>730 @ans=1
Afor(i=1;i<=y;i++)
ans*=x;
こうしたら出来たんですけど、ans*=x;というのはどういう処理をしているんでしょうか?
ans *= x は ans = ans * x と同値
>>723 1of3
#include <stdio.h>
#include <stdlib.h>
#define KYOUKA_NUM (sizeof(Kyouka)/sizeof(Kyouka[0]))
typedef struct tag_kyouka {
char *name;
}kyouka;
typedef struct {
char name[20];
double score[KYOUKA_NUM];
} student;
kyouka Kyouka[]={
{"kokugo"},
{"sansu"},
{"eigo"},
};
>>723 2of3
double ave(student *std)
{
double total=0.0;
int i;
for(i=0;i<KYOUKA_NUM;i++)
total+=std->score[i];
return total/KYOUKA_NUM;
}
void input_data(FILE *fp, student *std)
{
int i;
fscanf(fp,"%s",std->name);
for(i=0;i<KYOUKA_NUM;i++)
fscanf(fp, "%lf", &(std->score[i]));
}
void print_data(student *std)
{
int i;
printf("Name: %s\n", std->name);
for(i=0;i<KYOUKA_NUM;i++)
printf("\t%10s: %5.1lf\n", Kyouka[i].name, std->score[i]);
printf("\t%10s: %5.1lf\n", "average", ave(std));
}
>>723 3of3
int main(void)
{
FILE *fp;
int ninzu=0;
char *filename="meibo.txt";
fp = fopen (filename,"r");
if(fp==NULL){
perror(filename);
exit(1);
}
while(ninzu!=10) {
student hito;
input_data(fp, &hito);
print_data(&hito);
ninzu++;
}
fclose(fp);
return 0;
}
>>723 1of3 の訂正
#include <stdio.h>
#include <stdlib.h>
#define KYOUKA_NUM (sizeof(Kyouka)/sizeof(Kyouka[0]))
typedef struct tag_kyouka {
char *name;
}kyouka;
kyouka Kyouka[]={
{"kokugo"},
{"sansu"},
{"eigo"},
};
typedef struct {
char name[20];
double score[KYOUKA_NUM];
} student;
738 :
723 :2006/10/14(土) 00:15:06
>>734-737 ありがとうございます。
非常に恐縮なのですが、
723-725のプログラム(C++なのかもしれない・・・)
の余分な部分が無いかチェックしてほしかったのです。(宣言とか)
言葉足らず&間違えてすみません。
>>723 不要な行 main 関数内
char name[20];
double kokugo=0,sansu=0,eigo=0,hei=0;
無駄
student hito = {*name,kokugo,sansu,eigo,hei};
↓
student hito;
誤り
fscanf(fp,"%s%lf%lf%lf",&hito.name,&hito.kokugo,&hito.sansu,&hito.eigo);
↓
fscanf(fp,"%s%lf%lf%lf",hito.name,&hito.kokugo,&hito.sansu,&hito.eigo);
不足
main 関数最後
return 0;
※オプション -wall つけてコンパイルすればある程度分かる
[1]授業単位:C言語 [2]問題文:実行例のようになるためのプログラムの空欄部分のコードを答えてください。 実行例 aの2乗は=100 aの3乗は=1000 #include<stdio.h> void keisan(int m,int *p,int *q) { *p=m*m; @ } void main(void) { int a,b,c,i; a=10; keisan(a,&b,&c); printf("aの2乗は%d\n",b); printf("aの3乗は%d\n",c); } [3]環境 [3.1]OS:WindowsXP [3.2]visual C++ [3.3]言語:C言語 [4]期限:10月23日 [5]その他の制限: 関数はよくわからなくて困っているのでよろしくおねがいします。 解説も書けたら書いてくださるとありがたいです。
741 :
723 :2006/10/14(土) 00:38:05
*q=*p*m;
よく出てくるけど void main(void) って誰がそんな事を教えてるの? ANSI準拠なら main の返り値は int で K&R方式なら main() でないと… ってオレの方が間違ってる?
*q*=*m;
[1]授業単位:C言語
[2]問題文:
(1)キーボードから自然数nを入力して、その自然数までの2乗の和を求め、その結果を出力するプログラムの空欄部分のコードを答えてください。
自然数の2乗の和の公式は次の通りである。
Σ[k=1,n]k^2=1^2+2^2+3^2...+n^2=1/6n(n+1)(2n+1)
(2)このプログラムを2乗の和を求めるcall by value のみと、call by reference も用いたユーザー関数(keisan)を使って、
書き換えた。空欄部分のコードを答えてください。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2773.txt [3]環境
[3.1]OS:WindowsXP
[3.2]visual C++
[3.3]言語:C言語
[4]期限:
[5]その他の制限:
よろしくおねがいします
>>748 @
n*(n+1)*(2*n+1)/6;
A
return a*(a+1)*(2*a+1)/6;
B
return (*p)*(a+1)*(2*a+1)/6;
Bの*pはaと同じ値に評価されるので好きに入れ替えていい。
しかしなんかこのkeisan(n,&n)とかいう呼び出しが気味悪くて仕方が無い。
ポインタの学習用の課題だからそうなってるんだろうけど。
C言語なのに参照渡し?
751 :
720 ◆HYwgg5QUFo :2006/10/14(土) 03:36:51
>>728 >無限ループ対策有り?
>到達不能チェック有り?
>GUIの部分は問題無しってことでおk?
無限ループ、到達不能チェックはなくてもいいと思います。
752 :
743 :2006/10/14(土) 09:46:50
>>744 ありがとう。
気にしないことにします。
>>749 ありがとうございます。そしてすいません、Bはkeisan(n,&wa)の間違いでした。
その場合はどうなるか教えてください。
よろしくおねがいします。
[1]授業単位:C言語 [2]問題文:三角形の底辺と高さが与えられたときの面積を求めるプログラムを作成してください。 できればユーザー関数を入れたものにしてください。 [3]環境 [3.1]OS:WindowsXP [3.2]visual C++ [3.3]言語:C言語 [4]期限: [5]その他の制限: #include<stdio.h> int keisan(int x,int y,int *p) { *p=x*y/2; } void main(void) { int a,b,wa; printf("底辺は?=");scanf("%4.1f",&a); printf("高さは?=");scanf("%4.1f",&b); keisan(a,b,&wa); printf("\nこの三角形の面積は%7.4dです。\n",wa); } 自分なりにやってみたのですがエラーがでます、どこがいけないのでしょうか?
>>754 >どこがいけないのでしょうか?
エラーの内容も書けないあんたの頭。
>>754 #include<stdio.h>
void keisan(double x,double y,double *p) ← 引数の型をdoubleに変更、返り値は不要
{
*p=x*y/2;
}
int main(void) ←FAQ
>>743 {
double a,b,wa; ←intからdoubleに変更
printf("底辺は?=");scanf("%lf",&a); ←%4.1f から %lf に変更
printf("高さは?=");scanf("%lf",&b); ←%4.1f から %lf に変更
keisan(a,b,&wa);
printf("\nこの三角形の面積は%7.4fです。\n",wa); ←%7.4d から %7.4f に変更
return 0; ←正常終了
}
>>754 >>1 くらい読め
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
>>756 d:\c言語\b\b.c(5) : warning C4716: 'keisan' : 値を返さなければいけません
エラーではないのですがワーニングが出てきます。
それで底辺を入力した後高さが入力できません。
>>757の所為で・・・ >>760 ここは宿題丸投げスレだから、>>757見て事が足りなければ初心者スレにでもどうぞ。
763 :
749 :2006/10/14(土) 15:54:12
>>753 その場合keisanの戻り値は普通voidじゃないか?
*p = a*(a+1)*(2*a+1)/6;
もし戻り値もあるなら
*p = a*(a+1)*(2*a+1)/6;
return *p;
[1]授業単位:C言語 [2]問題文:三角形の三辺が与えられたときの面積を求めるプログラムを作成してください。 三辺が与えられたときのヘロンの公式 S=√s(s-a)(s-b)(s-c) ただし s=1/2(a+b+c) 三角形の成立と不成立のときに結果を分けてください。 [3]環境 [3.1]OS:WindowsXP [3.2]visual C++ [3.3]言語:C言語 [4]期限: [5]その他の制限: #include<stdio.h> #include<math.h> double keisan(double x,double y,double z,double g,double *p) { g=x+y+z/2; return *p=sqrt(4);g(g-x)(g-y)(g-z); } void main(void) { double a,b,c,d,wa; printf("各辺の長さを入力してください"); printf("a="); scanf("%lf",&a); printf("b="); scanf("%lf",&b); printf("c="); scanf("%lf",&c); printf("この三角形の面積は%8.7fです。",&wa); } これでやったら下のエラーがでました d:\C言語\b\b.c(6): error C2063: 'g' : 関数ではありません。 それと不成立の場合のやり方もわかりません。 おねがいします。
>>764 return *p=sqrt(g*(g-x)*(g-y)*(g-z));
だとおも
あとこれも。 g=(x+y+z)/2;
767 :
デフォルトの名無しさん :2006/10/14(土) 16:16:38
1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): キーボードから文字列を読み込んで、読み込んだ文字列を逆にした文字列を表示するプログラムを作成せよ。 例)papa→apap,level→level [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VisualStudio2003 [3.3] 言語: C [4] 期限:2006年10月16日午前10時まで [5] その他の制限:よろしくお願いします。
>>764 不成立のチェックはあってるかどうか自信がない
これはkeisanにg(d?)を渡す必要はあるのか?
ポインタ使ってるのに戻り値にする意味もわからん
#include<stdio.h>
#include<math.h>
double keisan(double x,double y,double z,double g,double *p)
{
g=(x+y+z)/2;
return *p=sqrt(g*(g-x)*(g-y)*(g-z));
}
BOOL check(double a, double b, double c){
if(a+b>c && a+c>b && b+c>a)
return TRUE;
return FALSE;
}
void main(void)
{
double a,b,c,d,wa;
printf("各辺の長さを入力してください");
printf("a="); scanf("%lf",&a);
printf("b="); scanf("%lf",&b);
printf("c="); scanf("%lf",&c);
if(!check(a, b, c)){
printf("不正な三角形ですが計算します\n");
}
keisan(a, b, c, d, &wa)
printf("この三角形の面積は%8.7fです。",wa);
}
>>767 #include <stdio.h>
#include <string.h>
int main()
{
char s[256];
size_t len;
int i;
scanf("%s", s);
len = strlen(s);
for(i = len - 1; i >= 0; i--) {
printf("%c", s[i]);
}
return 0;
}
770 :
デフォルトの名無しさん :2006/10/14(土) 16:37:30
>>768 辺の長さが正の数かどうかのチェックも必要かも
あと、三角形じゃないなら面積は求まらないと思われ
>>772 質問の意図が分かりません
BOOL check(double a, double b, double c){
if(a<=0.0 || b<=0.0 || c<=0.0)
return FALSE;
if(a+b>c && a+c>b && b+c>a)
return TRUE;
return FALSE;
}
printf("不正な三角形ですが計算します\n");
↓
printf("不正な三角形です\n");exit(1);
>>773 すいません BOOL checkというのは習ってないのでfor文が使いたいのですが
無理ですか?
ワラタ
>>775 禿同。ここまで的外れだと釣りだと思うが、
マジで言ってることもあるのが宿題スレなんだよな。
茶ふぃた
スレ違いだっちゅうに。 いい加減関数の使い方を覚えられない阿呆を構うのやめろや。
>>764 ,772,774 これなら分かるかな?
#include<stdio.h>
#include<math.h>
double keisan(double x,double y,double z,double *p)
{
double g, check_value;
g=(x+y+z)/2;
check_value=g*(g-x)*(g-y)*(g-z);
if(x<=0.0 || y<=0.0 || y<=0.0 || check_value<=0.0)
*p=-1.0;
else
*p=sqrt(check_value);
return *p;
}
int main(void)
{
double a,b,c,wa;
printf("各辺の長さを入力してください");
printf("a="); scanf("%lf",&a);
printf("b="); scanf("%lf",&b);
printf("c="); scanf("%lf",&c);
keisan(a, b, c, &wa);
if(wa>0.0)
printf("この三角形の面積は%8.7fです。\n",wa);
else
printf("三角形ではありません。\n");
return 0;
}
ぐだぐだ言わんでさっさとちゃんと動くプログラムよこせや。
#include<stdio.h> int main(void){ printf("ぐだぐだ言わんでさっさとちゃんと動くプログラムよこせや。\n"); return 0; }
何だよその言い方 せっかく初心者にもわかるようにコメント入りで解いてたのに晒す気無くなったよ 俺の30分を返せ
720 なあ。GUIの表示さえなければなんとかするんだが……。
BCB無いから作れん API叩きでいいならできないこともないが・・・・やっぱやりたくないな
Turbo C++ ならあるんだがグラフが分からん俺はお払い箱
C言語でGUI部分を作ろうという猛者の集まる場所はここか
>>787 俺、フリーソフト作って公開してるけど、C言語でGUI部分を書いてる。
特別なライブラリを使わずにWindowsAPIの呼び出しやメッセージのやり取りだけで。
小規模なものならそんなに猛者ってこたないだろ。
789 :
デフォルトの名無しさん :2006/10/14(土) 21:36:01
>>788 荒らしと疑われることなくここでソースを公開できる程度に小規模なら
どっかにアップロードしてURL貼ればいいだろう
791 :
デフォルトの名無しさん :2006/10/14(土) 21:44:02
[1] 授業単元: プログラミングT [2] 問題文(含コード&リンク): 大文字のAからZまでを表示するプログラムを作成せよ。ただし文字定数および文字配列を使ってはいけない(文字コードは使用可) [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VisualStudio.net2003 [3.3] 言語: c言語 [4] 期限: 10月17日 [5] その他の制限: よろしくお願いします。
>>791 #include <stdio.h>
int main()
{
int i;
for(i=0;i<128;i++)fputc(i,stdout);
return 0;
}
>>791 #include <stdio.h>
int main()
{
int i;
for(i = 65; i<=90; i++ )
printf("%c", i);
return 0;
}
796 :
デフォルトの名無しさん :2006/10/14(土) 22:16:08
>>794 3000程度なら規模云々のレベルではない
サンプルコードだよ
>>796 ?
サンプルコードならMSDN見ればいいんでない?
ステップでソフトウェアを語るアホどうしが喧嘩してるな
800 :
デフォルトの名無しさん :2006/10/14(土) 23:44:21
>>799 いまさら・・・
この程度なら5分でかけよ
801 :
720 ◆HYwgg5QUFo :2006/10/15(日) 00:00:49
とりあえずありがとうございます。 Cプログラムでと書いてあるのでC++でもいいのかな・・・。 C++はわからないので何が無駄かさえわかりませんが。。。 わがまま言うなら、C言語がいいです・・・申し訳。。。
[1]授業単位:C言語 [2]問題文:順位順に点数が出るようにプログラムしてください。 実行例 順位 1 90 2 80 3 70 4 60 5 50 6 40 7 30 8 20 9 10 10 0 [3]環境 [3.1]OS:WindowsXP [3.2]visual C++ [3.3]言語:C言語 [4]期限: [5]その他の制限: よろしくおねがいします。
>>802 ??
順位って?
点数って?
実行例を表現するプログラム書けばいいの?
つ
#include <stdio.h>
int main(){ return printf("1 90\n2 80\n3 70\n4 60\n5 50\n6 40\n7 30\n8 20\n9 10\n10 0")>=0?0:1; }
すいません、こうでした 順位 点数 1 90 2 80 3 70 4 60 5 50 6 40 7 30 8 20 9 10 10 0 それで実行例を表示するんではなくて、配列の中にある数字を点数の高い順に並べるということです。
コンテナにブチコンでソート
#include <stdio.h> void main(void) { static int ten[10]={88,73,78,76,90,66,58,56,56,55}; int i,n,wa; wa=; for(i=0;i<10;i++) { for(n=0;n<10;n++) { if (ten[i]<ten[n]) ten[i]=wa; ten[i]=ten[n]; ten[n]=wa; } } printf("順位 点\n"); for(i=0;i<10;i++) printf("%2d%6d\n",i+1,ten[i]); } こんな感じで作ってみたんですけど、エラーは出ないけどソートどころかうまく値が入りません どうすればいいんでしょうか?
>>806 ソート部分が意味わかんねえ・・・
>>805 の方法でいいなら最初にこれを書き加えて
#include <algorithm>
#include <deque>
ソート部分をこうする
std::deque<int> tensuu;
for(int i = 0; i < 10; i++)
tensuu.push_back(ten[i]);
sort(tensuu.begin(), tensuu.end());
for(int i = 0; i < 10; i++)
ten[i] = tensuu[i];
C言語指定してるからSTLはダメだろ。 常識的に考えて。
>>806 代入の方向とか、{ }の付け方とかがグダグダ過ぎ
#include <stdio.h>
void main(void)
{
static int ten[10]={88,73,78,76,90,66,58,56,56,55};
int i,n,wa;
for(i=0;i<10;i++)
{
for(n=0;n<10;n++)
{
if (ten[i]>ten[n]){
wa=ten[i];
ten[i]=ten[n];
ten[n]=wa;
}
}
}
printf("順位 点\n");
for(i=0;i<10;i++)
printf("%2d%6d\n",i+1,ten[i]);
}
>806 if (ten[i]>ten[n]){ wa=ten[i]; ten[i]=ten[n]; ten[n]=wa; } vector使っていいなら #include <iostream> #include <vector> using namespace std; int main(){ int ten[]={88,73,78,76,90,66,58,56,56,55}; vector<int> v=vector<int>(ten,ten+sizeof(ten)/sizeof(ten[0])); sort(v.begin(), v.end(), greater<int>()); cout << "順位 点" << endl; for(unsigned int i=0;i<v.size();i++) cout << i+1 << ' ' << v[i] << endl; return 0; }
>>802 要するに一次元配列をバブルソートしろってことでいいんだよね?
標準関数は使っていいんだよな? #include <stdio.h> #include <stdlib.h> #define N 10 int iCmpDescend(const void* vpx, const void* vpy) { const int* px = vpx; const int* py = vpy; return *py-*px; } int main(void) { int ten[N]={88,73,78,76,90,66,58,56,56,55}; qsort(&ten, N, sizeof(int), iCmpDescend); { int i; printf("順位\t得点\n"); for(i=0; i!=N; i++) printf("%-2d\t%-3d\n", i+1, ten[i]); } return 0; }
813 :
デフォルトの名無しさん :2006/10/15(日) 17:23:13
>>799 漏れ、依頼者じゃないけど、凄くGUIプログラミングの参考になりました。熱烈多謝
>>813 同意
InvalidateRect なんて知らなかったよ。
この知識を使うことは無いだろうけど…
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク):キーボードから文字列を読み込んで、読み込んだ文字列が逆から読んでも同じ(回文のようなもの)文字列かどうかを判定するプログラムを作成せよ。 (例) papa→no, level→yes [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VisualStudio2003 [3.3] 言語: C [4] 期限: 2006年10月18日 [5] その他の制限: よろしくお願いします。
>>815 #include<stdio.h>
#include<string.h>
#define ONE_LINE_MAX 1024
int main(void)
{
int i, len;
char buf[ONE_LINE_MAX];
gets(buf);
len=strlen(buf);
for(i=0;i<len/2;i++)
{
if(buf[i]!=buf[len-1-i])
break;
}
if(i<len/2)
printf("no\n");
else
printf("yes\n");
return 0;
}
818 :
デフォルトの名無しさん :2006/10/15(日) 21:24:40
[1] 授業単元:プログラミング [2] 問題文:三角形の面積を求める関数fa(), fb()を作成しその値を 比較するプログラムを作成しなさい. [3] 環境 [3.1] OS:Linux [3.2]gcc [3.3] 言語: c [4] 期限: 明日 [5] その他の制限: なし。
>>818 問題文が不足しています
#include<stdio.h>
double fa(void){/* 底辺6 高さ2 の三角形の面積を返す関数 */
return 6.0;
}
double fb(void){/* 底辺4 高さ4 の三角形の面積を返す関数 */
return 8.0;
}
int main(void){
if(fa()>fb()) printf("fa()>fb()\n");
if(fa()<fb()) printf("fa()<fb()\n");
if(fa()==fb()) printf("fa()=fb()\n");
return 0;
}
>>818 三角形の面積を2つの方法で求めてその2つの方法で得た面積を比較するってこと?
どのような方法で求めるのか具体的なことが全く書かれていないし
どんな方法で求めてもいいってことだとしても、どのような情報が与えられているのか(辺の長さとか角度とか)が全くわからない
>>818 > 関数fa(), fb()
なんだよその関数名は。
そんな仕様書が出てきたらキレていいぞ。
823 :
名無しさん :2006/10/15(日) 22:05:40
ファイル入出力の問題なんですけど 5個の整数値をキーボードにより入力してその合計を求めるプログラムを つくる。 そして、その問題において、キーボードより入力した値をつくっておいた ファイルinput.datよりファイル入力するようにして、ディスプレイに表示 していた値をout.datというファイルに出力する。 こんな問題なんですけれど・・・・・
826 :
名無しさん :2006/10/15(日) 22:21:57
[1]授業単元;プログラミング [2]問題文:問1:5個の整数をキーボードより入力し、その合計を求めて ディスプレイに表示するプログラムを作成せよ 問2:問1において、キーボードより入力していた値をあらかじめ つくっておいたファイルinput.datよりファイル入力するように変更し また、ディスプレイに表示していた値をout.datというファイルに出力 するように変更せよ。 問3:問2で作成されたout.datの内容の最後にinput.datの内容 を追記するプログラムを作成せよ。 [3]環境 [3.1]OS LINUX [3.2]gcc [3.3]C言語 [4]期限:明日 [5]その他制限:なし
問い1以外はシェルの機能の問題っぽいんだが… つ リダイレクト
828 :
名無しさん :2006/10/15(日) 22:34:16
ファイル入出力の問題なんですけれど、どうすればいいんでしょうか
>>826 問1
#include<stdio.h>
#define VALUE_NUM 5
int main(void){
int i,value,total=0;
for(i=0;i<VALUE_NUM;i++){
scanf("%d", &value);
total+=value;
}
printf("%d\n", total);
return 0;
}
問2
#include<stdlib.h>
int main(void){
system("./a.out < input.dat > out.dat");
return 0;
}
問3
#include<stdlib.h>
int main(void){
system("cat input.dat >> out.dat");
}
830 :
829 :2006/10/15(日) 22:36:27
832 :
名無しさん :2006/10/15(日) 22:39:00
いいえこちらこそ説明不足ですみません
>>826 問2・問3
#include<stdio.h>
#include<stdlib.h>
#define VALUE_NUM 5
int main(void){
int i, total=0;
int value[VALUE_NUM];
char *filename_in="input.dat", *filename_out="out.dat";
FILE *fp_in, *fp_out;
fp_in=fopen(filename_in, "r");
if(fp_in==NULL){
fprintf(stderr, "\nError : %s cannot open.\n", filename_in);
return 1;
}
for(i=0;i<VALUE_NUM;i++){
fscanf(fp_in, "%d", &value[i]);
total+=value[i];
}
fclose(fp_in);
fp_out=fopen(filename_out, "w");
if(fp_out==NULL){
fprintf(stderr, "\nError : %s cannot open.\n", filename_out);
return 1;
}
fprintf(fp_out, "%d\n", total);
for(i=0;i<VALUE_NUM;i++) /*この行は問3の時だけ必要*/
fprintf(fp_out, "%d\n", value[i]); /*この行は問3の時だけ必要*/
fclose(fp_out);
return 0;
}
834 :
名無しさん :2006/10/15(日) 22:59:50
本当にありがとうございます。解決しました
837 :
デフォルトの名無しさん :2006/10/16(月) 01:29:25
[1]プログラミング [2]キーボードから整数 m と n (ただし m≤n) を入力し, m 以上 n 以下の整数のうち 3 で割り切れるものの和を求めるプログラムを作成せよ. [3]wndowsとgcc [4]2006年10月17日 [5]while文習ったばっかりです よろしくです
838 :
デフォルトの名無しさん :2006/10/16(月) 01:29:43
おまいら、今日ソフ開試験受けてきた俺様が帰ってきましたよ
839 :
デフォルトの名無しさん :2006/10/16(月) 01:40:49
840 :
デフォルトの名無しさん :2006/10/16(月) 01:41:16
>>839 午後Uは楽勝でしたよ。
午前がやばい。
841 :
デフォルトの名無しさん :2006/10/16(月) 01:42:51
>>838 の訂正
おまいら、昨日ソフ開試験受けてきた俺様が帰ってきましたよ
駄目だったよ...orz...やけ酒飲んでたらこんな時間になってしまったよ、チキショー
842 :
デフォルトの名無しさん :2006/10/16(月) 01:44:01
>>午後Uは楽勝でしたよ。 いいな・・・('A`)
843 :
デフォルトの名無しさん :2006/10/16(月) 01:46:06
>>841 どっちやねん…(・ω・)
俺もなんていうか午後Uで地獄へ落ちたよ。
悔しいので調べたら・・調べてもわからんかったorz
844 :
デフォルトの名無しさん :2006/10/16(月) 01:49:43
845 :
720 ◆HYwgg5QUFo :2006/10/16(月) 02:26:00
>>836 ありがとうございました。とても助かりました。
GUIがんばって理解してみます。
一つ、atan2:DOMAIN error の原因が分からないのですが、なぜでしょか?
>837 int main() { int m, n; int sum = 0; int i; scanf("%d %d", &m, &n); for(i = m; i <= n; i++){ if(i % 3 == 0){ sum += i; } } printf("%d\n", sum); }
[1] 授業単元:プログラム [2] 問題文(含コード&リンク): 7並べ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: C++ [4] 期限:今月中 [5] その他の制限:COM3人と対戦 パスは3回まで ジョーカーあり 勝敗判定を行う
漏れは基本情報が・・(ry
ソフ開午前だけ受けて松屋で飯食って帰った。 スレチ乙
どうして御前だけ?
午前でオワタからだろ
853 :
デフォルトの名無しさん :2006/10/16(月) 19:24:52
今年は午前激難だったよねー
854 :
デフォルトの名無しさん :2006/10/16(月) 20:24:03
856 :
デフォルトの名無しさん :2006/10/16(月) 21:16:24
[1] 授業単元: 数値計算プログラミング [2] 問題文(含コード&リンク): 数値を符号部1bit,指数部8bit,仮数部16or32bitの浮動小数点型へ変換するプログラムを作成し,1,2,3,4,8,0.5,0.25,0.1,0.2等の数値を変換する。ただし,入力フォーマットは {-},[0-9]+{.[0-9]+}|{-}.[0-9]+ とする。ここで、{}は省略可、[0-9]は0〜9の任意の数字、+は前者の1回以上の繰り返し、|はどちらか一方を示す。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年10月19日(木)
友人が基情・ソフ技と受かって、 さらに何か取るつもりらしいのが・・ショボンヌ。。
858 :
デフォルトの名無しさん :2006/10/16(月) 23:54:54
[1] 授業単元: [2] 問題文(含コード&リンク):c++でフォーム上に二つのボタンと ひとつの窓をつくり、一方のボタンをクリックすると 任意のsample.c をコンパイルし、そのエラー結果表示を フォーム上の窓に表示させる。もう一方のボタンで窓をクリアする。 [3] 環境 [3.1] OS: xp(Windows/Linux/等々) [3.2] borland c++builder5.5 [3.3] 言語: C++ [4] 期限: ([2006年10月18日まで] [5] その他の制限: なし 何卒何卒、よろしくお願いいたします。 お忙しいところ、読んでくださってありがとうございました。
>>812 遅レスで悪いのだが、
> return *py-*px;
この技はchar以外では使えん。オーバーフローする。
解ってて書いたならごめん。
>>858 >任意のsample.c をコンパイルし
という意味がわからない。作業ディレクトリにある sample.c に対して
bcc32 sample.c を実行してやればいいのかな?
862 :
861 :2006/10/17(火) 00:42:42
ジョーカー実装してなかった…
>数値を符号部1bit,指数部8bit,仮数部16or32bitの浮動小数点型 新しく型作るのかな
864 :
デフォルトの名無しさん :2006/10/17(火) 01:27:35
>860様 作業ディレクトリにあるc++のsampleソースコードに対して、 borlandc++builderのF9を実行したいです。 書き方がおかしくてすみません、書き込みありがとうございます。
865 :
デフォルトの名無しさん :2006/10/17(火) 01:34:22
>860様 追 今私は、 フォームからコマンドプロンプトを呼び出し、 引数としてコマンドラインを渡し、 コンパイル実行、コンパイルの成功と失敗を判定し、 失敗した場合エラーメッセージの取得と表示をしたい と書いているのですが、エラーばかりで 実行ファイルにもなりません。
>>864 「BCBで F9 を押したときと同じような処理」だよね?
それとも,実際に BCB に対して F9 コマンドを飛ばすの?
ところでそれ本当に宿題?問題文は正確?
867 :
デフォルトの名無しさん :2006/10/17(火) 01:41:39
前者の「BCBで F9 を押したときと同じような処理」です。 宿題です、問題は口頭でしたので、私の言語力で正確に再生できているか 不安です。 ご迷惑をおかけし、すみません。 応答ありがとうございます。
868 :
デフォルトの名無しさん :2006/10/17(火) 02:16:32
>866様 867は、>866へのレスです。
869 :
デフォルトの名無しさん :2006/10/17(火) 02:49:22
[1] 授業単元: [2] 問題文 始点と終点、およびその間に複数個の頂点と、2つの頂点間に正の重み(コスト) がつけられた辺からなる有向グラフにおいて、始点から終点に至る経路の中で 以下の処理を実行するプログラムを作成する。 (1)最大コストになる経路を深さ優先探索法で求める。 (2)最小コストになる経路を深さ優先探索法で求める。 (3)最小コストになる経路をダイクストラ法で求める。 なお、グラフの作成の際には、画面の適当な位置をマウスで順次クリックして ゆくと頂点とその間の枝が登録でき、結果の経路をその上に表示できるような GUIを作成する。グラフ作成時には有向グラフであるから枝の終端には 矢印をつけて枝の向きがわかるようにする。 [3] 環境 [3.1] OS: xp(Windows/Linux/等々) [3.2] c++builder6 [3.3] 言語: C++ [4] 期限: ([2006年10月25日まで] [5] その他の制限: なし この宿題で、どうやってプログラムをつくればいいかずっと悩んで 困ってるんですが、(プログラミング初心者なんで・・)できれば 教えていただきたいのですが・・。お願いします。
なんか、見たことあるな…
デジャヴってやつだな…
みんな同じ感覚を共有していたんだ…
一瞬日にちが戻ったのかと思った
OSの部分が違うようだが、 そのコンパイラでクロスコンパイルできる? ライブラリは? 等々って、おい!
ほっとけよ。
876 :
デフォルトの名無しさん :2006/10/17(火) 07:59:47
>863 はい
なんでこんな BCB 流行ってんの? どっかの専門学校で使ってるんかな?
878 :
デフォルトの名無しさん :2006/10/17(火) 10:43:38
おちんちんの先に直径3cmぐらいのイボができました。どうすればいいですか
技術を身に付けるのが目的なのか単位を取るのが目的なのか… 専門学校生だけは、ここの解答を元に勉強してると思いたい
880 :
デフォルトの名無しさん :2006/10/17(火) 11:13:35
>>879 学生の8割以上は想像力不足で、自分が今一番すべき事を想像できず、目の前の事にしか気が回らないバカなのです。
まともな学生は2割以下でしょう。
>>880 ゆとり教育をしてきた学生にこの言葉を自覚させたい
その8割のうちの9割が 自分は先の2割だと思ってる罠。
そう言う風に考え付くならまだ先がある
その想像力を使っても、C++には未来が見えないことを思ってしまいます。
STL はものすごく好きなんだけどね
8割のうちの9割 = 全体の 18/25
>>879 >技術を身に付けるのが目的なのか単位を取るのが目的なのか
技術を身につけてITドカタ(PG)になる? ITドカタになるのは止めた方が良いぞ
学生はITドカタの現実を知らんからPGになりたいと思う香具師いるかもしれんが
>>881 >ゆとり教育をしてきた学生
こっちの表現ほうが、"ゆとり教育をさせられてきた学生(大人たちに)"、よくね?
>>887 じゃ、何がいいと思う?想像力を使って…
889 :
デフォルトの名無しさん :2006/10/17(火) 15:17:59
その問題くらい理解できるし、実装するのも難しくはないが、 単にめんどくさいからやらない。
他にやりたい事がある。 勿論にちゃんではない。
というか問題文書いた奴に「日本語でおk」といっといてくれ。
893 :
近似値 :2006/10/17(火) 18:44:47
[1] 授業単元:繰り返し計算の打ち切り [2] 問題文(含コード&リンク): Sn = 1-1/3+1/5-1/7… = (-1)^n/2n+1 (nは0から∞) =π/4 …(A) (A)を利用してπの近似値を求めたい。 但し、n項目までの計算結果から(n-1)項目までの計算結果の差が、 0.00001を下回ったところで計算を打ち切れ。 このとき、第何項目までが計算されたかを求めよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: わかりません [3.3] 言語: C [4] 期限:希望としては明日の午前中です [5] その他の制限:特にありません
894 :
近似値 :2006/10/17(火) 18:51:19
#include <stdio.h> #include <math.h> int main(void) { int n; double Sn ,N ,kinji ,a ,b n=0;b=0;N=0; while(a>0.00001) { Sn = pow(-1,n) / (2 * n + 1); b = b + Sn; kinji = 4 * b; a = fabs(kinji-N); N=kinji; n++; } printf("パイの近似値は%1.16lfである。\n",kinji); printf("第%d項目まで計算に使われた。\n",n); return 0; } 自分なりに作ってみたのですが(ほぼ友達のをこっそり見ながら)うまくいきません。 またBorland C++ Compiler 5.5を自分のPCに入れているのですが、コンパイルをすると [パイの近似値は+NANである。第0項目まで計算に使われた。] となってしまいます。これはエラーが改善されれば直るのでしょうか? 長文で申し訳ないのですが、よろしくお願いいたします。
aの初期化すべきでは?
Snとkinjuとaとbが未初期化warningもちゃんとみようね
>>893 これ中学生の時にやったなぁ
ふふふ・・・
中高年になってからやったの?
899 :
デフォルトの名無しさん :2006/10/17(火) 20:07:53
[1] 授業単元: 数値計算プログラミング [2] 問題文(含コード&リンク): 数値を符号部1bit,指数部8bit,仮数部16or32bitの浮動小数点型へ変換するプログラムを作成し,1,2,3,4,8,0.5,0.25,0.1,0.2等の数値を変換する。ただし,入力フォーマットは {-},[0-9]+{.[0-9]+}|{-}.[0-9]+ とする。ここで、{}は省略可、[0-9]は0〜9の任意の数字、+は前者の1回以上の繰り返し、|はどちらか一方を示す。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年10月19日(木)
>>899 正直問題が理解できない俺はどうすれば。
#include <stdio.h> int main(void) { int n; double Sn, kinji, pi; pi = 0.0; for( n = 1 ; ; n++ ) { Sn = 1.0 / (2.0 * n + 1.0); if( n & 1) pi += Sn; else pi -= Sn; kinji = 4 * pi; if( Sn < 0.00001 ) break; } printf("パイの近似値は%1.16lfである。\n",kinji); printf("第%d項目まで計算に使われた。\n",n); return 0; } 試してないけど、多分こう。
902 :
901 :2006/10/17(火) 20:52:38
2カ所訂正。 -for( n = 1 ; ; n++ ) { +for( n = 0 ; ; n++ ) { -if( n & 1 ) pi += Sn; +if( !(n & 1)) pi += Sn;
>>899 #include <stdio.h>
main(){
float hoge;
scanf("%f", &hoge);
printf("%f", hoge);
}
入力フォーマットとやらはscanfの%fが条件を満たしてる気がするが
floatでもdoubleでも仮数部のサイズが合わないんだよなあ・・・
>>902 kinji をループ内で計算する意味が分からん。
それと問題文があいまいだから仕方ないんだが、
π の小数点以下5桁の精度を確保するという風に出題者の意図を類推すると、
0.00001 と比較するのはソース中 Sn ではなく Sn * 4 になるのでは。
906 :
デフォルトの名無しさん :2006/10/17(火) 22:41:10
[1] 授業単元:数値解析 [2] 問題文(含コード&リンク): x=0 のとき f(0)=1 x=2 のとき f(2)=7.389 x=3 のとき f(3)=20.086 から補外(外挿)を用いてf(4)を推定せよ [3] 環境 [3.1] WindowsXP [3.2] gcc [3.3] C [4] 期限: 10月18日 [5] その他の制限: 特にないです お願いします
907 :
デフォルトの名無しさん :2006/10/17(火) 22:41:15
>>900 要するに小数を浮動小数点型で2進数表示にする
909 :
近似値 :2006/10/17(火) 23:37:29
#include <stdio.h>
#include <math.h>
int main(void)
{
int n;
double Sn ,N ,kinji ,a ,b;
n=0;N=0;kinji=0;a=0;b=0;
while(a>0.00001)
{
Sn = pow(-1,n) / (2 * n + 1);
b = b + Sn;
kinji = 4 * b;
a = fabs(kinji-N);
N=kinji;
n++;
}
printf("パイの近似値は%1.16lfである。\n",kinji);
printf("第%d項目まで計算に使われた。\n",n);
return 0;
}
>>895-896 初期化をしてみたのですが、(Snを初期化すると、エラーが出るのでしていません)
[パイの近似値は0.0000000000000000である。第0項目まで計算に使われた。]
と表示されます。ほかに改良すべき点はございませんか?
>>909 aを0で初期化したらwhileの条件のa>0.00001が満たせなくなるぞ
911 :
デフォルトの名無しさん :2006/10/18(水) 00:19:00
floatって小数第何位までOKなの?
912 :
デフォルトの名無しさん :2006/10/18(水) 00:29:33
914 :
デフォルトの名無しさん :2006/10/18(水) 00:36:39
だから浮動小数点という
915 :
911 :2006/10/18(水) 00:44:20
ごめん、仮数包茎部の有効桁数っていう意味なんだが
917 :
911 :2006/10/18(水) 00:48:24
915は俺じゃないんだが
918 :
911 :2006/10/18(水) 00:50:31
912は了解したが913,914はちょっと違うんじゃまいか
919 :
911 :2006/10/18(水) 00:51:53
>>915 10進数で言うならIEEE754のfloatは6桁
doubleは15桁
特別な理由がないかぎりfloat使うのは得策じゃないね。
921 :
デフォルトの名無しさん :2006/10/18(水) 00:57:13
[1] 授業単元: プログラミング演習 [2] 問題文(含コード&リンク): x,yの2次元座標が書かれている、coord2.txtとx,y,zの3次元座標が書かれている、coord3.txtを読み込み、 gnuplotなどで表示するプログラムを作成せよ。 ファイルをオープンしたら、必ずクローズすること。 [3] 環境 [3.1] OS: Linux or Mac OSX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 10月24日 [5]座標データは下記のように記されています。 ファイルを入力(オープン)した後のプロセスのイメージが浮かびません・・・ 各々の座標がどのように当てはめられていくイメージが掴めればよいのですが。 x y z 0.0 0.0 0.0 ・ ・
921は期限が21日まででした・・・。 すいません。
それはもう gnuplotなど の使い方を読めとしか
>>920 どういうときが得策になるか知らないでしょ。
>>908 どうもありがとうございます
プログラム読みながら構造体を理解したいと思います
927 :
デフォルトの名無しさん :2006/10/18(水) 09:55:49
【質問テンプレ】
[1] 授業単元:プロ演
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/2789.txt このプログラムを台形公式と2次のシンプソン則に基づく数値積分を行うように変更せよ
台形近似 h=(b-a)/n nは偶数
h*( 1/2f(a)+f(a+h)+f(a+2h)+・・・+f(b-h)+1/2f(b) )
シンプソン公式 h=(b-a)/n
(h/3)*( f(a)+f(a+h)+ 4( f(a+h)+f(a+3h)+・・・+f(b-h) ) 奇数番目
+2( f(a+2h)+f(a+4h)+・・・+f(b-2h) ) 偶数番目
[3] 環境
[3.1] Win XP
[3.2] gcc
[3.3] 言語: C
[4] 期限: 明日
[5] その他の制限: なし
お願いします
928 :
お願いします :2006/10/18(水) 13:36:51
[1] 授業単元: ゼミ [2] 問題文(含コード&リンク): サンプル数6個で、2つの変数(x、y)を入力してその共分散と相関係数を出力する [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン:VC 6.0 [3.3] 言語: Cでお願いします [4] 期限: 今週末の金曜日までです [5] その他の制限: 使う命令は、printf,scanf,for文等長くなってもいいので 初心者が使う文法みでお願いします。
>>927 //台形公式と2次のシンプソン則に基づく数値積分を行う
#include <stdio.h>
double func(double x);
double integra10(double (*func_p)(double x),double a, double b, unsigned int n);
main(){
double a,b;//区間
unsigned int n;//分割数
printf("積分区間 [a,b]と区間数n a,b,n : ");
scanf("%lf,%lf,%ud", &a,&b,&n);
printf("長方形近似 I=%20.17f\n",integra10(func,a,b,n));
}
double func(double x){ return(2.0/(1.0+x*x));}
double integra10(double (*func_p)(double x), double a, double b, unsigned int n)
{
double dx ; double h0, hn, hsum = 0.0,x , sum = 0.0; unsigned int i;
if(n == 0 && b - a == 0)
return 0;
dx = (b - a)/n; h0 = (*func_p)(a); hn = (*func_p)(b);
for(i = 1, x = a + dx; i < n -1; x+= dx, i++){ hsum += (*func_p)(x); }
if(((h0 + hn + (2 * hsum)) * dx / 2) < 0 )
return (((h0 + hn + (2 * hsum)) * dx / 2) * -1);
else
return ((h0 + hn + (2 * hsum)) * dx / 2);
}
930 :
929 :2006/10/18(水) 14:05:53
if(n == 0 && b - a == 0) のところ if(n == 0 && b == a) に直しといて
double同士の==比較は。。。
>>928 すぐに解答をもらえると思うなよ。
共分散と相関係数の式をそのまま当てはめるだけ。
まずは、その二つの値を求めるための式を書いてみろ。
933 :
デフォルトの名無しさん :2006/10/18(水) 14:36:00
[1] 授業単元: C言語 [2] 問題文(含コード&リンク): for(i=0; i<HEIGHT; i++){ for(j=0; j<WIDTH; j++){ fscanf(fp, "%d", &data); cell[i][j]->a = (int)data/100; cell[i][j]->b = (int)(data%100)/10; cell[i][j]->c = data%10; } } [3] 環境 [3.1] OS: :WindowsXP [3.3] 言語:C 外部ファイルからデータを構造体のポインタで受け取りたいのですが、 ビルドしたらエラーも警告も出ないのですが、実行の時に問題が発生して終わります。 ちなみに外部ファイルはテキストデータで 100 100 100 210 130 210 332 220 031 みたいな感じのものです。どうやらcell[i][j]に代入するときに問題が起きてるようです。 でも何が原因なのか良く分かりません。助けてください;;
ちなみにポインタじゃなくて普通の構造体に直して -> を . に変えたら普通に動作したのですが、 構造体にした場合 . を -> に変えるだけではダメなのでしょうか? ポインタでやらないと後々不便なのでここで妥協したくはないのですが・・・
>>933 ネタか?釣りか?それとも真性か?
cellの構造体がどう定義されてるのか、一体誰が分かると思う?
このスレには回答者はいるがエスパーはいない。
>>935 すみません、真性でした。
構造体はこんな感じです。
struct celldata{
int a;
int b;
int c;
};
連続ですみません。補足です。 main関数での構造体の定義は struct celldata *cell[HEIGHT][WIDTH]; で、HEIGHTとWIDTHは#includeの下あたりで #define WIDTH 3 #define HEIGHT 3 で定義しています。
どうせメモリ確保せずに使ってるとかなんだろうな・・・
>>938 ありがとうございました!
mallocでメモリ確保したら動作しました。
メモリ確保なんて自己参照構造体でくらいしか
使わないものだと思ってました・・・。
940 :
928 :2006/10/18(水) 15:18:49
#include<stdio.h> main() { scanf( "%d%d", &a, &g ); scanf( "%d%d", &b, &h ); scanf( "%d%d", &c, &i ); scanf( "%d%d", &d, &j ); scanf( "%d%d", &e, &k ); scanf( "%d%d", &f, &l ); m=(a+b+c+d+e+f)/6; n=(g+h+i+j+k+l)/6; S=((a-m)(g-n)+(b-m)(h-n)+(c-m)(i-n)+(d-m)(j-n)+(e-m)(k-n)+(f-m)(l-n))/6; X=sqrt((a-m)^2+(b-m)^2+(c-m)^2+(d-m)^2+(e-m)^2+(f-m)^2) Y=sqrt((g-n)^2+(h-n)^2+(i-n)^2+(j-n)^2+(k-n)^2+(l-n)^2) R=S/(X*Y) printf("%d",S); printf("%d",R); } これで精一杯です・・・
Brian Westly 氏が1988年に作った 円周率を計算するプログラムなんだけど↓ #define _ -F<00||--F-OO--; int F=00,OO=00; main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO() { _-_-_-_ _-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_-_-_-_-_ _-_-_-_-_-_-_-_ _-_-_-_ } このプログラムの中で、どのようにして円周率を計算するのか考えなさい 有名っぽいプログラムだったので検索したのですが解説してるサイトとかなかったので困ってます。 よろしくお願いします。
David van Brackle って人が書いたプログラムで1行で書けけるプログラムなんだけれども main(Q,O)char**O;{if(--Q){main(Q,O);O[Q][0]^=0X80;for(O[0][0]=0;O[++O[0][0]]!=0;)if(O[O[0][0]][0]>0)puts(O[O[0][0]]);puts("----------");main(Q,O);}} このプログラムを実行するとコマンドラインの引数すべての部分集合を表示することができるらしいのですが どうして表示されるのか解説をしろという問題なのですが どうしてなるのかわかる方はいらっしゃいませんか? 解説できる方がいたら解説をお願いします。
_________________________ | | | | [G]oogle | | | /ー[]{] /ー[]{] 冂 ┌冖ー┐ 冂 | | | く, グ / .く, グ / . | .レ'7´フ カ l | .レ'7 lー┐.| | | ∠/ ∠/ !__/ /_/ l__/ |__./..└‐┘.| | | ⊂二⊃ | | | | l | | | | |_l__| | | | ( ´_ゝ`) シェフの味! | | | / |: ヾ ∧_∧ ドウダカ | | | / / |: l、 l (´<_` ).、 | | |__(__コつ| ̄|С,ノ __ (二二つ二ノ __ | | | /⌒\** | | | .ゝ二二二ノ | | | ググ(・∀・)レ!! | | |_____________________________|/ ググレカレー [google curry] (発売 2006〜)
944 :
デフォルトの名無しさん :2006/10/18(水) 18:37:18
[1] 授業単元: 数値計算プログラミング [2] 問題文(含コード&リンク): 数値を符号部1bit,指数部8bit,仮数部16or32bitの浮動小数点型へ変換するプログラムを作成し,1,2,3,4,8,0.5,0.25,0.1,0.2等の数値を変換する。ただし,入力フォーマットは {-},[0-9]+{.[0-9]+}|{-}.[0-9]+ とする。ここで、{}は省略可、[0-9]は0〜9の任意の数字、+は前者の1回以上の繰り返し、|はどちらか一方を示す。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2006年10月19日(木)
1:演習C言語入門2 2:問:16 苗字/名前 といった形式で文字列を入力する 苗字と名前を表すふたつの文字列に分割するプログラムを作成せよ 実行例 苗字と名前を入力してください:takeda/wataru takeda wataru 仕様 苗字を表すポインタ *lastname 名前を表すポインタ *firstname を宣言する 入力された文字列から/を探す 無ければエラーを吐く 3:C言語 Linux gcc3.4 4:今週中 5:今週でポインタ、構造体の基礎まで学んでいます よろしくお願いします
>>946 #include <stdio.h>
#include <string.h>
main(){
char in[1000], *lastname, *firstname=in;
printf("苗字と名前を入力してください:");
scanf("%s", in);
lastname = strchr(in, '/');
if(!lastname){
printf("入力書式が間違っています\n苗字/名前という形式で入力してください");
return -1;
}
*lastname = NULL;
lastname++;
puts(firstname);
puts(lastname);
return 0;
}
948 :
デフォルトの名無しさん :2006/10/18(水) 23:10:13
>>947 *lastname=NULL;
↓
*lastname='\0';
っしょ?
950 :
947 :2006/10/19(木) 00:11:17
>>949 文字列の終わりだから'\0'のがいいか
いつもNULLで書いてるからついこう書いてしまった
NULLは意味が違うからやめたほうがいい 建前としては規格からはずれるので動かない可能性もある 見たことねーけどな
>>951 今の規格ではNULLは整数の0と等価にみなせるんじゃなかったか?
C99だったかC++のどこからかだったかは覚えてないんだが…
>>944 その問題、何度か尋ねてるようだけど、とりあえず出力例を出してくれ。
あと指数部の基数は幾つだ?下駄は?
仮数部の正規化の形式は?
>>944 入力フォーマット {-},[0-9]+{.[0-9]+}|{-}.[0-9]+
のうち|の前の {-} につづく , カンマが入ってるのは間違いだよな?
955 :
954 :2006/10/19(木) 00:50:20
>>944 受け取れる数値のフォーマットは
1.125
-1.125
.125
-.125
だと思いたいわけだが、問題の通りだとカンマがあるせいで
,1.125
-,1.125
.125
-.125
こんなものを処理しないといけなくなってしまうぞ
956 :
デフォルトの名無しさん :2006/10/19(木) 01:29:03
957 :
デフォルトの名無しさん :2006/10/19(木) 01:31:04
>>955 >>956 で訂正されてしまったので身もふたもないが…
おそらく適正を見ているのだろう。
勝手に解釈して , を抜かす奴→不可
間違いではないかと質問に来る奴→不可
書いてあるとおりに実装する奴→可
どちらの場合にも対応できるように実装する奴→良
このスレに丸投げしてねらーが答えないのが悪いと責任転嫁する奴→優
>>950 最近はNULLは#defineで0設定されてたと思う。
>>956 もしカンマをピリオドに変えると更にわけわかめ
1.1.25
-1.1.25
これは一体どんな数値に変換すれば…
960 :
デフォルトの名無しさん :2006/10/19(木) 01:47:30
>>959 チョット違う
.1.25
-.1.25
だろ?あげあし取りスマソ
>>944 の解き方としては
1.整数部分だけを二進数に変換
2.少数点以下を二進数に変換
3.1.2.の結果を合わせて初めてビットが1になる次のビットを仮数部の最上位ビットにする
で一応できるけど、無限大の表現と 0 の表現が未定義だな
962 :
デフォルトの名無しさん :2006/10/19(木) 08:29:59
区切り文字をわざわざ小数点とかぶせる神経が分からない
1.1.25 -1.1 .25 (0.25) と解釈できるけど?
あるぇ〜〜、まだぽまいらC言語なんてやってんのぉ〜〜〜〜〜?
>>961 世にあるIEEE以外の多くの実装では、最上位ビットも記録するわけだが。
素直にatofのソースまるパクリでよくね。 いっそのこと、atofで変換して基数部を指定ビット数で切り捨てるとか。
.-.1.25なんて馬鹿だろ
仮数部はどうするのかな。(1+x)?それともx?
まぁまて文字での表現形式とビットでの表現形式が一致しなければならないなんてどこにも書いてないぞ
971 :
デフォルトの名無しさん :2006/10/19(木) 12:21:13
もうこのネタは飽きた。
なら出てくんな
質問者の態度が悪いなー
974 :
デフォルトの名無しさん :2006/10/19(木) 15:13:40
>>952 >>958 C++では0だし、Cでも0になっていることはある。
でも、だからと言って文字列の終端にNULLを使ってよいという理由にはならない。
976 :
デフォルトの名無しさん :2006/10/19(木) 16:05:44
>>944 うっとうしいからさっさとやっちゃおうぜ
やれと言われても、
>>944 は解くための情報が決定的に不足しとるんだわな。
とりあえず、基数は2。バイアスは無し。正規化は小数第1位に有効ビットを
持ってくる。入力フォーマットのカンマは無視ってことでいいのか?
978 :
デフォルトの名無しさん :2006/10/19(木) 16:41:29
どうせ他人の宿題なんだし、適当に解釈してそれっぽく見繕えばいいんじゃね?
980 :
941 :2006/10/19(木) 17:09:26
ググったのですが解説されている所はありませんでした。 マジで誰か分かる方いませんか?
981 :
デフォルトの名無しさん :2006/10/19(木) 17:22:30
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>
#define Bs 10 //底を10とする
typedef struct{
unsigned int flug: 1;//フラグ
unsigned int index: 8;//指数
unsigned int mantissa: 32;//仮数
}BitSet;
BitSet *ChngF(char *Num, unsigned int size);double ToDubF(BitSet *Bz);
BitSet *ChngF(char *Num, unsigned int size){unsigned int i = 0,j = 0;unsigned int Bn = 0;
BitSet *Bi = (BitSet *)malloc(sizeof(BitSet));Bi->flug = 0;Bi->index = 0;Bi->mantissa = 0;
if(Bi == NULL){fprintf(stderr,"メモリ割り当て失敗\n");exit(1);}for(i = 0; isspace(Num[i]); i++)
;if(Num[i] == '-'){Bi->flug = 1;}else if(Num[i] == '+'){Bi->flug = 0;}else{Bi->flug = 0;}i++;
for(Bn = 0, j = 0;isdigit(Num[i]);i++, j++)Bn = 10 * Bn + (Num[i] - '0');Bi->index = j;
if(Num[i] == '.')i++;elseexit(1);for(;i < size; i++)Bn = 10 * Bn + (Num[i] - '0');Bi->mantissa = Bn;
return Bi;}double ToDubF(BitSet *Bz){double dm = (double)Bz->mantissa ,rd;unsigned int i;
double Ind = Bs ;for(i = 0; i < Bz->index; i++)Ind *= Bs;rd = (double)Bz->mantissa / Ind;if(Bz->flug == 1)
rd *= -1;return rd;}int main()
{char Num[] = "-13.653";unsigned int size = (unsigned int)strlen(Num);BitSet *B1;double Resl;
B1 = ChngF(Num, size);Resl = ToDubF(B1);printf("%s : %f \n",Num, Resl);return 0;}
>>944 の問題って
入力規則ってのがわかんないんっすけど
こんな感じっすかね。問題の意図が違いますかね?
982 :
デフォルトの名無しさん :2006/10/19(木) 17:42:20
983 :
デフォルトの名無しさん :2006/10/19(木) 17:46:38
985 :
デフォルトの名無しさん :2006/10/19(木) 18:18:54
>>985 1scanf("%lf %lf %lf", &w, &h, &d);
2:v=w*h*d;
3:s=w*h*2+h*d*2+d*w*2;
4:w, h, d
5:printf("taiseki %f, menseki %f\n", v, s);
987 :
985 :2006/10/19(木) 18:46:01
988 :
デフォルトの名無しさん :2006/10/19(木) 19:06:51
[1] 授業単元:システム学 [2] 問題文:行列の積を用いた性能評価プログラムを作成しなさい 計算に何秒かかったのか表示し、行列の大きさは任意で変更が出来るように組むこと [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C++ [4] 期限: 2006年10月20日14時 [5] その他の制限: コンパイルオプションには最適化を指示する。 倍精度浮動小数点を用いること よろしくお願いします
992 :
デフォルトの名無しさん :2006/10/19(木) 20:39:36
スレでも立てるか
>>990 問題文に問題があるんだが、変更していいのはあくまでも
struct nibun *add_nibun(struct nibun *x,int k)
って関数だけなの?
>>995 そうです
問題に書いてある部分は変更しちゃいけないみたいです
埋め
dispがこうなっていれば俺にも解けるんだが。 void disp(struct nibun *x) { if(x->small!=NULL) disp(x->small); printf("%d-(",x->num); if(x->small!=NULL) printf("%d,",(x->small)->num); else printf("*"); if(x->big!=NULL) printf("%d)\n",(x->big)->num); else printf("*)\n"); if(x->big!=NULL) disp(x->big); } つーか2分木リスト構造って何だ?
999
>>990 struct nibun *add_nibun(struct nibun *x,int k)
{
struct nibun *member, *parent, **parent_next;
member=malloc(sizeof(struct nibun));
member->num=k;
member->small=NULL;
member->big=NULL;
parent=x;
while(parent!=NULL)
{
if(k<parent->num)
parent_next=&(parent->small);
else
parent_next=&(parent->big);
if(*parent_next==NULL)
break;
parent=*parent_next;
}
*parent_next=member;
return x;
}
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。