1 :
デフォルトの名無しさん :
2010/03/24(水) 22:41:38 BE:331349257-S★(518000)
2 :
デフォルトの名無しさん :2010/03/24(水) 23:21:55
2
3
4
5
ときどき void main って書くやついるよね。 なんなんだろうね。馬鹿じゃないかと思うよね。
質問スレでやれ ・・・ってすでにやってたのねorz
オリジナルな人を宿題スレにお誘いしました。仲良くしてね。
>>6 昔、そのように指導していた入門書があったような気がする。
>>6 サンプル作るときはreturn省略できるから書いたりする。
まぁ今は昔と違って、void mainも仕様に沿ってるよね
> void mainも仕様に沿ってる (゚Д゚)ハァ?
_______ __ // ̄~`i ゝ `l | / / ,______ ,_____ ________ | | ____ TM | | ___ // ̄ヽヽ // ̄ヽヽ (( ̄)) | | // ̄_>> \ヽ、 |l | | | | | | | | ``( (. .| | | | ~~ `、二===-' ` ===' ' ` ===' ' // ̄ヽヽ |__ゝ ヽ二='' ヽヽ___// 日本 _____ _____ ______ _______ | ウェブ | | イメージ | | グループ | | ディレクトリ |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ._________________ | │・検索オプション └────────────────┘・表示設定 | Google検索 | I'm Feeling Lucky | ・言語ツール  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ○ウェブ全体から検索 ◎日本語のページを検索
>>11 スタートアップから int main() で call されるから、call 先の事情で void にかえるのはどうかと。
質問スレではこの話題で空前の荒れ模様になったので、やめときますね。
>>14 それは処理系による。
例えば DOS や Windows 環境のでは void は認められている。
スタートアップでは戻り値がなくてもいいように設計されている。
これに準拠した(MS系をはじめとする)C言語では void は正規なので警告を出さない。
つまりそういう仕様。
逆に int main が必須な仕様においては、
void main と宣言すれば警告またはエラーが出るのが普通。
voidの話は質問スレでやれ
>>16 だから両方の規格があるという話だろ。それで完結だろ。
int main が必須の規格であり、それに準拠するのであれば、void main は正しくない。
けど世の中には void main が正規な規格もあるし、そこでは void main が正しいのは当然。
少し頭の中を整理した方がいいよ。
>>16 それ"も"であってそれ以外を禁止するとは言ってないよな>規格
return を省略できるのは void main と関係ない話だろ
>>10 main(void){} は int main(void){} と同値。(C言語)
main(void){} は規格違反、void main(void){} ならGCC以外OK。(C++言語)
>>18 void main() が正規な処理系って、そんなに多いのですか?void main() でも表面上問題ないっていうだけではないですか?
void func() と int func() とではたまたまスタック構造が変わらない、というだけで、いわば void func() と int func() との差を自覚していないだけではないですか?
>>22 >void main() が正規な処理系って、そんなに多いのですか?
DOS、Windows と Unix 系はそう。OS側では問題のあるOSの方が特殊。
ただしそれらで走るC言語においては、int main 必須な規約に準拠している言語もある。
そういう言語を使用していれば、void main が許されないのは当然。
DOS や Windows で一番利用されているであろう、
MS系のC言語であれば void main は正規。
>void main() でも表面上問題ないっていうだけではないですか?
正規に認めらている。だから警告もださない。
というか、どっからこいう発想が湧いてくるんだろう。
自分の知ってる規格が int main が必須だったとして、
どうしてそれが世の中すべての規格に共通だと思うんだ。
>>23 DOS Windows Unix系において、void mainが正規であることのソースが出てくればみんな落ち着くんじゃない?
大抵問題ないという慣例じゃなくて。
>>24 プログラミング言語CというCの教科書では main 関数に return など存在していない。
この本はC言語の設計者が書いたものであり、C言語の規約その物。
当然この本に書いてあるコードは Unix や DOS で動いたし、問題があるわけもない。
80年代のことではあるが、その頃の Unix や DOS はそのまま残っているんだから、
当然今も問題ない。
そもそも void main が不正だという奴の根拠はなんなんだ?
どっかのWEBサイトに書いてあったらとかだろ。そんなものが何の根拠になるんだ。
あるいは void main が不正な規格を持ち出して、そこで禁止されているとか。
当たり前だろ。そういう規格なんだから。ある規格があったらすべてのC言語がそうあるべきだとか。
もうアホかと。
gcc version 4.2.2 -- hello.c -- void main(){} ------------- # gcc hello.c hello.c: In function ‘main’: hello.c:1: warning: return type of ‘main’ is not ‘int’ 普通にint main()やint main(int,char**)でいいように思うな void main()しか認めない環境でもない限り(あるのか知らんけど) なんのメリットもないと思う golfならmain(){}でいいんだしさ
>>27 理解力低いな。
DOS や Unix がK&Rのソースが動作するように設計されているという意味だ。
どうしてわからないんだ。
こういう OS では void main と書いても問題がないということ。
>>26 だから gcc で駄目だったら、全部のC言語で駄目っていう話にするの?
gcc 使うときに int main って書くのは当然だろ。
けど void main が認められている処理系で、それが駄目だという理由にはならん。
そこで論理の飛躍があることにどうして自分で気付けないの?
なんでvoidにこだわるかなぁ 別にvoidでもintでもどっちでもいいじゃん 臨機応変に使い分ければいいことだし
>>29 void mainでなければ通らない処理系を具体的に教えて。
>>30 本来どっちもで良いことなのに、int main に洗脳された人たちが、
他人が自身の環境に準拠した void main を使うことにまで口出しをしている。
void main 肯定派は、 int main もどちらもありだし、使う人の環境や規約に従えばよいと考える。
void main 否定派は、自分の環境に世の中のC言語が自分が準拠する規約に従っていないと許せない。
>>31 そういう処理系がないことを証明するのはそっちでしょ。
そもそもそういう処理系があるかもしれないのに、どうして void main を否定できるんだ。
あるかもしれないなんだろ?
そういう矛盾になぜ気づかない。int main に洗脳されているとしか思えない。
ないことを証明するのは「悪魔の証明」だろw
エイプリルフールと関係あるのかどうか
>>31 処理系じゃないけど、商用アプリ作ってるところで、
「main は void で宣言して、リターンコードを返す場合は exit() を使うこと。」
という社内規約を作っているところはあるよ。
この規約に準拠したら、void main 使うのは当然だよね。
そうすると、この規約自体がどうなだってるんだってことになるけど、
それ言い出すと int main を定めているのも規約の一つでしかないわけだし。
少なくとも昔は int main を定めている規格なんかなかったし、
処理系もその時代からあるから int main には依存していない。
そういう状況で int main を定めた規格が後から作られた。まぁある程度は広まった。
だからといって、その規格に準拠していないC言語はすべて間違いなんてのはおかしいだろ。
その時点で一番メジャーな規格のみが唯一絶対正しいなんて滅茶苦茶だし、
MS のコンパイラだってそれなりにメジャーだよ。
こういう無駄な議論にかける情熱の、せめて1/100でも 宿題回答に向けてくれればいいのになw
>>36 #include <stdio.h>
void main() { }
上記コード、MSのコンパイラなら何も文句を言わないのかとあせったがちゃんと警告が出るね。
DOS で void main() が正規だって?まさか! リンクするスタートアップモジュールは返り値をレジスタにとっているので void main() であろうとも int main() であろうともスタック構造がかわならいので問題ないようにみえるだけでは?
>>25 それは単に
main()
{
printf("Hello, world\n");
}
だったのでは。関数の返り値を指定しなかったら int だというだけでは。
そもそも、そのころに void というキーワードはあったのだろうか?
>>31 言っても無駄。そんな処理系は存在しない、少なくとも DOS 上・UNIX上ではね。
>>36 規格化、標準化されたものに対して
準拠するという言葉があるので
案件ごとに異なるローカルルールや
社内規約を持ち出して準拠するとは言わないよ
準拠という言葉の意味、成り立ちを考えれば分かると思うけど
C99準拠でなくMS準拠なんてもはやギャグだよ
環境依存しないよう規格化してるのに
わざわざ手間をかけてエラーや警告の出やすいものにする意味が分からん
またかよ いつまでやってんだ
>>38 MS-C, VisualStudio ともに警告はでない。
コンパイルオプションを変更せず、標準時の場合だよ。
>>39 ローカル変数が初期化されていないのと同じ状態。それが問題になるわけがない。
その値に依存した処理を行うときにはじめて問題になるだけ。
>>40 main 関数の中に return 文がないということがポイント。これは void main と同じ。
C言語の設計者が書いたコードであり、これこそC言語の規格。(もちろん昔の)
そしてこのコードが動くように Unix、DOS 等の処理系が設計された。
だから少なくとも Unix や DOS ではこういうコードの動作が保証されている。(これは今も)
>>42 君がMSのコンパイラ使わないのは勝手だけど、
世の中のWindowsアプリケーションの殆どはMS準拠で作成されてるんだよ。
C99準拠が唯一無二だという思想の方がよほどギャグだよ。
あと、とんでもなく勘違いしてるようだから言うけど、C99は処理系に対する規格じゃないんだよ。
こういうことも理解してないんだろうな。
>>44 その意味不明な規格は脳内で作ったの?
それとも誰かから受け継いだの?
>>45 「その」が何を指してるのか全くわからん。これでは答えようがない。
技術者ならもう少しマシな文章書けるようなった方がいいぞ。
>>44 > コンパイルオプションを変更せず、標準時の場合だよ。
おいよいよ?
そうか 春休みだから宿題うpがないのか
>>47 void main() と書いても、警告は出ないよ。
念のため Visual Sutdio 2008 でコンパイルしたけどでないよ。
警告レベルを /W4 に引き上げても警告はでない。
MS系のコンパイラで警告の出るバージョンがあったと言いたいの?
それとも何か別のこと?
何を聞いてるのかよくわからないから、答えようがない。
>>49 VS2008で警告でたよ。
というか、void派はvoid main()を否定すべきだろ
void main()という記述はよくないよという警告
こんばんわ。 BuildLog.htm に、そのように出力されてるのか?
コマンドプロンプト cl では警告は一切でない。
>>52 ためしてからものをいうこと。
@VC++2008EE #include <stdio.h> void main(void) { puts("TEST"); getchar(); } エラー0、:警告0 規格で main() の型は int って決まってるんだから警告ぐらいは出すべきと思うけど。
まぁ、MSだから仕方がない
スタートアップモジュールが void main() 用に切り替わる、とか? ありえないけど。
@VC++2010β2 エラー0、警告0 MS やる気あんのか
あー、void main() 実行できるけど、まともな終了値を返してないね
VCでのvoid main()はMSの仕様で許されています。
http://msdn.microsoft.com/en-us/library/6wd819wh.aspx > Alternatively, the main and wmain functions can be declared as returning void (no return value).
VC++2008EEで実験したが、0を返してるね。
void main()
{
}
00841000 xor eax,eax
00841002 ret
__tmainCRTStartup
:
00841167 call main (841000h)
0084116C add esp,0Ch
0084116F mov dword ptr [mainret (843030h)],eax
:
62 :
デフォルトの名無しさん :2010/04/04(日) 17:07:59
特に断りがなければvoidは正常終了でいいと思うけどなぁ
63 :
61 :2010/04/04(日) 17:08:53
すまん、0だったね 不定値を返してるのはVC6だった
>>61 エラーも警告も出ず、MSの仕様通り。
暗黙的に0を返しており、動作上も問題ない。
#include <stdio.h>
void main(void)
{
puts("TEST");
003C1000 push offset ___xi_z+30h (3C20F4h)
003C1005 call dword ptr [__imp__puts (3C20A4h)]
003C100B add esp,4
getchar();
003C100E call dword ptr [__imp__getchar (3C209Ch)]
}
003C1014 xor eax,eax
003C1016 ret
EmbarcaderoのECC6.2.1はvoid main(void)では不定値を返す
_TEXT segment dword public use32 'CODE' _main proc near ?live1@0: ; ; void main(){ } ; push ebp mov ebp,esp @1: @2: pop ebp ret _main endp _TEXT ends eax にはなにも設定されていない。したがって、bcc32 (5.5.1) は不定値を返す。
なんだか妙な流れ… でも面白そうなのでunix 7th editionで確認。 return無しでもコンパイルは通るが、システムに0は返らない(errnoの10はECHILD)。 void main()はNGという結果。 $ ls -l /bin/cc -rwxrwxr-t 1 bin 6464 May 5 1979 /bin/cc $ cat test0.c #include <stdio.h> int main() { puts("hello world!"); return 0; } $ /bin/cc test0.c -o test0 $ ./test0; echo $? hello world! 0 $ cat test1.c #include <stdio.h> int main() { puts("hello world!"); } $ /bin/cc test1.c -o test1 $ ./test1; echo $? hello world! 10 $ cat test2.c #include <stdio.h> void main() { puts("hello world!"); } $ /bin/cc test2.c -o test2 test2.c:2: External definition syntax $
とりあえず宿題すれで議論すんな スレチ
とりあえず春休みの宿題はvoid mainについてということで
汎用性を重視してプログラムを作成せよ。 ということで、FAでは? 機種制限されるようなプログラムを組ませるようなキチガイな学校は帰れといういことで マイコンなどは話は別だが
>>70 学校のせいで帰れというのは生徒に酷ですね。
学校は帰れって言ってんのに
>>50 >>52 void main 否定派は嘘ばっかりだよね。
他の発言もいい加減なことばっかり。
void main が駄目だとかデマを撒き散らして何のメリットがあるんだろう。
だから警告でるって。 試してるやつはコマンドラインさらしてみ? ってか「void main()」ここだけで明らかにおかしい点があるだろよ void main肯定派もっとがんばれよw
うちのコンパイラーは無警告なので void main おk
>>74 >cat voidmain.c
void main() { }
>cl voidmain.c
voidmain.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:voidmain.exe
voidmain.obj
>cl voidmain.c /Wall
voidmain.c
voidmain.c(1) : warning C4255: 'main' : 関数プロトタイプがありません : '()' を '(void)' に変換します。
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:voidmain.exe
voidmain.obj
>>73 リンクされるスタートアップの仮定と異なる宣言は間違っていると思います。
呼び出し元と呼び出し先で関数の宣言をあわせるのは、それがたとえ main() であっても同じことではないでしょうか。
77 :
76 :2010/04/05(月) 20:02:24
>76 は不完全ですね。bash を起動させて標準出力と標準エラー出力の両方を取っておきましょうか。 $cat voidmain.c void main() { } $cl voidmain.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. voidmain.c Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:voidmain.exe voidmain.obj $cl voidmain.c /Wall Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. voidmain.c voidmain.c(1) : warning C4255: 'main' : 関数プロトタイプがありません : '()' を '(void)' に変換します。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:voidmain.exe voidmain.obj
>>75 警告がでないからといって安心しているようでは‥‥‥。
モジュール別に分割してコンパイルするつくりで、かつちゃんとヘッダを書いていないときには、エラーがでなくてもはまります。
あと不定長引数の関数もはまれば結構難解です。
>>73 > void main 否定派は嘘ばっかりだよね。
> 他の発言もいい加減なことばっかり。
理解できないのなら、そういってくだされば、噛み砕いてご説明いたしますが。
面白いな。 Red Hat EL5.4上のgcc 4.1.2では警告ありで返り値はランダム. MacOS 10.5.8上のgcc 4.0.1では警告ありだけど返り値は常に0。
>>80 gcc 3/4 をみたんですけれども、___main 依存でよくわからない。___main ってなんでしょうか?
>>79 Visual Studio 2008 で void main と定義したときに、
警告が出るというのが理解できません。
「警告が出る」というのはどういう意味かを噛み砕いて説明してください。
なんでvoid main派はこんな頭悪いレスばかりするんだ? いざ警告内容を目の当たりにしてもこの有様。 void main派から見てもvoid main()はありえん。とかいいなよ。
void main派から見てもvoid main()はありえん。
>>82 VisualStudio2008では警告は出ないよ。
警告が出るというのは、void main否定派が、
都合が悪くなってデマカセを言ってるだけ。
>>83 void main否定派が全ての環境で警告が出るとか、くだらん嘘つくからだろ。
VS2008の出力 # cl /Wall voidmain.c Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved. voidmain.c C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(381) : warning C4255: '_get_printf_count_output' : 関数プロトタイプがありません : '()' を '(void)' に変換します。 voidmain.c(3) : warning C4255: 'main' : 関数プロトタイプがありません : '()' を '(void)' に変換します。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:voidmain.exe voidmain.obj
必要もないのにincludeしたのはごめんなさい。
バージョン、内容ともに
>>77 と同じ
>>88 それ、/Wall というオプションつけてるからだよ。
ヘルプ読めばわかるけど、推奨されているのは /W4 まで。
/Wall という特殊なオプションを付けて状態で警告がでても意味がない。
stdio.h に対しても警告出してるんだから、こんなオプションの実用性がないことは普通の人ならわかる。
更にこの状態であっても void main に対しての警告は出ていない。
つまり void main が認めらているということ。
だからこそしきりに、void main()はありえんと言っている。 void main肯定派の中にvoid main()も肯定しているように見受けられる人が多いから。 ちなみに俺はvoid mainを否定したことはないよ。
92 :
デフォルトの名無しさん :2010/04/06(火) 11:09:43
pedanticをディスってると聞いて
>>90 単に引数を指定しない宣言を void にしただけ。 func() を func(void) と読み替える、といってきている。
今回の話題には関係ない。いずれにせよ /Wall が特殊、というわけではない。stdio.h でエラーがでているのはご愛嬌というべきか。
MSのコンパイラでは、void main() にしても特に警告はでていない、ということは普通の人ならわかる。
ただ、私は void main() 否定派。リンクされるスタートアップモジュールでの仮定と異なる宣言はどうかと思う。
引数の宣言をあわせるのは main() も同じ。返り値をスタックにのせる場合もある現在の規格ではなおさら。
>>91 規格では関数の定義において void func(void) と void func() は等価であることが保障されている。
プロトタイプのときは別。
時間があれば規格の場所を探しておく。
>>94 それC++
>>88 は拡張子Cでやってるからvoid func()はvoid func(...)と透過でかつ未定義
96 :
デフォルトの名無しさん :2010/04/06(火) 14:18:53
void mainと書くのは日本だけの風習だから、外国では笑われるよ。 アメリカだとint mainじゃないと、罰金取られたりするしね。 あと日本の規格は優秀だから海外でも通用するから、 void mainなんて阿呆がすることなんだよ。 あと実行速度がvoidにすると最大10倍ぐらい遅くなったりするからね。 逆にいうとintにしたら、10倍はやくなるだから、そうしなのはどあほだよ。 あとintの方が文字が少ないし実行速度が早くなるのは当然なんだよ。
97 :
デフォルトの名無しさん :2010/04/06(火) 14:23:38
あああそうか!!! みんな実行速度のことを忘れたね。 そういう目で分析するとint mainで決着だ!!!! 10倍とかすごいね、頭のいい人がいるもんだわ。関心だわ。
クマー。
どこを横読みすればいいですか?
void main 否定派は嘘つきで更に頭も相当悪いな。。。
101 :
94 :2010/04/06(火) 22:01:34
>>95 仕様書の該当場所をみつけた。
残念ながら TC2 (草案とみなしていいのかな?)なんだけれども
ISO/IEC 9899TC2
6.7.5.3 Function declarators (including prototypes)
14
An identifier list declares only the identifiers of the parameters of the function. An empty
list in a function declarator that is part of a definition of that function specifies that the
function has no parameters.
とあり、関数の定義のときには、空のリストは no parameters だそうだ。
The empty list in a function declarator that is not part of a
definition of that function specifies that no information about the number or types of the
parameters is supplied.
関数定義の一部ではない場所での空リストはパラメータの内容について情報を示さないそうだ。
同文書では例として、
16
EXAMPLE 1 The declaration
int f(void), *fip(), (*pfi)();
declares a function f with no parameters returning an int, a function fip with no parameter specification
returning a pointer to an int, and a pointer pfi to a function with no parameter specification returning an
int.
があり、この例では関数定義での *fpi() は "no parameter" だそうだ。
ここで教えてもらった。つ
http://pc12.2ch.net/test/read.cgi/tech/1246115922/
VC で void main に警告出すには /Za オプション まあこれは Microsoft 拡張であることも示してる そして実は sizeof(T) <= sizeof(int) の整数型でも同じようになる これからは unsigned short main なんて書くやつがいても叩くのやめようぜ VC では認められてるもんな
103 :
94 :2010/04/06(火) 22:11:09
>>91 だから、void main(void) と void main() は関数定義においては同一で、
「void main() はありえない」といっている意味がわからない。
私は int main()派、というよりは、コールする側とコールされる側で返り値の仮定は一緒にするのが妥当だと思っているだけだが。
>>102 $cat voidmain.c
void main() { }
$cl voidmain.c /Za
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
voidmain.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:voidmain.exe
voidmain.obj
ん?別に警告はでないが?
cl /? によれば
/Za 拡張子を無効にする
だそうだが?
>>105 誤訳かあ。
> Visual C++ コンパイラでは、ANSI C または ANSI C++ 規格以外の機能を多数用意しています。
> これらの機能はまとめて、C および C++ の Microsoft 拡張機能として知られています。これらの
> 拡張機能は、/Ze オプションを指定すると使用可能になり、/Za オプションを指定すると使用不能になります。
しかし、/Za だと拡張機能が使えなくなるのではないか?/Ze じゃないのか?
そして、/Ze を指定しても、
$ cat voidmain.c
void main() { }
$cl voidmain.c /Ze
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
cl : コマンド ライン warning D9035 : オプション 'Ze' の使用は現在推奨されていません。今後のバージョンからは削除されます。
voidmain.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:voidmain.exe
voidmain.obj
返り値が void であることを警告する内容じゃないんだが?
>>86 そんなことは誰もいっていないと思う。
そもそも MS で警告がでないから void main() で問題ない、という void main 肯定派の発言が発端では?
ただ、int main() 派としては、void main() のアセンブル結果が面白い。MS で void main() でも 0 を返しているのは、MS嘘つきとしかいいようがない。
>>107 コンパイラのバージョンが違うんだね、たぶん。
私のは VC2008EE なんだが、
$cl voidmain.c /Za /W1
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
voidmain.c
Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
/out:voidmain.exe
voidmain.obj
としかいわない。よかったらコンパイラの標準出力&標準エラー出力を貼ってくださいな。
C++の話だから拡張子をcppにするか/TPオプション使おうね
C99規格でmainの定義はint main(void){...}、int main(int argc,char * argv[]){...}、
この2つと同等(型の再定義等)の方法、に加えて処理系定義の方法で行うということに
なっているもよう(JIS規格なら
http://www.jisc.go.jp/ の「JIS検索」からX3010を
検索すれば閲覧可能)。
ということなので、(少なくともCでは)宿題の処理系に対応していればvoid mainでも可
という結論で良いのかな。
ええ、C++とかC99とかの話になってんの? てっきりANSI-Cの話かと。。。
>>111 常識で考えればその通りで最初から答えは出ている。
なのに main 関数はどんな場合でも int で宣言しろという奴がいるんだよ。
114 :
*>< :2010/04/07(水) 09:35:38
Borland が、/* */ main(){} や、int main(){} で変な警告だすのがそもそもの原因。
{return 0:] と1行追加すればいいのに、なぜか void main(){} 。
void main()なのに、{return 0;} は変だ。int main(){return;} と書くようなもの。
void main(){} と書くのは、BCC、そう書かれて迷惑なのは GCCだけ、VC は蚊帳の外。
また、/* */ main(){} と書かれて警告が出るのは gcc -std=c99 と、cl /TP。
ほれ、リンク
http://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/955.zip
もはや、宿題スレじゃなくなってるwww
昔のfj.comp.lang.cを彷彿とさせるな
fjでもこの話題あがってたの?
>>111 しかし、最後の処理系定義の方法、というのが曲者で、VC にしろ、bcc にしろ、スタートアップルーチンは int の返り値を
受けるようにできているので、int main() とするとが妥当でしょう。これを、自分が作るプログラムは返り値を返さない、という
理由で void main() にするのはおかしいのではないでしょうか?
>>118 そういうくだらん発言は、スレ読んでからにすれば。
>>119 いやあの時は確かmalloc()&free()だったと思う
くだらん話題で何ヶ月も議論してたぞ
>>120 >>121 >>111 の「処理系定義の方法で行う」というのを拡大解釈しているのではないですか。たとえば
double main()
が可能か不可能かは明白でしょうが、
void main()
でも同じことではないでしょうか?
処理系定義のリンクされるスタートアップが int main() を前提にかかれているのであれば、
int main()とかくべきなのではないでしょうか。
それとも MS-C Borland C は void main() を前提としたスタートアップなのでしょうか?
>>123 おいおい確かめもせずにいい加減な事を書くな
Borland Cはvoid mianだと不定値を返すぞ
>>124 まって、それは私が
>>66 で書いています。
当然 bcc32 は void main() を前提としたスタートアップではありません。
実際 int の返り値はたいていの処理系ではレジスター経由でスタートアップにわたるので、 void main() と書こうが、int main() と書こうが
実害はないのは百も承知です。
その上で void main() と書くよりも int main() と書いたほうがいい理由を探しています。
>>122 strdup() の返り値を free() するかしないかでしたっけ?
だがちょっと待って欲しい 「不定値を返すから void main を前提としたスタートアップではない」 本当にそうだろうか 「void main のときは不定値を返す」 という仕様である可能性はないのだろうか
>>126 いや多分まだログは残っていると思うが、話の発端は
「malloc()で確保した領域をfree()すると何が起きるのでしょうか」
という一質問者の質問だった
これが堂々巡りでひどい話に膨れあがって
結局使ってるOSに言及しないとはっきりした事は言えないよという
結論に落ち着くまで半年かかった
Windowsではfree()したらシステムにメモリを返す事もあるが、unixや
Linuxではそのまま持っていたりとかとにかく読んでて眠くなった
>>128 そのままもっているのは C の処理系のほうだったかと。OS レベルでも返さないとは驚き。
>>129 ああそうか
でもこの話はよそうぜ(笑)
void main()で盛り上がってるのにここにmalloc&freeが加わったら
大変な事になるw
>>127 んー、void main()は不定値を返す、という表現自体が、main() が返した先のモジュールで返り値を扱うことを意味しますね。
一連のアセンブリソースの検証でも、あくまで main() の返り先が返り値を扱う前提で調査していることになりますね。
たしかに「不定値を返すから void main() を前提としたスタートアップではない」とはいいきれませんね。
もうこれはスタートアップ自体を調べないことにはわかりませんね。
テンプレ書け
>>125 >実害はないのは百も承知です。
>その上で void main() と書くよりも int main() と書いたほうがいい理由を探しています。
int main に洗脳されたキチガイが文句言ってくるので、そういう奴らの相手をしなく済むことだね。
そういうキチガイがいない環境では、使っても問題ない。
> void main() と書くよりも int main() と書いたほうがいい理由 規格で規定されてるからだろ コンパイラのあるバージョンからを境にvoid main()が使えなくなる可能性は 十二分にある
>>134 まさにこういう人がいるから、使った方がいいということだろね。
こういう人は規格の意味や内容を理解しておらず、
どっかの受け売りだから議論にもならない。
そのくせ「規格では」とか言いたがる。
もう面倒だから使ってればいいんだよ。
int main() と書くよりも void main() と書いたほうがいい理由ってなんなの
>>136 まさにこういう人がいるから、使った方がいいということだろね。
こういう人は規格の意味や内容を理解しておらず、
どっかの受け売りだから議論にもならない。
そのくせ「理由ってなんなの」とか言いたがる。
もう面倒だから使ってればいいんだよ。
int main()よりもvoid main()と書いた方がいいらしいですが、どうしてですか?
return 0; を書かなくても怒られないからとかじゃないの
おまえらには「臨機応変」という言葉は通用しないのか
宿題がないから暴れてるだけです。
臨機応変、、、適材適所だと思うんだけど、void mainの適所はどこですかっていう
ここれす
>>140 C++のint main()に限って省略可能だよ
>>136 int main()
{
return 0;
}
void main()
{
}
流れを切ってすいません、宿題の片付けをお願いします
[1] 授業単元: ゼミ演習でのプログラミング
[2] 問題文(含コード&リンク):
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10566.zip [3] 環境
[3.1] OS: XP SP2
[3.2] Cpad for Borland C++Compiler Ver2.31
[3.3] 言語: C言語
[4] 期限: (2010年4月9日 13:00:00
[5] その他の制限: とくにありません
ゼミで明日までに提出な課題なんですが
休み中呆けてて全く解けませんでした・・・問題文には#include <stdio.h> void main(void)としか無くてイチからコードを書いて貰えると嬉しいです・・・。
今日だよ。int main(void){return 0;} 1.ヒストグラム 0〜9の範囲内の整数を20個入力し、そのヒストグラムを求めて出力するプログラムを書きなさい 2.素数について 1〜30までの整数の中のすべての素数を求めて出力するプログラムを書きなさい 注:素数の求め方は色々考えられるが、まず効率を気にしなくてもよいのでプログラムを作りましょう そして1〜50,1〜100の素数を求めるように実行して、実行時間を観察しましょう(少しでも範囲を広げるとかかる時間は極端に増えてしまう。) 3.二次方程式の解 ax2+bc+c=0の係数abcを入力し、解があるかどうかなどを判定し 「実数解無し」・「実数解は一つ」・「実数解は2つ」のどちらかを出力するプログラムを書きなさい 4.配列 成績処理 10人の学生の成績を配列に入力してから、平均成績と最高成績を求めて出力するプログラムを書きなさい
ちゃんと流れに乗ってるじゃないかwww
#include <stdio.h> int main(void) { int i, j, hist[10] = {0}, n; for(i=0; i<20; i++) { do { scanf("%d", &n); } while(n < 0 || 9 < n); hist[n]++; } for(i=0; i<10; i++) { printf("%d:", i); for(j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; }
>>149 わざわざ問題文を載せてもらいありがとうございます
そうです、提出は今日ですね・・・寝る前だったので間違えてしまいました
#include <stdio.h> int main(void) { int i, j; char sieve[30+1] = {0, 0, 1}; for(i=3; i<=30; i+=2) sieve[i] = 1; for(i=3; i*i<=30; i+=2) if(sieve[i]) for(j=i*i; j<=30; j+=i*2) sieve[j] = 0; for(i=0; i<=30; i++) if(sieve[i]) printf("%d ", i); return 0; }
#include <stdio.h> int main(void) { double a, b, c, d; scanf("%lf%lf%lf", &a, &b, &c); d = b * b - 4 * a * c; if(d < 0) printf("「実数解無し」"); else if(d > 0) printf("「実数解は2つ」"); else printf("「実数解は一つ」"); return 0; }
#include <stdio.h> int main(void) { int i, score[10], max, total; for(i=0; i<10; i++) scanf("%d", score + i); for(max=total=score[0],i=1; i<10; i++) { total += score[i]; if(max < score[i]) max = score[i]; } printf("平均成績:%g\n最高成績:%d\n", total/10.0, max); return 0; }
156 :
148 :2010/04/09(金) 04:45:56
入力しろよw
1バイトが8bitじゃない環境なんて俺は認めない
認めないのは自由だけど、人に押し付けないでね
1バイト=8ビットじゃない環境ってどんなのだ?
何バイトかではなく何オクテットなのかで表現しているドキュメント結構あるよね
[1] 授業単元:
プログラミング演習
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10568.txt [3] 環境
[3.1] OS: (Windows/Linux/等々)
linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等)
gcc3.4
[3.3] 言語: (C/C++/どちらでも可 のいずれか)c
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
2010年4月15日
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々
特にないです。
プログラミングが全く分からずこまっています。私なりにわかる部分はがんばっているんですが、この課題はまったくわかりませんでした。助けていただけたら嬉しいです。
みなさんどうかよろしくお願いします。
(a) #include <stdio.h> #define N 3 int main(void){ double a[N][N], b[N], temp1, temp2; int i, j, k; for (i=0; i<N; i++) { for (j=0; j<N; j++) scanf("%lf", &a[i][j]); scanf("%lf", &b[i]);} for (i=0; i<N; i++) { for (j=0; j<N; j++) printf("%7.2f", a[i][j]); printf("%7.2f \n", b[i]);} for (i=0; i<N; i++) { temp1 = a[i][i]; for (k=0; k<N; k++) a[i][k] = a[i][k]/temp1; b[i] = b[i]/temp1; for (j=0; j<N; j++) { if (i != j) { temp2 = a[j][i]; for (k=0; k<N; k++) a[j][k] -= temp2*a[i][k]; b[j] -= temp2*b[i];}} printf("(i = %d)\n", i); for(j=0; j<N; j++) { for(k=0; k<N; k++) printf("%7.2f", a[j][k]); printf("%7.2f\n", b[j]); } } for (i=0; i<N; i++) printf("%10.2f", b[i]); printf("\n"); return 0;}
(b) #include <stdio.h> #define N 3 int main(void){ double a[N][N], b[N], temp1, temp2; int i, j, k, mc = 0, dc = 0; for (i=0; i<N; i++) { for (j=0; j<N; j++) scanf("%lf", &a[i][j]); scanf("%lf", &b[i]);} for (i=0; i<N; i++) { for (j=0; j<N; j++) printf("%7.2f", a[i][j]); printf("%7.2f \n", b[i]);} for (i=0; i<N; i++) { temp1 = a[i][i]; for (k=0; k<N; k++) a[i][k] = a[i][k]/temp1; b[i] = b[i]/temp1, dc += k + 1; for (j=0; j<N; j++) { if (i != j) { temp2 = a[j][i]; for (k=0; k<N; k++) a[j][k] -= temp2*a[i][k]; b[j] -= temp2*b[i], mc+=k+1;}} printf("(i = %d)\n", i); for(j=0; j<N; j++) { for(k=0; k<N; k++) printf("%7.2f", a[j][k]); printf("%7.2f\n", b[j]); } } for (i=0; i<N; i++) printf("%10.2f", b[i]); printf("\n* : %d, / : %d, total: %d\n", mc, dc, mc + dc); return 0;}
(c) #include <stdio.h> #define N 3 int main(void){ double a[N][N], b[N], temp1, temp2; int i, j, k, mc = 0, dc = 0; for (i=0; i<N; i++) { for (j=0; j<N; j++) scanf("%lf", &a[i][j]); scanf("%lf", &b[i]);} for (i=0; i<N; i++) { for (j=0; j<N; j++) printf("%7.2f", a[i][j]); printf("%7.2f \n", b[i]);} for (i=0; i<N; i++) { int m = i; for(j=i+1; j<N; j++) if(a[i][i] < a[j][i]) m = j; if(m!=i) { for(j=0; j<N; j++) {temp1 = a[i][j]; a[i][j] = a[m][j]; a[m][j] = temp1;} {temp1 = b[i]; b[i] = b[m]; b[m] = temp1;} printf("Exchange row %d with row %d\n", m, i); for(j=0; j<N; j++) { for(k=0; k<N; k++) printf("%7.2f", a[j][k]); printf("%7.2f\n", b[j]);}} temp1 = a[i][i]; for (k=0; k<N; k++) a[i][k] /= temp1; b[i] /= temp1, dc += k + 1; for (j=0; j<N; j++) { if (i != j) { temp2 = a[j][i]; for (k=0; k<N; k++) a[j][k] -= temp2*a[i][k]; b[j] -= temp2*b[i], mc+=k+1;}} printf("(i = %d)\n", i); for(j=0; j<N; j++) { for(k=0; k<N; k++) printf("%7.2f", a[j][k]); printf("%7.2f\n", b[j]);}} for (i=0; i<N; i++) printf("%10.2f", b[i]); printf("\n* : %d, / : %d, total: %d\n", mc, dc, mc + dc); return 0;}
すみませんが、インデントぐらいしてくださいよ。 これでは読めません。
お前は読まなくてもいいよ
ソースはインデントしてあるじゃん
>
>>164 本当にありがとうございます!しかし、わたしの問題文の書き方がわるかったみたいです。問題1は(a)と(b)を同時に満たすということみたいです。本当に申し訳ありません。
もしやっていただけるのであれば嬉しいです。本当にすみませんでした。
173 :
デフォルトの名無しさん :2010/04/14(水) 16:30:57
宿題で コンソール上で入力した文字によって、以下の出力をするプログラムを作成する。 入力が"a"→(^_^) 入力が"b"→(T_T) 入力が"c"→(≧∇≦) 入力が"A"→(≧Δ≦) その他の入力→(?_?) ※追加: 繰り返し入力を待ち受け、zが入力されたときのみ終了すること。 というのが出ました。 まったく分からないので教えてください。
> 自力でやろうとおもってたんですが、わたしはとけませんでした。 何もできないだめな学生だとアピールする理由が分からない
175 :
デフォルトの名無しさん :2010/04/14(水) 16:38:02
先ほどのものです。 言語はC++でお願いします。
>>173 while
入力内容を取得
switch入力文字
case a print (^_^)
case b print (T_T)
case c print (≧∇≦)
case A print (≧Δ≦)
case z 正常終了
default print (?_?)
177 :
デフォルトの名無しさん :2010/04/14(水) 16:47:26
>>176 さんありがとうございます。
早速やってみます。
#include <stdio.h> int main() { char c; while((c = getch()) != 'z') { switch (c) { case 'a': puts("(^_^)"); break; case 'b': puts("(T_T)"); break; case 'c': puts("(≧∇≦)"); break; case 'A': puts("(≧Δ≦)"); break; default: puts("(?_?)"); } } return 0; }
conio.hはインクルードしなくていいの?
>>179 しなくていいと思います。よろしくお願いします
>>174 すみません。本当にわからなくて…
>>172 int n; → int n, mc, dc;
にしてGauss()関数とSolution()関数をを下記のものと入れ替える
void Gauss(void) {
int i,j,k;
double ratio;
for(i=0; i<n-1; i++) {
for(j=i+1; j<n; j++) {
ratio = a[j][i]/a[i][i], dc++;
for(k=i; k<n; k++) a[j][k] -= a[i][k]*ratio, mc++;
b[j] -= b[i]*ratio, mc++;}}
b[n-1] = b[n-1]/a[n-1][n-1], dc++;
a[n-1][n-1] = 1.0;
for(i=n-2; i>=0; i--) {
for(j=i+1; j<n; j++) {
b[i]-=b[j]*a[i][j], mc++;
a[i][j]=0.0;
}
b[i]=b[i]/a[i][i], dc++;
a[i][i]=1.0;}}
void Solutions(void) {
int i,j;
for(i=0; i<n; i++){
for(j=0; j<n; j++)
printf("%7.2f ",a[i][j]);
printf("%7.2f\n",b[i]);}
printf("*:%d /:%d total:%d\n", mc, dc, mc + dc);}
>>182 本当にありがとうございました。助かりました。ありがとうございます
[1]C言語(初心者コース) [2] キーボードから5つの整数を読み込み、その任意の2つの異なる数の 組み合わせについて和と差と積と商と剰余を出力するプログラム [3] OS:Windows Vista コンパイラ:Visual Studio.NET 言語:C [4] 5/1迄 [5] fgets,scanf,printf sprintf strlen strcpy strcat関数は使っても良い。 それ以外は極力使用しないこと scanfで取得した整数が入力された整数を表す文字列と矛盾が無いことを チェックすること。 整数計算の際に桁溢れが発生していないかチェックすること。 (特に除数が0であるかのチェック。剰余は除数の絶対値より小さい 0以上の整数とする。) main関数以外にユーザー関数を定義しないこと(main関数だけで 構成)が制約条件だそうです。 よろしくお願いします
ちょっと意味が分からない
意味ならな分かるがなあ、、。
>>184 5つの整数を(正しく読めてるかチェックしながら)読む
同じ数が現れても正しく読めてる限りカウントする
2つの組み合わせ(1種類しか無い場合は出力無し?)を
すべて列挙し、それらについて加減乗除剰余の表を出力する
負数同士の剰余とかは単純に%で出せるとは限らないから
一度絶対値を取って%で計算してから調整する
これでおk?
問題文がこのまま出されてるとしたら出題者はアレだな・・・
>>187 「任意の」って書いてあると
可能な組み合わせの中から(ユーザが)1つ選ぶってニュアンスが強いような気がするんだ
そういう学校に入学した生徒も相当何と言うか・・・
どんなレベルの授業がなされるか、理解したうえで選択する生徒がいるのかね
[2]は入力された5つの整数から2つチョイスするって意味かと思ったけど違うん?
>scanfで取得した整数が入力された整数を表す文字列と矛盾が無いことを >チェックすること。 これの意味がいまいちわからん。
>>193 %d で受けるのではなく、
%s で受けて パースしつつ整数値を切り出せ ってことかねぇ
>>187 5個の数が全て同じなら、「2つの異なる数」は無いわけで、そのエラーメッセージが定義できないなら、
それなら20回同じ答えを出せばいい。
196 :
195 :2010/04/16(金) 16:39:48
>>193 #define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#define N 5
int main(void){
char str[80] = {0}, pri[80] = {0};
int data[N], i, j;
for(i=0; i<N; i++){
fgets(str, 80, stdin);
str[strlen(str)-1] = '\0';
sscanf(str, "%d", &data[i]);
sprintf(pri, "%d", data[i]);
/**/printf("<%s><%s>\n", str, pri);
if(strcmp(str,pri)) i--;
}
for(i=0; i<N; i++) {
for(j=0; j<N; j++) {
if(i == j) printf("--- ---,");
else printf("%3d %3d,", data[i], data[j]);
}
printf("\n");
}
}
>>194 ああ、そういう。。
fgetsが許可されてるけどsscanfがないし、scanfがあるわで意味分からんかった
# scanf 時のセパレータと一致させて printf するのも難儀な話だが sscanf, sprintf 系列が許されていたとして sscanf(buf, "%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5) == 5 かつ sprintf(buf2, "%d %d %d %d %d", a1, a2, a3, a4, a5); strcmp(buf,buf2) == 0 ってことかね? 入力文字列を整数化した際 singned/unsigned の境界をまたいでて値が裏返るケースを検出しろ ということかね?
199 :
195 :2010/04/16(金) 17:30:11
#define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #define N 5 int main(void){ int data[N] = {1,2,-3,4,0}, i, j, k; char name[6][20] = {"入力","和","差","積","商","剰余"}; for(k=0; k<=5; k++) { puts(name[k]); for(i=0; i<N; i++) { for(j=0; j<N; j++) { if(i == j) { if(k==0) printf("--- ---,"); else printf("---, "); } else switch(k){ case 0: printf("%3d %3d, ", data[i], data[j]); break; case 1: printf("%3d, ", data[i]+data[j]); break; case 2: printf("%3d, ", data[i]-data[j]); break; case 3: printf("%3d, ", data[i]*data[j]); break; case 4: if(data[j] == 0) printf("DIV0 "); else printf("%3d, ", data[i]/data[j]); break; case 5: if(data[j] == 0) printf("DIV0 "); else printf("%3d, ", data[i]%data[j]); break; } } printf("\n"); } } }/* j <-- 釣り針 */
200 :
195 :2010/04/16(金) 18:49:58
正剰余の計算 #pragma warning(disable : 4996) #include <stdio.h> int main(void){ int aa[12]={3,3,-3,-3,2,2,-2,-2,1,1,-1,-1}, bb[12]={2,-2,2,-2,2,-2,2,-2,2,-2,2,-2}; int i, a, b, a1, d, m; for(i=0; i<12; i++) { a = aa[i], b = bb[i]; d = a/b, m = a%b; /**/printf("d=%d m=%d, ", d, m); if(m != 0 && a<0) { if(b<0) d++; else d--; } printf("%d / %d = %d ... %d\n", a, b, d, a-b*d); } }
201 :
195 :2010/04/16(金) 20:49:40
オーバーフローチェック #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> int main(void){ int a, aa[8]={0x3ff0ffff, 0x3ff0ffff,-0x3ff0ffff,-0x3ff0ffff,999,999,-999,-999}; int b, bb[8]={0x6fe0ffff,-0x6fe0ffff, 0x6fe0ffff,-0x6fe0ffff,888,-888,888,-888}; int c, i; for(i=0; i<8; i++) { a = aa[i], b = bb[i]; puts(""); /* 加算 */ printf("%d + %d = ", a, b); c = a + b; if(a>0 && b>0 && c<0) puts("ERR"); else if(a<0 && b<0 && c>0) puts("ERR"); else printf("%d\n", c); /* 減算 */ printf("%d - %d = ", a, b); c = a - b; if(a>0 && b<0 && c<0) puts("ERR"); else if(a<0 && b>0 && c>0) puts("ERR"); else printf("%d\n", c); /* 乗算 */ printf("%d * %d = ", a, b); c = a * b; if(c/a != b) puts("ERR"); else printf("%d\n", c); } } /* J <-- 釣り針終わり */
ユーザ関数を作るなってことは、過去に多倍長でも作った奴がいたのか?
関数化するメリットを教えるためにわざわざ面倒なことをしているとか。
分かった 普段使わないから存在を忘れてたけど、 goto使えってことじゃないか?
[1] 授業単元:プログラミング応用 [2] 問題文(含コード&リンク): 25×25マスの数独の解を求めるプログラムを作成せよ。 テキストファイルに入力した問題(数字マスは半角数字、空マスは半角スペースで入力)を引数から指定し 解を出力する。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: BCC [3.3] 言語:C言語 [4] 期限: 4月23日中 [5] その他の制限:無制限
>>206 無制限って処理速度とかメモリ効率も考えなくて良いのか?
簡単なアルゴリズムだと総当りで、メモリも大量に使用するけど、
25×25だと、空のマスの状態次第で結構な時間とメモリを消費しそうな気が…
まぁ、ちょっとした工夫でメモリはなんとでもなるが、
時間はアルゴリズムを考えないとならんが、数独の得意な奴じゃないと分からんと思うし…
あと、入力方法は、半角数字2桁(頭0詰)で、空マスは半角スペース2つでOKなのか?
正しいか確認するために、その問題自体も出して欲しいところだ。
縦横斜めに同じ数字があってはならないという条件だけでバックトラックしちゃえば 数独得意じゃなくてもできると思うよ 答えが複数あるとか検知できないし、効率もわるいけど。。
あ、小マス?というの?に重複数字がないことというのも条件だた
>>208 斜め?
タテとヨコとブロックじゃないか?
>>208 通常の9×9程度であれば、全数検索で問題ないが、
25×25なんて、相当量の投機実行が走る(いつまで立っても終わらないほどの)から、
どうすれば、無駄を省けるかアルゴリズムを考える必要があるんじゃないか?
まぁ、相当量ってのも、単なる直感だから充てにならんけど
空きマスの数に応じて指数的に増えていくからね…
25x25数独は仮定無しで解ける問題なら一瞬で答えを出せる
じゃあ、とりあえず文字認識するプログラム組んで入力させるか
>>206 普通のヒューリスティックな探索的解法しか知らないが
その方法による限りかなり言語を選ぶ問題じゃないかと
もちろんCでもできるだろうが、できればJavaせめてC++
で書いたほうがずっと見通しがよく書けるんじゃないかと...
(この手の問題は同じ構造のものを投機的に複製すること
ができるか否かで、コードの見通しがだいぶかわってくる。
メモリ自主管理を重視するカーネルサイドなC言語のステージだと
基本的にそういうアルゴリズムはタブーなんで
Cに慣れれば慣れるほど書きづらくなる)
なんでCで書けと指定する出題者は相当に意地悪
>>215 ヒューリスティックな探索的解法ってどんな方法?
基本的には、問題の表を構造体にして、いくつかのパターンで
確定OKの数字や確定NGの数字を上書きし、ひとつのパターンでも上書きが発生した場合はループ、
全てのパターンで上書きが発生しなかった場合は、構造体を複製して、
未確定部分に適当な数字を入れて投機(再起)する位しか思いつかんが、
その投機の優先順位を動的に入れ替えるってこと?
深さ優先探索で押していくしかないのだが 浅い段で簡単に枝狩りができるとも限らない タイプだろから単純な深さ優先だけじゃ なかなか見つからないだろうから 幅優先探索の要素も取り入れるってのは よく行われるんじゃね?
3×3から始めても、解き方の本質は大してかわらんじゃないか? 取り合えず思いついた構造体の定義をば… #define MATH_ROW 3 #define MATH_COL 3 #define MIN_NUM 1 #define MAX_NUM MATH_ROW*MATH_COL typedef enum enumCellStat { UNKNOWN, NG, OK } cellStat; typedef struct structCellInfo { cellStat stat; cellStat allStat[MATH_ROW*MATH_COL]; } cellInfo; typedef struct structMathInfo { cellInfo math[MATH_ROW][MATH_COL]; struct structMathInfo *parent; } mathInfo;
いきなりミスってたな…orz #define MATH_ROW 5 #define MATH_COL 5 #define MIN_NUM 1 #define MAX_NUM MATH_ROW*MATH_COL typedef enum enumCellStat { UNKNOWN, NG, OK } cellStat; typedef struct structCellInfo { cellStat stat; int blockNo; cellStat allStat[MAX_NUM]; } cellInfo; typedef struct structMathInfo { cellInfo math[MAX_NUM][MAX_NUM]; struct structMathInfo *parent; } mathInfo;
富豪的ですね
>>211 直感でいって、たぶんたいしたことにならないよ
100*100になったら何メガかは食いそうだけど
節約的ですね
>>222 ビットが2つ以上立ってるパターンの取り方上手いな。
後は、単純に解を得られないパターンの修正か…
適当にググって見つけた3×3の問題 { 0, 0, 0, 0, 0, 5, 9, 0, 0, }, { 0, 9, 0, 0, 0, 4, 1, 0, 0, }, { 0, 0, 4, 4, 0, 0, 0, 0, 0, }, { 0, 6, 9, 0, 0, 0, 0, 0, 0, }, { 8, 2, 0, 0, 0, 0, 0, 3, 5, }, { 0, 0, 0, 0, 0, 0, 4, 8, 0, }, { 0, 0, 0, 0, 0, 7, 2, 0, 0, }, { 0, 0, 8, 1, 0, 0, 0, 4, 0, }, { 0, 0, 5, 3, 0, 0, 0, 0, 0, },
でその解 { 7, 8, 3, 2, 1, 5, 9, 6, 4, }, { 5, 9, 2, 8, 6, 4, 1, 7, 3, }, { 6, 1, 4, 7, 9, 3, 5, 2, 8, }, { 4, 6, 9, 5, 3, 8, 7, 1, 2, }, { 8, 2, 7, 9, 4, 1, 6, 3, 5, }, { 3, 5, 1, 6, 7, 2, 4, 8, 9, }, { 9, 3, 6, 4, 8, 7, 2, 5, 1, }, { 2, 7, 8, 1, 5, 9, 3, 4, 6, }, { 1, 4, 5, 3, 2, 6, 8, 9, 7, },
明日、暇だったら、やってみるかな…
>>222 も
>>227 も本質的に単純解のようですね。
得られた解答、まぁ、明日だな。
0 0 0 0 0 5 9 0 0
0 9 0 0 0 4 1 0 0
0 0 4 4 0 0 0 0 0
0 6 9 0 0 0 7 0 0
8 2 0 0 0 0 6 3 5
0 0 0 0 0 0 4 8 0
0 0 0 0 0 7 2 0 0
0 0 8 1 0 0 0 4 0
0 0 5 3 0 0 8 0 0
ごめん。入力ミスってた
3×3の難問
{ 0, 0, 0, 0, 0, 5, 9, 0, 0, },
{ 0, 9, 0, 0, 0, 4, 1, 0, 0, },
{ 0, 0, 4, 7, 0, 0, 0, 0, 0, },
{ 0, 6, 9, 0, 0, 0, 0, 0, 0, },
{ 8, 2, 0, 0, 0, 0, 0, 3, 5, },
{ 0, 0, 0, 0, 0, 0, 4, 8, 0, },
{ 0, 0, 0, 0, 0, 7, 2, 0, 0, },
{ 0, 0, 8, 1, 0, 0, 0, 4, 0, },
{ 0, 0, 5, 3, 0, 0, 0, 0, 0, },
>>227 は正しい結果が得られる
多分3×3の中でも超難問。
0, 0, 0, 0, 0, 0, 0, 1, 0,
4, 0, 0, 0, 0, 0, 0, 0, 0,
0, 2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 5, 0, 4, 0, 7,
0, 0, 8, 0, 0, 0, 3, 0, 0,
0, 0, 1, 0, 9, 0, 0, 0, 0,
3, 0, 0, 4, 0, 0, 2, 0, 0,
0, 5, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 8, 0, 6, 0, 0, 0,
>>227 だと40秒程度で解ける
ソースを細かく見てないから何とも言えんが
予想通り25×25は単純な方法じゃ終わらんな…
6 9 3 7 8 4 5 1 2
4 8 7 5 1 2 9 3 6
1 2 5 9 6 3 8 7 4
9 3 2 6 5 1 4 8 7
5 6 8 2 4 7 3 9 1
7 4 1 3 9 8 6 2 5
3 1 9 4 7 5 2 6 8
8 5 6 1 2 9 7 4 3
2 7 4 8 3 6 1 5 9
かきわすれ。 入力ファイルはタブ区切りで。
234 :
232 :2010/04/18(日) 02:07:48
なんかバグってるのかと心配したけど
>>231 が6分くらいで解けたわ
>>230 は10秒くらい。
25*25も一晩ぐらいかけたら解けるんじゃないの、という楽観的な。
236 :
235 :2010/04/18(日) 06:04:59
>>215 失敗という論理が許されず、何らかの形で対処しなければ
ならないカーネルコードの世界で育ったCでは、失敗したら
潔く捨てるという考えとは対極を為すものかも知れないな
>>237 これに書かれてる25*25はすぐ終わったけど、難問データってどんなのですか?
[1] 授業単元: 3DGAME [2] 問題文:下記 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Microsoft Visual Studio 2005で動くもの [3.3] 言語:どちらでも可 [4] 期限: 2010/04/21 [5] その他の制限: なし 学生番号、氏名、カナ、点数(少数第1位まで)、クラス(3桁)を入力しファイルに出力する。(カンマ区切り) 入力したファイルを読み取り、メニューを作成し次の処理を行えるようにする。 ・ 学生番号で昇順、降順に並べ替えてファイルに出力する。 ・ 氏名で昇順、降順に並び替えてファイルに出力する。 ・ 点数で昇順、降順に並び替えてファイルに出力する。 ・ 各項目について修正を行えるようにする。 ・ 点数の平均を画面に出力する。 ・ クラス別に学生番号で昇順、降順を指定してファイルに出力する。 【画面例】 <メニュー> 1 学生番号で並び替え 2.氏名で並び替え 3.点数で並び替え 4.修正 5.平均の出力 6.クラス別で出力 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー メニュー番号=> 【データ】 学生番号 8桁 氏名 12桁 カナ 12桁 点数 3桁(小数点第1まで) クラス 3桁 12000001, 田中太郎, タナカタロウ, 40.5, 003 よろしくお願いします
>>242 その25*25は
>>213 の問題だが、単純な方法ですぐに解ける易問。
一方、
>>231 レベルの難問で25*25ならどうだろう、ってことで。
ただ、盤面サイズn(9や25)に対して計算量はO(n^4)なので、
(25/9)^4=約60倍となり、終わらないってことはないか。
あと
>>240 が、候補の少ないマスの探索を先に行う方法で
高速化していたので、アイデアを使わせていただいたところ、
>>231 が約5ミリ秒で解けるようになった。
http://codepad.org/iJVIhwMF (速すぎるので64回繰り返し解いて、時間を計測している。)
これなら25*25の難問が来ても1秒以内でいけそう。
>>244 なるほど。
枝刈りは重要だけど、枝刈りしなくてもそこそこ早く終わるという事例か
あいや、
>>236 みて、ぼちぼちはやいんだなっていう。
終わらないという予測は外れたんだなぁと。
36*36になったらどうなるんだろね
>>244 フラグの倒し方と、データの持たせ方に目から鱗が落ちるばかりなんだけど、今回のために思いついた?
それとも何かで知ってた?
こういうセンスがすごくほしい
>>244 一つの可能解の探索なら候補の少ないものを優先的に行う
ほうが幅優先探索性が高まるが、幅優先探索そのものでは
ないので、運が良くない限り速くはならない。
タチの悪い問題の場合は、25x25のケースで620個まで
埋まるが何故か解けなく結局それは最初のマスの投機的決定が
間違ってたという例もあり得る。経験上埋まるが何故か完全には
埋まらない場合はそういうのがその近傍にやたらと多い
ちゃんと木を作って枝狩りしながら深く延ばせる枝を絞り込んでいく
方法が最善なんだろうがメモリ容量の問題が..
あと解の一意性のチェックは大切でこれがないと問題を解いたことには
ならないんじゃね?
>>250 ちょっとロジック書いてくれないか
高度なレスが多いから期待も高い
遅いが答えの出るプログラムぶん回す→金になる 高度かどうか知らんがプログラムが出来上がらない→金にならない これがすべてだろ。
一意性までとなると全数列挙しかないから、解の一つを できるだけ速く見つけたいというのであれば 選択枝が小さいものから順次とか随時矛盾チェックとか いろいろと山の賭けかたにはノウハウはあるのかも知れないが この問題の場合、列挙の途中で見つかる解を出力する アルゴリズムだから、結局最終的には運だとしかいいようが ないような感じ
ビット変数を利用しないことによる処理時間の伸びは高々 倍程度(裏を返せばビット変数を使うことにより処理時間が 半分になることが期待できる) できればビット変数を使わないコードのほうが美しいような 気がする
いいぞもっとやれ
[1] 授業単元: 並列プログラミング [2] 問題文(含コード&リンク): 配列をソートするために、クイックソートをMPIを用いて並列化せよ。 [3] 環境 [3.1] OS: Red Hat Linux [3.2] コンパイラ名とバージョン: gcc 3.3.2 [3.3] 言語: C [4] 期限: 2010年04月23日23:00まで [5] その他の制限: OpenMPではなくMPIを使う MPIです。すみません。 よろしくお願いします。
>>253 全数とはいっても全てのマスが独立しているわけではなく
あるマスを決定した段階で他のマスの選択肢が減る訳だから
どこから始めるかは重要
ちなみに
>>240 は解を全て列挙するが
選択肢の少ないマスから試行するのをやめると
100倍以上実行時間が変わる
行き詰まるか解けるまでに現れる選択枝の総数と最初の選択枝の 個数はあまり関係が無いみたいだから一筋縄じゃいかないし そこが面白いといえば面白いんだが...
選択肢が少なくかつ、盤面におかれている数が多い数字から仮定をはじめたらどうだろう 12が一番多いなら、選択肢が少ないかつ12が置けるところにおいてみるっていう感じ
260 :
デフォルトの名無しさん :2010/04/20(火) 22:24:24
この問題は空きマスが増える度に指数的に選択肢が増えていくから 何かしらの法則で解いていかないと100倍どころか一生終わらないんだが誰も気づかないのか?
指数的に増える ≠ 無限大
何万年とか寿命のある人はいいですね
空きマスが極端に増えると、 数字のマス(つまり制約)が減るということなので、 簡単に解けるようになり、解の数は多くなると予想。 空き具合がちょうどいいあたりに「難問」があるのでは?
>>263 ちなみに、難問って言うのは、絶妙に数を減らし行って、
空きマスを増やしてるから、解は1つしかないよ。
>>264 全部が空きマスの場合は簡単に解け、
そこから数字を置いていくと徐々に難しくなるので、
難易度のピークは両極端には無く、その間にあると思う。
>>265 つまり、解が1つのままで空きマスを最大どれだけ取れるか、
そしてその空きマスは
>>231 よりどれだけ多いか、ということね。
想像できん。
>>257 選択肢最小を選ぶか否かだと速度は 20% 程度しか変わらなかった
>>231 の問題に対して試行したもの
1.選択肢最大のマスから埋めると 10回 解くのに 10〜11秒
2.左上から順にみて一番最初の空白マスから埋めると 1000回 解くのに 2.6〜2.8秒
3.選択肢最小のマスから埋めると 1000回 解くのに 2.2〜2.4秒
2.は左上から順に見ていくことによって左上周辺の選択肢が狭まり
結果的に3.の状況に近くなるものと思われる
1 と 3 の実行速度の差は約450倍にもなるため
仮置きするマスの決め方がとても重要であることは分かる
※ 但し
>>231 の場合にうまくはまっただけの可能性もある
268 :
231 :2010/04/21(水) 01:04:30
CはCPUや環境に依存しにくいセキュアなコードが書けるが、 この系統の問題は最初からあんましコードをセキュア に書くと後で非常に辛い思いをするだろな
そりゃあ全体サイズが増えれば時間がかかるようになることは分かる。 けれど、25*25が終わらないと予測するのはあまりにも今の時代にそぐわないのではないか?というところでしょ。 アルゴリズムにしろコードにしろ何の結果も出さないあなたが、見積もりもできないわけで、 じゃあ何ができるの?
解答が複数あった場合どうすんの?というのはこのパズルのルールにおいて本来誤った問題であるから、 解答を導くプログラムにおいては1つの解答が得られれば問題ない。 問題が適切であるかどうかをチェックするプログラムなら複数の回答があるかどうかをチェックする必要がある。
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 整数の入った配列中の、各整数の個数を出力せよ。 例えば、P[4]={1, 2, 3, 1} ならば出力は 0 0 1 2 2 1 3 1 4 0 となる。配列の要素数までの各整数の個数を出力すれば良い。 [3] 環境 [3.1] OS: Windows7 [3.2] Visual C++ 2008 Express [3.3] 言語: C [4] 期限: 明後日まで [5] その他の制限:冗長なプログラムにならないこと。
274 :
デフォルトの名無しさん :2010/04/22(木) 00:06:39
[1]授業単元: プログラミング [2] 問題文: unixのソケット通信を使ったTCP/IPの通信型プログラムで、まず認証の方法として ユーザー名とパスワードを打ち込みサーバー側が認証され、その後サーバー側からは クイズを出題する状態になっていて5問正解した場合(正解数はサーバー、クライアント 両方保持した状態)、暗証のメッセージを送信するということになっていて、 その場合のクライアント側のプログラムを作成せよ(書き方がおかしかったら すいません) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:c [4] 期限: 2010/04/22 [5] その他の制限: なし
276 :
デフォルトの名無しさん :2010/04/22(木) 00:15:01
>>270 時代にそぐとか、もうアホじゃないかと。
この問題は、単純に決まらない空きマスが一つ増える度に、
計算量が数倍になっていくから、見積もるとか、それ以前の問題なのに…
本気で解くことを考えるなら、もっとアルゴリズムを見直すことが必要。
>>274 宿題ならサーバー側のソースは渡されてるか、何かしら説明があるんじゃないの?
じゃないと作りようがない
>>275 プロトコルも何も単に行区切りのテキストストリームでいいんじゃない?
そうすればechoサーバー見たいにtelnetクライアントでも繋がる。
280 :
デフォルトの名無しさん :2010/04/22(木) 06:23:41
>>278 ソースは渡されています
後IPアドレスとポート番号が決まっています
281 :
デフォルトの名無しさん :2010/04/22(木) 07:03:46
すいません、274です。 280で書いたこと勘違いで、ソースは渡されてませんでした
>>277 やっぱ本気で解くことを考えるならサイズ制限入れちゃだめですよね。
それでかつ速度は予測できないけど、最速を目指すべきですよね。
>>279 telnet がプロトコルだということを知らない馬鹿か?
teletで繋がるのはサーバー側がtelnetプロトコルに準拠しているからに他ならん
>>283 telnetクライアントで80、25、110あたりにつないだことのない人?
>>283 telnet のオプション交渉はサーバー側から始まるからそれを開始しない
echo サーバーやsmtp, httpに繋げるとtelnetクライアントはhalf duplex、
local echoモードのtcpクライアントとして使える.
>>274 あ、宿題はクライアントかw サーバー側かと勘違いしてたw
あ、俺クライアントとサーバを両方実装するもんだと思ってた そりゃサーバの仕様教えてもらえないとどうにもならない
>>284 えええ、まじで telnet がプロトコルだって知らないのか????
常識知らずにも程があるぞ、当然RFCでも定義されてるけどな。
ttp://tools.ietf.org/html/rfc854 で、http, smtp, pop3 に telenet で接続できるから何なの?
後発のプロトコルが telnet と互換性があるように設計されるのは普通のことだろ。
>>285 TCPってwwwほんと無知だな。
今はTCPに乗っかってるけど、昔は IP 上動いてたこととか知らないんだろうな。
あ、もしかして、君たちはPと言う文字が入ってるものだけがプロトコルだと思ってるのか。
きっとそうだろうな、あ〜恥ずかしい。
>>273 おかげさまでどうにか間に合いそうです。
どうもありがとうございました。
>>288 http smtp pop3がtelnetプロトコルと互換性があると書かれているように読めるんだけど、
もちろん俺がすごい読み間違いをしてるんだよな?
もうちょっとちゃんと伝えてくれ。
telnet(ソフト)とtelnet(プロトコル)がごっちゃになってるな
これはw
293 :
279 :2010/04/22(木) 21:47:18
>>283 >>288 >後発のプロトコルが telnet と互換性があるように設計されるのは普通のことだろ。
互換ってcr/lfで分けた行がメッセージ単位って事? だから「行区切りのテキストストリーム」
と言ったのだが?
それから後発のテキストベースのプロトコルで互換があるってそれだけ.
telnetのコマンドを送られても大抵のサーバーは混乱するぞ.
試しに^Cを押してInterrupt Processコマンドを送るとsmtpサーバーなんて
混乱してコマンド受け付けなくなるよ。
ちなみに自分はtelnetクライアント、サーバーの保守をしばらくしてたから
プロトコルは分かってるつもり。
295 :
デフォルトの名無しさん :2010/04/22(木) 22:18:07
297 :
デフォルトの名無しさん :2010/04/22(木) 23:13:05
あれ、ほんとだ。 no[5]にしたらちゃんと表示されました。ありがとうございました。 でもなんで足りなかったんでしょう?noは4ビットなのに。
文字列で'\0'を勝手に入れるから。 あと、バイトじゃね?
299 :
デフォルトの名無しさん :2010/04/22(木) 23:35:07
バイトでした。 文字列の終わりをあらわすんでしたっけ?\0 それだとsikaku[6]はなぜ足りてることになるんですか?
足りてないですよ。 動いてるのはたまたま。 7にしましょう。
リモートでホストを操作するために必要なtelnetプロトコルと telnetクライアントを使ってtcp/ipでテキストストリームで通信するのは全く別の問題だろ? シリアルポートや、tcp/ipオーバーで、ホストをリモート操作できるのは、 ホスト・クライアントが同じtelnetプロトコルで動いてるからだし、httpやpop3に接続できるのは、 telnetクライアントが、様々な環境に対応できるように最低限の tcp/ipオーバーの機能を提供した結果が、テキストストリームで通信できるだけって話じゃないの? 何でリモート操作するためのtelnetプロトコルが、httpやpopと互換性があるって話になるの? 互換性があるのは、tcp/ipオーバーで通信をしているってことだけじゃないのか?
302 :
デフォルトの名無しさん :2010/04/22(木) 23:55:38
>>300 ありがとうございました。
基本的なことでしたね。
>>301 >telnetクライアントが、様々な環境に対応できるように最低限の
> tcp/ipオーバーの機能を提供した結果が
ちがう。 以下のRFCの文に続く定義により、telnetオプションが交渉される前には
ラインバーファーされたhalf duplexモードにクライアントがなるので「様々な環境で」
他のテキストベースのtcpサーバーと通信出来る。 別にわざわざ対応した訳ではない。
Although a TELNET connection through the network is intrinsically full duplex,
the NVT is to be viewed as a half-duplex device operating in a line-buffered mode.
That is, unless and until options are negotiated to the contrary, the following default
conditions pertain to the transmission of data over the TELNET connection:
>>303 俺もRFC初めて見たけど、意味分かって書いてないだろ?
>ラインバーファーされたhalf duplexモードにクライアントがなるので
一行単位の処理だろうが、全二重だろうが半二重だろうが、
他のプロトコルと通信できる理由になってない。
ポイントを整理すると下記のような理由で通信できる。
1. telnetでは、必ずNVT(ネットワーク仮想端末)を通して通信するように定義されている。
2. NVT間では、変換されないことが保証されている
3. NVTの入出力はUSASCIIにて行う
4. USASCIIを使用するプロトコルであれば問題は発生しない
telnet通信イメージ→ クライアント <変換> クライアントNVT <未変換(over tcp/ip)> ホストNVT <変換> ホスト
他の通信イメージ→ クライアント <変換> クライアントNVT <未変換(over tcp/ip)> httpなど
305 :
303 :2010/04/23(金) 02:31:12
main() 笑
Telnetがプロトコルだというのは流石に常識だと思うぞ。
telnetはどんな端末とでも通信できんだよ 従ってプロトコルとは無縁、プロコトルなんて必要ねえ 英文だからわかりにくいけどさ、 ガチで読めばRFCにもtelnetはプロトコルではないと書いてあるぞ
309 :
えーご :2010/04/23(金) 11:02:23
>>309 そうだよね
そこにもtelnetがプロトコルでないことがはっきり書いてある
312 :
デフォルトの名無しさん :2010/04/24(土) 11:47:44
[1] 授業単元: Introduction to C++ [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます) Write a program that asks user to enter a size, N. (The maximum is 100000). Write a function that generates random numbers in range of 1 ~ 100 and fill an array of size N. You also need to count how many 1’s, 2’s, 3’s, 4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to each number should be equal. But they might be slightly off. 3] 環境 [3.1] OS:Vista [3.2] コンパイラ名とバージョン:Visual C++ 2008 [3.3] 言語:C++ [4] 期限: 2010/04/30 [5] その他の制限: なし
#include <stdio.h> #include <stdlib.h> int myrand(void) { return (int)(rand() / (RAND_MAX + 1.0) * 100 + 1); } int main(void) { int i, *array, N, cnt[101] = {0}; srand(time(NULL)); do { printf("Enter a size(The maximum is 100000);"); scanf("%d", &N); }while(N < 1 || 100000 < N); array = malloc(N * sizeof(int)); for(i=0; i<N; i++) { array[i] = myrand(); cnt[array[i]]++; } for(i=1; i<=100; i++) printf("%3d : %d\n", i, cnt[i]); free(array); return 0; }
>>312 If the random number function does it job perfectly, the distribution to
each number should be equal. But they might be slightly off.
全然関係ないが、数学的に言えば、ランダム関数が完全な仕事をすれば、
全ての数が一致する可能性はNが大きくなるにしたがって低くなる
(数を一致させるためには、数が偏らないように、ランダムを偏らせる必要がある)
const int randmax = (RAND_MAX / 100) * 100; int rand100(){ int r = rand(); while(true){ if(r >= randmax) continue; return r/(RAND_MAX/100)+1; } }
>>315 >int r = rand();
その位置はネタだよな?
オーケーオーケー const int randmax = (RAND_MAX / 100) * 100; int rand100(){ while(true){ int r = rand(); if(r >= randmax) continue; return r/(RAND_MAX/100)+1; } }
318 :
デフォルトの名無しさん :2010/04/24(土) 15:02:19
いい気分
答えは1種類だけど、並べ方は2通りあるんだな
>>318 総当りの頭の悪い方法
#include <stdio.h>
int c[13];
int check(char *a) {
int add = a[0]+a[5]+a[6]+a[2], i;
for(i=1; i<5; i++) if(add!=a[i]+a[i+5]+a[(i+1)%5+5]+a[(i+2)%5]) return 0;
return 1; }
void f(int size, int pos, char *a) {
int i, j;
if(size == pos) {
if(check(a)) {
for(i=1; i<=12; i++) c[i] = 0;
for(i=0; i<10; i++) {
printf("%d ", a[i]);
c[a[i]] = 1;}
putchar('\n');
for(i=1; i<=12; i++) if(!c[i]) printf("%d ", i);
putchar('\n');}
return;}
for(i=4; i<=12; i++) {
for(j=3; j<pos; j++) if(i==a[j]) goto L;
a[pos] = i;
f(size, pos+1, a);
L:;}}
int main(void) {
char a[10] = {1,2,3};
f(10,3,a);
return 0;
}
323 :
322 :2010/04/24(土) 18:06:22
失礼、
>>322 は思いっきり完全にバグってました。
>>317 配列に埋めるところまでが関数の仕様だと思うよ
英語苦手なんだねw
[1] 授業単元:プログラミング(画像処理)
[2] 問題文:
ttp://www1.axfc.net/uploader/He/so/274810 pass:1
100KB以上になってしまったので斧に上げました。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC 6.0
[3.3] 言語: C
[4] 期限: 2010年4月27日
[5] その他の制限:特になし
画像の読み込みと保存はsampleの流用で基本的におkだと思います。
ご助力お願いします。
>>325 Write a function that generates random numbers in range of 1 ~ 100 and fill an array of size N.
functionは乱数生成にしかかかってないってこと?
それ中学生レベルじゃね?
だよなぁ
generatesはfunctionにかかるが、fillはWriteと同じく命令
>>330 Write a function that generates random numbers in range of 1 ~ 100 and fill an array of size N.
これは、こうなるのは同意?
Write a function that generates random numbers and fill an array.
あとはGoogle翻訳にかけて。
http://translate.google.co.jp/ 乱数を生成し、配列を埋める関数を書きなさい。
by the way.
乱数を生成する関数を書き、配列を埋めなさい。
Write a function to generate random numbers, please fill in the array.
Google翻訳w generetesはsがついて三単現だが、 fillにはついてないからfunctionにはかからねーんだよ、アホがw おまけ Yahoo翻訳 乱数を生み出す機能を記述して、配列を満たしてください。 エキサイト翻訳 乱数を生成する機能を書いてください、そして、配列をいっぱいにしてください。
Google翻訳使ったことなかったからちょっとネット見てみたら、 使えないとか変な翻訳で有名じゃねーかよ なんでよりにもよってGoogle翻訳をもとにしちゃったんだw
>>312 を俺的に翻訳してみた
ユーザにサイズN(最大100000)を入力させるプログラムを作れ
1〜100までの範囲でランダム数を生成する関数を作れ。そしてサイズNの配列に埋めろ。
さらにお前は1の数、2の数、3の数、4の数、5の数、…、100の数が、幾つあるのが数える必要がある。
もしランダム数関数が完璧に仕事をこなせば、配分された全ての数は等しくなるはずだ。
まぁ、すこし位の誤差はあるかもしれんがなw
つーわけで、作るべきプログラムは、入力させるプログラムと
ランダム数を生成して配列に一杯にする関数だけで、
配列に埋めるのと、それぞの数が、いくつあるのか数えるのは
>>312 の仕事じゃないか?
プログラム内でやらせないでどうすんだよw
一様分布の乱数生成の手法を考えさせる問題なのか randの使い方を覚えさせる問題なのかで書くべき回答が違うなぁ
337 :
334 :2010/04/25(日) 09:59:14
修正しながら変なまま送ってしまった…orz
ユーザにサイズN(最大100000)を入力させるプログラムを作れ
1〜100までの範囲でランダム数を生成する関数を作れ。そしてサイズNの配列に埋めろ。
さらにお前は1の数、2の数、3の数、4の数、5の数、…、100の数が、幾つあるのが数える必要がある。
もしランダム数関数が完璧に仕事をこなせば、配分された全ての数は等しくなるはずだ。
まぁ、すこし位の誤差はあるかもしれんがなw
つーわけで、作るべきプログラムは、入力させるプログラムと
ランダム数を生成する関数と配列に埋までで
それぞの数が、いくつあるのか数えるのは
>>312 の仕事じゃないか?
>>335 でも、素直に読むと、お前が数えろって書いてない?
まぁ、数える手段を書いてないので、それをプログラムでやっても
問題はないと言うか、そういう主旨だとは思うが…
313でいいだろ。 乱数の偏りが気になるんなら関数を317のにして。 ってか、あんな中学レベルの英語に機械翻訳持ち出す奴がいるのが驚きだ。
>>339 If the random number function does it job perfectly, the distribution to
each number should be equal. But they might be slightly off.
この部分をどう読む?
ここで求められている乱数発生関数が通常の乱数ではなく、
出来るだけ均等になるように(偏りを加えた)乱数発生関数の可能性もあるわけで…
>>340 偏りを加えたら一様分布じゃなくなるんじゃねーの
線形合同法の偏りを打ち消す偏りって意味か?
>>340 どう読んだから知らんが、それをもとにコード書けよw
>>342-343 原文を読むと、配分された数が一致されることか前提にあって、
少し位の誤差はあるかも知れないって書かれている。
しかし、実際は、誤差があるのが大前提で、大体の範囲でおさまるのが正しい。
それとも、俺の翻訳がおかしい?
そもそも乱数が完璧でも結果は等しくなる確率の方が低いんだから、 そんな文に一々とらわれる必要はない。
>>345 >そんな文に一々とらわれる必要はない。
おいコラw
んなことを言ったら、何を持って問題文に回答するんだw
そこは問題部分じゃなくて単なる補足説明みたいなもんだし。
Google翻訳wは使うなよってことで、いい勉強になったろ? できれば中学生の英語からやり直して欲しいところだが、 いまさら手遅れなんだろうな。
349 :
331 :2010/04/25(日) 11:18:27
OCN翻訳 もそれと同じだな。1対Nでなくなったぞ。
http://www.ocn.ne.jp/translation/ 配列を、乱数と満たしを生成する機能に書いてください。
Write the function into which a random number is formed and bury arrangement.
@nifty翻訳 乱数を生成する機能を書いてください、そして、配列をいっぱいにしてください。 Infoseek マルチ翻訳 乱数を生み出す機能を記述して、配列を満たしてください。 FreeTranslation.com 乱数を産む機能を書いて、配列をいっぱいにしてください。 機械翻訳をもとに英語を語るなよ、頼むから
>>349 翻訳は意味が分からない単語や使い回しの参考にする程度で
あんまり信じないほうが良いよ
配列を埋めるのも関数内でやるなら、fillじゃなくてfillsになってなければならない。 前でも言われてるように、こんなのは中学英語の範疇。
別人だとしても、最大100000個を人間に数えさせるとか、似たようなバカっぷりだなw
355 :
353 :2010/04/25(日) 11:49:57
まぁ、おれも最初fillがどこにかかってるのか勘違いしたり、
その後、fillはプログラムの範囲なのか次の「You also …」と同じで
>>312 がやるべき範疇なのか迷ったりしたけどね
>>354 「You also …」以降は「Write a program」に掛かってねーよ
この場合、数える手段は自由であって、プログラムの出題の範囲じゃない
※これ以前に出力結果を数えるプログラムとか作ってるかも知れんだろ?
不毛な議論はもういいよ
>>358 >>312 を読んでるか?
>(元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます)
だから、間違えてる可能性を示唆してるだけなんだが?
さすがに中学英語もわからないバカは考えることが違うな。
>>360 まぁ、お前とは話が合わんことだけは分かった。
>>312 です
ここまでの流れを読んだ上で出題者の方に確認してみた所、カウントするのもプログラム上でやれとの事でした
If the random number function does it job perfectly, the distribution to each number should be equal. But they might be slightly off.
の部分は上で仰っていた方がいらした様に、問題文への補足説明の様です
回答結果がどの様な感じになるのかの具体的な説明も付記されていたのでコピペしておきます
For example, user entered N as 50. Then you are filling the array with 50 random values
and then sort. And the count how many 1’s, 2’s, 3’s, 4’s, 5’s, …, 100’s. and then print out
that info.
マジレスするとalsoはプログラム内でなすべきことについての追記だから、 数えるのも当然プログラム内でやる。
おっと、書いてる間に新情報が。
ソートするよりカウント用の配列使うほうがいいんだがなあ。 カウント用の配列禁止ならソートして数えるしかないが。
>>363 違くね?
その直後にIfなんたらかんたらで、補足っぽいもの直接続いてなければ、
それであってると思うが、全体の文章の流れを考えると、ここだけでは、どうとでも取れる。
って言うか、
>>312 が適当に切っただけのような気もするが…
>>362 Nが50であれば、50個の配列を用意して、ソートしてから数を数えろと…?
何か、他に情報を小出しにしてないか?
>>368 >>312 は問題文全文のコピペで、それ以外では
>>362 での記述が問題に関する情報が全てです
ソートに関しては、バブルソートとインサーションソートについてしかまだ教科書の方で習ってないので、恐らくはそれを使えという事なのかと
ですので、言語がC++で、Visual C++ 2008で動作する物であるという事以外の制限に関しては何も無いと思います
sort(array, N); for(i=1, j=0; i<=100; i++) { for(k=j; array[k]==i; k++); printf("%d's %d\n", i, k - j); j = k; }}
>>362 100000個ソートすっと重いなあ
#include <iostream>
int myrand100(){ return (int)(rand() / (RAND_MAX + 1.0) * 100) + 1; }
void sort(int *a, int size)
{
int i, j, k;
for(i=size-1; i>0; i=k) {
for(j=k=0; j<i; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
k = j;}}}}
int main()
{
int i, j, k, N, *array;
srand(time(NULL));
std::cin >> N;
array = new int[N];
for(i=0; i<N; i++) array[i] = myrand100();
sort(array, N);
for(i=1,j=0; i<=100; i++, j=k) {
for(k=j; array[k] == i; k++);
std::cout << i << "'s " << k - j << std::endl;
}
delete[] array;}
calloc(N+1, sizeof(int))にでもしとくか
>>373 >array of size N.
って、しばりがありまっせ。
375 :
327 :2010/04/25(日) 14:12:25
andで切れることを理解しました。 逆に、乱数を発生し、かつ配列を埋める関数を作れ、というのはどう書くの? fillをfillsにするだけ?なの?ごめん頭悪くてorz
ターミネーターは別枠扱いなんだよ! 配列として利用してるサイズはNなんだよ! まあ、すっかり忘れてたことをなんとか誤魔化そうとしてるだけなんだけどね。
>>375 fillsにすれば、乱数を生成して配列を埋める関数って意味になる。
ちゃんと訳せてる翻訳サイトにfillsにした英文を入れても確認できる。
378 :
327 :2010/04/25(日) 14:21:33
379 :
デフォルトの名無しさん :2010/04/25(日) 21:13:43
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク):10000未満の正の整数を考える(xとする)。このとき、ある2つの整数の3乗の和として表す表し方が2通りある数をすべて求めなさい。つまり、異なる2通りの数の組(a,b)と(c,d)があって、 x = a^3 + b^3 = c^3 + d^3 とできる数xを表示するプログラムを実行しなさい。例えば、1027は 1027 = 3^3 + 10^3 と表せますが、それ以外は表せません((3,10)と(10,3)は同じものと考える)。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2010年4月28日まで [5] その他の制限: ポインタなどは習っていません。よろしくお願いいたします。
2個しかみつからん
#include <stdio.h> int main(void) { int a, b, c, d; for(a=1; a*a*a<10000/2; a++) { for(b=a+1; ; b++) { int temp1 = a*a*a + b*b*b; if(temp1 >= 10000) break; for(c=a+1; c*c*c<10000/2; c++) { for(d=c+1; ; d++) { int temp2 = c*c*c + d*d*d; if(temp2 >= 10000) break; if(temp1 == temp2) printf("a=%d b=%d c=%d d=%d %d\n", a, b, c, d, temp1); }}}} return 0; }
if(temp2 >= 10000) → if(temp2 > temp1)
簡単な問題はすぐレスがつきますねw
>>381 今回はそれで問題ないけど、範囲が100000000未満になったときに
(167, 436), (228, 423), (255, 414)のペアを3通り表示してしまう
(3乗の和として表す表し方が"2通り"ある数でないといけない)
#include <stdio.h>
#define N 10000
#define C_SIZE 22 // ceil(pow(N,1.0/3))
int main(){
int i, j, x;
int cubic[C_SIZE];
int table[N]={0};
for(i=1; i<C_SIZE; i++) cubic[i]=i*i*i;
for(i=1; i<C_SIZE-1; i++){
for(j=i+1; j<C_SIZE; j++){
x = cubic[i] + cubic[j];
if(x > N) break;
table[x]++;
}
}
for(i=1; i<sizeof(table)/sizeof(table[0]); i++){
if(table[i]==2) printf("%d\n",i);
}
return 0;
}
387 :
デフォルトの名無しさん :2010/04/25(日) 22:32:32
379です。もうひとつお願いいたします。 [1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): モンテカルロ法で円周率πの近似値を求めよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2010年4月28日まで [5] その他の制限: 以下の疑似乱数発生方法を参考にする。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void) { double r; srand(getpid()); r = (double)rand()/(RAND_MAX+1.0); printf("%f\n", r); return 0; }
>>387 #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define N 1000000
int main(void)
{
double x, y;
int i, j;
srand(getpid());
for( i=j=0; i<N; i++ ) {
x = (double)rand()/(RAND_MAX+1.0);
y = (double)rand()/(RAND_MAX+1.0);
if( x*x + y*y <= 1.0 ) j++;
}
printf("%f\n", (double) j / N * 4);
return 0;
}
>>371 int main(int argc, char *argv[]) {
int32_t N;
std::cin >> N;
if (N > 100000 || N < 1)
exit(1);
char* array = new char[N];
int32_t counts[100] = {0};
srand(time(NULL));
int32_t i;
for(i = 0; i < N; i++) {
char value = myrand100();
array[i] = value;
counts[value - 1]++;
}
std::cout << int(array[0]);
for(i = 1; i < N; i++) {
std::cout << ", " << int(array[i]);
}
std::cout << "\n" << std::endl;
for(i = 0; i < 100; i++) {
std::cout << i+1 << "\t" << counts[i] << "\n";
}
std::cout << std::endl;
delete array;
return 0;
}
>>371 ソートしない方がいいと思う。
つか、
>>312 には一言もソートしろって書いてないわけだし。
先生(?)が後で言ってるのはあくまでも例えなわけで、
答えを直接教えるわけにもいかんから、適当に言ってるだけだろう。
仮に、数え上げるプログラムが課題だったとしても、
ソートよりは普通に数えた方がいい。
>>362 にsortって書いてあるからそうしただけ。
しなくていいなら
>>313 程度でいいし。
配列サイズを1個節約するためだけに、無意味な加算減算を繰り返すのは効率いいとは思えない。
[2] 実行して表示 [3] 環境 [3.1] OS:windows2000 [3.2] Microsoft Visual C++ 6 [3.3] C [4] 期限:[無期限] #include <stdio.h> /MyC.c */ int main(void){ printf("My C program\n"); retun 0; } コンパイルしようとすると、エラー6 警告2が出てしまいます。
>>393 /MyC.c */
を
/*MyC.c */
にする。
397 :
393 :2010/04/27(火) 10:46:37
.plgファイルが作られコマンドラインには何も表示されません。 結果 テスト2.exe - エラー 0、警告 0 これでできたことになるんでしょうか?
>>397 コマンドラインに表示されてるはず
早すぎて見えないだけ
引数1に10進の1/10の位までの値(例えば45なら4.5という意味です)、 引数2に目量数があったとして 目量の数に四捨五入するプログラムを作る。 例えば45,2なら結果は4、123,5なら10で125,5なら15という風にな る-45,3なら-6、-44,3なら-3・・・ よろしくお願いします。
>>399 #include<stdio.h>
#include<stdlib.h>
int func(int a, int b)
{
int abs_a, sign;
if(a<0) sign=-1;
else sign=1;
abs_a=abs(a);
abs_a+=b*5;
abs_a=abs_a/10/b*b;
return sign*abs_a;
}
int main(void)
{
printf("%d\n", func(45, 2));
printf("%d\n", func(123, 5));
printf("%d\n", func(125, 5));
printf("%d\n", func(-45, 3));
printf("%d\n", func(-44, 3));
return 0;
}
401 :
ノラ :2010/04/28(水) 23:58:29
いま学校の課題で do-while文を使って 1+2+3・・・というように数値を加算して表示し、 加算結果が300を超えたら表示して 処理を終了するというプログラムを組みたいのですが、 普段から授業ついていけなくて、よくわかりません どなたか教えてください。お願いします
>>401 #include<stdio.h>
#include<math.h>
int main(void)
{
int suuti=0;
do
{
suuti++;
printf("%s%d", suuti!=1?"+":"", suuti);
}
while(suuti<=sqrt(300*2+0.25+1e-10)-0.5);
printf("\n加算結果が300を超えた\n");
return 0;
}
簡単な問題だと、すぐにレスが付くんですねw
>>404 1. C++ としてコンパイルする
2. 変数の宣言場所を変える
>>405 変数の宣言場所を変えるとはどういうことですか?
407 :
406 :2010/04/29(木) 02:31:59
ごめんなさい解決しました。 pow関数のところでひっかかってたみたいですお騒がせしました。
>>408 この手の問題はいやというほどやったからなあ。
ちょっと難しくなると、”片付けます”なんて銘打ってるスレなのに 「自分で考えないと、力付かない」なんて屁理屈こねだすのにねhw
411 :
C言語苦手 :2010/04/30(金) 00:24:14
[2] 問題文(含コード&リンク): 簡単なんですけど、C言語苦手でお願いします。 すべて関数の部分だけで大丈夫です。 @3つの実数の掛け算をもとめよ。 A整数nの階乗n!をもとめよ。 B配列・実数・data[]の平均値を求めよ。 C2つの実数 aとbの内容を入れ替えよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C [4] 期限:4月30日の正午まで お願いします。
413 :
458 :2010/04/30(金) 01:31:56
>>411 #include <stdio.h>
int Kakezan(int a, int b, int c){
return a*b*c;
}
double Heikin(int* data,int x){
int i;
double sum=0;
for(i=0;i<x;++i)
{
sum += data[i];
}
return (double)(sum/x);
}
int Kaijo(int n){
if(n > 1)
return n * Kaijo(n-1);
else
return 1;
}
void Swap(int* a, int* b){
int* swap;
swap = a;
a=b;
b= swap;}
int main(){
int data[5] = {1,2,3,4,5};
int x = sizeof(data) / sizeof(data[0]);
printf("%d\n",Kaijo(4));
printf("%lf",Heikin(data,x));
}
>>413 Kakezan(2147483647,2147483647,2147483647);
が計算できません
回答するなら、いいかげんな回答はやめてください。
[1] 授業単元:プログラム [2] 問題文(含コード&リンク):プログラム開始前に%だけの行が1つも無いときには,そのような行を追加し,2つ以上あるときには1つだけにするようなプログラムをC言語により作成する. [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: cygwin [3.3] 言語: C [4] 期限: 4月30日朝 [5] その他の制限: なし お願いします
>>415 言うのが遅くないかい?
この時間は無理だろ。
プログラムを開始する事なく どこの行を指しているかも分からない"%"を判別しなければならないんだぞ この時間じゃなくても無理
こういう状況で張り切って答える馬鹿がいるんだよな。 そういう奴に限って実社会では役に立たないクズで、 しかも空気読めなくて周りから嫌われるタイプ。
>>416 数あて
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int com_ans,man_ans;
com_ans = rand() % 100;
printf("数当てゲームです、好きな数字を入力してください\n");
while(1){
printf("数は?");
scanf("%d", &man_ans);
if(com_ans > man_ans){
printf("もっと大きいよ\n");
}
else if(com_ans < man_ans){
printf("もっと小さいよ\n");
}
else{
printf("正解。\n");
break;
}
}
}
>>416 ヒストグラム
#include <stdio.h>
int main(void)
{
int i, j, hist[10] = {0}, n;
for(i=0; i<20; i++) {
do { printf("%d個目:",i+1); scanf("%d", &n); } while(n < 0 || 9 < n);
hist[n]++;
}
for(i=0; i<10; i++) {
printf("%d:", i);
for(j=0; j<hist[i]; j++) printf("*");
printf("\n");
}
return 0;
}
422 :
420 :2010/04/30(金) 10:13:16
やっぱこうだわ #include <stdio.h> #include <stdlib.h> int main(void) { int com_ans,man_ans,count=0; com_ans = rand() % 100; printf("数当てゲームです、好きな数字を入力してください\n"); while(1){ printf("数は?"); scanf("%d", &man_ans); if(com_ans > man_ans){ printf("もっと大きいよ\n"); ++count; if(count >=10){ printf("おしまい\n"); exit(1);} } else if(com_ans < man_ans){ printf("もっと小さいよ\n"); ++count; if(count >=10) {printf("おしまい\n"); exit(1);} } else{ printf("正解。\n"); break; } } }
>>416 素数
#include <stdio.h>
int main(void)
{
int i, j;
char sieve[30+1] = {0, 0, 1}; //0と1は素数でない、2は素数なので探索リストに追加
for(i=3; i<=30; i+=2){
sieve[i] = 1; //3以上30以下かつ奇数であるものを探索リストに追加
}
printf("2及び3以上30以下かつ奇数であるものが現在の探索リスト\n");
for(i=0; i<=30; i++) if(sieve[i]) printf("%d ", i);
printf("\n");
for(i=3; i*i<=30; i+=2){ //30は7の平方より小さいので
if(sieve[i]) { //i==7になったときに探索リストに残っているものが素数。
for(j=i*i; j<=30; j+=i*2)
sieve[j] = 0; //iの平方の倍数にiの偶数倍を足したものが30以下であれば探索リストから外す。
} //奇数+奇数=偶数になるためj+=i*2として偶数倍のものを選んでいる。
} //ex...i=3のときj=9,j=12,j=15,j=18…と探索していくのは無駄である。
//それはj=12,j=18は探索リストからすでに外れているからである。
printf("先ほどの探索リストから3,5の平方の倍数\n");
printf("および3,5の平方の倍数に3,5の偶数倍を足したものを除いた残り\n");
for(i=0; i<=30; i++) if(sieve[i]) printf("%d ", i);
return 0;
}
>>420-423 数当てはカウントさせて10に達するようにすればよかったんですね
素数とヒストグラムもわかりやすいものにしてもらい助かりました、本当にありがとうございます
>>408 それむずかしいんじゃない、めんどくさいんや
[1] 授業単元:プログラム [2] 問題文(含コード&リンク):sample.txtを読み込み、データを身長の小さい人から順番に並び変えてans.txtに出力せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: cygwin [3.3] 言語: C [4] 期限: 5月2日まで [5] その他の制限: なし sample.txtの中身はこんな感じです。 12 ヤマダタロウ 56.7 165.1 43 タナカハナコ 44.3 156.8 54 スズキイチロウ 70.3 179.2 左から番号、名前、体重、身長です
いまどきそんなプログラム書いて何になるの?
単位になるんだよ 大学行ったことないとわからないかもしれないけど
大学でのその程度のプログラムかけないだw
日本語で頼む
大学にもよるんじゃないの? まぁ、3流以下だろうけどなhw
文系の教養科目としてプログラムがある大学もあるし、 4月から週一こま程度ならその程度でもおかしくはないだろ。 大学行ったことないとわからないかもしれないけど
>>426 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct tag_data_t{
char *org;
double height;
}data_t;
int data_cmp(const data_t *pa, const data_t *pb){
if(pa->height<pb->height) return -1;
return (pa->height>pb->height);
}
int main(void){
FILE *fp_in, *fp_out;
char onelinebuf[1024], *p;
data_t *data=NULL;
int i, data_num;
if((fp_in=fopen("sample.txt", "r"))==NULL) exit(1);
for(data_num=0;fgets(onelinebuf, sizeof(onelinebuf), fp_in);data_num++){
if((p=strchr(onelinebuf, '\n'))) *p='\0';
if((data=realloc(data, sizeof(*data)*(data_num+1)))==NULL) exit(2);
data[data_num].org=strdup(onelinebuf);
if(sscanf(onelinebuf, "%*d %*s %*f %lf", &data[data_num].height)!=1) exit(4);
}
fclose(fp_in);
qsort(data, data_num, sizeof(*data), (int (*)(const void*,const void*))data_cmp);
if((fp_out=fopen("ans.txt", "w"))==NULL) exit(3);
for(i=0;i<data_num;i++) fprintf(fp_out, "%s\n", data[i].org);
fclose(fp_out);
for(i=0;i<data_num;i++) free(data[i].org);
free(data);
return 0;
}
>>434 コンプレックス強い奴だな
大学に行きたきゃ夜間でもなんでも方法あるだろ
まぁ、小学生でもかけるようなものを質問して、 大学生ですってのもはげしくかっこ悪いのは事実
お前いつも口だけで、コード何も書いてないじゃんw
そんなに大学が妬ましいのかw
3流大は妬ましくはないですよ
>>434 十分大学レベルだよ
最近は高校でもプログラムやるのかな。それなら大学ではTMPとかやってもよさそうだけど。
最近いる文句つけてるだけのヤツはコード読めないし書けもしないただの煽りだろ。
例によって授業についていけず、ここでも救われなかった自業自得な生徒が喚いているのでは
>>434 この程度で大学レベルならあまりのレベルの低さに笑っちまうよな
ところでお前はどんな美しいコードが書けるんだ?
>>444 ((void (*)())(0))();
ダメダメ全然イケてないよ
>>448 メモリアドレス0を、引数を持たず値を返さない関数として呼び出す
つもりなんだろうけど、本当にメモリアドレス0になるかどうかは環境依存
451 :
393 :2010/05/01(土) 11:13:44
>>398 遅レス申し訳ないんですが、
どうすれば表示されたものを
目で確認できるんでしょうか?
コマンドプロンプトから実行
MyC.EXEを、コマンドプロンプトから実行しましょう。 か、または Ctrl+F5
>>445 たしかに肝心のソートを qsort() にしているのは、出題者(学校の先生)からみると、手抜きにみえる、というか、そこを
がしがし書いてほしいというか。
455 :
393 :2010/05/02(日) 11:55:06
>>453 .exeファイルが生成されません。代わりに.plgファイルができます。
ビルドするかどうかの問いに「はい」答えると
「プログラムを実行できません」と
表示されてしまいます。
コンパイルしようとすると「コンパイルツールがない為できない」
と出てしまいます。
とりあえず、その テスト2.plg の表示画面を此処にコピペして見て。
457 :
デフォルトの名無しさん :2010/05/02(日) 13:23:17
[2] 問題文(含コード&リンク): ・ユークリッドの互除法の拡張アルゴリズム 入力 f1,f2 (f1>f2>0でよい)に対して、 s*f1+t*f2=gcd(f1,f2)となる、s,tを求めよ。 ただし、gcd(f1,f2)はf1とf2の最大公約数である。また 配列を使わずに再現すること。 [3] 環境 [3.1] OS:vista [3.2] コンパイラ名とバージョン: VC 2008 [3.3] 言語: C言語 [4] 期限: 5/5 よろしくお願いします。
s,tの条件が足りない
459 :
デフォルトの名無しさん :2010/05/02(日) 13:38:04
>>458 すいません。
s,tは整数で、一意でない場合も、一組求めればいいです。
460 :
393 :2010/05/02(日) 13:38:35
>>456 ビルドのログ
--------------------構成: テスト2 - Win32 Debug--------------------
コマンド ライン
結果
テスト2.exe - エラー 0、警告 0
以上ですけど何か分かりますか?
できたよ
>>457 #include <stdio.h>
int gcd(int a, int b) { return a % b ? gcd(b, a%b) : b; }
int func(int f1, int f2, int *s, int *t){
int a, b, m = f1 / f2, n = f1 % f2;
if(n == 1) {
*s = 1;
*t = -m;
return;}
func(f2, n, &a, &b);
*s = b;
*t = a - *s * m;
}
int main(void)
{
int f1, f2, g, s, t;
scanf("%d%d", &f1, &f2);
g = gcd(f1, f2);
if(g == f2) printf("s = 0, t = 1\n");
else {
func(f1/g, f2/g, &s, &t);
printf("s = %d, t = %d\n", s, t);
}
return 0;
}
int func()じゃなくてvoid func()だな
>>460 こんなのが正常。
.plgの他に.dspファイルとDebugフォルダーは出来てる?
--------------------構成: テスト2 - Win32 Debug--------------------
コマンド ライン
一時ファイル
[〜]
一時ファイル
[〜]
アウトプット ウィンドウ
コンパイル中...
MyC.c
リンク中...
結果
テスト2.exe - エラー 0、警告 0
>>457 関数一つにしてみた
#include <stdio.h>
void func(int f1, int f2, int *s, int *t)
{
int a, b, m = f1 / f2, n = f1 % f2;
if(n == 0) {
*s = 0;
*t = 1;}
else if(n == 1) {
*s = 1;
*t = -m;}
else {
func(f2, n, &a, &b);
*s = b;
*t = a - *s * m;
}}
int main(void)
{
int f1, f2, s, t;
scanf("%d%d", &f1, &f2);
func(f1, f2, &s, &t);
printf("s = %d t = %d\n", s, t);
return 0;
}
よく考えたら一つにしたらn==1のときはいらねーな
ついでに最大公約数も求めてみた #include <stdio.h> int gcd(int f1, int f2, int *s, int *t) { int a, b, m = f1 / f2, n = f1 % f2, ret; if(n == 0) *s = 0, *t = 1, ret = f2; else { ret = gcd(f2, n, &a, &b); *s = b, *t = a - b * m; } return ret; } int main(void) { int f1, f2, s, t, g; scanf("%d%d", &f1, &f2); g = gcd(f1, f2, &s, &t); printf("gcd = %d, s = %d, t = %d\n", g, s, t); printf("s * f1 = %d * %d = %d\n", f1, s, f1 * s); printf("t * f2 = %d * %d = %d\n", f2, t, f2 * t); return 0; }
[1]C言語課題 [2] fopen等から作成された既に開いているFILEと同じファイルを指す 独立したオープンのFILE*変数を作成するfreopen関数を作れ 関数ヘッダ: FILE *freopen(FILE *,char *mode) 使用例: FILE *f,*g; int a,b,c; f=fopen("./hoge.txt","w"); g=freopen(f,"r"); fprintf(f,"1+1=2¥n"); fscanf(g,"%d+%d=%d",&a,&b,&c); ........ [3] OS:Linux(FedraCore) Compiler :GCC4.2 Language:C言語 [4] 5/30迄 [5]よろしくお願いします
>>469 同名の標準関数があるのにリンクできるのかな?
>>469 Cは引数の型が違っても同名の関数は作れないのであります
C++なら出来るであります
>>457 #include <stdio.h>
typedef struct{
int t0;
int t1;
}tuple2;
// s*f1 + t*f2 = gcd(f1,f2) (f1>f2>0)
tuple2 ex_gcd(int f1, int f2){
if(f2==0) {
tuple2 tup = {1, 0};
return tup;
}
{
int q = f1/f2;
int r = f1%f2;
tuple2 ret = ex_gcd(f2, r);
tuple2 res;
res.t0 = ret.t1;
res.t1 = ret.t0 - ret.t1*q;
return res;
}
}
int main(void){
int f1=12, f2=23;
tuple2 tup = ex_gcd(f1, f2);
printf("s = %d t = %d\n", tup.t0, tup.t1);
return 0;
}
自分で言うのもなんだがコードがキモ過ぎる
tuple2 res = {ret.t1, ret.t0 - ret.t1*q}; とできないとかC言語腐ってやがる
473 :
393 :2010/05/03(月) 06:53:56
>>465 レスありがとうございます。
そのように表示されたことはありません。
.dspとDebugフォルダともできてます。
何がいけないんでしょうか?
分かったかも。礼は要らない。 プロジェクト メニュー⇒プロジェクトへ追加⇒ファイル⇒プロジェクトにファイルを追加
「負の値が入力されるまで繰り返す」ってどういう条件にすれば良いですか? while(n<0)でscanf文を囲みましたができません。
while(1) { scanf(
手が滑った while(1) { scanf("%d", &n); if(n < 0) break; .... }
>>478 本当助かりました。ありがとうございました。
関数初心者です。以下の問題お願いします。 ・2つの整数型の引数を持ち、そのうち小さい方を返す関数のプロトタイプ宣言と関数定義を書け.
scanfなんて20年ぶり位に見た 今でも、使ってるのかしらん?
>>480 まず、君の年齢を教えてくれ。
10歳以下なら教えてあげる
>>480 int f(int,int);
int f(int a, int b) { reutnr a > b ? b : a; }
↑ なに言語ですか?
reutnrってw
>>484 スレタイを声に出して100回呼んでこい
488 :
457 :2010/05/04(火) 01:04:29
ポインタについて、*tに文字列を関数内で入れたいのですが、 下記のようにすると、ビルドは成功するのですが 実行時に"The variable 't' is being used without being defined" というエラーメッセージが出ます。 関数test(t)で*tに文字列を入れるにはどうしたらいいでしょうか。 教えてください。 int main(int argc, char *argv[]) { char *t; test(t); cout << t << endl; return EXIT_SUCCESS; } void test(char *t) { t = new char[100]; int i = 0; cout << "step1" << endl; t[i++] = 'a'; t[i++] = '\0'; }
int main(int argc, char *argv[]) { char *t; test(t); cout << t << endl; return EXIT_SUCCESS; } void test(char *&t) { t = new char[100]; int i = 0; cout << "step1" << endl; t[i++] = 'a'; t[i++] = '\0'; }
C++ではこの *&t という書き方に慣れましょう。 読み方は 't is refference of pointer to char' となります これはCでは使えません
#include <iostream> using namespace std; void test(char *t) ; int main(int argc, char *argv[]) { char *t = new char[100]; test(t); cout << t << endl; return EXIT_SUCCESS; } void test(char *t) { int i = 0; cout << "step1" << endl; t[i++] = 'a'; t[i++] = '\0'; }
>>491 コンパイル通って実行できました。
ありがとうございました。
newしたらちゃんとdelete[]してあげて下さい><
配列 new なんかしないで std::vector 使ってください。
>>495 それ言うとまた「例外安全にしろ」とか言う馬鹿が出て来て困るんだよ(´・ω・`)
宿題にそこまで必要ないだろと言いたい
宿題だからとかいうわけのわからない理由で例外安全にしないでいい場合の線引きを 考えるぐらいなら、可能な場合は全部例外安全にしといたほうがいい。
勝手にガイドラインを作ってみた ・宿題の場合は特に題意に指定がない時は例外安全を考慮しない ・newしたものは必ずdelete、malloc()したものはfree()する
>>498 お前さあ、boost::shared_ptrを使ったとして、教官に「これは何かね?」と
聞かれて答えられる奴ばかりだと思うか?宿題丸投げしてくるような奴ら
ばっかりだぞ
そこら辺の事情も考えてやれよ
>>500 どうして宿題丸投げしてくるようなやつらの事情を優先して考えてやる必要があるの?
>>499 何がしたいのかわからんガイドラインだな。
>>503 楽をしたいんなら new/delete の対応なんかも無いほうがいいんじゃないの?
教育現場では malloc() したものを free() しない、new したものを delete しないのは減点対象かと。
>>492 の何が悪いか分からん
char[100]を1回newしてるのをdelete[]しないのは「リーク」じゃないから
実害ゼロだし
この程度のコードで例外安全とか正気かおまえら
>>507 実際にリークにならないからと考えて delete [] しなかったのか、単に忘れたのか、
それが読み手にはわからない。
そんな突っ込みどころを残して人目に晒すからこんなことになる。
>>507 リークにならないのはコードを「見れば」分かるだろ
>>492 が「忘れた」かどうかなんて、何の意味がある?
tが不要のなるのはreturnでmain()からexitする直前で、
そこでdelete[]したところで
どうせexitすればCランタイムかOS自身が回収するんだから
無意味もいいとこじゃねえか
new して delete を忘れるようなゴミプログラマは一人でも減って欲しいと思うだろjk
うむ。delete しないなら、いっそのこと static にしてくれた方が気持ちいい
>>510 無意味だから最後にfree()しないコードなんてlibcの層には普通にあるんだが
そんなことも知らんのか?
っていうか、宿題丸投げスレに来るような奴がプログラマになったとして
まともなプログラマになるわけないだろw
513 :
492 :2010/05/05(水) 13:14:17
delete忘れてました。申し訳ありません。
>>495 承知しました
>>496 メモリ開放忘れるリスクがなさそうでよさげですね。承知しました。
>>497-499 try〜catchでしょうか
try {
char *t = new char[100];
test(t);
cout << t << endl;
return EXIT_SUCCESS;
} catch(Exception e
>>512 おまえわざとやってるだろ。プログラム終了前の free() とか、何年前のフレームネタだよ。
515 :
492 :2010/05/05(水) 13:22:15
※途中で書いて島田orz
delete忘れてました。申し訳ありません。
>>495 承知しました
>>496 メモリ開放忘れるリスクがなさそうでよさげですね。承知しました。
>>497-499 try〜catchでしょうか。ごめ。これの意図は分からないです。
try {
char *t = new char[100];
test(t);
cout << t << endl;
return EXIT_SUCCESS;
} catch(Exception e) {}
>>500-512 deleteしないのは「メモリリーク」を発生させると思っていました。
お手数ですが、なぜ「メモリリーク」にならないのかご教授願えませんでしょうか。
>っていうか、宿題丸投げスレに来るような奴がプログラマになったとして
>まともなプログラマになるわけないだろw
ヽ(`Д´)ノウワァァン!!
>>515 メモリリークってのはプログラム実行時に使用メモリ量がどんどん増えていく
現象のこと
勿論deleteすべきものをしないことがメモリリークの主な原因だが、
定義により、
>>592 がメモリリークを発生させないのは、分かるだろ
使用メモリ量がどんどん増えはしなくとも、不要になったメモリをいつまでも
開放せず、本来使いまわせるメモリを使いまわさないのも良くないことだが、
>>592 はそれにも該当しない
>>509 それって規格で決まってるの?
>>515 deleteしてないぞ
てか今回はvector<char>じゃなくてstring使えばよくね?-128から127までの整数を保存したいとかなら別だが
>>519 質問が
>>489 で、その回答なのに
何でstringを持ち出すんだよ
本当にオナニー野郎ばかりだな
規格の話をすると、C/C++の規格は、malloc()したものをfree()しなければならない
とは一言も言っていないぞ
プログラマがfree()するのは、単にそうしないと困るからであって、
>>492 でdeleteしなければならないと主張するなら、それで困る実例を
挙げてみろって話だ
、
なんだかバカがひとりでがんばってるな。
523 :
492 :2010/05/05(水) 14:16:55
>>516 「例外安全」は理解しました。
>>517-518 分かりやすいご説明ありがとうございます。
今まで、プログラム終了後もWindows上のメモリを占有すると勘違いしていました。
(だったら、なおさらdelete忘れるなよって言うのはごかんべん)
>>519-522 いろいろな考え方がありますね。勉強になります。
>>521 まっとうな先生なら原点するとおもう、10点満点の1点くらいで。それが困る。
>>521 こういうくだらない議論のきっかけになるというだけでも十分困る。
char t[100]; これでよくね?
>>526 今の時代なら wchar_t t[100]
charでやるなんてどうかしているよ。
>>496 いや、まえから不思議におもっていたんですけれども vector や list や deque は
どうして明示的に delete しなくてもいいんですか?デストラクタが自動に呼び出されるしくみはなんなのでしょうか?
独習C++ を解いたレヴェルで質問するのははばかられるんですが、よろしければ教えてください。
>>528 C++ の規格で定められた動作だから。
仕組みが知りたければアセンブリ吐かせるとかコンパイラのソース見るとかしろ。
530 :
デフォルトの名無しさん :2010/05/05(水) 22:46:58
Cでアスキーコード表ってどうやって作ればいいんですか?(>_<)
>>528 vector や list や deque が明示的に delete しなくてもいいとはどういみ?
>>528 ちょっと質問がおかしいぞ
コンテナのデストラクタが自動的に呼び出される仕組み云々よりも、
まず自作のクラスを作ってデストラクタがいつ呼び出されるかを
確認できたら自ずと答えは出るはずだが?
>>530 for (i = 0; i < 16; i++) {
for (j = 0; j < 8; j++) {
if (i < 2) {putchar(' ');} else {putchar((i << 4) + j);}
}
putchar('\n');
}
534 :
デフォルトの名無しさん :2010/05/05(水) 23:39:49
>>533 意地悪だなあwww
> for (j = 0; j < 8; j++) {
for (j = 0; j < 16; j++) { でないかい?
536 :
528 :2010/05/06(木) 00:18:42
>>532 ん、
Myclass ob1(1), ob2(3)
とかはわかるんですが、
new とかを内部でつかっているとどうなるのかな、とか‥‥‥。
でも、もうちょっといろいろ書いてみます。レスありがとうございました。
asciiコードは00-7fまでしか定義されてないから
>>533 であってるお
i と j がごっちゃになってるなw
もっと素直に書けよ for (i = 0; i < 0x80; i++) { printf("%X:%c\n", i, iscntrl(i) ? ' ' : i); }
[1]プログラミング言語C [2] キーボードより入力した4桁の数値を逆転させて表示せよ.例えば,「1234」 と入力した場合は,「4321」と表示され,「1」と入力した場合は,「1000」と 表示させ,「3210」と入力した場合は,「123」と表示するものとする. faXXXXX<1> ./kadai02 ←プログラムの実行 数値を入力して下さい。 3210 ←キーボードより入力 数値を逆転させた結果は、123です。 faXXXXX<2> [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限: 2010/5/7 よろしくお願いしますorz
>>541 #include<stdio.h>
int main(void)
{
int x, y;
printf("数値を入力して下さい。\n");
scanf("%d", &x);
y=(x/1%10)*1000+(x/10%10)*100+(x/100%10)*10+(x/1000%10)*1;
printf("数値を逆転させた結果は、%dです。\n", y);
return 0;
}
[1] 授業単元:プログラミング [2] 問題文(含コード&リンク): コンソール上でキーボードから次のような標準入力を与えるとする。 10+2 すると、演算結果が出力するようなプログラムを記述せよ。 四則演算( +, -, *, / )に対応させること [3] 環境 [3.1] OS: Windows [3.3] 言語: C [4] 期限: 5/12 [5] その他の制限: 文字列をコピーする関数( strcpy, strncpy ) 文字列を連結する関数( strcat, strncat ) 文字列の比較を行う関数( strcmp, strncmp ) 文字列の長さを調べる関数( strlen ) 文字を検索する関数( strchr ) 文字列を整数値に変換する関数( atoi ) を使用する お願いします。
回答レスが無い可能性99.9%w
過去に何度も出てるから飽きたって問題はある
理由はそれだけかしらんw
ぶっちゃけた話、その手の宿題が出る環境にいるのにそのレベルの問題が解決出来ないのはおかしい……
>>469 先生から回答貰えたら晒し希望
引数にchar *pathnameがないと実装量が多すぎる気がする
552 :
デフォルトの名無しさん :2010/05/08(土) 18:58:18
553 :
デフォルトの名無しさん :2010/05/09(日) 17:17:30
[1]Cプログラミング [2] 0から9までの数字を2回ずつ使用し掛け算の筆算を表示させよ 図 □□□ ×□□□ ━━━━ □□□ □□□ □□□ ━━━━━ □□□□□ [3] 環境 [3.1] OS: windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限: 2010/5/9 よろしくお願いします
>>553 ごめんなさい、私には難しくて出来ません
556 :
デフォルトの名無しさん :2010/05/09(日) 20:19:36
forとprintfを使って以下のようなアスキーコード表を作りたいです。 たびたび申し訳ありませんが、よろしくお願いいたします。 0123456789ABCDEF 2SP!"#$%&'()*+,-./ ・ 省略 ・ Cタチツテトナニヌネノハヒフヘホマ Dミムメモヤユヨラリルレロワン゛
>>556 あなたの思い描くアスキーコードは独自のモノなので
char *str[]={"0","1","2"....};
と地道に列挙するのがいいんじゃないかな
558 :
デフォルトの名無しさん :2010/05/09(日) 21:51:50
C言語でモジュラス10ウェイト3のソースコードを教えてください。 できれば解説もお願いします。
560 :
デフォルトの名無しさん :2010/05/09(日) 22:18:36
>>558 です
8桁でも13桁でも求められるようにお願いします
あと解説もお願いできますか
>>560 別に8桁でも13桁でも255桁でもいけると思うが
解説って何を解説すりゃいいんだ?
オーバーフローするだろ
564 :
デフォルトの名無しさん :2010/05/09(日) 22:31:18
>>561 回答ありがとうございます。
しかし、私、C言語を始めたばかりでしてsscanやfgetsがよくわかりません。
for文,printf,scanf、配列を使ってのソースコードを教えてほしいです。
fgets(buf, sizeof(buf), stdin); を scanf("%s", buf); に読み替えて(書き換えて)おくれ
566 :
デフォルトの名無しさん :2010/05/09(日) 22:51:21
>>565 k ^= 2; //3,1を交互に切り替える
というのはどのような処理なのでしょうか?
>>566 ビット演算をまだ勉強してなければ
if (k == 3) { k = 1; }
else { k = 3; }
と考えてもらえれば。
568 :
デフォルトの名無しさん :2010/05/09(日) 23:46:05
total += ((data[cnt] - '0') % 10) * k; の、-'0'の処理は、 入力した数字を数値化し、mod 10 することによって 10以上の1桁目をtotalに加えるということでよろしいでしょうか?
10以下のじゃね?
570 :
デフォルトの名無しさん :2010/05/10(月) 00:01:45
571 :
デフォルトの名無しさん :2010/05/10(月) 00:08:16
>>567 ありがとうございます
おかげさまで無事動かすことができました
572 :
393 :2010/05/10(月) 16:56:17
まだやってたの?
574 :
デフォルトの名無しさん :2010/05/10(月) 17:11:01
[1] 授業単元: C言語入門 [2] 問題文(含コード&リンク): ニュートン法を用いてf(x)=e^(-x)-x^2=0の根を求めよ。 但し、x(0)=1とし、反復回数を4とする [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 本日中 お願いします。
本日中と書きましたが、夜10時までに回答していただけると助かります。 それ以降の場合はレスしないかもしれません。
回答が無い可能性は極めて高いw
577 :
574 :2010/05/10(月) 18:01:43
>>575 は私ではありません。
自分でも作っているのですが、終了条件でメチャメチャになっています。
>>578 ありがとうございます。
if (dy == 0) break;
この判定は問題ありますが、とりあえずはよしとしましょう。
とりあえずはよしとしましょう。
それは判定じゃなくて、0 じゃ割れないのでどうしようもない場合。 反復回数(最大反復回数ではなく)が4と指定されてるので、 終了条件は i == 4 とかでしょう?
582 :
574 :2010/05/10(月) 19:15:53
>>579 お前いい加減にしてくれ
こっちは本気で切羽詰まっているんだ。
>>574 #include<stdio.h>
#include<math.h>
double f(double x)
{
return exp(-x)-x*x;
}
int main(void)
{
double x, d, delta=1.0e-10;
int i;
x=0.0;
for(i=0;i<=4;i++)
{
printf("%d x=%f f(x)=%f\n", i, x, f(x));
d=(f(x+delta)-f(x))/delta;
if(d==0.0) break;
x+=-f(x)/d;
}
return 0;
}
お前らどうして、演算結果のダブル値を0と比較したがるの?
実務だったらバグだけど、所詮は宿題だからいいんじゃね。
>>582 トリップをつけたらいいですよ。ハンドル欄に#で始まる秘密の文字列を書けばいいんです。
たとえば
#abc ――@
を名前欄に入力していますが、それが
GmgU93SCyE ――A
と変換されています。Aから@を推測するのは、今のところ難しいようです。
588 :
デフォルトの名無しさん :2010/05/10(月) 20:59:34
本科目の受講生より、こちらにて4月28日出題の課題を インターネットに投稿している者がいるとの連絡を受けました。 今回の課題は学生の理解を深める為に個別レポートとして出題されたものであり、 問題の解答そのものを丸投げすることは課題の趣旨に反する行為となります。 初回の講義でお話しましたように、ソースコードの書き方には個人差があり、 過去に提出したレポートなどから本人が書いたものかどうか判別することは十分可能です。 他人が書いたソースコードをレポートとして提出することは重大な不正行為に当たります。 提出されたレポートにおいて不正が確認された場合、本学の懲罰規程に従い厳しく処罰されます。 締切りは明日の17時とまだ時間もいくらか残されていますので、 この問題を投稿した、または参考に読んでいる学生には自分の力で 今回の課題に取り組んで頂けることを期待しています。
またか
0じゃなくても小さすぎるとオーバーフローするのか
INFになるだけ
592 :
474 :2010/05/10(月) 21:58:18
>>594 c++でなら通るのですが普通のc言語では同じエラーが出てしまいます
>>593 C では const int としても配列の次数指定には使えないようですね。
#define がいやなら、enum { N = 32 } はいかが?
なお、C++ でコンパイルするとうまくいきました。
>>594 それは関係ないようですよ。無名の enum や struct は今はOKのはず。
規格に詳しい方のコメントをお待ちしております。
597 :
594 :2010/05/10(月) 23:36:06
さっきの無かったことに 原因はsqrtfみたい
なんで勝手にfになるんだろうな
なんか#defineで通らないと思っていたら行末に ; つけてただけでした enumでも通ったのですが一概には決めれないでしょうがどちらを使ったほうがいいんですかね?
>>600 最近のはやりは enum でしょうね。
#define は定義したところから最後まで見えてしまいますが、
enum ならば定義した場所によっては通用範囲を絞ることができますしね。
meyers 先生は enum や const int を使えとおっしゃっています―― C++ の教科書で、なんですけどね。
意個数の整数を標準入力(キーボード)から入力し、 入力された整数の個数 平均値(小数点以下 1 桁まで表示) 最大値 最小値 を標準出力(ディスプレイ)に表示するプログラムを作成せよ。 ただし、9999が入力されたら入力を終了するものとし、9999は入力個数、平均値、最 大値、最小値には含めない。 また、最初に9999が入力された場合には、入力個数=0、平均値=0.0、最大値=0、 最小値=0が出力されるようにする。
#include <stdio.h> int main() { int n = 0, ma = 0, mi = 0; // 個数, 最大, 最小 double sum = 0; // 和 int x; for (;;) { scanf("%d", &x); if (x == 9999) break; if (n == 0 || x > ma) ma = x; if (n == 0 || x < mi) mi = x; n++; sum += x; } printf("個数: %d\n", n); printf("平均値: %.1f\n", n ? sum/n : 0.0); printf("最大値: %d\n", ma); printf("最小値: %d\n", mi); return 0; }
キーボードから int 型変数aに値を入力し、aの値を 2 進数に変換して画面に表示するプログ ラムを作成せよ。 ただし、aに負の値が入力された場合には、再入力させるものとする。 実行例: () の部分が入力である。 Input a: (-4) Input a: (-3) Input a: (10) a(decimal)=10 a(binary) =1010
>>605 #include <stdio.h>
unsigned DtoB(int a)
{
unsigned x=1,ans=0,k=1;
while(a>0)
{
if(x & a) ans += k;
a = a >> 1;
k*=10;
}
return ans;
}
int main()
{
int a;
do{
scanf("%d",&a);
printf("Input a: (%d) \n",a);
}while(a < 0);
printf("a(decimal)=%d\n",a);
printf("a(binary)=%u\n",DtoB(a));
return 0;
}
607 :
よろしくお願いします :2010/05/11(火) 21:42:53
[1] 授業単元: C言語 [2] 問題文: (1)\int_0^π/2 f(x^2cosx)dx (0からπ/2までのf=x^2cosxの定積分) (2)\int_1^e f(logx)^2dx (1からeまでの(logx)の二乗の定積分) (1),(2) の積分を実施する。 [3] 環境 [3.1] OS: Windows [3.3] 言語:C [5] その他の制限:無いです
【質問テンプレ】 [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): ランダムなアルファベットから成る、最大長255個の文字列を作成し、 文字配列char a[256]へ代入、putsで表示せよ。 作る文字列の長さははじめに入力すること。 [3] 環境 [3.1] OS:Windows7 [3.2] Visual C++ 2008 Express [3.3] 言語: C [4] 期限: 明日17時 [5] その他の制限: なるべくシンプルに。乱数を利用するとよいと書いてありましたが 乱数とアルファベットがどう関連するのか分からないです…
>>608 文字列長はコマンドライン引数から取るようにした。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX_LENGTH 255
int main(int argc, char **argv){
char a[MAX_LENGTH + 1];
int i, length;
srand((unsigned)time(NULL));
length = argc > 1 ? atoi(argv[1]) : MAX_LENGTH;
for(i=0; i < length; ++i){
a[i] = (char)( (rand() % 2) * 0x20 + (rand() % 26) + 0x41);
}
a[length] = '\0';
puts(a);
return 0;
}
#include <ctime> #include <iostream> #include <boost/random.hpp> #include <vector> using namespace std; int main() { char a[256]={0}; char alpha[('z'-'a'+1)*2]; for(int i=0;i<'z'-'a'+1;i++){ alpha[i]='a'+i; alpha[i+26]='A'+i; } int len; for(;;){ cout << "最大長255個の文字列の長さははじめに入力すること。" << endl; cin >> len; if(!cin.fail() && len>=0 && len<256) break; cin.clear(); cin.ignore(1024,'\n'); } using namespace boost; mt19937 gen(static_cast<unsigned long>(time(0)) ); uniform_smallint<> dst( 0, len-1 ); variate_generator<mt19937&, uniform_smallint<>> rand( gen, dst ); for( int i=0; i<len; ++i ) cout << alpha[rand()]; cout << endl; return 0; }
611 :
610 :2010/05/11(火) 23:21:47
あ、配列への代入とputs使ってないわ スルーしてくれ
>609 コマンドライン引数に65535を渡してやる、うひゃひゃひゃひゃ
616 :
よろしくお願いします :2010/05/12(水) 08:43:38
>>608 #pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 255
int main(void){
char a[MAX_LENGTH + 1], r;
int i, length=0;
srand((unsigned)time(NULL));
printf("文字列の長さ:"); scanf("%d%*c", &length);
if(length < 0 || length > MAX_LENGTH)
length = MAX_LENGTH;
for( i=0; i < length; i++ ) {
r = rand()/(RAND_MAX/(26*2));
if(r<26) a[i] = r + 'A';
else a[i] = r - 26 + 'a';
}
a[length] = '\0';
puts(a);
}
618 :
デフォルトの名無しさん :2010/05/12(水) 18:19:53
[1] 授業単元: 画像処理
[2] 問題文:1.各自が自由に作成した画像のヒストグラ
ムを調べ、それぞれどのような形になるか画像として表示できるようにせよ。また、ヒストグラムから判断したし
きい値を用いて、2 値画像を作成せよ。
2.先の画像群に対して、平均化フィルタ(移動平均操作、重み付け移動平均操作など)、微分フィルタ(1
次微分、2 次微分など)をそれぞれ適用した画像を出力せよ。
http://www.dotup.org/uploda/www.dotup.org879740.txt [3] 環境
[3.1] OS:Windows
[3.2] gcc 3.4 VC 6.0
[3.3] 言語:C/C++/
[4] 期限: 5月13日17:00まで
txtのソースのload_image_data();とsave_image_data(image, x_size, y_size);の間に付け加えるみたいです。
[1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 30個の要素を持つ配列に小数をキーボードから代入し,それらを小さい順にソートし,その結果をモニタに出力するプログラムを作成せよ [3] 環境 [3.1] OS:vista [3.2] コンパイラ名とバージョン: VC 2008 [3.3] 言語: C言語 [4] 期限: 5/13 7:00 よろしくお願いします。
qsort使ったら怒られるのかな
>>621 さすがにそれは手を抜きすぎ
というか質問の内容考えると、まださわりの方しかしてないような感じするし
余計ややこしくなるような気がする
>>618 程度だと、回答が付かない可能性極めて高いw
#include <stdio.h> int f(int); int main(void) { int no; printf("整数を入力:"); scanf("%d",&no); return 0; } void f(int n) { while (n-->0) putchar('*'); putchar('\n'); } 入力したnの数だけ*を表示するプログラムなんですが、コンパイルできません。 どこがおかしいですか?
>>624 矛盾してるから
int f(int);
void f(int n)
まぁそもそもmain()からf()を使っていない時点でお菓子い
627 :
デフォルトの名無しさん :2010/05/13(木) 12:20:56
[1] 授業単元: C言語 [2] 問題文: 1〜9までの値の整数 n を入力として受け取り、実行例のように、その n を高さとした二等辺三角形を出力するプログラムを作成しなさい。 なお、10以上が入力されたら以下の実行例のようなエラーメッセージを発するようにしなさい。 実行例 1から9までの整数を入力:6 1 22 333 4444 55555 666666 55555 4444 333 22 1 1から9までの整数を入力:11 入力する数は1から9までです
>>627 #include <stdio.h>
int main(void)
{
int i, j, n;
printf("1から9までの整数を入力:");
scanf("%d", &n);
if(n < 1 || 9 < n) printf("入力する数は1から9までです\n");
else {
for(i=1; i<=n; i++) {
for(j=0; j<i; j++) putchar('0'+i);
putchar('\n');
}
for(i=n-1; i>=1; i--) {
for(j=0; j<i; j++) putchar('0'+i);
putchar('\n');
}
}
return 0;
}
[1] プログラミング演習課題 [2] 画像ファイル情報を表す構造体hBitmapは次の定義を持つ。 typedef struct{ char signature[7]; int width,height;//縦横のピクセル数 int pixels; //ピクセル情報 (0,0)(0,1)..(0,width-1),(1,0),(1,1),...,(1,width-1),...という風に並ぶ。エンディアンはビッグエンディアンとする }hBitmap; sigunatureには文字列"hBitmap"が終端の¥0を含めて格納されるものとする ピクセルは32ビットの色情報で上位8ビットは0 0~7ビットは赤 8~15ビットは青 16~23ビットは緑を表す。(各成分は256段階の色情報を 持つ) 2次元座標平面[-0.5,0.5]X[0.5,0.5]を大きさ600x600のビットマップに対応させ そこで次の不等式が作る領域を指定された色で塗りつぶした画像ファイルを 上記構造体をファイルにバイナリ保存する形で作成するプログラムを作れ (1)(x-0.25)^2+y^2<=0.5^2 (x+0.25)^2+y^2<=0.5^2 (2)x^2+(y-0.125)^2=0.01^2 (3)x^2+y^2=0.025^2 (4)x^2+(y+0.3)^2=0.03^2 (5)それ以外 (1)の塗りつぶし色 R=255 G=0 B=200 (2)の塗りつぶし色 R=255 G=0 B=180 (3)の塗りつぶし色 R=240 G=0 B=220 (4)の塗りつぶし色 R=180 G=180 B=180 (5)の塗りつぶし色 R=G=B=255 [3] OS:Windows Vista Home Edition IDE:Visual studio 2008 Express Edition 言語:C [4] 2010/05/20迄 [5] 板書写し間違いがあるかも知れませんがよろしくお願いいたします。
>>630 >sigunatureには文字列"hBitmap"が終端の\0を含めて格納されるものとする
なら
char signature[8];
でないと 終端の\0 分の器が足りない
>>630 int pixels; も int *pixels; だよね。
[1] プログラミング演習
[2]
5匹の羊と5匹の狼を1匹ずつひとつの檻に入れる。
羊の数を狼の数が超えると羊が食べられるのでNG。
上の条件で羊と狼を全頭檻に入れられる順番の組み合わせを全通り出力するプログラム。
他に方法はないのでしょうか?
[3] WinXP / GCC / C
[4] 明日まで
[5] 標準入出力 / ループ / if / 配列 / ポインタ / 自作関数くらいまで習いました。
http://brunhild.sakura.ne.jp/up/src/up443431.txt ↑を繰り返すくらいしか思いつきません。
例えば↓の順番に羊狼を檻に入れると常に狼の数が羊の数を上回らないからオッケー 羊→狼→羊→狼→羊→狼→羊→狼→羊→狼 ですが、↓の順番だと狼の数が羊の数を上回ってしまうためNG 羊→狼→狼 最小の例のような常に狼の数が羊の数を上回らない順番を全て出力するプログラムです
>>633 #include <stdio.h>
int is_ok(int value){
int i, sheep=0, wolf=0;
for(i=0;i<10;i++){
if((value>>i)&1) sheep++;
else wolf++;
if(wolf>sheep) return 0;
}
if(wolf!=5) return 0;
return 1;
}
void print_sequence(int value){
int i;
for(i=0;i<10;i++) printf("%s", ((value>>i)&1)?"羊":"狼");
printf("\n");
}
int main(void){
int i;
for(i=0;i<(1<<10);i++){
if(is_ok(i)){
print_sequence(i);
}
}
return 0;
}
>>633 #include <stdio.h>
#define SHEEP_NUM 5
#define WOLF_NUM 5
#define WHOLE_NUM ((SHEEP_NUM)+(WOLF_NUM))
void hoge(int buf[], int sheep, int wolf){
int i, whole;
whole=sheep+wolf;
if(whole>=WHOLE_NUM){
for(i=0;i<WHOLE_NUM;i++) printf("%s", buf[i]?"羊":"狼");
printf("\n");
return;
}
if(sheep<SHEEP_NUM){
buf[whole]=1;
hoge(buf, sheep+1, wolf);
}
if(wolf<sheep){
buf[whole]=0;
hoge(buf, sheep, wolf+1);
}
}
int main(void){
int buf[WHOLE_NUM];
hoge(buf, 0, 0);
return 0;
}
>>637 修正
if(wolf<sheep){
↓
if(wolf<sheep && wolf<WOLF_NUM){
狼羊貴貴貴貴貴貴貴貴
641 :
デフォルトの名無しさん :2010/05/13(木) 16:05:13
このスレの住民の方には楽勝かもしれませんがお願いします 場合の数を計算するときに、いわゆる「nCr」というものを使うことがある。これは、順番を特に決めない場合、n個のものからr個のものを取り出す場合をいい、 7C5 = 7! / (7-5)!5! である。nCrであれば nCr = n! / (n-r)!r! (但し、0≦r≦n) この数を計算したい。 1. nとrを入力させる。 2. n!を計算させる 3. (n-r)!を計算させる 4. r!を計算させる 5. (2)/(3)/(4)を計算する しかしn!と(n-r)!がかなりの部分まで重複することを利用すれば、かなり計算の手間を省くことができる 1から5の手順まで守ったプログラムと手間を省いたプログラムをそれぞれ作成しなさい
642 :
デフォルトの名無しさん :2010/05/13(木) 16:09:46
[1] 授業単元:ロボット制御 [2] 問題文: 3次元空間座標(x,y,z)の数値を与えると、 ロボットの関節の角度(A,B,C)を計算するプログラムを作成する。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 今週中にお願いします。 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) L1,L2はロボットの腕の長さでL1:69.8/L2:77.35が与えられています。 また、それぞれの変換公式は C= ±(プラスマイナス) arccos(((x^2+y^2+x^2)-(L1^2+L2^2))/(2*L1*L2)) B= arcsin(y/(L1+L2*cos(C))) A= arctan(x/(-z)) ±(マイナスプラス) arccos(((L1+L2*cos(C))*cos(B))/root(x^2+y^2)) で、ABCは動作幅が制限されています。 Cの動作幅は-30<= C <=127 [deg] Bの動作幅は-15<= B <=93 [deg] Aの動作幅は-120<= A <=135 [deg] 最初にCを出すと値がプラスマイナスの2種類が出るため、 条件に当てはまる最適値を選んでradに変換した上でBに代入して計算、 Bの値をAに代入した上で、出てきた二つの値から最適値を選んで 結果を出力するのだと思うのですが、どのような条件式を書けばよいのでしょうか? 最適値の選び出し方の動作アルゴリズムだけでも結構ですのでお願いします。
643 :
640 :2010/05/13(木) 16:58:03
// gcc -std=c99
>>633 #include <stdio.h>
int main(void){
short ans[]={
0x01F,0x02F,0x037,0x03B,0x03D,0x04F,0x057,0x05B,
0x05D,0x067,0x06B,0x06D,0x073,0x075,0x08F,0x097,
0x09B,0x09D,0x0A7,0x0AB,0x0AD,0x0B3,0x0B5,0x0C7,
0x0CB,0x0CD,0x0D3,0x0D5,0x10F,0x117,0x11B,0x11D,
0x127,0x12B,0x12D,0x133,0x135,0x147,0x14B,0x14D,
0x153,0x155,0x20F,0x217,0x21B,0x21D,0x227,0x22B,
0x22D,0x233,0x235,0x247,0x24B,0x24D,0x253,0x255};
for(int i=sizeof(ans)/sizeof(ans[0]); i>0; i--){
for(int j=1; j<=10; j++)
printf("%s",ans[i]&(1<<(10-j))?"狼":"羊");
puts("");
}
}
645 :
デフォルトの名無しさん :2010/05/13(木) 17:14:01
648 :
640 :2010/05/13(木) 17:19:01
>>643 修正
printf("%s",ans[i]&(1<<(10-j))?"狼":"羊");
↓
ans[i-1]
>>649 二個ある中のどっちか一つしか、次の式に入れられないので、
どちらか一つ正しいほうを選ぶ方法を教えてくれってことと解釈
まあ、数学嫌いなので関わる気はない。
>>646 プログラミングの要素がない。すれちがい、ではないかしらん?
>>651 すみません。でもやっていただけると嬉しいです。
>>652 見るだけができないってどうしちゃったの
654 :
630 :2010/05/13(木) 21:21:01
>>644 早々とやっていただけてありがとうございます。
ダウンロードしてテキストファイルに直して
コンパイルしたらエラーもなく動作しました。
hoge.datというファイルが出来ました。
どのような画像ファイルができているのか
見てみたいのですが、ダブルクリックしても
開けません。拡張子が対応していないみたいなので
拡張子を変えれば良いと思うのですが.bmpでは
駄目でした。どうすれば見れるのかも教えて
いただけるとうれしいです。
初等算数の問題にか回答が付かないw
ん?レスついてない問題あるか?
>>654 int hBitmap_save2(const char *filename, hBitmap *bmp)
{
// fprintf(fp, "P3\n%ld %ld\n%d\n", bmp->width, bmp->height, 255);
fprintf(fp, "P6\n%ld %ld\n%d\n", bmp->width, bmp->height, 255);
// fprintf(fp, " %ld %ld %ld", RED(col), GREEN(col), BLUE(col));
fprintf(fp, " %c%c%c", RED(col), GREEN(col), BLUE(col));
}
// hBitmap_save2("hoge.ppm", bmp);
hBitmap_save2("hoge.ppm", bmp);
// fprintf(fp, " %ld %ld %ld", RED(col), GREEN(col), BLUE(col)); fprintf(fp, "%c%c%c", RED(col), GREEN(col), BLUE(col));
題意を把握していないw
>>661 そですかね。掛け算を足し算に変えたんですけど、これってやっぱり「計算の手間を省いた」ことにはならないんですかね。
>しかしn!と(n-r)!がかなりの部分まで重複することを利用すれば、かなり計算の手間を省くことができる この文章からどうして足し算が出てくるのか理解できない
たとえば n=10, r=4 のとき n! = 10*9*8*7*6*5*4*3*2*1 (n-r)! = 6*5*4*3*2*1 なので n!/(n-r)! = 10*9*8*7 てことだろ
666 :
630 :2010/05/14(金) 07:57:08
>>657 ,658
ありがとうございます。
ただ意図が私にはよくわかりませんでしたので
解説して頂ければ幸いです
671 :
630 :2010/05/14(金) 12:11:44
>>670 頂いたソースコードに//をつけてから追加記入でよろしいでしょうか?
次のプログラムを作成して実行し,下に示されている変更を加えよ。 #include <stdio.h> int main() { int i = 0xffffffff; printf("%d\n%u\n%le\n",i,i, 0x3ff0000000000000); return 0; } 0xff・・・を「符号付整数の最小値(絶対値が最大の負の数)を表すビットパターン」 0x3f・・・を「絶対値が同じで符合の異なる倍精度実数」 に書き換え,結果を確かめよ。 これがわからない;; もしよかったら回答求む!
>>672 >0xff・・・を「符号付整数の最小値(絶対値が最大の負の数)を表すビットパターン」
0x80000000
>0x3f・・・を「絶対値が同じで符合の異なる倍精度実数」
0xbff0000000000000
674 :
デフォルトの名無しさん :2010/05/14(金) 13:16:17
符号付整数は2の補数表現 倍精度実数は IEEE 754 でよければ #include <stdio.h> int main() { int i = 0x80000000; // <- ffffffff printf("%d\n%u\n%le\n",i,i, 0xbff0000000000000); // <- 3ff0000000000000 return 0; }
676 :
657 :2010/05/14(金) 14:11:03
diff してみた。 @@ -90 +90 @@ - fprintf(fp, "P3\n%ld %ld\n%d\n", bmp->width, bmp->height, 255); + fprintf(fp, "P6\n%ld %ld\n%d\n", bmp->width, bmp->height, 255); @@ -96 +96 @@ - fprintf(fp, " %ld %ld %ld", RED(col), GREEN(col), BLUE(col)); + fprintf(fp, "%c%c%c", RED(col), GREEN(col), BLUE(col)); @@ -171 +171 @@ -// hBitmap_save2("hoge.ppm", bmp); + hBitmap_save2("hoge.ppm", bmp);
677 :
630 :2010/05/14(金) 14:44:34
ソースをいじってみたのですが 案の定エラーがででてしまいました。 Line90:(が必要とか Line90:,が必要とか です。 これはなんとか直せそうなのですが 直したら別の場所で同じようなエラーが...
>>677 いじったソース貼ってみ?
多分すごいことやってんでしょ
679 :
630 :2010/05/14(金) 18:13:51
今日のところは時間切れなので帰ります。 出来上がりの画像をみてみたいのですが残念です。
680 :
◆UJgUFCVXlA :2010/05/14(金) 19:07:15
[1] 制御工学 [2] 問題文:dy/dx=(1-y)/15の微分方程式をルンゲクッタ法を用いてx=0〜100までの値を求めよ。 [3] [3.1] OS:windouwsXP [3.2] コンパイラ名とバージョン: Fujitsu Fortran & C Academic Package V3.0 L10 [3.3] 言語:C [4] 期限: 5/19 17:00まで [5] その他の制限:初期値は0で、刻み幅は任意です。 コード、計算結果をプリントして提出、また計算結果をグラフにして提出しなければならないので、ファイル形式で保存できるようにして欲しいです。 プログラミングの授業ではないのに急に出されて困っています。 よろしくお願い致します。
681 :
デフォルトの名無しさん :2010/05/14(金) 22:52:44
[1] 授業単元: プログラム [2] 問題文(含コード&リンク): 以下のようにプログラムを作成してください。バブルソートという名前です 0に34 1に3 2に11 3に28 4に17が入っています。 (1)0番と1番の値を比べ、0番が大きいなら、入れ替える→(2)順に1番と2番、2番と3番…と比べて、(1)と同様の処理を行う→(3)端まで行ったら0番に戻って、n-1番までで(1)と(2)を繰り返す(ここの例ではn=4) [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: g++ [3.3] 言語: C++ [4] 期限: [2010年5月14日まで] [5] その他の制限:なるべく簡単にしてください。swap関数を使います。 最初は #include <iostream> using namespace std;で始まります 出力はcout 入力はcinです
684 :
デフォルトの名無しさん :2010/05/14(金) 23:38:08
685 :
デフォルトの名無しさん :2010/05/14(金) 23:47:40
686 :
デフォルトの名無しさん :2010/05/14(金) 23:51:51
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): 配列を用いて連立一次方程式を解くプログラムを実装し、以下の連立一次方程式の解を求めなさい。 a + 2b -5c + 4d = 2 2a - 4b + 2c + 3d = 18 4a + 15b - 32c + 3d = -116 5a + 15b - 32c + d = -129 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2010年5月19日まで [5] その他の制限:特になし よろしくお願いします。
687 :
デフォルトの名無しさん :2010/05/15(土) 00:37:12
ポインタの中身を見るほうの*演算子(?)ってオーバーロードできまするか?
>>686 #include <stdio.h>
int main(void)
{
double array[4][5] = {{1,2,-5,4,2},{2,-4,2,3,18},{4,15,-32,3,-116},{5,15,-32,1,-129}};
int i, j, k;
for(i=0; i<4; i++) {
double r = array[i][i];
for(j=i; j<5; j++) array[i][j] /= r;
for(j=0; j<4; j++) {
if(i==j) continue;
r = array[j][i];
for(k=i; k<5; k++) array[j][k] -= r * array[i][k];
}}
for(i=0; i<4; i++) printf("%c = %f\n", 'a' + i, array[i][4]);
return 0;
}
690 :
デフォルトの名無しさん :2010/05/15(土) 06:40:47
return list_size(head->next) + 1;
>>690 return 1+list_size(head->next);
693 :
683 :2010/05/15(土) 07:48:48
>>689 どこがまずいのかよくわかりません。plz kwsk
ちゃんと問題文を読んでない バブルソートが何か理解してない
どこがまずいのかよくわかりません。plz kwsk #include <iostream> using namespace std; int main() { int a[] = {34, 3, 11, 28, 17}; int N = sizeof(a) / sizeof(int) - 1; unsigned int i, j; for (i = 0; i < N; i++) for (j = N - 1; j >= i ; j--) if (a[j] > a[j + 1]) swap(a[j], a[j + 1]); for (i = 0; i <= N; i++) cout << a[i] << ", "; cout << endl; return 0; }
>>696 #include <iostream>
#include <vector>
using namespace std;
int main()
{
int a[] = {34, 3, 11, 28, 17};
const int N = 5;
int i, j;
for (i=N;i>0;--i){
for (j = 0; j < N -1 ; ++j){
if (a[j] > a[j + 1]){
swap(a[j], a[j + 1]);
}
}
}
for (i = 0; i < N; i++) {
cout << a[i] << ", ";
}
cout << endl;
return 0;
}
//まずはじめに0番と1番を比べて…
700 :
681 :2010/05/15(土) 15:30:58
なんか計算時間の話で 0(N^2) 0(NlogN)とかを話していました
>>700 前者は選択ソート
後者はマージソートもしくはクイックソート
for(i=n-1; i > 0; i--) { for(j=0; j<i; j++) { if(a[j] > a[j+1]) swap(a[j], a[j+1]); }}
704 :
683 :2010/05/15(土) 19:14:06
705 :
683 :2010/05/15(土) 19:16:59
>>696 正確には
for (i = 0; i < N - 1; i++)
for (j = N - 1; j >= i ; j--)
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
一回余分
バブルソートはループするごとに比較する列が短くなってくんだよw
>>697 どこが「問題文をよくよめ」という判断になるのか plz
>>699 >for (i=N;i>0;--i){
一回多い。
>>703 若干改良がなされているが、それでもオーダーは Ο(N^2)
712 :
681 :2010/05/15(土) 19:29:28
結果的にどれが正解なんでしょうか…
>>709 >>681 >0番と1番の値を比べ、0番が大きいなら、入れ替える
>>696 >if (a[j] > a[j + 1])
比較の向きはあっている。
>>711 そこも読み違えてる気がする。
一つずつ短くなるのは必須で交換されなかった場合に一つ以上短くしなくてもいいってだけだろ
>>713 まずはじめに3番と4番を比べてしまっているという意味で逆
>>713 向きってのは0と1から比較して添え字の大きいほうに向かうって意味で使ってる。
717 :
683 :2010/05/15(土) 19:34:39
>>712 >>683 を書いた私としては、どうも根拠のない意味不明の物言いがはいってきている、とは感じているのですが、
最終的にはご自分で判断するしかないですね。
>>683 提出して減点されればいいと思うよw
あと、◆QZaw55cn4c
トリつけるんなら全部につけてくれ
>>719 >「比較回数」は、高々n(n-1)/2回。
>>719 >確定していない部分について1つずつ減らしながら繰り返す。
>>719 その1文しか読んでないの?
もう少し後まで読もうぜ
少なくともサンプルコードぐらいまではなw
>for each j in 2 to length(A) - i + 1 do:
なんでiを引いてるか理解できてるか?
724 :
696 :2010/05/15(土) 20:07:27
>>705 サンクス
(1)0番と1番の値を比べ、0番が大きいなら、入れ替える
→(2)順に1番と2番、2番と3番…と比べて、(1)と同様の処理を行う
→(3)端まで行ったら0番に戻って、n-1番までで(1)と(2)を繰り返す(ここの例ではn=4)
>>683 →(3)端まで行ったら0番に戻って、"n"番までで(1)と(2)を繰り返す(ここの例ではn=4)
>>724 unsigned int だと無限ループしないか?
>>723 んー、たしかに短くしてますねえ。これは大変失礼いたしました。
お前は二度とくるな
wikiすらまともに読めないヤツが他人の宿題を解こうなんて無茶すぎるw
>>728 #include <iostream>
using namespace std;
int main() {
int a[] = {34, 3, 11, 28, 17};
unsigned int i, j;
for (i = 0; i < sizeof(a) / sizeof(int) - 1 - 1; i++)
for (j = 0; j < sizeof(a) / sizeof(int) - 1 - i; j++)
if (a[j] > a[j + 1])
swap(a[j], a[j + 1]);
for (i = 0; i < sizeof(a) / sizeof(int); i++)
cout << a[i] << ", ";
cout << endl;
return 0;
}
/* end */
forだとややこしくなるからこれは? n=sizeob(a)/sizeof(int)-1; while (n) { for (i=0;i<n;i++) if (a[i]>a[i+1])swap(a[i],a[i+1]); n--; }
なんでバブルソートでこんなに伸びてんだよw
お前ら、普段からqsort()やstd::sort()に頼ってばっかりで バブルソート様を使ってないだろ
ソートすら使ってない list_for_eachでごりごり探すコードしか見てないなあ
740 :
デフォルトの名無しさん :2010/05/16(日) 17:13:37
[1]プログラミング演習 [2]asciiコード表を出力しなさい。(main関数、プロトタイプ宣言、関数定義を全て書くこと。) [3]windowsでコンパイラはborland C++ 5.5.1、C言語です。 [4]火曜日まで よろしくお願いします。
//n!の階乗を出力
>>745 これがモジュール化できた状態なんでしょうか?
配列を使うことが条件となっているのでよろしくお願いします
[1] 授業単元:プログラミング演習
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々) Linux
[3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc3.4
[3.3] 言語: (C/C++/どちらでも可 のいずれか) C
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 5月19日
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはい 特にありません
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10604.txt 問題文はこちらになります。わたしなりに頑張ったのですが、できませんでした。どうかよろしくおねがいします。
>>749 無駄な入れ替えとか、引数名がi,jとか、配列とnをグローバルにするっぽいとことか、
なんか気持ち悪くてやるきになれない。
751 :
681 :2010/05/16(日) 21:03:42
#include <iostream> using namespace std; void swap(int &a); int main() { int a[5]={34,3,11,28,17}; この続きからお願いできないでしょうか…
752 :
デフォルトの名無しさん :2010/05/16(日) 21:47:03
[1] 授業単元: プログラム [2] 問題文(含コード&リンク): 掃き出し法で下の連立方程式を解くプログラムを作成してください 3x+y+z=10 x+5y+2z=2 x+2y+5z=30 [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: g++ [3.3] 言語: C++ [4] 期限: [2010年5月17日まで] [5] その他の制限:なるべく簡単にしてください。swap関数とか配列とかその辺りを使います。 最初は #include <iostream> using namespace std;で始まります 出力はcout 入力はcinです
>>751 そんなに制約が厳しいのか
わけのわからん宿題だな
>>754 一応 g++ (MinGW) ならこれで一つ後ろの要素と交換できた
void swap(int &a)
{
int *p=&a+1 ,temp;
temp=a;
a=*p;
*p=temp;
}
757 :
デフォルトの名無しさん :2010/05/16(日) 23:58:28
>>756 その発想はなかった
みんな面白いこと考えるなぁ
>>760 return car(head) + sum(cdr(head));
[1] 授業単元: プログラミング実習2
[2] 問題文(含コード&リンク):
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10606.txt [3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: (gcc )
[3.3] 言語: (C言語)
[4] 期限: (5月18日)
[5] その他の制限: この課題で要求されていることは、一見しただけでは単に与えられた計算
式に従って計算することだけの様にも見えるが、E≠128の時は計算結果を保持した変数
の内部のビット列が入力したビット列と一致することも要求されている。この要求を満た
すためには、計算のために用意する変数のデータ型を適切に選ばなければならないし、ま
た、誤差が発生しない計算方法を選ばなければならない。例えば、数字関数は色々な引数
に対してある程度の精度の計算結果を保証してくれるものであるが、計算結果が内部で誤
差無しで表せる場合に実際に誤差無しの計算結果をもたらすことを保証するものではな
い.そういう理由で、計算にはpow(,)等の数学関数は使うべきではない。だそうです。
自分ではできませんでした。よろしくお願いいたします。
[1]プログラムU [2]要素数nの実数型配列cの要素全てにaを入力する関数void value(double v,int n,double x);を定義せよ。 [3] 環境 [3.1] OS: (Windows/Linux/等々) Windous [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4] 期限:19日 頼みます
void value(double *c, int n, double a) { while(n--) *c++ = a; }
>>765 #include <stdio.h>
#include <stdlib.h>
int main()
{
int i, j, d, x;
printf("長さが32の0と1の列を入力せよ.\n");
for (j = 0; j < 32; j++) {
scanf("%1d", &d);
if (d != 0 && d != 1) {
printf("0と1以外の文字があった.\n");
abort();
}
x = (x << 1) | d;
}
printf("16進表現: %08x\n", x);
printf("実数値: %g\n", *(float*)&x);
return 0;
}
あ i 使ってないやw
#include <stdio.h> int main(void) { union { float dataf; unsigned int datai; } d; int i; char in[32+1+1]; while(1){ puts("1と0を32個入力してください。"); puts("SEEEEEEEEDDDDDDDDDDDDDDDDDDDDDDD"); fgets(in, 32+1+1, stdin); in[32] = '\0'; for(i=0; i<32; i++) in[i] = (in[i] & 1) | '0'; /*12345678901234567890123456789012*/ puts(in); d.datai = 0; for(i=0; i<32; i++) { d.datai = (d.datai << 1) | (in[i] & 1); } if( ((d.datai >> 23) & 0xFF) == 0xFF) { /* & で、符号を取る */ if( (d.datai & 0x7FFFFF) == 0) puts("Inf"); else puts("NaN"); } else printf("%08X\n%.10e\n", d.datai, d.dataf); } }
771 :
デフォルトの名無しさん :2010/05/17(月) 23:44:35
[1] C言語演習 [2] n科目の点数を入力してGPAを出す(100~90が4,80~89は3,70~79は2,60~69は 1,60以下は0) [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:5月17日 27:00まで [5] その他の制限:特に無し
#include <stdio.h> int main(void) { int i, n, temp; double gpa = 0.0; scanf("%d", &n); for(i=0; i<n; i++) { scanf("%d", &temp); if(temp >= 90) gpa += 4; else if(temp >= 80) gpa += 3; else if(temp >= 70) gpa += 2; else if(temp >= 60) gpa += 1; } printf("%.2f\n", gpa / n); return 0; }
773 :
デフォルトの名無しさん :2010/05/17(月) 23:54:55
[1] 授業単元: 映像メディア処理 [2] 問題文(含コード&リンク): 入力した画像を3〜16値階調にする多値ディザ法のプログラムを作りなさい。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: BCC5.5.1 [3.3] 言語: C言語 [4] 期限: 5月22日正午 [5] その他の制限: グレースケールの画像をロードし、image_in[256][256]という配列に保存してあります。 これに多値ディザ法を適用し、image_out[256][256]に出力させたいです。 ロード部分は問題無いので、多値ディザ法を行う部分をお願いします。
[1] プログラミング応用1
[2] 問題文(含コード&リンク):
http://water.eit.hirosaki-u.ac.jp/~slmizu/pa2010/ ハノイの塔を解くプログラムの時間計算量と空間計算量を調べる
* 時間計算量、空間計算量をそれぞれ、while ループの実行回数、プログラムが実際に使用するスタックのサイズとして求める。
* 上記二つの量を円盤の枚数毎に求め、横軸に円盤枚数(1-30)をとって図にプロットする。
[3] 環境
[3.1] linux
[3.2] gcc
[3.3] C言語
[4] 2010年5月24日(月)
[5]なし
よろしくお願いします
779 :
774 :2010/05/18(火) 22:39:42
>>774 誤差拡散
int x, y, a, b, c, d, level_num, max;
level_num=3; // 3値階調の場合 level_num=3
max=level_num-1;
for(y=0;y<256;y++)
{
d=255/2/max;
for(x=0;x<256;x++)
{
a=image_in[y][x]+d;
b=a*max/255;
c=b*255/max;
image_out[y][x]=c;
d=a-c;
}
}
782 :
774 :2010/05/19(水) 07:39:02
>>780 ありがとうございます。
これ、まともな内容ですか?
3年開講のこの科目でコンパイラのインストール方法からコンパイル・実行方法
を何周かにかけて説明するようなレベルですから。
>>782 内容ほとんど見てないけど、ちゃんと作ってるにおいがするよ
授業のレベルは超えているかもね
5桁の整数のそれぞれの桁の数を配列にいれるにはどうすればいいんでしょう 例えば13578という整数だと a[0]=8,a[1]=7,・・・,a[4]=1という感じにしたいのです よろしくお願いします
int n = 13578; for(i=0; i<5; i++, n/=10) a[i] = n % 10;
sprintf
へぇ、sprintfだけで逆順にすることできるんだ
sprintf 使って無理やりやるとこんな感じかね #include <stdio.h> int main() { int i, a[5], n = 13578; char buf[6]; sprintf(buf, "%d", n); sscanf(buf, "%1d%1d%1d%1d%1d", a+4, a+3, a+2, a+1, a); for (i = 0; i < 5; i++) printf("a[%d]=%d\n", i, a[i]); return 0; }
ああ、逆順かすまん
reverse(a, a+5);
おえええええ
793 :
デフォルトの名無しさん :2010/05/19(水) 22:31:39
早急にって書かれるとやる気無くすなあ
795 :
デフォルトの名無しさん :2010/05/19(水) 22:36:48
>>685 です。
ポインタなどは習っていないため、できるだけ簡単に、もう一度お願いしたいです。
配列は使ってください。
急いでいますので、わがまま言ってすみませんが、よろしくお願いします。
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
で直してみたが 配列? #include <stdio.h> int main() { int n = 0; double a, b; double x, y; double sum_xy = 0.0, sum_x = 0.0, sum_y = 0.0, sum_x2 = 0.0; for (;;) { if (scanf("%lf %lf", &x, &y) != 2) break; printf("%.2f %.3f\n", x, y); sum_xy += x * y; sum_x += x; sum_y += y; sum_x2 += x * x; n++; } a = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x); b = (sum_x2 * sum_y - sum_xy * sum_x) / (n * sum_x2 - sum_x * sum_x); printf("a = %f\n", a); printf("b = %f\n", b); return 0; }
>>798 こんな感じじゃないかな。
#include <stdio.h>
int main() {
int n = 0;
double a, b;
double x, y;
double sum_xy = 0.0, sum_x = 0.0, sum_y = 0.0, sum_x2 = 0.0;
char in_fmt[] = "%lf %lf";
char out_fmt[] = "%.2f %.3f\n";
for (;;) {
if (scanf(in_fmt, &x, &y) != 2) break;
printf(out_fmt, x, y);
sum_xy += x * y;
sum_x += x;
sum_y += y;
sum_x2 += x * x;
n++;
}
a = (n * sum_xy - sum_x * sum_y) / (n * sum_x2 - sum_x * sum_x);
b = (sum_x2 * sum_y - sum_xy * sum_x) / (n * sum_x2 - sum_x * sum_x);
printf("a = %f\n", a);
printf("b = %f\n", b);
return 0;
}
ワロタ
801 :
デフォルトの名無しさん :2010/05/20(木) 01:21:05
[1] 授業単元:プログラミング演習 [2] 問題文: テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 実行例 84 <--キーボードから点数入力 84点 <--入力した点数を表示 95 95点 48 48点 66 66点 80 80点 999 <--データの終わり(999点とは表示しない) 合計点=373点 平均点=74.6点 受験者数=5名 合格者数=4名 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [4]期限:20日8:10 突然ながらおねがいします。
803 :
デフォルトの名無しさん :2010/05/20(木) 07:01:49
すみません、
>>685 お願いします。なるべく簡単にお願いします。
804 :
デフォルトの名無しさん :2010/05/20(木) 07:48:33
806 :
805 :2010/05/20(木) 10:07:48
偏差値はこうだろ sd_t = sqrt(sum_tt/n); for(i=0; i<n; i++) { printf("%f\n", (data[T][i] - ave_t) / sd_t * 10 + 50); }
>>802 それCになってないぞ
C++になってる
Cは変数の宣言を文の途中に書けない
お前は何を言ってるんだ?
C99
>>807 ローカルな話はどうでもいいだろ
普通のCでOKならそれでいいじゃん
Mingw gcc -std=c89
ブロックの途中かな
814 :
812 :2010/05/20(木) 14:29:22
Microsoft VC++ CL /TP にするしかない
816 :
805 :2010/05/20(木) 18:47:29
>>702 h+=sqrt(pow(avr-k,2.0));
↓
h+=(avr-k)*(avr-k);
818 :
デフォルトの名無しさん :2010/05/20(木) 19:49:45
[1] 授業単元:ソフトウェア演習 [2] 問題文(含コード&リンク): 直角三角形の3辺a,b,cのa,bの長さが与えられたときCの長さを返す関数のプログラム、 角度0〜180の値を与えるラジアンに変換した値、sinの値、cosの値を返す関数のプログラムをひとつのプログラムで行う。 π=3.141592 [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: \C [4] 期限: 月曜日まで [5] その他の制限:値は標準入力から出力、関数からの戻り値を標準出力に出力
>>818 斜辺は c ですか?
sinθ, cosθ のθはどの角ですか?
¥Cは角度 #include <stdio.h> #include <math.h> int main(void) { double a, b, c1, c2; printf("直角三角形の2辺の長さを入力\nInput a b = "); scanf("%lf %lf", &a, &b); c1 = sqrt(a*a + b*b); c2 = sqrt(fabs(a*a - b*b)); printf("直角三角形のもう1辺の長さ = %f, %f\n", c1, c2); }
821 :
デフォルトの名無しさん :2010/05/20(木) 21:33:31
>>819 Cは斜辺です。
どの角という指定はないです。
でも0〜180の指定はあります。
>>820 ありがとうございます。
#include <stdio.h> #define ROW 3 #define COLUMN 4 int main(void) { double a[ROW][COLUMN]; int i, j; printf("%d行%d列の行列の各要素を入力してもらいます\n", ROW, COLUMN); for ( i = 0 ; i < ROW ; i++) { printf("第%d行の要素を入力して下さい>>>", i+1); for ( j = 0 ; j < COLUMN ; j++) { scanf("%lf", &a[i][j]); } } printf("各要素の値は次の通りです\n"); for ( i = 0 ; i < ROW ; i++) { for ( j = 0 ; j < COLUMN ; j++) { printf("a[%d][%d]=%f\t", i+1, j+1, a[i][j]); } printf("\n"); } return 0; }
#include <stdio.h> #define ROW 3 #define COLUMN 3 int main(void) { double a[ROW][COLUMN]={ {1, 2, 3}, {5, 6, 7}, {9, 10, 11} }; double b[ROW][COLUMN]={ {1.1, 2.2, 3.3}, {5.5, 6.6, 7.7}, {10.1, 11.1, 12.2} }; double c[ROW][COLUMN]; int i, j; printf("行列Aと行列Bの和は次の通りです\n"); for ( i = 0 ; i < ROW ; i++) { for ( j = 0 ; j < COLUMN ; j++) { c[i][j] = a[i][j] + b[i][j]; printf("%8.3f", c[i][j]); } printf("\n"); } return 0; } *************************************************************** 上の2つのプログラムを参考にして、N×N行列AとBをキーボードから入力し、行列A、行列B、及び行列AとBの積ABを出力するプログラムを作成する よろしくお願いしますorz
825 :
820 :2010/05/20(木) 22:44:50
前の続き if(c1 != 0.0) { printf("\n%f, %f, 斜辺=%f の時の\n", a, b, c1); printf("sinθ, cosθ=%f, %f\n", a/c1, b/c1); printf("角度=%f, %f [rad]\n", asin(a/c1), acos(a/c1)); } if(a > b) { if(a != 0.0) { printf("\n斜辺=%f, %f, %f の時の\n", a, b, c2); printf("sinθ, cosθ=%f, %f\n", b/a, c2/a); printf("角度=%f, %f [rad]\n", asin(b/a), acos(b/a)); } } else { if(b != 0.0) { printf("\n%f, 斜辺=%f, %f の時の\n", a, b, c2); printf("sinθ, cosθ=%f, %f\n", c2/b, a/b); printf("角度=%f, %f [rad]\n", asin(c2/b), acos(c2/b)); } }
826 :
◆UJgUFCVXlA :2010/05/21(金) 03:24:31
f(x+y)=f(x)+f(y) と、x≠yならばf(x)≠f(y)を満たす関数で ある4点 a,b,c,dを選べば f(a) < f(b) (a< b) かつ f(c) > f(d) (c< d)が成り立つ 関数って存在するのか。
>>827 大雑把な議論だが
f(x + y) ≡ f(x) + f(y) ... (1)
の両辺を x で微分する。
f'(x + y) * 1 ≡ f'(x) (for any x and y)
すなわち、f'(x) は定数。ここで
f(x) = a * x + C
とおいて (1) に代入すると
C = 0
すなわち
f(x) = a * x (a ≠ 0)
ゆえに
f(a) < f(b) (a < b) (for any a , b)
だから、
>>827 のような関数は存在しない。
どんな構造の群でも無理なの? 順序も樹序の公理はみたす範囲で自由に付けられるとして。
f(x+h)=f(x)+f(h) f(x+h)-f(h)=f(x) lim(f(x+h)-f(h))/h =limf(x)/h f'(x)=0 とした方がよさげ。
まちがえました。
f(x+h)=f(x)+f(h) f(x+h)-f(x)=f(h) lim(f(x+h)-f(x))/h =limf(h)/h f'(x) = ∞ ? or f(x)=0 へんなの出た。
作れるのだがハメルーンの笛吹き
で正解は? あるのかないのか。 微分可能ではない任意の群でも作れないの
Z/(n)にしとけばよさげ。順序が成立しているのかは不明だが。
ACを使う世界は完全にスレ違い
837 :
デフォルトの名無しさん :2010/05/21(金) 20:53:15
大学の課題です。何度修正してコンパイルしてもエラーになります。教えてください。 問題:キーボードから三個の値x[0]、x[1]、x[2]を入力する。 キーボードからyの値を入力する。 x[0]、x[1]、x[2]の中にyと同じ値があれば『○』と出力し、なければ『×』と表示する。 一応自分ではこんなプログラムコードを作ってみました。 #include<stdio.h> int main(void){ int x[3]; int i; for (i=0;i<=2;i=i+1){ printf("xを入力してください\n"); scanf("%d",&x[i]); } printf("yを入力してください\n"); scanf("%d",&y); if(x[0]==y || x[1]==y || x[2]==y) then{ printf("○\n");} else{ printf("×\n"); } return 0; }
[1] 授業単元:応用情報プログラミング [2] 問題文(含コード&リンク): ・main関数で三つのint型変数a,b,cを宣言し、キーボードでから値を入力せよ。 ・そして三つの変数を大きい順に入れ替える関数sortingを作成せよ。 ・関数sortingは変数a,b,cのアドレスを引数として受け取ること。返却値は持たない。 ・関数sorting内では、2つの変数の大きさを比べ、値を入れ替えるためのint型変数tmpを宣言すること。 ・値の大きさの比較は,aとb、aとc、bとcの三回行う。 [3] 環境 [3.1] OS: WindowsXP [3.2] Microsoft Visual stadio 2008 [3.3] 言語:C言語 [4] 期限:明日の土曜日まで [5] その他の制限:プログラミングを授業で受けて二年目です。ポインタの授業の宿題です。
>>837 int y; の定義が抜けている。
then はいらないので、if(){ でよい。
入力された値が素数かどうかを調べるプログラムを作りたい 入力された値xを2から√xまで順番に割って全てにおいて余りが出たらxは素数 というところまではわかった このとき√xは小数点以下切捨て 問題はルートをどうやって表現するか for(i = 2 ; i <= √x ; i++)なんて書き方無いよな どうすりゃいいの?
842 :
デフォルトの名無しさん :2010/05/21(金) 21:08:39
[1] 授業単元:自学 [2] 問題文(含コード&リンク):擬似乱数を用いて大吉(excellent luck)中吉(good luck)吉(good luck)凶(bad luck)大凶(worst luck)を出力し それぞれの項目のコード4,3,2,1,0を返す関数fortune()を作成せよ ただしそれぞれの項目が現れる確立は順に5.0,20.0,50.0,20.0,5.0%とする。 またこの関数を用いて2000回のサンプリングを行ったときそれぞれの項目の出現割合を出力するプログラムを作成し上記の割合とほぼ同じ値が得られていることを検証せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:6/1まで [5] その他の制限 自学なのでコメントをつけていただけるとうれしいです。よろしくお願いします。
843 :
デフォルトの名無しさん :2010/05/21(金) 21:08:57
>>839 >>840 コンパイルできました。ありがとうございます。
参考書などでは then を記載するように書かれているのですが。。
何の参考書だそりゃw
>>843 その教科書を晒してください。amazon の書評に書いておきます。
thenって、禅問答でもするつもりかあ
#define then
852 :
デフォルトの名無しさん :2010/05/21(金) 21:42:40
[1] 授業単元: プログラム [2] 問題文(含コード&リンク): 掃き出し法で下の連立方程式を解くプログラムを作成してください 3x+y+z=10 x+5y+2z=21 x+2y+5z=30 [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: g++ [3.3] 言語: C++ [4] 期限: [2010年5月22日まで] [5] その他の制限:なるべく簡単にしてください。関数に多次元配列を渡すとかその辺りを使います。 最初は #include <iostream> using namespace std;で始まります(もしかしたらdefineが入るかもしれません) 出力はcout 入力はcinです
>>842 #include <stdio.h>
#include <stdlib.h>
int fortune(void){
int ran = rand()/(RAND_MAX/20);
if(ran<1) {puts("大吉(excellent luck)"); return 4;} /* 5% */
else if(ran<5) {puts("中吉(good luck)"); return 3;} /* 20% */
else if(ran<15) {puts("吉(good luck)"); return 2;} /* 50% */
else if(ran<19) {puts("凶(bad luck)"); return 1;} /* 20% */
else {puts("大凶(worst luck)"); return 0;} /* 5% */
}
#define N_MAX 2000
int main(void){
int i, data[5]={0};
srand(time(0));
for(i=0;i<N_MAX;i++)
data[fortune()]++;
for(i=0;i<5;i++)
printf("%d %d %.1f%%\n", i, data[i], 100.*data[i]/N_MAX );
return 0;
}
855 :
デフォルトの名無しさん :2010/05/21(金) 23:00:41
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): 2×2行列Aと二次元ベクトルxとの積Axを計算する関数linear_trans()を実装しなさい。ただし、関数linear_trans()は以下のような仕様とする。 void linear_trans(double matA [2][2], double vecx[2], double vecy[2]) { /*matA × vecx = vecy を実装*/ } [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2010年5月25日まで] [5] その他の制限:ポインタは習っていません。
856 :
デフォルトの名無しさん :2010/05/21(金) 23:06:03
[1] 授業単元: プログラム演習 [2] 問題文(含コード&リンク): 三角形の三つの辺の長さを引数とし、内角の大きさを返す関数を実装しなさい。 さらに、その関数を用いて、三角形の三つの点の座標(x座標, y座標)を入力し、それらの点が作る三角形のすべての内角の角度を計算するプログラムを実装しなさい。 計算結果の角度の表示は必ずmain()関数の中で行われなければならないとする。 [3] 環境[3.1] OS: linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [2010年5月25日まで] [5] その他の制限:ポインタは習っていません。なるべく簡単にお願いします。
>>855 行列の積ってよく覚えてないんだけど
y0 = matA00*x0 + matA10*x1;
y1 = matA01*x0 + matA11*x1;
こういう計算するんだっけ?
>>855 #include <stdio.h>
#define COLUMN 2
int main(void) { int i, j, k;
double a[COLUMN][COLUMN], b[COLUMN], c[COLUMN];
printf("%d行%d列の行列Aの各要素を入力してもらいます\n", COLUMN, COLUMN );
for ( i = 0 ; i < COLUMN ; i++) {
printf("第%d行の要素を入力して下さい>>>", i+1);
for ( j = 0 ; j < COLUMN ; j++)
scanf("%lf", &a[i][j]);
}
printf("各要素の値は次の通りです\n");
for ( i = 0 ; i < COLUMN ; i++) {
for ( j = 0 ; j < COLUMN ; j++)
printf("A[%d][%d]=%f\t", i+1, j+1, a[i][j]);
printf("\n");
}
printf("%d行のベクトルBの各要素を入力してもらいます\n", COLUMN );
for ( i = 0 ; i < COLUMN ; i++) {
printf("第%d行の要素を入力して下さい>>>", i+1);
scanf("%lf", &b[i]);
}
printf("各要素の値は次の通りです\n");
for ( i = 0 ; i < COLUMN ; i++)
printf("B[%d]=%f\n", i+1, b[i]);
printf("行列AとベクトルBの積は次の通りです\n");
for ( i = 0 ; i < COLUMN ; i++) {
c[i] = 0.0;
for ( k = 0 ; k < COLUMN ; k++)
c[i] += a[i][k] * b[k];
printf("%8.3f\n", c[i]);
}
}
>>856 double CalcAngleFromThreeEdges(double a, double b, double c)
{
return acos((b*b+c*c-a*a)/(2*b*c));
}
860 :
858 :2010/05/21(金) 23:55:42
よく見たら関数だった
>>855 void linear_trans(double matA [2][2], double vecx[2], double vecy[2])
{
vecy[0] = matA[0][0] * vecx[0] + matA[0][1] * vecx[1];
vecy[1] = matA[1][0] * vecx[0] + matA[1][1] * vecx[1];
}
行と列がどっちにはいってるかわからないと解けなくね
最後の角は2PIから引けばいーのに
2PIじゃないPIだな
866 :
デフォルトの名無しさん :2010/05/22(土) 14:52:34
大学のC言語の課題です。教えてください。 問題:3人の成績を入力すると最高点を出力するプログラムを作りましょう。 自分ではこの辺まで分かったのですが、最高点というものをどう処理したらいいのでしょうか。 int score[5]; int i; int max_score; max_score = 0; for(i=0; i<=4; i=i+1){ printf("成績を入力してください。\n"); scanf("%d",&score[i]); }
なんで3人なのに5個入力するの?
868 :
デフォルトの名無しさん :2010/05/22(土) 15:15:30
int max_score = 0; : if(max_score < score[i]) max_score = score[i]; :
#include <stdio.h> int main(void) { int score; int i; int max_score=0; for(i=0; i<3; ++i){ printf("成績を入力してください。\n"); scanf("%d",&score); if(max_score < score){ max_score = score; } } printf("最高点:%d\n",max_score); return 0; } //最高点出すだけなら配列使わなくて大丈夫
871 :
デフォルトの名無しさん :2010/05/22(土) 15:27:21
学校のC言語のレポート課題なんですが、少し知恵を分けてください。 問題:5個の値を入力してその中にひとつでも偶数があれば『偶』、奇数しかなければ『奇』と出力するプログラム (※複数個の偶数があったとしても『偶』と表示するのは1回だけとする) 途中まではこんな風に書いてみたのですが #include<stdio.h> int main(void){ int x[5]; int i; for(i=0;i<=4;i=i+1){ printf("x[%d]を入力してください。\n",i); scanf("%d",&x[i]); } if (x[i] % 2 == 0){ printf("偶\n"); } else{ printf("奇\n"); } return 0; }
872 :
866 :2010/05/22(土) 15:28:29
>>871 奇と表示する条件をif条件にすると良い
874 :
デフォルトの名無しさん :2010/05/22(土) 15:36:08
>>873 どういう条件にすればいいのでしょうか?
>>871 #include<stdio.h>
int main(void){
int x;
int i;
int flag = 0;
for(i=0;i<=4;i=i+1){
printf("x[%d]を入力してください。\n",i);
scanf("%d",&x);
if (x % 2 == 0 && !flag){
flag = 1;
}
}
flag ? printf("偶\n") : printf("奇\n");
return 0;
}
フラグを使わない方法で、入力と偶奇判断を分けてみた。 教育目的としてよいかも。 ひとつめのfor文の後に for ( i = 0; i <= 4; i++ ) { if ( x[i] % 2 == 0 ) { printf("偶"); break; } } if ( i == 5 ) printf("奇"); 条件式、for文の構造と、ループ制御を理解していているかという課題かも。 レポートなら、コードだけじゃなく、説明も要求されるだろうし。
877 :
869 :2010/05/22(土) 16:03:36
int x[5+1]; x[5] = 1; : if (x[i] % 2 == 0){ x[5] = 0; } :
878 :
デフォルトの名無しさん :2010/05/22(土) 16:41:53
大学のレポートです。お助けください。 問題:キーボードから10個の値(x[0]〜x[9])を入力し,2番目に大きい値を出力するプログラムを作成せよ. 2番目というのをどうしたらよいのでしょうか??? 自分で途中まで書いたコードです。 int x[10]; int i; int no1=0,no2=0; for(i=0;i<=9;i=i+1){ printf("x[%d]を入力してください。\n",i); scanf("%d",&x[i]); } for(i=0;i<=9;i=i+1){ if(
879 :
869 :2010/05/22(土) 16:45:39
10 10 9 8 7 6 5 4 3 2 の時の2番目に大きいのは?
どう考えても9だろ
ちなみにどこの大学だ
>> 878 int main(void) { int x[10]; int i; int *max = NULL, *result = NULL; for(i=0;i<=9;i=i+1) { printf("x[%d]を入力してください。\n",i); scanf("%d",&x[i]); } max = &x[0]; for(i=1;i<10;++i) { if (*max < x[i]) { result = max; max = &x[i]; } } printf("答え:%d\n", *result); return 0; }
書いた後にバグがあることに気づいた。
>>882 10個すべて同じ値にすると落ちる。
printf("答え:%d\n", *result); → if (result) print("%d"), *result);
886 :
デフォルトの名無しさん :2010/05/22(土) 18:22:29
おしえてください!!! { int a; printf("西暦年を入力してください "); scanf("%d", &a); if (a%400==0 || (a%4==0 && n%100 !=0)) printf("西暦%d年は,うるう年です \n" ,a ); else printf("西暦%d年は,うるう年ではありません \n" ,a); } のプログラムを論理演算子(&&,||)無しでお願いします!!
if(a%400==0) printf("西暦%d年は,うるう年です\n" ,a ); else if(a%100==0) printf("西暦%d年は,うるう年ではありません\n" ,a ); else if(a%4==0) printf("西暦%d年は,うるう年です\n" ,a ); else printf("西暦%d年は,うるう年ではありません\n" ,a );
888 :
デフォルトの名無しさん :2010/05/22(土) 18:41:29
>>887 おおおおおおお!!
ありがとうございます.
889 :
879 :2010/05/22(土) 20:41:58
すみません、 txtファイルに書いた2進数(10011101)をchar配列に保存しているのですが、 これをint型10進数(10011101 → 157)に直すシンプルな方法は無いでしょうか? 現状atoiで整数にしてから 10ずつ割りながら、整数で1の論理積を確認し、 別途1..2..4..8..と数値を足し合わせ作り直す手しか思い付かないのですが・・。
>>890 #include<stdio.h>
int main(void)
{
char buf[]="10011101";
int i, value=0;
for(i=0;buf[i];i++)
{
value=value*2+buf[i]-'0';
}
printf("%d\n", value);
return 0;
}
>>889 拡張性なんか無視して書いたからなー
作りなおすしかない。
C++、STLありならこれで
#include <iostream>
#include <set>
int main(void) {
int order = 5; // 何番目に大きな数字を出力するか
int x[10];
for (int i = 0; i < 10; ++i) {
std::cout << "x[" << i << "]を入力してください。" << std::endl;
std::cin >> x[i];
}
std::set<int> s(&x[0], &x[10]);
std::set<int>::reverse_iterator result = s.rbegin();
for (int i = 0; i < order - 1 && result != s.rend(); ++i) {
++result;
}
if (result != s.rend()) {
std::cout << *result;
}
return 0;
}
894 :
879 :2010/05/22(土) 23:40:03
>>878 #include <stdio.h>
int main(void) {
int x[10];
int i;
int *max = NULL, *result = NULL;
for(i=0;i<=9;i=i+1) {
printf("x[%d]を入力してください。\n",i);
scanf("%d",&x[i]);
}
result = max = &x[0];
for(i=1;i<10;++i)
if(*max <= x[i])
max = &x[i];
else
result = &x[i];
for(i=1;i<10;++i)
if (*max != x[i])
if(*result < x[i])
result = &x[i];
printf("答え:%d\n", *result);
return 0;
}
>>894 すべて同じ数字を入力した場合、その数字が答えとして出力されるが、
それは「2番目に大きい値を出力する」という要件に合致しているといえるの?
出題者いるよ、そっちにきいてくれ。 if(*max != *result) /* 10個すべて同じ値にすると表示無し。 */ printf("答え:%d\n", *result);
あんま関係ないけど、そのコメントはコードの意図を直接的にあらわしていないので いやなにおいを感じて修正しそう。
洗濯しました
899 :
863 :2010/05/23(日) 11:30:20
お助けください。 問題:代表の生徒の名前、代表者の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力するプログラムを作成せよ. キーボードから代表者のID,個人のID,名前を入力するものとし、グループメンバーは代表者のIDでのみで関連付けされる 出席の記録はキーボードから個人のIDが呼び出された回数でされるものとする.
>>900 こんな入力・出力例でいいの?
Input:
2
1,1,murayama
1,2,sugano
3,3,koizumi
3,4,abe
5,5,hatoyama
6,6,ozawa
Output:
#1
Rep. Name: murayama
Rep. Attendance: 1
Group: 001
Group Attendance: 2
#2
Rep. Name: koizumi
Rep. Attendance: 1
Group: 003
Group Attendance: 2
はい 名簿のほうはいつでも人が増やされる感じで 出席のほうは個人のIDが呼び出されると加算されていく感じです
>in 1,1,sakata >in 1,2,yamada >in 3,3,itao >at 1 >at 2 >at 1 >in 1,4,yamada >at 4 >at 3 >out Rep. Name: sakata Rep. Attendance: 2 Group Attendance: 4 Rep. Name: itao Rep. Attendance: 1 Group Attendance: 1 みたいなイメージです
905 :
879 :2010/05/23(日) 15:46:57
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 // int n = 10; is for C99 compiler. int main(void) { int x[N], small[N], i, j, m = 1; srand(time(NULL)); for (i = 0; i < N; i++) { printf("x[%d]を入力してください。\n",i); scanf("%d",&x[i]); small[i] = 0; // printf("x[%d]: %d\n", i, x[i] = rand() % 10); } // printf("%d番目に大きい数値は\n", (m = rand() % N) + 1); for (i = 0; i < N; i++) for (j = i + 1; j < N; j++) { if (x[i] <= x[j]) small[i]++; else small[j]++; } for (j = 0; j < N; j++) if (small[j] == m) printf("答え:%d\n", x[j]); return 0; }
10マスある双六で1〜6のランダムの値だけ進むのを繰り返してゴールを目指す。 ぴったりじゃないと余った分引き返す。 (|スタート◎| _ _ _ _ _ _ _ _ _ _ |ゴール|の表示をEnter押すごとに繰り返す) というプログラムを作りたいのです。 #include <stdio.h> #include <time.h> int sa_(void); int main(void) { srand((unsigned int)time(NULL)); return 0; } /*1〜6の値をランダムで返す*/ int sa_(void) { int sai,i; for(i = 0; i < 10; i++) { sai = rand() % 6 + 1; } return sai; } これを使うように指示されています。よろしくお願いします。
#include <stdio.h> #include <time.h> #include <stdlib.h> int sa_(void); int main(void) { int i,x=0,dx; char course[10]; srand((unsigned int)time(NULL)); for(i=0;i<10;i++) course[i] = '_'; while(1){ dx = sa_(); (x + dx > 9) ? x=9-((x+dx)%9) : x+=dx; printf("サイコロ=%d",dx); getchar(); course[x] = 'm'; printf("スタート◎|"); for(i=0;i<10;i++) printf(" %c ",course[i]); printf("|ゴール|\n"); course[x] = '_'; if(x == 9) { printf("クリアだお!\n"); break; } } return 0; } //sa_(void)は変更してないので省略
908 :
900 :2010/05/23(日) 17:27:46
>>900 テンプレつかえよ
CかC++か?制限は?講義のレベルはどれくらいなんだよ。
問題文の各行のつながりもわかりにくい。1行目が
>>903 のout以降で、2行目がat、3行目がinの説明?
問題文の1行目は、すべて並列に書かれているように見えるけど、1行目はグループメンバ全員の出席数の合計が多い順に、各グループの代表者名、代表者の出席回数、メンバー全員の集積回数の合計を出力するって意味?
j上位x番のxはキーボードから入力するのかコード内に数字として埋め込んでいいのか。
好きなだけグループや生徒を登録できるのか?だとしたら可変長配列や可変長文字列を使うと便利だがライブラリを使用していいのか自作しなければいけないのか。
>>909 出題者(つまり学校の先生)が手を抜いているのに、依頼者(つまり学生・生徒)を責めても無駄。
依頼者が仕様を正確に記述できないのも、出題者がへぼなだけ。
仕様を正確に記述する訓練はコーディングの訓練の後に来るべきなのに、それが逆になっているというのは、
>>900 のせいというよりは、教育業界全体がおかしい。
そして、それを
>>900 に八つ当たりして納得している我々にも問題があるだろう。
でも
>>900 はテンプレートくらいは読もうね。
[1] プログラミング [2] 数字を収納する [3] 環境 [3.1] OS: XP [3.2] gcc [3.3] C [4] 無期限 Cでお願いします。コンソールです ある数字を一文字入力し、そしてenter。 次に、その前に打った数だけランダムな数字を空白をはさんで打ち込む。そしてエンター 例 6 (エンター 4 23 1 4 5 3 (エンター みたいなかんじです そしてこれを X[i] にi=1から順に空白を飛ばして入れていくってかんじです。 そんでX[1]=4 X[2]=23 ・・・ みたいに入ればいいです 文字列ではなく数字で収納したいです お願いします
912 :
900 :2010/05/23(日) 18:47:47
すみません、次から気おつけます
#include <stdio.h> #define LENGTH 128 int main() { unsigned int n, i; int X[LENGTH]; printf("Generate random integer list (n elements)..."); printf("n ->"); scanf("%u", &n); if ( n > LENGTH || n < 0 ) { fprintf(stderr, "Error: n in range [0..%d]", LENGTH); exit(1); } for ( i = 1; i <= n; i++ ) scanf("%d",&X[i]); }
>>912 とりあえず現状では問題がよくわからないのは事実ですので、
>>1 を読んで書き直してみてはいかがでしょうか。
915 :
900 :2010/05/23(日) 19:34:36
はい
>>907 #include <stdio.h>
#include <time.h>
int sa_(void);
int main(void)
{
int i,x=-1,dx;
char course[10];
srand((unsigned int)time(NULL));
for(i=0;i<10;i++)
course[i] = '_';
while(1){
dx = sa_();
printf("サイコロ=%d",dx);
getchar();
x += dx;
if(x != 10){
x = x > 9 ? 10*2-x : x;
course[x] = 'm';
}
printf("スタート◎|");
for(i=0;i<10;i++)
printf(" %c ",course[i]);
printf("|ゴール|\n");
course[x] = '_';
if(x == 10) {
printf("クリアだお!\n");
break;
}
}
return 0;
} //sa_(void)は変更してないので省略
>>911 なぜx[0]からでなくx[1]からなんだろう。
エラーチェックとかは省いてるんで適宜修正してくれ。
#include <stdio.h>
#include <stdlib.h>
#define MAX_BUFFER_SIZE 256
void main() {
int i = 0, j = 1;
int num = 0;
char buffer[MAX_BUFFER_SIZE] = "";
int *x = NULL;
scanf("%d", &num);
if (0 < num || num < 9) {
printf("数字を”一文字”入力しろ。ただし0、てめーはダメだ\n");
}
++num;
rewind(stdin);
fgets(buffer, MAX_BUFFER_SIZE, stdin);
x = (int*)calloc(num, sizeof(int));
for (i = 0; i < MAX_BUFFER_SIZE; ++i) {
if (buffer[i] == '\n') {
break;
} else if (buffer[i] == ' ') {
++j;
} else {
x[j] = 10 * x[j] + buffer[i] - '0';
}
}
free(x);
}
// スタートとゴールは枡に含めない場合。あと、バグ修正。 if(x != 10) course[x] = '_'; else [ printf("クリアだお!\n"); break; }
919 :
917 :2010/05/23(日) 20:13:13
if文間違ってたので修正 if (0 < num || num < 9) { → if (num < 0 || 9 < num) {
920 :
917 :2010/05/23(日) 20:15:29
修正したのも間違ってるし(´д`) if (0 < num || num < 9) { → if (num < 1 || 9 < num) {
921 :
デフォルトの名無しさん :2010/05/23(日) 20:54:00
[1]授業単元:プログラミング [2]問題文:(1)scanfにより3つの正の整数a,b,cの値を入力する。 (2)(i,j)要素がj+(a-1)*iであるa×b行列を定義する。 (3)(i,j)要素がj-(b-1)*iであるb×c行列を定義する。 (4)2つの行列の積を計算し、結果を表示する。 [3]環境:windows,C++ [4]期限:5月25日 [5]なし よろしくおねがいします。
[1]授業単元:プログラミング [3]環境:windows,C言語 [4]期限:無期限 コンソールです。エンターキーを押せば次の処理に進めるにはどのようにすればいいのでしょうか? scanf(" "); gets(a); a=getchar(); とかにしてもダメでした すぐに次の動作に進んでしまいます よろしくお願いします。
getchar();
>>923 多分ストリームに文字列が残ってるのが原因
getchar();
getchar();
と2つ書けば大丈夫のはず
>>925 「最初は」の人はいつも
公式に当てはめるだけのつまらない問題だからでしょ
928 :
852 :2010/05/23(日) 21:33:44
>>925 >最初は
>#include <iostream>
>using namespace std;で始まります
>出力はcout 入力はcinです
これが読めないのかカス
>>923 入力処理後に rewind(stdin)
>>923 printf("1\n");
getchar();
printf("2\n");
これで1が表示されたあとエンターおせば2が表示される
printf("1\n");
getch();
printf("2\n");
こうするとgetchar()と違ってエンター入力したあと改行が入らない
932 :
デフォルトの名無しさん :2010/05/23(日) 21:44:27
>>925 ありがとうございます。でもprintfとかstdio.hとかって使わないんですよね…
936 :
900 :2010/05/23(日) 22:43:07
[1] 情理工 補
[2] 問題文(含コード&リンク):
(図解だけの問いでした、説明がわかりにくくてごめんなさい)
代表の生徒の名前、代表の出席回数、グループメンバーの出席回数、グループの全体の出席回数の上位x番だけ出力するプログラムを作成せよ.
グループメンバーは代表者のIDでのみで関連付けされる.
出席は個人のIDを入力すると出席が加算されていく.
>グループメンバ全員の出席数の合計が多い順に、各グループの代表者名、代表者の出席回数、メンバー全員の集積回数の合計を出力する
>好きなだけ好きな時にグループや生徒を登録できる
>上位x番のxはキーボードから入力する
>>909 のとおりです。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: VC2008
[3.3] 言語: C++
[4] 期限: [2010年05月26日13:10まで]
[5] その他の制限: なし 授業でSTL一通りやりました
>>832 いや、いいところまでいっている。
仮定より
f(0) = 0
がいえて、
>>832 の変形より
f'(x)≡f'(0) (∀x∈R)
もなりたつ。あとは x = 0 のまわりで f'(x) が存在するかどうかを、問題であたえられるか証明してしまうか、なんだが、
f'(0) が存在することを証明できないでいる。できるのかできないのか?
すれ違いですみませぬ。
938 :
デフォルトの名無しさん :2010/05/23(日) 23:36:51
>>933 ありがとうございます
関数の渡しは何行目辺りで使われていますか?
>>938 関数の渡しはつかっていません。使わなくてもできる問題なので。
どうしてもいりますか?
940 :
デフォルトの名無しさん :2010/05/24(月) 00:08:46
>>939 何か、関数の渡しを習ったので使うと言われたんです…
swapとかそういうのですかね…?
[1] プログラミング入門 [2] 1+2+3+…n≦1000となるように、nの最大値とそのときの合計を求め、表示するプログラムを作成せよ 注:「等差数列の和の公式は」ではなく、while文またはfor文を使用すること。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ:VC2008 [3.3] 言語:C++ [4] 期限:[2010年5月26日10:00まで] [5] その他の制限: なし nの最大値が44、合計が990というのはわかったのですがそれをうまく表示できません。 よろしくお願いします。
>>942 #include <iostream>
using namespace std;
int main()
{
int sum=0,n=0;
while(1){
if(sum+(n+1)>=1000)break;
sum+=++n;
}
cout << "max:" << n << ", sum:" << sum << endl;
}
>>946 すげえな。一体何年ぐらいC++やってるの?
Cっぽい書き方しかできないんで、参考になる++
949 :
900 :2010/05/24(月) 22:33:00
ありがとうございます〜
950 :
946 :2010/05/24(月) 22:43:09
C++は4年くらい、STLはここ1年くらいで「標準テンプレートライブラリによるC++プログラミング」とかで覚えた。
あとC++相談室スレも勉強になる。
>>946 のソースをちょっと修正
「T strToVar (const std::string str) {」 → 「T strToVar (const std::string& str) {」
ActionInクラスの「int getGroupID() const { return groupID_;}」「int getMemberID() const { return memberID_;}」「std::string getMemberName() { return memberName_;}」はまったく使っていないので削除
951 :
946 :2010/05/24(月) 22:55:51
まだあった…
ParserOutクラスのoperator()定義内の最後の「return std::auto_ptr<Action>(new ActionError());」は
「return std::auto_ptr<Action>(NULL);」です。
あと、inとかの後ろにスペースいれなくても動いてしまうけど、もう直すの面倒くさいから後は適当にがんばってね
>>900
952 :
947 :2010/05/24(月) 23:19:13
しかし、お疲れ様。
プログラミングじゃないんですが、どこに書けばいいのかわからなかったので、スレチならすみません。 (1)4Byte machineでDouble PrecisionのReal Numberは何桁まであらわされるのかMemoryのStructureから計算せよ。 (2)4Byte machineでDouble PrecisionのReal Numberの計算でOverflow,Underflowのエラーが出た時,それぞれどのような大きさの計算でエラーが起こったのかMemoryのStructureから理論的に説明せよ。 お願いします。
"4Byte machine" から意味がわからん。 "MemoryのStructureから" っていうのも謎。
倍精度は 64 ビットでいいですかね。(IEEE754) 仮数部は 52ビット + 1 = 53 ビット相当で表現されるから 2^53 = 10^15.95すなわち 少なくとも10進16桁まで表現できる。
最大数を10進数表示したときの桁数を聞かれてるんじゃないのかなあ
958 :
デフォルトの名無しさん :2010/05/25(火) 13:17:27
#include <stdio.h> 14 15 unsigned DtoB(int a) 16 { 17 unsigned x=1,ans=0,k=1; 18 while(a>0) 19 { 20 if(x & a) ans += k; 21 a = a >> 1; 22 k*=10; 23 } 24 return ans; 25 } 26 27 int main() 28 { 29 int a; 30 31 do{ 32 scanf("%d",&a); 33 printf("Input a: (%d) \n",a); 34 }while(a < 0); 35 36 printf("a(decimal)=%d\n",a); 37 printf("a(binary)=%u\n",DtoB(a)); 38 39 return 0; 40 } このプログラムに注釈つけてください
958 :デフォルトの名無しさん :2010/05/25(火) 13:17:27
>>861 全部のコードを書いていただけませんか?
>>958 >>858 をお忘れなく
#include <stdio.h> /* a を1/2する毎に、k を10倍の値にする */ /* a の最下位ビットが 1 の場合、ans に k を足す */ unsigned DtoB(int a) // 関数の入力仮引数は、整数の a である。 { unsigned x=1,ans=0,k=1; while(a>0) // a が正の数の間繰り返す { if(x & a) // a の最下位ビットが 1 の場合 ans += k; // ans に k を足す a = a >> 1; // a を2で割る k *= 10; // k を10倍する } return ans; // DtoB() の戻り値は ans } int main() { int a; // 整数型の変数 a を定義 do{ scanf("%d",&a); // a の入力 printf("Input a: (%d) \n",a); // 入力した a の出力 }while(a < 0); // a が負の数の間は繰り返す printf("a(decimal)=%d\n",a); // 10進数での a の表示 printf("a(binary)=%u\n",DtoB(a)); // 2進数での a の表示 return 0; // main() の戻り値 }
条件 printf("行列AとベクトルBの積は次の通りです\n"); linear_trans(a, b, c); for ( i = 0 ; i < COLUMN ; i++) printf("%8.3f\n", c[i]);
>>966 なんで質問者を刺戟する様な名前をわざわざ使うの?
質問しづらくなるだろ。
>>962 が無防備すぎてつい
それに回答する側としては質問しづらくなっても関係ないしなあ
なんという自分勝手 でも質問者ももう少しひねって出して…
971 :
954 :2010/05/25(火) 22:31:54
>>956 ,
>>957 ありがとうございます。
いろいろな人に聞いたのですが,
>>956 がどうもあってるみたいです。
>>957 はその10進法であらわした数字を超えたらoverflowってことですかね?
972 :
デフォルトの名無しさん :2010/05/25(火) 22:58:19
スレを最初から最後まで読めば全部だと思う。
>>972 この関数を使って正しく動作するものを作ってみなさい、とでも先生に言われたの?
976 :
デフォルトの名無しさん :2010/05/26(水) 00:09:54
>>921 http://codepad.org/OVk5XcXl 便乗で質問なんですが、
コピーコンストラクタを
Matrix &Matrix::operator=(const Matrix &a) { }
とするとコンパイルできるのですが、教科書のとおりに
Matrix &Matrix::operator=(Matrix &a) { }
とすると、
Matrix::operator=(Matrix) に一致するものがみつからない(BCC32)
というエラーがでてコンパイルできません。
どうしてなのでしょうか
>>977 それ、コピーコンストラクタじゃなくてコピー代入演算子。
で、エラーになるのはテンポラリで非 const 参照を初期化できないという規則があるから。
979 :
デフォルトの名無しさん :2010/05/26(水) 04:13:40
>>974 はい、そうです…。よろしくお願いしますm(__)m
こんなんで、いいのかひ? #include<stdio.h> void linear_trans(double matA [2][2], double vecx[2], double vecy[2]) { vecy[0] = matA[0][0] * vecx[0] + matA[0][1] * vecx[1]; vecy[1] = matA[1][0] * vecx[0] + matA[1][1] * vecx[1]; } int main() { double matA [2][2], vecx[2], vecy[2]; printf("input matA [0][0]:"); scanf("%lf",&matA[0][0]); printf("input matA [0][1]:"); scanf("%lf",&matA[0][1]); printf("input matA [1][0]:"); scanf("%lf",&matA[1][0]); printf("input matA [1][1]:"); scanf("%lf",&matA[1][1]); printf("input vecx [0]:"); scanf("%lf",&vecx[0]); printf("input vecx [1]:"); scanf("%lf",&vecx[1]); linear_trans(matA, vecx, vecy); printf("vecy[0]=%lf\n",vecy[0]); printf("vecy[1]=%lf\n",vecy[1]); return 0; }
次スレ立てます
■■■■■■■■ ■■■■■■■■ ■■■■■■■■
[1] 授業単元: [2] 問題文 キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら、それ以降は奇数のみの和の計算に切り替える。 そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して偶数の和と奇数の和を表示させる。 [3] 環境 [3.1] OS: Mac [3.2] コンパイラ名とバージョン: cc [3.3] 言語: C [4] 期限: 5月27日
984の者です。 間違えて送信してしまったので追記します。 その他の制限: do whileまでしか教えてもらってないのでそれでお願いできますか
987 :
デフォルトの名無しさん :2010/05/26(水) 12:48:52
From: [758] デフォルトの名無しさん <sage> Date: 2010/05/26(水) 09:29:56
[1] 授業単元:プログラミング基礎
[2] 問題文 キーボードから読み込んだ整数のうちの偶数の和の計算を続け、もし2回連続して奇数が読み込まれたら、それ以降は奇数のみの和の計算に切り替える。
そして、次に偶数もしくは奇数が2回連続して読み込まれたら、読み込みを中止して偶数の和と奇数の和を表示させる。
From: [759] デフォルトの名無しさん <sage> Date: 2010/05/26(水) 09:31:06
>>758 宿題スレでやれ
From: [760] デフォルトの名無しさん <sage> Date: 2010/05/26(水) 09:59:31
宿題はスルーでお願いします
From: [761] デフォルトの名無しさん <sage>Date: 2010/05/26(水) 11:32:25
>>759 >>760 あ、わからないんだったら、無理して答えなくていいから
From: [762] デフォルトの名無しさん <sage>Date: 2010/05/26(水) 12:11:23
誰か答えられる賢い人いない?
>>759 >>760 は引き続き黙ってていいから
あらあら。向こうで時間みてびっくりしたの俺だけど、転載乙
989 :
デフォルトの名無しさん :2010/05/26(水) 22:52:08
[1] 授業単元:プログラミング演習 [2] 問題文 : 1.テキストファイル(file,txt)を読み込み、 goodという単語すべてをbadに置換し、filea.txtに出力せよ 2.テキストファイル(file,txt)を読み込み、文字数の多い行から順に並べかえてfileb.txtに出力せよ [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語: C [4] 期限: 5月27日 お願いします
990 :
デフォルトの名無しさん :2010/05/26(水) 23:39:28
失礼します。 行列の積を計算するプログラムのコードを提出という課題が学校で出たのですが 自分は以下のように書いたのですが、何度実行しても出力されてくる数字が間違っているのですが どこがおかしいのでしょうか???? #include<stdio.h> int main (void) { int i,j,k,n; int a[10][10],b[10][10],c[10][10]; printf("n (n<=10) の値を入力して下さい。\n"); scanf("%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("行列aの%d行%d列の値を入力して下さい。\n",i,j);scanf("%d",&a[i-1][j-1]);}} for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("行列bの%d行%d列の値を入力して下さい。\n",i,j);scanf("%d",&b[i-1][j-1]);} } for(i=0;i<=n;i++) { for(j=0;j<=n;j++) { for(k=0;k<=n;k++){ c[i][j] += a[i][k] * b[k][j];}}} for(i=0;i<=n;i++){for(j=0;j<=n;j++){ printf("c[%d][%d] = %d\n",i,j,c[i][j]);}} return 0; }
>>979 へぇ。大変だね。
回答に加えていくつかツッコミ入れたけどそれに対してノーリアクションだったなぁ、と思うのと、
多分そのツッコミ部分を理解しているかどうかを確認する為にその出題されたんだろうね。
スルーせずに先生に突っ込みを先に入れていれば勝てた勝負なのにな。
[1] 授業単元:Cプログラミング演習 [2] 問題文(含コード&リンク): ・文字列 computer を、ポインタを用いて大文字で表示するプログラムを作成せよ ・文字列 ABCD を変数に代入し、ポインタを用いて次のように表示するプログラムを作れ ABCD BCD CD D [3] 環境 [3.1] OS:win vista [3.2] コンパイラ名とバージョン:VB 2008 [3.3] 言語:C [4] 期限: [2010年5月28日まで] [5] その他の制限:なし よろしくお願いします
1000 :
デフォルトの名無しさん :2010/05/27(木) 11:22:39
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。