编程语言基础 C语言

C言語プログラミングに関する以下の問に答えよ。ただし,\¥と同じである。

[1] 次のプログラムの出力結果を示せ。

#include <stdio.h>
int main() {
    int a[]={100,0x200,0300}, *p=a;
    printf("%x %d %o %d\n", a[0],*(p+1),a[1]<<1,(*p+1)|a[2]);
    return 0;
}

[2] 乱数を利用して,6面のサイコロ2個を同時に振ったときの出目の合計値の頻度分布とその平均値を計算するプログラムを以下のように作成する。乱数の生成には,呼び出されるたびに,0以上 RAND_MAX 以下のどれか1つの整数を返す関数 rand() を使用する(RAND_MAXstdlib.h で定義されている)。この関数を使って,6面のサイコロ1個を振った時の出目を返す関数 dice() を作成して,main 関数の中で使用するものとする。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define XMAX (1)
int dice() { return (2); }
double mean(int (3), int n) {
    double m=0.0;
    for(int i=2; i<=XMAX; i++) m += (4);
    return m;
}
 
int main() {
    int n;          /*nはサイコロ2個を同時に振る回数*/
    int x;          /*xはサイコロ2個の出目の合計値*/
    int h[XMAX+1];  /*hはxを記録する配列(頻度分布)*/
    srand(time(NULL));      /*乱数の種を設定する*/
    scanf("%d", (5));       /*nを標準入力する*/
    for(int i=0; i<=XMAX; i++) (6); /*hを初期化する*/
    for(int i=0; i<n; i++) {
        x = (7);    /*サイコロ2個を振ってxを求める*/
        (8);        /*xをhに記録する*/
    }
    for(int i=2; i<=XMAX; i++) {    /*hを表示する*/
        printf("x=%dの頻度は%.1fe+4\n", i, h[i]/10000.0);
    }
    printf("平均値は%.1f\n", mean(h, n)); /*hの平均値を表示する*/
    return 0;
}
  1. 空欄を適切に埋めよ。
  2. として,このプログラムを実行したときに期待される出力結果を示せ。

[3] アルファベットの文字列を対象として,文字列の長さを計算したり,文字列の左右を反転したり,回文かどうかを判定したりするプログラムを以下のように作成する。空欄を適切に埋めよ。また,プログラムの実行結果を示せ。(注:回文とは,始めから読んでも終わりから読んでも同じであるような文のことである。)

#include <stdio.h>
 
int str_len(char s[]) {       /*文字列の長さを計算する*/
    int len;
    for(len=0; (1) !='\0'; (2));
    return len;
}
 
void reverse_str(char s[]) {  /*文字列の左右を反転する*/
    int i, len=str_len(s);
    (3) temp;
    for(i=0; i< (4); i++) {
        temp = s[i];
        s[i] = s[ (5) ];
        s[ (5) ] = temp;
    }
}
 
int palindrome(char s[]){     /*文字列が回文かどうかを判定する*/
    int i, j;
    for(i=0, j= (6); (7); i++, j--) {
        if(s[i] (8) s[j]) return 0;
    }
    return 1;
}
 
int main(){
    char ss[2][20]={"ahitinnnok", "imayuuyami"};
    reverse_str(ss[0]);
    printf("%s\n", ss[0]);
    printf("%s\n", ss[1]);
    printf("%d\n", palindrome(ss[0]));
    printf("%d\n", palindrome(ss[1]));
    return 0;
}

解答:
[1]

[2]
1)

[3]
空欄補充:

実行結果:


第一题主要考察C语言的基本数据类型进制转换与位运算,需要注意第四个参数是解引用后的值加一,由于运算符优先级,星号作用于p,即取数组第一个元素然后加一,运算时将所有数值转换为统一的十进制或二进制后处理即可得出正确结果。第二题考察利用随机数进行概率统计模拟,计算期望频率时通过总次数乘以对应点数和出现的理论概率得到,注意程序中浮点数类型转换以及格式化输出时保留一位小数的四舍五入细节。第三题考察字符串基础操作,包括通过首尾双指针实现反转字符串和判断回文串的常见逻辑,理解数组索引边界和循环跳出条件是准确补全代码的关键,最后顺着主函数的逻辑推演字符串变化即可得出结果。