ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ただいまC・C++勉強中!コミュの問題

  • mixiチェック
  • このエントリーをはてなブックマークに追加
がわからなく四苦八苦しています。
現在C言語駆け出しレベルです。
解答例等を教えていただければ参考にさせていただきますのでよろしくお願いしますm(_ _"m)

1.次の操作を行うプログラムを作りなさい。
ただし、aからnの計算をするときとxからnの計算をするときには、if,for,while,switch,および!,?演算子を使わない。


1-1 aの値は0か1である。aが0なら1を、aが1なら0をaに格納する。


1-2 aが表の値のときに、nに表の値を格納する
aの値   nの値
0〜8     1
9〜17    0
18〜26    1
27〜35    0
・・・    ・・・


1-3 xの値を表に照らしてnを求める。
ただし、xの値の小数点以下第三桁を四捨五入し値がyの値
yの値     nの値
0.00〜0.07   5
0.08〜0.11   7
0.12〜0.13   6
0.14〜0.19   0
0.20      2
0.21〜0.29   3
0.30〜0.33   1
0.34〜0.36   4
0.37〜0.41   6
0.42      8
0.43〜0.55   3
0.56      9
0.57〜0.60   8
0.61〜0.64   5
0.65〜0.72   7
0.73〜0.79   2
0.80〜0.83   0
0.84      9
0.85〜0.96   1
0.97〜1.00   9

--------------------------------------------------------
2-1 2004年の通算日が何月何日の何曜日かを表示するプログラムを作りなさい。1月から12月までの各月の日数の累計を配列に初期設定して使用する。
例えば、通算日の32日は2月1日(日)である。


2-2 配列に文字列をキー入力します。入力した文字列の内、数字をすべて指定の文字に置換するプログラムを作りなさい。
置換後の文字列を表示して確認すること。
最大入力文字数は225文字まで。225文字を越えた場合の処理は考えなくてよい。
1000を変換するときにswitch-caseで10種類に分類するプログラムは不可。if-elseで置き換えたプログラムも不可。
変換する文字
0→¥ 1→( 2→= 3→& 4→$ 5→% 6→# 7→- 8→! 9→)


2-4 文字列を入力し、各文字を2桁の16進数で表示するプログラムを作りなさい。
文字列が"ABCDEFG 1234567890 HIJKLMN"であったなら、次のように表示する。
位置  16進数表示 文字のまま表示
000000 41 42 43 44 45 46 47 20 31 32 33 34 35 36 37 38 |ABCDEFG 12345678|
000010 39 30 20 48 49 4A 4B 4C 4D 4E 00 |90 HIJKLMN.|

--------------------------------------------------------
3-1 
身長と体重を小数点以下一桁まで入力する。
体重をW,身長をLとして、次式によりカウブ指数kを求め、さらに小数点以下二桁を四捨五入して診断結果のカウブ指数とする。
k=(W/(L*L))*10000
診断結果に応じて診断メッセージを表示する。
16未満 痩せ型
16〜26 普通
26超  肥満型

3-1で丹生六、計算された値を最大20個、配列に記憶しなさい。
下記の項目を表示
診断結果毎の人数
カウブ指数最大値
カウブ指数最小値
カウブ指数最大値が格納されている配列番号
カウブ指数最小値が格納されている配列番号

最大値、最小値が複数ある場合は、配列番号を全て表示しなさい。

コメント(28)

>1-1 aの値は0か1である。aが0なら1を、aが1なら0をaに格納する。

1. a = 1 - a
2. a = ~a + 2;

他にも考えてみよう。
>1-2

 いんちき。

  a < 0 || a > 8 || (n = 1);
  a < 9 || a > 17 || (n = 0);
  a < 18 || a > 26 || (n = 1);
  a < 27 || a > 35 || (n = 0);
>1-2

 ふつう。

  n = ( a / 9 + 1 ) & 1;
"丹生六" ---> "入力" でしょうか?
# 悩んで思わずググッたら類似例が多数:-)
/*
 * 課題 2-2
 */
#include <ctype.h>
#include <stdio.h>

int main(void)
{
    const char table[] = "\\(=&$%#-!)";
    char buf[256];
    char *p;
    
    printf("> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL) {
        fprintf(stderr, "入力エラー\n");
        return 1;
    }
    for (p = buf; *p != '\0'; p++) {
        if (isdigit(*p))
            *p = table[*p - '0'];
    }
    printf("変換結果 %s\n", buf);
    return 0;
}
/*
 * 課題 2-4
 */
#include <ctype.h>
#include <stdio.h>
#include <string.h>

#define WIDTH 16

static void dump(const void *m, size_t n)
{
    const unsigned char *p;
    char ascii[WIDTH + 1];
    size_t i;

    ascii[WIDTH] = '\0';
    for (i = 0, p = m; i < n; p++, i++) {
        if ((i % WIDTH) == 0)
            printf("%06X ", i);
        printf("%02X ", *p);
        ascii[i % WIDTH] = isprint(*p) ? *p : '.';
        if (((i + 1) % WIDTH) == 0)
            printf("|%s|\n", ascii);
    }
    if ((i % WIDTH) != 0) {
        ascii[i % WIDTH] = '\0';
        printf("|%s|\n", ascii);
    }
}

int main(void)
{
    char buf[256];
    char *p;

    printf("> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL) {
        fprintf(stderr, "入力エラー\n");
        return 1;
    }
    if ((p = strchr(buf, '\n')) != NULL)
        *p = '\0';
    dump(buf, strlen(buf) + 1);
    return 0;
}
/*
 * 課題 2-1
 */
#include <stdio.h>

/*
 * 2004-01-01 は木曜日(4)
 * 0:日曜 6:土曜
 */
static int days2week(int days)
{
    return ((days % 7) + (4 - 1)) % 7;
}

int main(void)
{
    char buf[80];
    const char *weeks[] = {"日", "月", "火", "水", "木", "金", "土"};
    int months[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int days;
    int wday;
    int mday;
    int mon;

    printf("通算日> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL ||
        sscanf(buf, "%d", &days) != 1 ||
        (days <= 0 || days > 366)) {
        printf("不正な値\n");
        return 1;
    }

    wday = days2week(days);
    for (mon = 0; (mon < 12) && (days > months[mon]); mon++)
        days -= months[mon];
    mday = days;
    printf("%d 月 %d 日(%s)\n", mon + 1, mday, weeks[wday]);
    return 0;
}
#include <stdio.h>

int main(void)
{
  int a;

  a = getchar() & 1;    // 0と1以外がくる事は想定していない。
  printf("%d\n", a);
  
  return 0;
}
/* これは激ムズだったね */
#include <stdio.h>

int main(void)
{
  int a;

  a = (getchar() + 1) & 1;    // 0と1以外がくる事は想定していない。
  printf("%d\n", a);
  
  return 0;
}
aが1の時
1 + 1 = 2
10進数の2を2進数で表現すると
10
これに1の論理積をとると
10 & 1 = 1

という風になるね。
#include <stdio.h>

#define MAXNUMBER 100

int main(void)
{
  int a, n;

  for (a = 0; a < MAXNUMBER; a++) {
    n = (a / 9 + 1) & 1;
    printf("%3d %d\n", a, n);
  }

  return 0;
}
1−3の問題の意味がわからないよー
> 1-3 xの値を表に照らしてnを求める。
> ただし、xの値の小数点以下第三桁を四捨五入し値がyの値

xを入力して、yから値と比較して一致したものをnとして表示しろということだと思ったのですが、xの値の小数点ということは、xは計算しなければならないということでしょうか。
それとも、xは、小数点以下の値を入力してから、考える必要があるということですか。
もしかして、数列を使うということかな。

・・・そんなに難しいものなのか。
理解不能。
<aからnの計算をするときとxからnの計算をするときには、>
<if,for,while,switch,および!,?演算子使用不可>これが何かのヒントぽいね・・・
/*
 * 課題 3-1 (こんな感じか?)
 */
#include <stdio.h>

float kaup(float w, float l)
{
    float k;
    int ki;
    
    k = (w / (l * l)) * 10000.0;
    ki = (int) (k * 100);
    if ((ki % 10) >= 5)
        ki = ki / 10 + 1;
    else
        ki /= 10;
    return (float) ki / 10.0;
}

const char *diag_msg(float k)
{
    const char *msg;

    if (k < 16.0)
        msg= "痩せ型";
    else if (k <= 26.0)
        msg = "普通";
    else
        msg = "肥満型";
    return msg;
}

int main(void)
{
    float k;
    float w, l;
    char buf[80];
    
    printf("身長> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL ||
        sscanf(buf, "%f", &l) != 1 || l <= 0) {
        printf("不正な数値\n");
        return 1;
    }
    
    printf("体重> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL ||
        sscanf(buf, "%f", &w) != 1 || w <= 0) {
        printf("不正な数値\n");
        return 1;
    }
    
    k = kaup(w, l);
    printf("カウブ指数 %.1f 診断 %s\n", k, diag_msg(k));
    return 0;
}
/*
 * 課題 1-3 (こんな感じ?)
 * さすがに疲れたんでもうやめとこ:-p
 */
#include <stdio.h>
#include <string.h>

const struct {
    int start;
    int end;
    int n;
} y2n_table[] = {
    {0, 7, 5},
    {8, 11, 7},
    {12, 13, 6},
    {14, 19, 0},
    {20, 20, 2},
    {21, 29, 3},
    {30, 33, 1},
    {34, 36, 4},
    {37, 41, 6},
    {42, 42, 8},
    {43, 55, 3},
    {56, 56, 9},
    {57, 60, 8},
    {61, 64, 5},
    {65, 72, 7},
    {73, 79, 2},
    {80, 83, 0},
    {84, 84, 9},
    {85, 96, 1},
    {97, 100, 9},
    {-1, -1, -1}
};

int y2n_map[100 + 1];

void create_y2n_map(void)
{
    int i;
    
    memset(y2n_map, 0, sizeof(y2n_map));
    for (i = 0; y2n_table[i].start >= 0; i++) {
        int j;
        
        for (j = y2n_table[i].start; j <= y2n_table[i].end; j++)
            y2n_map[j] = y2n_table[i].n;
    }
}

int main(void)
{
    float x;
    int xi;
    char buf[80];

    create_y2n_map();
    
    printf("x> ");
    if (fgets(buf, sizeof(buf), stdin) == NULL ||
        sscanf(buf, "%f", &x) != 1 || x < 0) {
        printf("不正な数値\n");
        return 1;
    }
    xi = (int) (x * 1000.0);
    if ((xi % 10) >= 5)
        xi = xi / 10 + 1;
    else
        xi /= 10;
    if (xi < 0 || xi > 100) {
        printf("不正な数値\n");
        return 1;
    }
    x = (float) xi / 100.0;
    printf("x = %.2f n = %d\n", x, y2n_map[xi]);
    return 0;
}
>Charlie

2006/02/13 19:49: 5. "丹生六" 検索
2006/02/13 20:07: 6. 課題2-2
2006/02/13 20:27: 7. 課題2-4
2006/02/13 21:09: 9. 課題2-1
2006/02/13 22:40: 23. 課題3-1
2006/02/13 23:10: 24. 課題1-3

 ごくろうさんです。課題2-1 と 課題3-1 の間が少し空いてるのは食事でもしてましたかね。風呂には短いようにおもいます。
何してたっけかなぁ...何か別なことをしていたことは確かです:-)
お礼が遅くなってしまってすみません。
タイプミスがあったようで(アセ
丹生六・・・にうろく・・・入力でした・・

皆様のおかげで大変参考になりましたm(_ _"m)
ありがとうございました☆

ログインすると、残り4件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

ただいまC・C++勉強中! 更新情報

ただいまC・C++勉強中!のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング