C言語の日常練習(1)

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

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

1. 次のプログラムを実行します。正しい出力は ( ) です。

#include<stdio.h>
int x=5,y=7;
void swap()
{
int z;
z=x;
x=y;
y=z;
} 
int main()
{
int x=3,y=8;
swap();
printf("%d,%d\n",x,y);
return 0;
} 

A.5,7 B.7,5 C.3,8 D.8,3

分析: コード分析によると、注: 2 つのグローバル変数 x と y が最初に定義されていますが、ローカル変数の名前を x と y として使用できます。メインからプログラムに入り、最初にローカル変数で x と    y を定義します。スワップ関数の機能は、x と y の値を交換することであり、z はそれらの交換を実現するための中間変数です。ただし、注意すべき点が 1 つあります。swap は実際のパラメータはおろかパラメータも渡さないということです。つまり、x と y を交換しても main 関数には影響しません。グローバル変数 x と y のみを交換するため、最終的な出力結果は次のようになります    。元のデータ、つまり 3、8 の場合は C を選択します

 

 

 

2. 次の間違った定義文は ( )
A: double x[5] = {2.0, 4.0, 6.0, 8.0, 10.0};
B: char c2[] = {'\x10', '\xa', ' \ 8'};
C: char c1[] = {'1','2','3','4','5'}; D:
int y[5+3]={0, 1, 3 , 5、7、9};

分析: \x の後の数字は 16 進数を表し、\ または \0 の後の数字は 8 進数を表します。8 進数は 0 ~ 7 のみです。B は明らかに間違っているため、B を選択します。

 3. test.c ファイルには、ファイル内で定義されている 4 つの変数のうち、ポインタ型の変数が [複数選択] ( ) という記述が含まれています。


define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;

Aa Bb Cc Dd

分析: マクロ定義の理解に従って、INT_PTR を int* (int*a, b) に直接置き換えるので、a はポインター変数であり、b はそうではなく、typedef int* int_ptr は同等であると判断できます。 int* へ int_ptr という型は int と * を組み合わせた全体なので、c と d はポインタ変数です。ACD を選択します。

4. 条件式 (M)?(a++):(a--) が与えられた場合、式 M ( )
A: および (M==0) は B: および (M==1) と等価です。 . 原子価 C: (M!=0) に相当 D: (M!=1) に相当

分析: (M)?(a++):(a--) は、M が true の場合は a++ が実行され、M が false の場合は a-- が実行されることを意味します。ここでの M の意味は、M が 0 ではない、M が true、M が 0 の場合は false であるということです。次に、ステップごとに分析します。オプション A、M==0 は、M が 0 であり、それは真であり、それが間違いであることを意味します。オプション B、M==1 は、M が 1 の場合は true、false です。C オプション M!=0 は、M が 0 でない場合に true になります。はい。D オプション M!=1 は、M が 1 に等しくない場合は true、false です。結論から言うと、答えはCです

5. 以下の定義文がある場合、正しい入力文は[複数選択]( )です。

int b;
char c[10];

 A: scanf("%d%s",&b,&c); B: scanf("%d%s",&b,c);
 C: scanf("%d%s",b,c); D: scanf("%d%s",b,&c);

分析: b は整数、c は文字配列であり、99% の場合、配列の名前のみが配列の開始アドレスを表します。scanf を使用するには、ターゲットがアドレスを取得し、そのアドレスに従ってターゲットの内容を変更する必要があります。オプション A: ここで、&c は単一の c ではないため、現時点では c は最初の要素のアドレスではありませんが、最初の要素 &c の効果は、単一の c の効果と同じです。したがって、Aは正しいです。選択肢 B: &b が正解、c が正解なので、B が正解です。選択肢 C、b は間違っています。アドレスが取得されていないため、C は間違っています。選択肢 D と選択肢 C は同じ間違いをしているため、D は間違っています。ABを選択してください

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

1 から最大までの n 桁の数を出力します

static int arr[100001];
int* printNumbers(int a,int*x)
{
int b = 1;
while (a)
{
b *= 10;
a--;
}
int c = 0;
for (c = 1; c < b; c++)
{
arr[c - 1] = c;
}
    *x=--b;
return arr;
}

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

日付から日への変換を計算する - プログラマー募集

この質問に対する簡単な解決策は、実際に各月の日数を列挙し、現在の月に従って満月の日数を合計し、さらに現在の月の日数を加算することです。最後に、偶数うるう年の 2 月の差が 1 日増えるかどうかを考えてみましょう。
注意が必要なのは平年と私室年の判定で、私室年の月が2より大きい場合、つまり2月が終わった場合は合計日数に1を加算することができます。例えば2月2000 年 18 日 (閏年ですが、2 月旅行を終えていない場合、閏年に 1 日追加することはできません) 

#include<stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d %d %d", &year, &month, &day);
int arr1[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int arr2[13] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 };
int sum = 0;
int i = 0;
for (i = 1; i < month; i++)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
{
sum += arr2[i];
}
else
{
sum += arr1[i];
}
}
sum += day;
printf("%d", sum);
}

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

おすすめ

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