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

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

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

1. 次のプログラムを実行すると、出力値は () になります。

#include<stdio.h>
int main()
{
int a = 1,b = 3,c = 5,d = 4;
int x = 0;
if (a < b)//1
if (c < d) x = 1;//2
else//3
if (a < c)//4
if (b < d) x = 2;//5
else x = 3;//6
else x = 6;//7
else x = 7;//8
printf("%d", x);
}

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

分析: エラーが発生しやすい質問。コードを観察すると、コード 1 の前に行われた操作は単に変数を初期化するためのものであることがわかります。コード 1 の後には、多くの if、else があり、ここでは実際に if と else の一致を調べます。問題は、if と else のマッチングが外部要因の影響を受けずに近接性の原理に従うこと、つまり if と else 間の相対的な距離が一致するということです。これに基づいて、2 と 3 は一致すると結論付けることができます。 5 と 6 の一致、4 と 7 の一致、1 と 8 の一致

対応関係を理解し​​たら、a<b が成立し、2、c<d が成立せず、3、4、a<c が成立し、5、b<d が成立するまでコードに従うだけです。確立された場合、x=2 とします。else の残りの部分は、以前に一致しているため、移動する必要はありません。最終的な出力は 2 なので、B を選択します。

拡張: a=4、b=3、c=5、d=4 の場合に出力される内容 (他は変更されません)、                                           

拡張分析: if と else のマッチング問題によると、a<b が成立しない場合、コード 8 に達しており、x=7 とすると、最後に 7 が出力されます。

2. 次のプログラムの結果は () です。

#include<stdio.h>
int main()
{
	int m = 6;
	if (m++ > 6)
	printf("%d\n", m);
	else 
	printf("%d\n", --m);
}

A、4 B、5 C、7 D、6

分析: 質問の前で良い仕事をした友人は、おそらくこの質問を見て、それは簡単だと思うでしょう。最初に m=6 を定義して初期化し、次に if に進み、++ をポストし、最初に ++ を使用するため、6>6 は true ではありません。else に進み、この時点では m=7、最後に pre--、first--次に、 を使用します。つまり、m-1=6 となり、印刷します。最終出力は 6 になります。D を選択します。

3. 次のプログラムを実行した結果は () です。

#include<stdio.h>
int main()
{
	int k;
	int a[3][3] = { 1,2,3,4,5,6,7,8,9 };
	for (k = 0; k < 3; k++) 
	printf("%d ", a[2 - k][k]);
}

A、3 6 9 B、7 5 3 C、9 6 3 D、3 5 7

分析: コードを観察すると、主要部分が円形印刷であることがわかります。まず、2 次元配列が定義され、その中に 1、2、3、4、5、6、7、8、9 が格納されます。その後、2 次元配列内の対応する内容がループで出力されます。

サイクル数が少なく、直接代入する規則を見つける必要がない k=0 の場合は a[2][0] を出力、k=1 の場合は a[1][1] を出力 k=1 の場合は a[1][1] を出力=2、[ 0][2] を出力します。a[2][0] は配列の添字に従って 3 行目の最初の要素 (7) を出力し、a[1][1] は 2 行目の 2 番目の要素 5 を出力します。 a[0] [ 2] 最初の行の 3 番目の要素 3 を出力します。まとめると、Bを選択します

4. 2 つの文字配列 a と b がある場合、次の正しいステートメントは _________() [複数選択]
A, printf("%s %s", a,b); B, scanf("%s %s " 、a、b);

C、scanf("%s %s",&a+1,&b+1);D、printf("%s %s",&a,&b);

分析: エラーが発生しやすい問題では、ポインター、scanf、printf についての包括的な理解を調べます。最初に理解する必要があるのは、配列の名前は初期アドレスを表すことが多いということです。この質問には特別な状況はありません。特別な状況については次の質問で説明します。

オプション A は、アドレスを取得せずに a と b を文字列の形式で出力しますが、この時点では配列名自体がアドレスであるため、問題ありません。A は正しいです。オプション B、scanf を使用して a と b の文字列を変更します。この時点では、配列名はアドレスのままであり、問​​題はなく、B が正しいです。

オプション C、配列名のアドレスを最初に取得することによって得られるアドレスは確かに配列の最初のアドレスですが、その重みは配列全体です。これはどういう意味ですか。つまり、a+1 は要素をスキップすることです。 &a+1 は配列全体をスキップすることを意味し、C は範囲外なので間違っています。オプション D、配列名のアドレスを取得し、配列の最初のアドレスを取得して出力します。問題ありません。D は正しいです。

 5. 32 ビット プラットフォームで実行されたプログラムの結果は () です。

#include<stdio.h>
int main()
{
	int a = 0;
	char b[9] = "abc";
	int arr[3] = { 0 };
	printf("%d ", sizeof(&a));//1
	printf("%d ", sizeof(a));//2
	printf("%d ", sizeof(&b));//3
	printf("%d ", sizeof(b));//4
	printf("%d ", sizeof(&arr));//5
	printf("%d ", sizeof(arr));//6
}

A、4 4 4 4 4 4 B、4 4 4 9 4 3 C、4 4 4 9 4 12 D、4 4 4 9 4 4

分析: 32 ビット プラットフォーム上のアドレスのバイト数は 4 であるため、アドレスに遭遇すると、それは直接 4 と判断されます。コード1、アドレス、印刷4。コード 2、整数変数のバイト サイズは 4、出力 4。コード 3、アドレス、印刷 4。コード 4、配列名、アドレス、print 4、code 5、address、print 4、code 6、address、print 4 したがって、答えは 4 4 4 4 4 4 です。A を選択します。妥当なようですが、これは大きな問題です。間違い。sizeof を使用する場合、配列名は配列の最初の要素のアドレスを表すのではなく、配列全体を表します。つまり、    sizeof (配列) は配列全体が占めるバイト数を計算するため、コード 4 とコード 6 は次のようになります。 9 と 12 を出力すると、答えは 4、4、4、9、4、12 となり、C を選択します。 

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

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

int diagonalSum(int** mat, int matSize, int* matColSize){
int sum=0;
int i=0;
for(i=0;i<matSize;i++)
{
   sum+=mat[i][matSize-i-1]+mat[i][i];
   //将对角线上的加起来
}
if(matSize%2!=0)
//为奇数有重复,要减去
{
  i=matSize/2;
  sum-=mat[i][i];
}
return sum;
}

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

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

ヒント: 細部に注意を払い、境界線を越えないようにし、特別な状況を無視しないように注意してください。

bool canPlaceFlowers(int* flowerbed, int flowerbedSize, int n) {
    int i = 0;
    int count = 0;
    if (n == 0)
        //特殊情况单独处理
        return true;
    if (flowerbedSize == 1)
        //特殊情况单独处理
    {
        if (flowerbed[0] == 0)
            return true;
        else
            return false;
    }

    for (i = 0; i < flowerbedSize; i++)
    {
        if (flowerbed[i] == 1)
            //有花了就直接跳过
        {
            continue;
        }
        if (i == 0)
            //第一个元素和最后一个元素正常处理会越界,单独考虑
        {
            if (flowerbed[1] == 0)
            {
                flowerbed[0] = 1;
                count++;
                //种上了计数器+1并修改对应位置的值
                continue;
                //种上了就直接返回
            }
            else
                continue;
            //没种上意味着不能种也返回
        }

        if (i == flowerbedSize - 1)
        {
            if (flowerbed[flowerbedSize - 2] == 0)
            {
                flowerbed[flowerbedSize - 1] = 1;
                count++;
                //种上了计数器+1并修改对应位置的值
                continue;
                //种上了就直接返回
            }
            else
                continue;
            //没种上意味着不能种也返回
        }
        if (flowerbed[i - 1] == 0 && flowerbed[i + 1] == 0)
            //通常情况分析
        {
            flowerbed[i] = 1;
            count++;
            //种上了计数器+1并修改对应位置的值
            continue;
        }
    }
    if (n <= count)
    {
        return true;
    }
    else
        return false;
}

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

おすすめ

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