C言語の日々の練習 (12)

はじめに:
毎日の練習シリーズ、各号には多肢選択問題 5 問とプログラミング問題2 問が含まれています。初心者でもはっきりと聞くことができるように、ブロガーができるだけ詳しく説明します。日々の実践シリーズは今後も更新していきますが、夏休み中は3日以内に更新する必要があり、学校が始まってからも学業状況に応じて更新していきます。

5 つの多肢選択式の質問:

1. プログラムの実行結果は () です。 

#define ADD(x) x+x
#include<stdio.h>
int main()
{
	int m = 1, n = 2, k = 3;
	int sum = ADD(m + n) * k;
	printf("sum = %d", sum);
}

A、 sum=9 B、 sum=10 C、 sum=12 D、 sum=18

分析:マクロ定義の理解を調べます。マクロ定義は前処理段階で処理される、つまりコンパイル段階に到達する前に実行されるため、マクロ定義は大まかに置き換えると考えることができます。

たとえば、#define abc 5 とすると、abc*6 は直接 5*6 と見なすことができ、他の演算子を気にする必要がなく、最初に置き換えることができます。この質問では、ADD(x) マクロを x+x として定義しているため、sum=1+2+1+2*3、他には何も心配する必要はありません。最初に置き換えることができるので、sum=10、答えは B です。

2. 次のプログラムの出力は () です。

#include<stdio.h>
void incre()
{
	static int x = 1;
	x *= x + 1;
	printf("%d ", x);
}
int main()
{
	int i;
	for (i = 1; i <= 2; i++) incre();
}

A、 3 3 B、 2 2 C、 2 6 D、 2 5

分析: コードの構成を観察すると、コードが main 関数と incre 関数で構成されており、main 関数の main 関数は、対応する操作のために incre 関数を 2 回呼び出すことであることがわかります。incre 関数はまず x を定義して 1 に初期化しますが、特にこの x は static で変更されるため、この x の格納場所は static 領域に配置されるため、x は変更されませんが再定義されると、プログラムの開始時に定義され、そのライフサイクルはプログラムの終了まで継続します。

回数が少ないので直接代入、1回目はincre()に入り、x*=x+1、x=2とするのでprint 2、2回目はこのときx=2、xが入ります*=x+1 、x=6 とすると、6 を出力し、答えは C になります。

 3. 次のプログラムの出力は何ですか? ()

#include <stdio.h>
int main()
{
	int a[][3] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, * p[4], i;
	for (i = 0; i < 4; i++)
		p[i] = &a[i][3];
	printf("%d\n", p[2][2]);
}

A. 出力項目が不正 B、6 C、8 D、12

分析:コードを観察すると、コードでは最初に行がなく列のみの配列 a を定義し、次に整数ポインター配列 p とループの数を制御する変数 i を定義していることがわかります。次に、ループを使用して整数ポインター配列 p にいくつかのアドレスを格納します。ループの数は 4 つだけであり、直接置換できます。

i=0のとき、p[0]にa[0][3]のアドレス、つまり1行4列のアドレスを格納しますが、4列がないので2行に進みます。つまり、p[0]には4のアドレスが格納されます。

i=1のとき、p[1]にa[1][3]のアドレス、つまり2行4列のアドレスを格納しますが、4列がないので3行に進み、3行を格納します1 列、つまり 7 アドレスは p[1] に格納されます。

i=2の場合はp[2]に4行1列または10を格納、i=3の場合はp[3]に5行1列、つまり12以降のアドレスをp[3]に格納します。しかしそうではないので、p[3] は範囲外であるため、一度使用された p[3] は問題になります。

最後に p[2][2] を出力します。p[2] は 10 のアドレスなので、p[2][2] は 12 です。したがって 12 を出力し、D を選択します。

 4. 構造体と共用体に関する次の記述のうち、正しいものは () A.
共用体の同じメモリ セグメントには複数の異なる種類のメンバを格納できますが、一度に格納できるメンバは 1 つだけです。
B. 構造体変数が占有するメモリ長は最も長いメンバの長さに等しく、共用体変数が占有するメモリ長は各メンバが占有するメモリ長の合計となります。
C. 共用体の各メンバーは独自のメモリ ユニットを占有します。
D. 構造体型は共用体型の定義に使用できますが、共用体型は構造体型の定義に使用できません。

分析:共用体は、同じデータ型または異なるデータ型を持つデータのコレクションを指しますが、共用体のすべてのメンバーがメモリ空間を共有するため、それらのデータは相互に排他的です。メンバー A を使用する場合、メンバー B は、メンバーAとは違うタイプの彼は、元通りにはならない運命にある。したがって、A が正しいです。選択肢 B はその逆で、B は間違いです。選択肢 C は概念に反しており、完全に間違っています。D オプションが間違っています。構造体型と共用体型は特に何もなく、本質的には型なので使用できます。まとめると、Aを選択します

5. 次のプログラムセグメントの出力は () です。

#include<stdio.h>
int main()
{
	int arr[] = { 6,7,8,9,10 };
	int* ptr;
	ptr = arr;
	*(ptr + 2) += 2;
	printf("%d,%d\n", *ptr, *(ptr + 2));
}

 A、8,10 B、6,8 C、7,9 D、6,10

分析: まず配列 arr を定義し、そこに 6、7、8、9、10 を格納します。次に、ポインタ ptr が定義され、配列 arr の最初のアドレスが ptr に割り当てられ、次に *(ptr+2)+=2 が割り当てられ、ptr のアドレスが 2 単位前の 8 に戻され、8+= 2 になります。配列 arr に格納されている 6、7、8、9、10 を 6、7、10、9、10 に変更して、ptr を印刷するときに 6、(ptr+2) を印刷し、10 を印刷するようにするには、D を選択します。

 プログラミングの質問 1:

 LeetCode 公式ウェブサイト - 世界中のオタクに愛されるテクノロジー成長プラットフォーム

 

ヒント: 最後の単語の長さだけが必要なので、単語間のスペースの特性に従ってトラバースすることができます。また、次の逆の計算を試すこともできます。つまり、最初に strlen を使用して文字列の長さを計算し、次に を使用します。 the reverse 最後の単語の長さを計算する方法は問題ありません。 

int lengthOfLastWord(char* s) {
	int i = 0;
	int count = 0;
	//计数器,计算最后一个单词的长度
	int min = 0;
	//存储器,避免最后一个单词后面有空格,将计数器清零
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] == ' ')
		{
			count = 0;
			//一旦遇到空格清空计数器
		}
		else
		{
			count++;
			min = count;
		}
	}
	if (count == 0)
		//当计数器为0,不是最后一个单词后面有空格
		//就是本身就全为空格,本身就全为空格,count也为0,不影响
	{
		count = min;
	}
	return count;
}

プログラミングの質問 2:

 136. 一度だけ現れる数字 - LeetCode

楽しかった夏休みも終わりが近づいてきました 最後に素朴な質問です リラックスしてください 

 

ヒント: 2 つの同一の数値 ^ (XOR) = 0 と ^ は交換法則を満たします。 

int singleNumber(int* nums, int numsSize){
int i=0;
int a=0;
for(i=0;i<numsSize;i++)
{
  a^=nums[i];
}
return a;
}

さて、今日の練習はこれで終わりです、来てくれた友達に感謝します、皆さんの明るい未来を祈っていますO(∩_∩)O

 

 

おすすめ

転載: blog.csdn.net/fq157856469/article/details/132574969