■掲示板に戻る■ 全部 1- 最新50 read.htmlに切り替える
■ C言語のお勉強ページに対するご意見・ご感想スレ

1 名前:へなちょこ管理人 ★:2007/08/05(日) 07:32:58
移転を機に立ててみました。
これ、もうちょっと○○したほうがスマートじゃない?
とか
こんな関数つかってんじゃねーよ
とか
普通に感想とかお寄せください。

9 名前:るーきー:2008/06/30(月) 20:55:23
int IsLeepYear(int y) の最後  ? 1 : 0;  の行に[;のトークンの前に
文法エラーがあります] と表示されるのですが、どういった理由なのかよくわかりません
勘違いだったらすいません。

10 名前:へなちょこ管理人 ★:2008/07/01(火) 00:29:08
しばらく放置しすぎた・・・

>>8
たしかにおかしいですね。
しばらくCさわってなかったから色々苦戦中w
しばしおまちくだしあ。

>>9
上に同じく原因を調べてます〜

11 名前:へなちょこ管理人 ★:2008/07/01(火) 00:35:12
2-1.cについてはキャストせずにやっていたのでおかしなパーセンテージになってました。
修正版はこちら。
#include <stdio.h>

main(void)
{
int a,b;
double c;

puts("二つの整数を入力してください。");
printf("整数A:");scanf("%d", &a);
printf("整数B:");scanf("%d", &b);
printf("Aの値はBの%d%%です。\n", (int) ((double) a / (double) b * 100));

return 0;
}

12 名前:へなちょこ管理人 ★:2008/07/01(火) 00:40:13
>>9
うちの環境ではエラーがでないのでよくわからないです・・・。
Borland C++ CompilerとBCpadなんですが。

括弧が多すぎるのかな?

13 名前:すぐ名無し、すごく名無し:2008/08/31(日) 00:05:24
こんにちは!
C言語勉強中です.
演習6-11で行き詰まり参考にさせていただきました.
そこで1つ気づいたのですが,管理人様の解答だと,

「例2):各学生の3教科の平均点を求める。」

が実行できないと思います.
おそらく勘違いだと思いますが,管理人様のは各教科の平均を出しておられるのではないかと...
自分ももう少し考えてみますが,管理人様もお時間がありましたら修正版を示していただけると助かります.

14 名前:へなちょこ管理人 ★:2008/09/01(月) 15:30:27
Cは久しくさわってないので時間がかかるかも・・・
とりあえず考えてみます。

15 名前:へなちょこ管理人 ★:2008/09/01(月) 15:45:08
でけた。
ちょこちょこデバッグしながらで仕様を思い出せないですが、
なんとか期待通りの動作をしました。

/*
5人の学生の3教科(国語・数学・英語)の点数を
2次元配列を用いて処理するプログラムを自由に作成せよ。
例1):科目別の最高点を求める。
例2):各学生の3教科の平均点を求める。
*/

#include    <stdio.h>

#define    NINZU    5
#define    KYOKA    3

void max(const int ma[NINZU][KYOKA], int no, int mb[KYOKA])
{
    int    i, j;
    
    for ( i = 0; i < KYOKA; i++ )    {
        mb[i] = ma[0][i];
    }
    
    for ( i = 1; i < no; i++ )
        for ( j = 0; j < KYOKA; j++ )
            if ( mb[j] < ma[i][j] )
                mb[j] = ma[i][j];
}

void avg(const int va[NINZU][KYOKA], int no, int vc[NINZU])
{
    int    i, j;
    for ( i = 0; i < NINZU; i++ )
        for( j = 0; j < no; j++ )
            vc[i] += va[i][j];
    
    for ( i = 0; i < NINZU; i++ )
        vc[i] /= no;
}

int main(void)
{
    int    i;
    int    a[NINZU][KYOKA] = { 0 };
    int    b[KYOKA] = { 0 };
    int    c[NINZU] = { 0 };
    
    printf("%d人の国語、数学、英語の点数を入力して下さい。\n", NINZU);
    for ( i = 0; i < NINZU ; i++ )    {
        printf("[%02d] 国語:", i + 1);    scanf("%d", &a[i][0]);
        printf("   数学:");            scanf("%d", &a[i][1]);
        printf("   英語:");            scanf("%d", &a[i][2]);
    }
    
    max(a, NINZU, b);
    avg(a, KYOKA, c);
    
    printf("国語の最高点:%d\n", b[0]);
    printf("数学の最高点:%d\n", b[1]);
    printf("英語の最高点:%d\n", b[2]);

    for ( i = 0; i < NINZU; i++ )    {
        printf("%02d人目の平均点:%d\n", i + 1, c[i]);
    
    return 0;
}

16 名前:訴える名無しさん。:2008/11/07(金) 23:31:59
C LanguageよりLanguage Cの方がしっくりくるお。
どっちでも通じるけど、後者の方が論文で良く見る。

17 名前:かえで:2008/11/12(水) 19:59:35
ほすほす

18 名前:へなちょこ管理人 ★:2008/11/12(水) 21:05:42
ほすしなくても落ちないよw

19 名前:かえで:2008/11/12(水) 21:06:46
>>18
いやいつになったら16に対する反応があるのかなぁと

20 名前:へなちょこ管理人 ★:2008/11/12(水) 21:09:38
FTPにログインするのが億劫だっただけだったりしたのだ。
まぁ仕事忙しくて時間無かったのもあるけど。

上下が逆のような気がするけど気にしないw
んじゃHTML更新してくるぜ!

21 名前:☆ハイパー名無しタイム☆:2008/11/24(月) 17:16:11
演習7-2.cの終わりの方の

puts("左にシフトした後の内容");
nol = lrotate(no, n);
print_bits(nol);

return 0;
}
の  nol = lrotate(no, n); じゃなくて
   nol = rrotate(no, n); では?

22 名前:へなちょこ管理人 ★:2008/11/24(月) 20:11:25
/*符号無し整数xを右にnビット回転した値を返す*/
unsigned rrotate(unsigned x, int n)

/*符号無し整数xを左にnビット回転した値を返す*/
unsigned lrotate(unsigned x, int n)

だから合ってるような気がするんですが読み間違えてるんでしょうか・・・

23 名前:超絶初心者:2008/12/27(土) 15:58:18
第四章4-18のリンクが4-1になってますよ。

24 名前:へなちょこ管理人 ★:2008/12/29(月) 02:52:32
>>23
Oh...misstake.
修正しておきますた。

25 名前:超絶初心者:2009/01/06(火) 00:14:19
演習6-9についてなのですが、問題が配列v2の並びを逆順にしたものを配列v1に格納する関数
なのですがこれをコンパイルするとv1がv2に格納されるのですがこれでよろしいのですか?
初心者であまり問題の意味も理解しきれていないのですがスイマセン…
ちなみに私はこのようにやってみました、間違っていたらご指摘ください。
void intary_rcpy(int v1[], const int v2[], int no)
{
int i;
for (i = 0; i < no; i++)v1[i] = v2[(no - i) - 1];
}
int main (void)
{
int i;int a[NUMBER], b[NUMBER];
printf("%d×2個の数値を入力してください。\n", NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("a[%d] = ", i); scanf("%d", &a[i]); printf("b[%d] = ", i); scanf("%d", &b[i]);
}
puts("bの数値を逆転したものをaに代入します。");
intary_rcpy(a, b, NUMBER);
for (i = 0; i < NUMBER; i++) {
printf("a[%d] = %d", i, a[i]);
printf("b[%d] = %d", i, b[i]);
putchar('\n');
}

26 名前:へなちょこ管理人 ★:2009/01/06(火) 06:04:25
パッと見ですが、
for (i = 0; i < no; i++)v1[i] = v2[(no - i) - 1];
この行に違和感感じました。

詳しくは帰宅した後にでも〜。

27 名前:へなちょこ管理人 ★:2009/01/07(水) 00:38:06
問題を見ると
/*
要素数がnoであるint型の配列v2の並びを逆順にしたものを配列v1に格納する関数
void intary_rcpy(int v1[], const int v2[], int no) {}
を作成せよ。
*/
とあります。
まず、
printf("%d×2個の数値を入力してください。\n", NUMBER);
ここがおかしいです。
×2個はいらないです。
その下も以下略。

まず問題をわかりやすく砕いてみましょう。
要は、
12
34
56
78
90
となってる配列(v1)を
90
78
56
34
12
という配列(v2)にすればいいのです。

なので、
v1配列の最初の値をv2配列の最後に代入

v1配列の最初+1の値をv2配列の最後-1に代入

以下略

これでうまくいくはず?
なんか自分の回答みると無駄な処理してるような・・・。
とりあえずこんな感じです〜。

28 名前:へなちょこ管理人 ★:2009/01/07(水) 00:40:23
付け加えると、constをつけると弄れなくなるので、
必然的にintary_rcpyに与える引数は
逆順にした値を格納する配列,入力した配列,要素数(配列の数)ですね。


眠い頭で書いてるので変なこと書いてたら吸いません。

29 名前:へなちょこ管理人 ★:2009/01/07(水) 00:47:04
久々にCのコード覗いて思ったけど未だにオレ、配列とポインタの区別できてないんだよなぁ。
なんとなく違いはわかるんだけど明文化しろって言われたらできない。

30 名前:超絶初心者:2009/01/07(水) 05:15:06
実引数bをv1に、aをv2にとしているのを、aをv1に、bをv2にと勘違いしていました。スイマセン
intary_rcpyなのですが最初の
for ( i = 0; i < no; i++ ) v1[i] = v2[i]; temp = v1[i]; v1[i] = v1[(no - 1) - i]; v1[(no - 1) - i] = temp;
for (i = 0; i < no; i++) v1[i] = v2[(no - 1) - i];に書き換えることが可能だとおもいます。
お忙しい所質問にご回答いただきありがとうございます。今後とも利用させていただきます。

31 名前:へなちょこ管理人 ★:2009/01/23(金) 21:02:36
某人生ゲームみたいなボードゲーム。サイコロを振って出た目の分進んでゴールを目指す。途中止まったマスによって様々なイベントが起こり、そのたびに所持金やプレイヤーのステータスが変化する。例えば、所持金が変化するイベントやステータスが上下するイベントがある。移動制限は作らない。
ステータスや所持金で選べる職業が変化する。ゴールしたときプレイヤーの所持金とステータスをランキングに残す。所持金のランキングとステータスのランキングと総合スコアのランキングをそれぞれ上位の10人ずつ残す。総合スコアは所持金とステータスの値を計算式にあてはめて算出する。最初にいくつか質問をして、ステータスの初期値をきめる。マスの進む数は1?6までの数をだすサイコロで決める。マス目は100マスぐらいを予定。少ないターン数でゴール出来たら所持金やステータスにボーナスがある。

32 名前:へなちょこ管理人 ★:2009/01/23(金) 21:08:54
サイコロの目を決める
int saikoro = 1;
saikoro = rand() % 6 + 1;

33 名前:へなちょこ管理人 ★:2009/01/23(金) 21:22:29
【びん取りゲーム】
ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。
びんの本数: 20
先攻後攻を決めます...先攻 [1] / 後攻 [2] : 1
===========================あなたの先攻でスタート============================

何本取りますか?...3
プレイヤー>3 本取ったぞ!
□□□■■■■■■■■■■■■■■■■■ あと 17 本!
コンピュータ>1 本取ったぞ!
□□□□■■■■■■■■■■■■■■■■ あと 16 本!
何本取りますか?...2
プレイヤー>2 本取ったぞ!
□□□□□□■■■■■■■■■■■■■■ あと 14 本!
コンピュータ>2 本取ったぞ!
□□□□□□□□■■■■■■■■■■■■ あと 12 本!
何本取りますか?...2
プレイヤー>2 本取ったぞ!
□□□□□□□□□□■■■■■■■■■■ あと 10 本!
コンピュータ>1 本取ったぞ!
□□□□□□□□□□□■■■■■■■■■ あと 9 本!
何本取りますか?...3
プレイヤー>3 本取ったぞ!
□□□□□□□□□□□□□□■■■■■■ あと 6 本!
コンピュータ>1 本取ったぞ!
□□□□□□□□□□□□□□□■■■■■ あと 5 本!
何本取りますか?...1
プレイヤー>1 本取ったぞ!
□□□□□□□□□□□□□□□□■■■■ あと 4 本!
コンピュータ>3 本取ったぞ!
□□□□□□□□□□□□□□□□□□□■ あと 1 本!

=================================ゲーム終了==================================
あなたの負け!また挑戦してね!
nterキーを押すと終了...

34 名前:へなちょこ管理人 ★:2009/01/23(金) 21:23:57
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

//びん取りゲーム
main () {
int bin_max;//びんの総本数
int bin;//残りびんの本数
int max = 3;//一度に取れるびんの最大数
int p_turn = 0;//プレイヤーターンフラグ
int p_get, m_get;//プレイヤー、コンピュータそれぞれの取ったびんの数
int i;

srand(time(NULL));

//びんの総本数を決める
bin_max = rand()%5 + 20;
bin = bin_max;

printf("【びん取りゲーム】\n");
printf("ルール:交互に1〜3本のびんを取ります。最後の1本を取った人が負けです。\n");
printf("びんの本数: %d\n", bin_max);

//先攻後攻を決める
printf("先攻後攻を決めます...先攻 [1] / 後攻 [2] : ");
scanf("%d", &p_turn);
while(getchar() != '\n') { }
if(p_turn == 1 || p_turn == 2) {
printf("============================あなたの");
if(p_turn == 1) { printf("先攻"); }
else if(p_turn == 2) {
printf("後攻");
p_turn = 0;
}
printf("でスタート============================\n\n");
} else {
printf("不正な値を受け取りました...強制的にプレイヤーは後攻です。\n\n");
p_turn = 0;
}

//びんを交互に取る
for(; bin > 1; p_turn = !p_turn) {
if(p_turn) {//プレイヤーのターン
do {
p_get = 0;
printf("何本取りますか?...");
scanf("%d", &p_get);
while(getchar() != '\n') { }
} while((p_get < 1) || (p_get > max));
printf("プレイヤー>%d 本取ったぞ!\n", p_get);
bin -= p_get;
if(bin <= 0) { printf("プレイヤー>0になっちゃったよ・・・\n"); }
} else {//コンピュータのターン
if(bin <= max + 1) {
m_get = bin - 1;
Sleep(500);
}
else {
m_get = rand()%max+1;
Sleep(rand()%500 + 1000);
}
printf("コンピュータ>%d 本取ったぞ!\n", m_get);
bin -= m_get;
}

//残り本数の表示
if(bin >= 1) {
for(i = 0; i < bin_max; i++) {
if(i < bin_max - bin) { printf("□");
} else { printf("■"); }
}
printf(" あと %d 本!\n", bin);
}
}

printf("\n==================================ゲーム終了==================================\n");
//勝敗判定
if(!p_turn && (bin <= 0)) { p_turn = !p_turn; }
if(p_turn) {
printf("あなたの負け!また挑戦してね!\n"); }
else { printf("あなたの勝ち!\n"); }
/***********************************以下追加文********************************/
printf("Enterキーを押すと終了...");
rewind(stdin);
getchar();
/***********************************追加文終了********************************/
return 0;
}

35 名前:名無しさんが転んだ!:2009/01/26(月) 09:45:38
演習7-4の解答ページが見れなくなっています。

36 名前:へなちょこ管理人 ★:2009/01/26(月) 20:00:22
>>35
ローカル見てみたらどうやら解いてないみたいです。。。
ちょっと解いてみますね。

37 名前:へなちょこ管理人 ★:2009/01/26(月) 23:19:05
現在Cのコンパイル環境がないので昔のPCでちまちまやるの面倒だった・・・。
おおざっぱですが、やってみました。挙動がおかしかったらご指摘下さい。

38 名前:へなちょこ管理人 ★:2009/01/26(月) 23:20:16
/*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
        unsigned set_n(         unsigned x, int pos, int n) { /*…*/ }
        unsigned reset_n(       unsigned x, int pos, int n) { /*…*/ }
        unsigned inverse_n(     unsigned x, int pos, int n) { /*…*/ }
を作成せよ。
*/

#include        <stdio.h>

/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
        int     count = 0;
        while(x){
                if ( x & 1U )   count++;
                x >>= 1;
        }
        return count;
}

/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
        return count_bits(~0U);
}

/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
        int     i;
        for ( i = int_bits() - 1; i >= 0; i-- )
                putchar((( x >> i ) & 1U ) ? '1' : '0');
        putchar('\n');
}

/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i | x;
}

/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        i = ~i;
        return i & x;
}

/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i ^ x;
}

int main(void)
{
        unsigned no;
        int bit;
        
        printf("整数を入力してください:");      scanf("%lu", &no);
        puts("ビットの中身");
        print_bits(no);
        printf("何ビット目を処理しますか:");    scanf("%d", &bit);
        printf("ON_n:\t");
        print_bits(set_n(no, bit));
        printf("OFF_n:\t");
        print_bits(reset_n(no, bit));
        printf("INVERSE_n:");
        print_bits(inverse_n(no, bit));
        
        return 0;
}

39 名前:へなちょこ管理人 ★:2009/01/26(月) 23:23:44
fooooooooooooooooooooooooo

forの中のj = pos - 1ってのは全部j = 0におきかえてくだしあ。
間違えたまま保存してたw

40 名前:@携帯:2009/01/27(火) 13:03:01
あー
ちゃんと引数あたえてなかったりでめちゃめちゃや。

帰宅してから直します。

41 名前:へなちょこ管理人 ★:2009/01/27(火) 20:12:43
>符号無し整数xのposビット目からn個のビットを
右にn個なのか左にn個なのか・・・。
humm...

42 名前:へなちょこ管理人 ★:2009/01/27(火) 20:40:51
/*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
unsigned set_n(         unsigned x, int pos, int n)
unsigned reset_n(       unsigned x, int pos, int n)
unsigned inverse_n(     unsigned x, int pos, int n)
を作成せよ。
*/

#include        <stdio.h>

/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
    int count = 0;
    while(x) {
        if ( x & 1U )   count++;
            x >>= 1;
    }
    return count;
}

/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
    return count_bits(~0U);
}

/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
    int i;
    for ( i = int_bits() - 1; i >= 0; i-- )
        putchar((( x >> i ) & 1U ) ? '1' : '0');
    putchar('\n');
}

/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    return i | x;
}

/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    i = ~i;
    return i & x;
}

/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
    unsigned i = 1U;
    int j;
    for ( j = 0; j < n - 1; j++ ) {
        i <<= 1;
        i += 1;
    }
    i <<= pos - n;
    return i ^ x;
}

int main(void)
{
    unsigned no;
    int bit,n;
    
    printf("整数を入力してください:");      scanf("%lu", &no);
    puts("ビットの中身");
    print_bits(no);
    printf("何ビット目を処理しますか:");    scanf("%d", &bit);
    printf("何個処理しますか:");        scanf("%d", &n);
    printf("ON_n:\t\t");
    print_bits(set_n(no, bit, n));
    printf("OFF_n:\t\t");
    print_bits(reset_n(no, bit, n));
    printf("INVERSE_n:\t");
    print_bits(inverse_n(no, bit, n));
    
    return 0;
}

43 名前:へなちょこ管理人 ★:2009/01/27(火) 20:43:39
上記の回答は右にn個処理するものです。
左にn個処理する場合は各関数の i <<= pos - n;を
i <<= pos - 1;にしたらいいと思います。

44 名前:へなちょこ管理人 ★:2009/01/27(火) 20:49:27
んで、もし、posがunsignedを超えたり、nがposを超える入力があった場合のために、
pos → pos % int_bits()
n → n % pos
にしとくと安全かもしれません。

45 名前:へなちょこ管理人 ★:2009/01/27(火) 21:01:53
http://newcomer.nuts-choco.com/clang/src/7/7-4.c.txt

んで、ファイル置いておきました。

46 名前:uuuss:2009/05/17(日) 17:28:39
http://newcomer.s368.xrea.com/clang/
掲示板へのリンクが切れてるw

47 名前:へなちょこ管理人 ★:2009/05/18(月) 02:54:08
>>46
っうぇっうぇw
一部相対リンクじゃなくて絶対リンクになってるから直すのめんどくせぇww

48 名前:へなちょこ管理人 ★:2009/05/18(月) 02:57:28
nuts-chocoの方も復活してるけどいずれまた落ちるだろうからシカトw
看板だけ取り戻せてよかた〜。
みっちゃんに作ってもらった大切な看板だからなぁ。

49 名前:へなちょこ管理人 ★:2009/07/03(金) 21:10:19
/*
文字列strの中に、文字cが含まれていれば(複数ある場合は、最も先頭側とする)、
その文字へのポインタを返し、含まれていなければNULLを返す関数
char *str_chr(const char *str, int c) {}
を作成せよ。
*/

#include <stdio.h>

char *str_chr(const char *str, int c)
{
while(*str){
if(*str == c)
return (char*)str;
str++;
}

return NULL;
}

int main(void)
{
char str[128];
int c;
char *p;

printf("文字列を入力してください:");
scanf("%s", str);
while(getchar() != '\n' );
printf("検索する文字を入力してください:");
scanf("%c", &c);

if( (p = str_chr(str, c)) == NULL )
printf("指定された文字は見つかりませんでした。\n");
else
printf("%cは%d文字目にありました。\n", c, p - &str[0] + 1);

return 0;
}

50 名前:へなちょこ管理人 ★:2009/07/03(金) 21:12:06
char *str_chr(const char *str, int c)
{
char * res;

while(*str){
if(*str == (char)c){
res = str;
return res;
str++;
}

return NULL;
}

こうかな

29KB
新着レスの表示

掲示板に戻る 全部 前100 次100 最新50 read.htmlに切り替える

名前: E-mail(省略可)

img0ch(CGI)/3.1.10