はじめに:
毎日練習シリーズ、毎号選択問題 5 問とプログラミング問題 2 問が含まれており、初心者でもわかりやすく、ブロガーができるだけ詳しく解説します。日々の実践シリーズは今後も更新していきますが、夏休み中は3日以内に更新する必要があり、学校が始まってからも学業状況に応じて更新していきます。
5 つの多肢選択式の質問:
1. 次のプログラムセグメントの出力は () です。
#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A.12 B.13 C.16 D. 上記のどれも正しくありません
分析: トピックの分析によると、このコード列の機能は文字列 s の長さを計算することです。strlen 関数の特徴は、\0 に遭遇するとアクセスを停止し、\ が存在することです。見えませんが、文字列の末尾には 0 が付いています。strlen についてのブロガーも以前にブログの紹介文を書いているので、strlen 関数を理解していない友人は見に行くことができます。一般的な文字列関数の使い方を教えます (シミュレーション実装を含む) - 海のトマトブログ - CSDN ブログ
文字列の長さを計算するためなので、文字列 s の長さをカウントする 必要があります。これは通常の文字であるため、これら 2 つの \\ を足すと 1 文字 123456 となり、6 文字あります。 6+1は7文字です。
続けて、また\に会いました。\の後ろの数字は、その数字が8進数であることを意味し、最大数は3桁です。したがって 、\123は全体として、文字としてみなされ、7+1が得られます。 8 文字、3 文字 456、8+3 は 11 文字、最後の \t を 1 文字とみなし、最後に 12 文字あり、答えは A
多くの友人はエスケープ文字の具体的な内容を忘れてしまいますが、ここではブロガーが以前に整理した内容を提供します。
2. 以下のようなプログラムがある場合、実行後の出力は( )となります。
#include<stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}
A.4 B.8 C.9 D.6
分析:マクロ定義は、操作を実行する前に、対応するコードを対応するマクロに置き換えることです。このコード文字列は NUM を出力する必要があり、NUM にはマクロ定義があるため、操作の前に NUM を対応するマクロに置き換えます。置換結果は (M+1)*M/2 です。M にはマクロ定義があり、置換を続けます。 , 結果を置き換えます It is (N+1+1)*N+1/2.単なる置き換えであることに注意してください. 余分な括弧を追加しないでください. マクロ定義に従って、定義されたとおりに置き換えることができます。N にはマクロ定義があり、置換結果は (2+1+1)*2+1/2 で、計算結果は 8.5 ですが、printf は整数データを出力しようとしているため、データが失われ、8 が出力されます。
3. 次の関数の f(1) の値は ( )
int f(int n)
{
static int i = 1;
if(n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
A.5 B.6 C.7 D.8
分析: 質問の意味によれば、目標は f(1) であり、int f(int n) 関数を呼び出したときに 1 を渡したときの f の戻り値が答えになります。関数を入力し、n を 1 とみなします。まず、関数は静的変数 i を定義し、それを 1 に初期化します。静的変数の意味は、関数呼び出しの終了とともに破棄されず、破棄されるだけであるということです。同様に、これは 1 回だけ作成されます。つまり、static int i=1 は if(n>=5) の場合に 1 回だけ実行されます。これは、n>= の場合にトリガーされることを意味します。 5、最初にスキップ、n=n+i、次にこの時点で n=2、続行、i++、i は 2、f(2) に戻り、f() 関数に入り続けますが、今回は 2 を渡します、 i も 2、その後 n は最終的に 4、i は 3、再帰を継続、n はまだ >=5 ではない、n=n+i で n 7、i++ で i 4、再帰を継続、今回は n 7、n>=5、関数を中止し、7 を返します。ということで、答えはCです
4. 次の 3 つのプログラム コードは同じ効果ですか? ( )
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A.(2)=(3) B.(1)=(2) C.は異なります D.はすべて同じです
分析:ポインター変数を変更する const の効果は、const と * の間の相対位置に従って決定されます。const が * の 左側にある場合は、対応するポインターが変更できないことを意味し、* の右側にある場合は、コンテンツが指すことを意味します。ポインタによる変更はできません。トピックを観察するには、同じ相対位置を見つけるだけで済みますが、(1) と (2) の const と * の相対位置が * の右側にある const であることを見つけるのは難しくありません。同じで、(3)のconstを髪の毛の右側に置くと効果が異なります。したがってBを選択します
5. 次のステートメントの場合、正しいステートメントは ( )
A です。 struct X{short s;int i;char c;} の場合、sizeof(X) は sizeof(s) + sizeof(i) + sizeof(c )
B. double 変数 a の場合、a == 0.0 を使用してゼロかどうかを判断できます
C. 初期化メソッド char a[14] = "Hello, world!"; および char a[14]; a = "Hello , world! "; は同じ効果があります
D. 上記の記述はどれも正しくありません
分析:構造体のサイズは、アライメントによって達成する必要があります。オプション A の X のサイズは、この方法で計算されます。short 型は 2 バイトを占有し、オフセット 0 と 1 の位置が占有され、int 型は 4 バイトを占有しますバイト。バイトなので、4 の倍数の位置に揃える必要があります。したがって、オフセット 4、5、6、および 7 が占有され、オフセット 1、2、および 3 のスペースが無駄になります。Char 型1 バイトを占有し、位置合わせする必要がないため、オフセット 8 の位置が占有され、サイズは 9 になります。その後、メモリ位置合わせの規則に従って、最大位置合わせの倍数に位置合わせする必要があります。 4、10、11 の倍数 無駄になってしまい、最終的な構造計算結果は 12 と 2+4+1=8 は異なります。
構造のアライメントの内容を理解していない友人は、ブロガーが以前に書いたカスタム型の詳細な説明を読むことができます。そこには、この問題の詳細な説明が含まれています。
オプション B は、double 型の比較を検討します。浮動小数点数の誤差のため、2 つの数値が等しいかどうかを直接判断することはできません。通常は、両者の差の絶対値が等しいかどうかを比較するために使用されます。 2 つの数値が小さい数値 (具体的には、エラーとしてそのような値を自分で設定できます) より小さい場合、等しいかどうかを判断します。選択肢 C、a は配列の最初のアドレスであり、定数で変更できないため、A、B、C はすべて間違っているため、答えは D になります。
プログラミングの質問 1:
P5717 [深い基礎 3. 学習 8] 三角形の分類 - 羅谷 | コンピューター サイエンス教育の新しい生態学 (luogu.com.cn)
ただ注意すべきは鋭角と鈍角の判断です。判断方法を忘れている人が多いので注意してください。
2 つの短い辺の二乗の合計が最長の辺の二乗より大きい場合、その三角形は鋭角三角形です
2つの短い辺の平方和が最も長い辺の2乗より小さい場合、その三角形は鈍角三角形です
#include<stdio.h>
int main()
{
int a=0;int b=0;int c=0;
//代表着三角形的三边
scanf("%d %d %d",&a,&b,&c);
int max=a>b?a:b;
max=max>c?max:c;
//计算出三边的最大边
int min=a>b?b:a;
min=c>min?min:c;
//计算出三边的最小边
int sum=a+b+c;
//三边总和
a=max;
//令a为最大边
b=sum-min-max;
//令b为中间边
c=min;
//令c为最小边
if(b+c<=a)
//三角形成立条件,两边之和大于第三边,不满足肯定不是三角形
//拿较小的两条边来比较,如果较小的两边之和都能大于第三边就一定是三角形
{
printf("Not triangle");
}
else//是三角形才能进行后面的判断
{
if(b*b+c*c==a*a)
//勾股定理判直角
{
printf("Right triangle\n");
}
else if(b*b+c*c>a*a)
{
printf("Acute triangle\n");
}
else if(b*b+c*c<a*a)
{
printf("Obtuse triangle\n");
}
if(a==b||b==c||c==a)
//等腰三角形判断
{
printf("Isosceles triangle\n");
if(a==b&&b==c)
//先是等腰才是等边
{
printf("Equilateral triangle\n");
}
}
}
}
プログラミングの質問 2:
等差数列の公式に従って、最初と最後のを足し、*項目数/2が答えとなり、最初と最後のを計算します。
#include <stdio.h>
int main() {
int head=0;
int end=0;
int n=0;
scanf("%d",&n);
head=2;
end=2+(n-1)*3;
printf("%d",(head+end)*n/2);
}
さて、今日の練習はこれで終わりです、来てくれた友達に感謝します、皆さんの明るい未来を祈っていますO(∩_∩)O