C/C++の宿題を片付けます 104代目at TECH
C/C++の宿題を片付けます 104代目 - 暇つぶし2ch809:デフォルトの名無しさん
08/03/26 20:37:58
[1] 授業単元: プログラミング演習
[2] 問題文:5人のテストの点数をキーボードから入力し、合計と平均を表せ。
[3] 環境
 [3.1] OS: Windows・Linux/
 [3.2] コンパイラ名とバージョン:
 [3.3] 言語: C
[4] 期限: 明日まで
初期的な問題ですがお願いします。

810:デフォルトの名無しさん
08/03/26 20:55:18
>>809
#include<stdio.h>
int main() {
int i, test[5], sum = 0;
for (i=0; i<5; i++) {
printf("%d人目の点数を入力してください:", i+1);
scanf("%d", &test[i]);
sum += test[i];
}
printf("合計:%d 平均:%f\n", sum, (double)sum / 5);
}

811:デフォルトの名無しさん
08/03/26 23:19:00
test+iでええやん。

812:デフォルトの名無しさん
08/03/26 23:25:25
>>811
君は一年後自分のレスを思い出してこう言うだろう
「認めたくないものだな、自分自身の若さ故の過ちと言うものを。」

813:812
08/03/26 23:27:41
おれは今自分自身の過ちを後悔している
コピペ元が間違ってた orz

「認めたくないものだな。自分自身の、若さ故の過ちというものを。」

814:デフォルトの名無しさん
08/03/26 23:55:53
ガノタ乙
と言って欲しいんだろ?

815:デフォルトの名無しさん
08/03/27 00:01:02
>>812-813
なんだこいつ・・・

816:デフォルトの名無しさん
08/03/27 00:07:28
それより>>811の解説してくれ

817:812
08/03/27 00:18:13
>>816
シンタックスシュガーを知ったばかりなので使いたがっている状態

818:デフォルトの名無しさん
08/03/27 01:08:39
糖衣構文でええやん。

819:デフォルトの名無しさん
08/03/27 02:17:54
ところで、
>>44
> /* 文字列の長さ */
> for(str_length=0; str[str_length]; str_length++) {}

ではなく
str_length = sizeof (str) - 1;

だと思うが。

820:デフォルトの名無しさん
08/03/27 02:20:36
>>811
そもそもtest[5]はscoreでええがな

821:デフォルトの名無しさん
08/03/27 02:30:33
>>819
わざわざ「文字列の長さ」と書いてあるんだから配列の大きさを基準にしちゃダメじゃないか?

822:デフォルトの名無しさん
08/03/27 09:03:35
>>817
こいつもしかして、test[i]こそがシンタックスシュガーだということを知らないのでは・・・

823:デフォルトの名無しさん
08/03/27 10:49:45
>>816
test[i]は*(test+i)のシンタックスシュガー
&test[i]は&*(test+i)のシンタックスシュガー
&*ってムダじゃね?ってことだろ。

824:デフォルトの名無しさん
08/03/28 14:09:52
糖衣だろうがなんだろうが &test[i] なんて書き方はしねーよ

825:デフォルトの名無しさん
08/03/28 14:17:26
それが、&test[i]の方が多数派だったりするんだよw

826:デフォルトの名無しさん
08/03/28 14:29:03
確かに&test[i]って記述はよく見かけるね
俺は個人的に好かない書き方だ
Cの配列とアドレッシングとの関連がわかってないのかな

827:デフォルトの名無しさん
08/03/28 15:00:27
俺はCだと基本どうでもいい。所詮、構文糖。
が、C++だと&a[i]とa+iの意味が違う事がある。(std::vector等)。
STL等のランダムアクセス可能なコンテナだと&a[i]は使えるけどa+iは使えない。
そうなるとCを使うときもC++の流儀に合わせて&a[i]と書きたくなる。

828:デフォルトの名無しさん
08/03/28 15:21:10
vectorで&a[i]なんて何に使うんだ?

829:デフォルトの名無しさん
08/03/28 15:45:00
char*を要求する関数を呼び出すときとか

830:デフォルトの名無しさん
08/03/28 15:55:40
char*ならstd::string使えよ・・・

831:デフォルトの名無しさん
08/03/28 16:00:56
非constのchar*が必要なとき

832:デフォルトの名無しさん
08/03/28 16:48:17
&を見れば定義をみないでもアドレスであることがわかる
ソース中の[をみれば配列にアクセスしている箇所を
testをキーワードにして検索したりしないでもすぐ探せる
保守しやすくなるからワザとやってるんじゃないの

833:デフォルトの名無しさん
08/03/28 16:52:58
>>826
Cの配列とアドレッシングとの関連がわかっていることと
&test[i]と書くことは全く別問題。

834:デフォルトの名無しさん
08/03/28 22:46:33
&test[ i ] 配列testのi番目の要素のアドレス
test + i ポインタtestからi * nずらしたアドレス
って感じだから前者の方がしっくりくるって人が多数派ににるんじゃない?


835:デフォルトの名無しさん
08/03/28 23:52:10
&test[i]って書き方はあまりしないけど、&test[0]って書き方なら結構するな
testだけだとパッと見わかりにくいし。

836:デフォルトの名無しさん
08/03/29 04:23:24
>>835
char buf[1024];
int size = sizeof(&buf[0]);
って書くってこと?

837:デフォルトの名無しさん
08/03/29 04:35:51
オッス、オラC言語歴10年、もっとオラがwktkするような宿題を依頼してくれYO!

838:デフォルトの名無しさん
08/03/29 04:42:23
>>836
何をしたいのか理解できない

839:デフォルトの名無しさん
08/03/29 14:17:42
整数を入力してください:25
1234567890123456789012345


こんな感じで1234567890123…を読み込まれた整数の個数だけ繰り返し表示するプログラムを作成する問題なのですが
誰か教えて頂けないでしょうか?


840:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/29 14:29:21
printf("%u", n%10);

あとは頑張れ。

842:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/29 14:30:26
独力で学習することが独学。
聞ける人がいないのは孤独。

844:デフォルトの名無しさん
08/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
08/03/29 14:31:36
おっとアンカミス
s/841/840

846:デフォルトの名無しさん
08/03/29 14:42:21
ありがとうございます!
上京したてで友達がいない中、予習してまして…

847:デフォルトの名無しさん
08/03/29 14:50:16
勉強用に、の意味がわからない

848:デフォルトの名無しさん
08/03/29 16:14:46
勉強用に捻くれたコードを提示すると、捻くれた知識が身に付くだけだぞ。

849:デフォルトの名無しさん
08/03/29 17:55:02
と、捻くれた人が言ってます

850:デフォルトの名無しさん
08/03/29 18:43:08
>>840>>844 は師匠と弟子か?
もしそうならスレ立てしてそっちでやれよ
ついでに俺は前置きで
> こんなの書いても現段階だと悪影響にしかならん気はするぞ
って書いておいたんだがな

851:デフォルトの名無しさん
08/03/29 18:55:00
>って書いておいたんだがな
どこに?

852:デフォルトの名無しさん
08/03/29 19:11:50
>>850
> >>840 と >>844 は師匠と弟子か? 
いや、まったく関係なし。
単に暇つぶしで適当かつ、それなりに捻くってコードを書いただけ。
真面目なコードは既に出てたし、こういう捻った書き方もあるよーってね。

#まぁぶっちゃけprintfの書式で遊んでみたかっただけなんだけど。

853:デフォルトの名無しさん
08/03/29 19:16:56
勉強用に、って自分の勉強のことか

854:デフォルトの名無しさん
08/03/29 21:07:15
変なコードを書くときは、一々捻くれたとか書かないでそのまま書く。
そういうことを書くとちょっと変わった俺臭がきついから。

855:デフォルトの名無しさん
08/03/29 21:10:10
いよいよCにすら関係なくなってきたぞ

856:デフォルトの名無しさん
08/03/29 23:39:59
まぁ、ぶっちゃけ、これらを習って最終的に何を作る目的があるのか?
自分も大学生時代にC言語の授業はあったけど、そこで習ったことだけじゃ通用せんが
必要なことは習っていた。その後、自分でライブラリを調べて、日ごろの使用目的に応じて
必要なプログラムを作るようになった。そうなるのが望ましい。

857:デフォルトの名無しさん
08/03/30 00:22:05
まあここに来るのは「プログラムの宿題マンドクサ。誰かにやってもらおう」って人だから、望むべくもないかもね。

858:デフォルトの名無しさん
08/03/30 00:36:29
それくらいの人の方がうれしい
単位がかかってるとか理解できないからもっと簡単にしてくれとかちょっとうざい

859:デフォルトの名無しさん
08/03/30 00:43:56
何でも良いから宿題かもん

860:デフォルトの名無しさん
08/03/30 00:46:37
ひまなら project Euler でもやってれば

861:デフォルトの名無しさん
08/03/30 00:48:37
おおやってみる㌧クス

862:デフォルトの名無しさん
08/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
08/03/30 12:57:51
↑書き忘れました。
規定の文字列というのは2分探索法ですので aaabbcのように辞書順にソートされている1行の文字列です。

864:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/30 15:06:39
>>862
mainは適当に書いたから書き直したほうがいいかも
URLリンク(kansai2channeler.hp.infoseek.co.jp)


867:デフォルトの名無しさん
08/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
08/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:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/30 18:08:44
>>869

871:デフォルトの名無しさん
08/03/30 20:50:16
〉〉868
アルゴリズムの問題なのだから、bsearchを使うのはだめなんじゃないか?アルゴリズムを作って使う課題なのだろうし。

872:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/31 23:11:01
基本的に領域の開放は無理だろ swapでやるしか無いのでは?
ブロックごとに管理して100個使わなくなったら解放とかじゃないか

874:デフォルトの名無しさん
08/03/31 23:11:47
constでない操作を呼び出した時点でiteratorは無効になる。
(実装によりたまたま有効なままかもしれないけど)
↓でいいんじゃない。

while(!v.empty()) {
delete v.back();
v.pop_back();
}

875:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/03/31 23:18:15
上のソースで、一つずつ領域解放出来るの??? swapしか出来ないと思ってたけど

877:デフォルトの名無しさん
08/03/31 23:21:33
解放しようとしているものを取り違えている。
v.empty()がtrueだけどメモリがreserveされてる話とは別。

vector<Hoge*>().swap(v);
てことだろうけど、これだとvの中のHoge*が指す先はリークする。

878:デフォルトの名無しさん
08/03/31 23:22:22
delete v.back();

'delete' のオペランドは非 const ポインタでなければならない

879:デフォルトの名無しさん
08/03/31 23:23:14
>>878
vがconstなんだろ。それなら無理だ。

880:デフォルトの名無しさん
08/03/31 23:23:47
>>877
後ろからサイズを小さくしていくならばresize()という関数あるけど駄目なの?

881:デフォルトの名無しさん
08/03/31 23:24:36
vector<int> v(10000); だが・・・

882:デフォルトの名無しさん
08/03/31 23:25:26
>>880
元の質問読んでる?vector<Hoge*>の各要素が指す先をdeleteしつvectorをemptyにしたいって言ってるんだよ。

883:デフォルトの名無しさん
08/03/31 23:31:04
そういうことね

884:デフォルトの名無しさん
08/03/31 23:39:18
>>875
3番目はboost無くても数行で実装できるよね
URLリンク(www.google.com)

885:デフォルトの名無しさん
08/03/31 23:48:18
>>875
うん。今回だとdeleteを適用する関数オブジェクト作るだけだしね。

886:デフォルトの名無しさん
08/04/01 16:21:58
[1] 授業単元:プログラミング
[2] 問題文(含コード&リンク):URLリンク(kansai2channeler.hp.infoseek.co.jp)
[3] 環境
 [3.1] OS:windowsXP
 [3.2] コンパイラ名とバージョン: visual studio 2003
 [3.3] 言語:C言語
[4] 期限:2008年4月2日午前8時
[5] その他の制限:なし

よろしくお願いします


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch