目次
複数の選択肢
(1)
1. 次のプログラムの関数は ( ) です。
#include <stdio.h>
int main()
{
char ch[80] = "123abcdEFG*&";
int j;
puts(ch);
for(j = 0; ch[j] != '\0'; j++)
if(ch[j] >= 'A' && ch[j] <= 'Z')
ch[j] = ch[j] + 'e' - 'E';
puts(ch);
return 0;
}
A: 文字配列 ch の長さを測定します
B: 数値列 ch を 10 進数に変換します
C: 文字配列 ch 内の小文字を大文字に変換します
D: 文字配列 ch 内の大文字を小文字に変換します
答え: D
分析する
文字に対応する大文字と小文字の ASCII コード値の差は 32 で、小文字の方が大文字よりも大きくなります。したがって、質問内の「e」と「E」の ASCII コード値の差は 32 です (ch[j]+'e'-'E' は ch[j]+32 と同等です)。大文字から小文字に変換された文字はそれ自体で +32、小文字から大文字への変換は -32 になります。
(2)
2. コードセグメントについては、次の記述が正しいです ( )
t=0;
while(printf("*"))
{
t++;
if (t<3)
break;
}
A: ループ制御式は 0 に相当します。
B: ループ制御式が「0」に相当する場合
C: ループ制御式が不正な場合D: 上記の記述はどれも真実ではありません
答え:B
分析する
print("*") 関数呼び出しの戻り値は文字列内の文字数、つまり 1 であるためです。したがって、while の背後にある条件は常に true であるため、ループ制御式は「0」と同等になります (文字「0」は 0 ではありません)。正解はBです
(3)
3. 以下のプログラム実行中に、1abcedf2df<Enter>と入力すると、出力結果は( )となります。
#include <stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '\n')
{
if (ch % 2 != 0 && (ch >= 'a' && ch <= 'z'))
ch = ch - 'a' + 'A';
putchar(ch);
}
printf("\n");
return 0;
}
A: 1abcedf2df B: 1ABCEDF2DF C: 1AbCEdf2df D: 1aBceDF2DF
答案: C
分析する
プログラムはまず ch の ASCII コード値が奇数であるかどうかを考慮し、次にそれが小文字であるかどうかをチェックし、満たされる場合は大文字に変更します。
(4)
4. 以下の条件文のうち、他の文と機能が異なります( )
A: if(a) printf("%d\n",x); else printf("%d\n",y);
B: if(a==0) printf("%d\n",y); else printf("%d\n",x);
C: if (a!=0) printf("%d\n",x); else printf("%d\n",y);
D: if(a==0) printf("%d\n",x); else printf("%d\n",y);
答案:D
分析する
D オプションは異なります。その他は、a==0 の場合は y を出力し、a!=0 の場合は x を出力します。
(5)
5. C言語のbreak文は最も近い層のループからしか抜け出せないことはわかっていますが、場合によっては複数層のループから抜け出す必要がある場合があります。複数層のループから抜け出すには次の方法が正しいです。選択] ( )
A: プログラムを関数として記述し、return で関数を終了すると、ループから抜け出すことができます。
B: 外側のループの条件を変更します。たとえば、for( int i = 0 ; i < MAX1 ; i ++ ) { for( int j = 0 ; j < MAX2 ; j ++ ) { if( condition ) { i = MAX1; break; } } }
C: 外側のループに判定条件を設定する例
for( ; symbol != 1 && condition2 ; ) { for( ; symbol != 1 && condition3 ; ) { if( condition1 ) symbol = 1 ; } }
D: たとえば、外側のループの後にブレークを追加します。
for( ; condition2 ; ) { for( ; condition3 ; ) { if( condition1 ) symbol = 1 ; } if(symbol == 1 ) break ; }
答え:A、B、C、D
分析する
この質問は、多層ループから抜け出す方法を整理することを目的としています。各選択肢は正しく、コードは疑似コードであり、条件は論理式を表します。
プログラミングの質問
質問 1
説明
長さ n の非降順配列と非負の整数 k が与えられた場合、配列内の k の出現数をカウントする必要があります。
データ範囲: 0≤k≤100、配列内の各要素の値は0≤≤val≤100を満たす
例
分析する
トラバーサルでもできますが、配列は降順ではないので、二分探索を使用する考え方が最適です。最初に 2 点で左端の番号の位置を見つけ、次に右端の番号を見つけます。位置を 2 点で引きます。2 つの位置 + 1 を引くと長さになります。中央の比率
探している値は大きいです。探している数字は右側にある必要があります。左側 = 中央 + 1、中央は
より小さいです。探している値: 探している数値は左側にある必要があります、右 = Mid - 1;
中央の値は探している値と同じです: 検索する
左端の数値: Mid が左の場合、ミッドを返すだけ、それ以外の場合は right=mid-1 にリセットし、中心を左にシフトします。検索する右端の数値
: Mid が右の場合は、mid を返すだけ、そうでない場合はリセットします。 left=mid+1 に設定し、中心を右にシフトします。継続的に
コード
int get_last_or_first_idx(int* data, int len, int k, int flag) {//flag:0-找左边, 1-找右边
int left = 0, right = len - 1, mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (data[mid] > k)
right = mid - 1;
else if (data[mid] < k)
left = mid + 1;
else {
if (flag == 0) {//flag==0时,找最左边的数字
if (mid == left || data[mid - 1] != k) return mid;
else right = mid - 1;//把中心向左推
}
else {//flag==1时,找最右边的数字
if (mid == right || data[mid + 1] != k) return mid;
else left = mid + 1;//把中心向右推
}
}
}
return - 1;
} int GetNumberOfK(int* data, int dataLen, int k) {
if (dataLen == 0) return 0;
int left = get_last_or_first_idx(data, dataLen, k, 0);
int right = get_last_or_first_idx(data, dataLen, k, 1);
if (left == -1 && right == -1) return 0; //表示没有找到k这个数据
return right - left + 1;
}
質問 2
説明
整数変換。整数 A を整数 B に変換するために何ビット変更する必要があるかを決定する関数を作成します。
例
ヒント
A、B 範囲 [-2147483648、2147483647]
分析する
実際、何ビットを変更する必要があるかを尋ねるとき、問題は何ビットが異なるかということです。異なるビットがあれば同じだけ変更する必要があるためです。
コード
int get_bin_count(int num) {
int count = 0;
for (int i = 0; i < 32; i++) {
if ((num >> i) & 1)
count++;
}
return count;
}
int convertInteger(int A, int B) {
return get_bin_count(A ^ B);
}
要約する
今日の練習の説明はこれで終わりです。メッセージを残して、コメントを交換し、修正することを歓迎します。記事が役に立った場合、または著者の文章が悪くないと思う場合は、クリックしてフォロー、いいね、ブックマークをしてくださいサポートするために。