- 1 名前:デフォルトの名無しさん [2008/02/04(月) 23:32:19 ]
- あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】 回答者の便宜のため、質問の際は以下を行うことを推奨します。 ・質問は【質問テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう. ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。 ・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク):() [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 【前スレ】 C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/
- 820 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:20:36 ]
- >>811
そもそもtest[5]はscoreでええがな
- 821 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 02:30:33 ]
- >>819
わざわざ「文字列の長さ」と書いてあるんだから配列の大きさを基準にしちゃダメじゃないか?
- 822 名前:デフォルトの名無しさん [2008/03/27(木) 09:03:35 ]
- >>817
こいつもしかして、test[i]こそがシンタックスシュガーだということを知らないのでは・・・
- 823 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 10:49:45 ]
- >>816
test[i]は*(test+i)のシンタックスシュガー &test[i]は&*(test+i)のシンタックスシュガー &*ってムダじゃね?ってことだろ。
- 824 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 14:09:52 ]
- 糖衣だろうがなんだろうが &test[i] なんて書き方はしねーよ
- 825 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 14:17:26 ]
- それが、&test[i]の方が多数派だったりするんだよw
- 826 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 14:29:03 ]
- 確かに&test[i]って記述はよく見かけるね
俺は個人的に好かない書き方だ Cの配列とアドレッシングとの関連がわかってないのかな
- 827 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:00:27 ]
- 俺はCだと基本どうでもいい。所詮、構文糖。
が、C++だと&a[i]とa+iの意味が違う事がある。(std::vector等)。 STL等のランダムアクセス可能なコンテナだと&a[i]は使えるけどa+iは使えない。 そうなるとCを使うときもC++の流儀に合わせて&a[i]と書きたくなる。
- 828 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:21:10 ]
- vectorで&a[i]なんて何に使うんだ?
- 829 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:45:00 ]
- char*を要求する関数を呼び出すときとか
- 830 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:55:40 ]
- char*ならstd::string使えよ・・・
- 831 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 16:00:56 ]
- 非constのchar*が必要なとき
- 832 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 16:48:17 ]
- &を見れば定義をみないでもアドレスであることがわかる
ソース中の[をみれば配列にアクセスしている箇所を testをキーワードにして検索したりしないでもすぐ探せる 保守しやすくなるからワザとやってるんじゃないの
- 833 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 16:52:58 ]
- >>826
Cの配列とアドレッシングとの関連がわかっていることと &test[i]と書くことは全く別問題。
- 834 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:46:33 ]
- &test[ i ] 配列testのi番目の要素のアドレス
test + i ポインタtestからi * nずらしたアドレス って感じだから前者の方がしっくりくるって人が多数派ににるんじゃない?
- 835 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 23:52:10 ]
- &test[i]って書き方はあまりしないけど、&test[0]って書き方なら結構するな
testだけだとパッと見わかりにくいし。
- 836 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 04:23:24 ]
- >>835
char buf[1024]; int size = sizeof(&buf[0]); って書くってこと?
- 837 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 04:35:51 ]
- オッス、オラC言語歴10年、もっとオラがwktkするような宿題を依頼してくれYO!
- 838 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 04:42:23 ]
- >>836
何をしたいのか理解できない
- 839 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:17:42 ]
- 整数を入力してください:25
1234567890123456789012345 こんな感じで1234567890123…を読み込まれた整数の個数だけ繰り返し表示するプログラムを作成する問題なのですが 誰か教えて頂けないでしょうか?
- 840 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:27:22 ]
- [1] 授業単元:
[2] 問題文(含コード&リンク):>>839 [3] 環境 [3.1] OS:Windows xp [3.2] コンパイラ名とバージョン:BCC Developer 1.2.21 [3.3] 言語:C [4] 期限:[無期限] [5] その他の制限:独学ゆえに聞ける人が居なくて困ってます
- 841 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:29:21 ]
- printf("%u", n%10);
あとは頑張れ。
- 842 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:30:16 ]
- >>839
#include <stdio.h> int main() { int n, i; printf( "整数を入力してください:" ); scanf( "%d", &n ); for(i=1; i<=n; i++) putchar( '0'+i%10 ); return 0; }
- 843 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:30:26 ]
- 独力で学習することが独学。
聞ける人がいないのは孤独。
- 844 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:31:01 ]
- >>841
勉強用に捻くれたコードにしてみた。 #include<stdio.h> int main(void){ int n; printf("整数を入力してください:"); for(scanf("%d",&n);n>0;n-=10) printf("%.*s",n,"1234567890"); return 0; }
- 845 名前:844 mailto:sage [2008/03/29(土) 14:31:36 ]
- おっとアンカミス
s/841/840
- 846 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:42:21 ]
- ありがとうございます!
上京したてで友達がいない中、予習してまして…
- 847 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 14:50:16 ]
- 勉強用に、の意味がわからない
- 848 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 16:14:46 ]
- 勉強用に捻くれたコードを提示すると、捻くれた知識が身に付くだけだぞ。
- 849 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 17:55:02 ]
- と、捻くれた人が言ってます
- 850 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 18:43:08 ]
- >>840 と >>844 は師匠と弟子か?
もしそうならスレ立てしてそっちでやれよ ついでに俺は前置きで > こんなの書いても現段階だと悪影響にしかならん気はするぞ って書いておいたんだがな
- 851 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 18:55:00 ]
- >って書いておいたんだがな
どこに?
- 852 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 19:11:50 ]
- >>850
> >>840 と >>844 は師匠と弟子か? いや、まったく関係なし。 単に暇つぶしで適当かつ、それなりに捻くってコードを書いただけ。 真面目なコードは既に出てたし、こういう捻った書き方もあるよーってね。 #まぁぶっちゃけprintfの書式で遊んでみたかっただけなんだけど。
- 853 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 19:16:56 ]
- 勉強用に、って自分の勉強のことか
- 854 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 21:07:15 ]
- 変なコードを書くときは、一々捻くれたとか書かないでそのまま書く。
そういうことを書くとちょっと変わった俺臭がきついから。
- 855 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 21:10:10 ]
- いよいよCにすら関係なくなってきたぞ
- 856 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:39:59 ]
- まぁ、ぶっちゃけ、これらを習って最終的に何を作る目的があるのか?
自分も大学生時代にC言語の授業はあったけど、そこで習ったことだけじゃ通用せんが 必要なことは習っていた。その後、自分でライブラリを調べて、日ごろの使用目的に応じて 必要なプログラムを作るようになった。そうなるのが望ましい。
- 857 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:22:05 ]
- まあここに来るのは「プログラムの宿題マンドクサ。誰かにやってもらおう」って人だから、望むべくもないかもね。
- 858 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:36:29 ]
- それくらいの人の方がうれしい
単位がかかってるとか理解できないからもっと簡単にしてくれとかちょっとうざい
- 859 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:43:56 ]
- 何でも良いから宿題かもん
- 860 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:46:37 ]
- ひまなら project Euler でもやってれば
- 861 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:48:37 ]
- おおやってみるdクス
- 862 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 12:55:14 ]
- [1] 授業単元:アルゴリズム
[2] 問題文(含コード&リンク):() 指定文字列と一致する文字列が規定の文字列に存在するかどうかを2分探索法で探索するプログラム [3] 環境 [3.1] OS: (Windows/Linux/等々) linux [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) C [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)3月31日AM9:00まで [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)特になし 上記のプログラムの作り方が分かりません。文字列は2つとも配列に格納してある状態です。よろしくお願いします。
- 863 名前:862 mailto:sage [2008/03/30(日) 12:57:51 ]
- ↑書き忘れました。
規定の文字列というのは2分探索法ですので aaabbcのように辞書順にソートされている1行の文字列です。
- 864 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 13:32:09 ]
- | 1 2 3 4… 9
--------------------- 1| 1 2 3 4… 9 2| 2 4 6 8… 18 3| 3 6 9 12… 27 4| 4 8 12 16… 36 以下省略 と、いった感じの九九の表をforを使って作りたいのですが、どうしたらよいのでしょうか?
- 865 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 14:02:38 ]
- int main()
{ int i, j; const int max = 9; printf(" |"); for (i = 1; i <= max; i++) { printf(" %3d", i); } printf("\n--+"); for (i = 1; i <= max; i++) { printf("----"); } for (i = 1; i <= max; i++) { printf("\n%2d|", i); for (j = 1; j <= max; j++) { printf(" %3d", i * j); } } return 0; }
- 866 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:06:39 ]
- >>862
mainは適当に書いたから書き直したほうがいいかも kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6186.c
- 867 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 15:09:28 ]
- >>862
二分探索には標準ライブラリ関数bsearchを使いました。 #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp( const void* key, const void* elm ) { return strcmp( (const char*)key, *(const char**)elm ); } int main(void) { // 規定の文字列。辞書順にソートされていること。 static const char* const table[] = { "abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz", }; const char** hit; char str[101]; printf( "検索文字列:" ); scanf( "%100s", str ); hit = (const char**)bsearch( str, table, sizeof(table)/sizeof(*table), sizeof(*table), cmp ); if( hit ) printf( "'%s'は%d番目に存在します。\n", str, hit-table ); else printf( "'%s'は存在しません。\n", str ); return 0; }
- 868 名前:867 mailto:sage [2008/03/30(日) 15:21:42 ]
- >>863を把握していなかった。修正。
#include <stdio.h> #include <stdlib.h> #include <string.h> int cmp( const void* key, const void* base ) { const char* key_str = (const char*)key; return strncmp( key_str, (const char*)base, strlen(key_str) ); } int main(void) { static const char base[] = "aaabbc"; // 規定の文字列 const char* hit; char str[101]; printf( "検索文字列:" ); scanf( "%100s", str ); hit = (const char*)bsearch( str, base, strlen(base), 1, cmp ); if( hit ) printf( "'%s'は%d文字目から存在します。\n", str, hit-base+1 ); else printf( "'%s'は存在しません。\n", str ); return 0; }
- 869 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 18:03:32 ]
- >>864
int x,y; puts(" | 1 2 3 4 5 6 7 8 9\n------------------------------" for(x=1; x<10; x++) { printf("%d | ", x); for(y=1; y<10; y++) printf("%d ", x * y); }
- 870 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 18:08:44 ]
- >>869
- 871 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 20:50:16 ]
- 〉〉868
アルゴリズムの問題なのだから、bsearchを使うのはだめなんじゃないか?アルゴリズムを作って使う課題なのだろうし。
- 872 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 22:57:05 ]
- C++ のSTLのvectorで、要素の最後から開放していくのはこんな感じであってますか?
std::vector<Hoge*>::reverse_iterator itr = v.rbegin() ; while( false == v.empty() ) { delete *itr++ ; v.pop_back() ; }
- 873 名前:デフォルトの名無しさん [2008/03/31(月) 23:11:01 ]
- 基本的に領域の開放は無理だろ swapでやるしか無いのでは?
ブロックごとに管理して100個使わなくなったら解放とかじゃないか
- 874 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:11:47 ]
- constでない操作を呼び出した時点でiteratorは無効になる。
(実装によりたまたま有効なままかもしれないけど) ↓でいいんじゃない。 while(!v.empty()) { delete v.back(); v.pop_back(); }
- 875 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:14:51 ]
- pop_backした際にiteratorが無効になるので駄目。
なので while( ! v.empty() ){ delete v.back(); v.pop_back(); } もしくは for(std::vector<Hoge*>::reverse_iterator itr = v.rbegin();itr != v.rend();++itr) delete *itr; v.clear(); もしくは std::for_each(v.rbegin(),v.rend(),boost::checkd_deleter<Hoge>()); v.clear(); あたりをどうぞ。 2番目か3番目がお勧め(3は要boost)
- 876 名前:デフォルトの名無しさん [2008/03/31(月) 23:18:15 ]
- 上のソースで、一つずつ領域解放出来るの??? swapしか出来ないと思ってたけど
- 877 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:21:33 ]
- 解放しようとしているものを取り違えている。
v.empty()がtrueだけどメモリがreserveされてる話とは別。 vector<Hoge*>().swap(v); てことだろうけど、これだとvの中のHoge*が指す先はリークする。
- 878 名前:デフォルトの名無しさん [2008/03/31(月) 23:22:22 ]
- delete v.back();
'delete' のオペランドは非 const ポインタでなければならない
- 879 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:23:14 ]
- >>878
vがconstなんだろ。それなら無理だ。
- 880 名前:デフォルトの名無しさん [2008/03/31(月) 23:23:47 ]
- >>877
後ろからサイズを小さくしていくならばresize()という関数あるけど駄目なの?
- 881 名前:デフォルトの名無しさん [2008/03/31(月) 23:24:36 ]
- vector<int> v(10000); だが・・・
- 882 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:25:26 ]
- >>880
元の質問読んでる?vector<Hoge*>の各要素が指す先をdeleteしつvectorをemptyにしたいって言ってるんだよ。
- 883 名前:デフォルトの名無しさん [2008/03/31(月) 23:31:04 ]
- そういうことね
- 884 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:39:18 ]
- >>875
3番目はboost無くても数行で実装できるよね www.google.com/search?q=for_each+delete
- 885 名前:デフォルトの名無しさん mailto:sage [2008/03/31(月) 23:48:18 ]
- >>875
うん。今回だとdeleteを適用する関数オブジェクト作るだけだしね。
- 886 名前:デフォルトの名無しさん [2008/04/01(火) 16:21:58 ]
- [1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6189.txt [3] 環境 [3.1] OS:windowsXP [3.2] コンパイラ名とバージョン: visual studio 2003 [3.3] 言語:C言語 [4] 期限:2008年4月2日午前8時 [5] その他の制限:なし よろしくお願いします
|

|