記事ディレクトリ
皆さんこんにちは、ジニンです。
今日はC言語筆記試験研修2日目です、一緒に頑張りましょう!
最初の質問
1. 次のプログラムセグメントの出力は ( ) です。
#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A : 12 B : 13 C : 16 D : 上記のいずれも正しくありません
そこで、vs を使用します。vs でのこのコードの効果を示しましょう。
あはは、コンパイラによって明確に区別された文字がいくつかあります。しかし、それでも説明。
\\: 文字「\」を示し、エスケープできないようにします。
\t: 水平タブ文字 (コンピュータの Tab キー) を示します。つまり、文字も表します。
\ddd: \1 ~ 3 の数字を追加します。これらの数字は 8 進数で、ASCII と同等の文字にエスケープする必要があります。
したがって、\\ は 1 文字としてカウントされ、123456 は 6 文字としてカウントされ、\123 は 1 文字としてカウントされ、456 は 3 文字としてカウントされ、\t は 1 文字としてカウントされ、合計 12 文字としてカウントされるため、A を選択します。
2番目の質問
2. 以下のようなプログラムがある場合、実行後の出力は( )となります。
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}
A : 4 B : 8 C : 9 D : 6
この質問では、マクロを定義するための #define について調べます。define で定義された識別子は置き換えられるだけです。括弧がない場合、実際に何らかの副作用が発生する可能性があります。
N と M の値を次のようにマクロに置き換えます
得られた値は8なのでBを選択します。
この質問で調査された知識ポイント: C 環境と前処理
3番目の質問
3. 次の関数の f(1) の値は ( )
int f(int n)
{
static int i = 1;
if (n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
A : 5 B : 6 C : 7 D : 8
この質問では、関数の再帰とローカル変数の静的定義について調べます。
変数が static によって変更された場合、その変数はスコープを出た後も破棄されません。つまり、関数に初めて入る i の値は 1、関数に 2 回目に入る i の値は 2 です。 i の値が常に 1 になるわけではありません。
n=1 関数を入力して再帰を開始します
i=1、n=n+i=2
i=2、n=n+i=4
i=3、n=n+i=7
n=7>5 は n を返します
したがって、この質問ではCを選択してください。
関数再帰の豆知識:C言語関数詳細解説
4番目の質問
4. 次の 3 つのプログラム コードは同じ効果を持ちますか?(
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A : (2)=(3) B : (1)=(2) C : 同じではない D : すべて同じ
この質問は、const で変更されたポインター変数を調べます。
const 変更ポインタ
constが*の左側にある場合、ポインタの指す内容は変更できません。
const が * の右側にある場合、ポインタ変数はそのポインティングを変更できません。
この質問では、(1) と (2) の const は両方とも * の左側にあり、型に属し、どちらもポインタ a が指す内容を変更できないように制限しますが、(3) の const は右側にあります。 * の側、型に属し、制限 ポインタのポインティングは変更できません。したがって、この質問ではBを選択してください。
5番目の質問
5. 次の文のうち正しいものはどれですか? ( )
A: struct X{short s;int i;char c;} の場合、sizeof(X) は sizeof(s) + sizeof(i) + sizeof(c) に等しくなります。
B: double 変数 a の場合、a == 0.0 を使用して、それがゼロであるかどうかを判断できます。
C: 初期化メソッド char a[14] = "Hello, world!"; は、char a[14]; a = "Hello, world!"; と同じ効果があります。
D: 上記の記述はどれも真実ではありません
この質問では、もう少し詳しい知識を調べます。
オプション A では、構造体のメモリ アライメント コンテンツを調べます。理解できない場合は、 C 言語のカスタム型 で構造体のメモリ アライメントの内容が詳細に記述されているので読むことができます。
オプション B では、浮動小数点関連のコンテンツを調べます。コンピュータの記憶装置では、浮動小数点数を正確に記憶することができないため、浮動小数点数が等しいかどうかを判断するには、一般に、2 つの数値の差が一定の最小値より小さいかどうかを判断します。
オプション C では、文字ポインターと配列に関連する概念を検討します。最初の定義は、Hello, world の各文字を配列 a に格納することであり、2 番目の定義は、文字 'H' のアドレスをポインタ a に割り当てることですが、Hello, world は実際には地区内のコードに格納されます。
ステートメント A、B 、 C はすべて間違っているため、Dを選択してください。
6番目の質問
6. ニコチェスの定理
ニコルシュの定理を検証します。つまり、任意の整数 m の 3 乗は、m 個の連続する奇数の合計として記述できます。
例えば:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
正の整数 m (m≦100) を入力し、m の 3 乗を連続する m 個の奇数の和として書き込み、出力します。
上級: 時間計算量: O(m)、空間計算量: O(1)
入力説明: int 整数を入力します。
出力の説明: 分解された文字列を出力します。
例:
入力: 6 出力: 31+33+35+37+39+41
この質問は難しそうに見えますが、実際には法則を見つける問題です
m の 3 乗が m 個の連続する奇数の合計として記述されると仮定すると、最初の出力数値は次のようになります。
毎回 2 を加算する m-1 個の数値を出力し、それらを加算するだけで済みます。
#include <stdio.h>
int main()
{
int m=0;
scanf("%d",&m);
int i=0;
int sum=0;
for(i=0;i<m;i++)
{
sum+=i;
}
i=sum*2+1;
printf("%d+",i);
m-=2;
while(m--)
{
i+=2;
printf("%d+",i);
}
i+=2;
printf("%d",i);
return 0;
}
この質問の難しさは、出力の形式を正しく制御することです。
7番目の質問
7、等差数列
算術数列 2、5、8、11、14... (2 から始まる、3 は許容誤差のある算術数列です)、算術数列の最初の n 項の合計を出力します。
入力説明: 正の整数 n を入力します。
出力の説明: 加算された整数を出力します。
例1
入力: 2 出力: 7
例 2
入力: 275 出力: 113575
この質問は比較的単純で、コードを全員に教えるだけです。
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int i=0;
int ret=2;
int sum=0;
for(i=0;i<n;i++)
{
sum+=ret;
ret+=3;
}
printf("%d",sum);
}