C言語の演習

ここに画像の説明を挿入します

私の世界へようこそ

著者の記事があなたのお役に立てば幸いです。不備があれば修正してください。一緒に学び、コミュニケーションをとりましょう。


序文


空白を埋めてください:

最初の質問

ここに画像の説明を挿入します

質問の解決策のアイデア:
この質問は、演算子の優先順位の把握 + 2 次元配列の理解を調べます。Baidu
:演算子の優先順位の詳細な説明。式X[i][j]では、添え字参照演算子の優先順位が最高です。したがって、最初に逆アセンブルすると、その構造をよりよく理解できます:
ここに画像の説明を挿入します
次に、オプションを順番に見ていきます:オプション A: *(X[ i ]+j);
添え字参照演算子 "[ ]" は括弧 " よりも優れています。 ( )" の方が優先されます。これは 2 次元配列であるため、1 次元配列のコレクションとみなすことができます。このオプションは X[i][j] と同等です。オプション B: * X
( i) [ j ]; 「[ ]」が「 * 」の前にあるため、添え字参照演算子が最初に動作することを知っておく必要があります。これは間違った式です。オプション C: *(X+i+j) ; このオプションは理解
できますX[i][j] と完全に矛盾する X[i+j] として;
オプション D: ( (X+i)+j);このオプションは と一貫していると理解できます。

2番目の質問

コンテキスト ファイルとヘッダー ファイルが正常な場合、次のコードの出力は ( ) になります。ここに画像の説明を挿入します

問題解決のアイデア:
この質問は比較的単純に見えますが、細かい点に注意を払わないとすべてを失う可能性があります。これは関数の再帰問題です。
再帰出力は「Geneius」、出力は「suiteG」です。 " ですが、ここでは特別な注意が必要です。最初の再帰入力は ++s で、「G」をスキップしているため、G の出力はありません。そのため、
ここに画像の説明を挿入します
最終出力は次のようになります。

3番目の質問

以下のforループの回数は( )です。

for(int i = 0 ; i || i++ < 5;);

問題解決のアイデア:
この問題は論理的な「または」、論理的な「または」を調べます。真がある場合は真、両方が偽である場合は偽です。ループに入るだけです。i=0。判定条件に入ります 。 、i は 0 です。 false の場合、i++<5 を参照してください。この式は計算されます。これが true の場合、ループに入ります。2 番目のループで i がすでに ++ である場合、i=1、つまり、が true の場合、i++<5 式を入力しても、 i は変更されないため、式は無限ループに陥ります。

回数は無制限である必要があります。

質問4

ここに画像の説明を挿入します

オプション A では、メモリのアライメントは考慮されません。 オプション B、double 型の比較を調べます。浮動小数点数の誤差のため、2 つの数値が等しいかどうかを直接判断することはできません。通常、2 つの数値の差の絶対値が小さいかどうかが比較されます。非常に小さい数値 (具体的には、誤差としてそのような数値を自分で設定できます) よりも等しいかどうかを判断します。 選択肢 C、a は配列の最初のアドレスであり、定数で変更できない ため、A、B、C はすべて間違っています。D を選択してください。


プログラミングに関する質問:

最初の質問:


住所:ojアドレス


ここに画像の説明を挿入します

問題解決のアイデア: ソート + ダブル ポインター
まず 2 つの配列をソートし、次に 2 つのポインターを使用して 2 つの配列を走査します。 次に、交差する要素を格納する配列 arr を作成します。arr 配列に追加される要素は増加するはずであることが予測されます。追加された要素の一意性を保証するために、 最後に追加された要素を表す変数 prve をさらに記録する必要があります。回答配列に。
最初に、2 つのポインターはそれぞれ 2 つの配列の先頭を指します。
次に、2 つのポインタが配列内の要素を指すたびに、それらが等しくない場合は、小さい方のポインタが 1 ビット右に移動します。等しい場合は、prve に等しくないものと判断され、そうでない場合は、prve に格納されます。交差する配列 arr. を取得し、 prve の値を更新し、 prve の値を交差したばかりの要素の値に変更します。 次に、両方のポインタが同時に 1 ビット右に移動し、少なくとも 1 つのポインタが配列の範囲を超えると、トラバーサルは終了します。

コード:

int cmp (const void *e1,const void*e2)
{
    
    
    return *(int*)e1-*(int*)e2;
}

int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
    
    
    //首先进行排序
    qsort(nums1,nums1Size,sizeof(int),cmp );
    qsort(nums2,nums2Size,sizeof(int),cmp );
    //创造一个数组存放相交的数组
    int *arr=(int*)malloc(sizeof(int) * (nums1Size + nums2Size));
    //设置两个指针
    int sur1=0;
    int sur2=0;
    int prve=-1;//记录上一个的相交值,判断是否要存入
    int j=0;
    while(sur1<nums1Size && sur2<nums2Size)
    {
    
    
        int num1=nums1[sur1],num2=nums2[sur2];
        if(num1==num2)
        {
    
    
            if(prve!=num1)//判断出不是相同的相交值
            {
    
    
                arr[j]=num1;
                j++;
                prve=num1;
                sur1++;
                sur2++;
            }
            else
            {
    
    
                sur1++;
                sur2++;
            }
        }
        else if(num1<num2)
        {
    
    
                sur1++;
        }
        else
        {
    
    
            sur2++;
        }
    }
    *returnSize=j;//相交数组个数
    return arr;
}

2 番目の質問:


住所:ojアドレス


ここに画像の説明を挿入します

問題解決のアイデア:
まず、配列内のすべての要素の合計を計算し、それを total に記録します。i に移動すると、左側の要素の合計が sum になり、次に右側の要素の合計が total になります。 nums[i]-sum; 左と右の要素の合計が等しい場合、次の方程式が成り立ちます: 2*sum + nums[i] =total;
ここに画像の説明を挿入します

コード:

int pivotIndex(int* nums, int numsSize){
    
    
    int total=0;
    for(int i=0;i<numsSize;i++)
    {
    
    
        total+=nums[i];
    }
    int sum=0;
    for(int i=0;i<numsSize;i++)
    {
    
    
        if(2*sum+nums[i]==total)
        {
    
    
            return i;
        }
        sum+=nums[i];
    }
    return -1;
}

要約する

知識には終わりがありませんが、探検の旅は退屈です。その楽しみを共有しましょう。
魯迅はかつてこう言った、「足を骨折して松葉杖を与え、そして彼なしでは歩くことさえできない、だから感謝することを学びなさい」。


最後に:サポートに感謝します

あと言いたいのは、
----------過程に全力で取り組み、結果には無頓着であれ これは
私自身に言い聞かせていることでもあります。

おすすめ

転載: blog.csdn.net/m0_66780695/article/details/132542048
おすすめ