C言語経典テーマ(ある学校の再試験の本題)
47009 ワード
2017:
1.順次記憶されたn個の整数、プログラミング出力最大の上位k個
2.再帰関数で1からnの和を求める:
3.swap(int a,int b)関数によるパラメータ交換:
4.関数を編んで文字列の中の数字の個数を求めます:
5.文字列中の文字ASCIIの総和を求める:
6.学生情報、氏名、学号、英語、数学、政治成績、a:学生構造体情報b:finput入力学生情報c:単科と総点が最も高い学生情報を求める
2018:(選択問題8問:)既知後序と中序求先序: ベクトルグループを知り、秩序化された単一チェーンテーブルを構築する時間の複雑さ: クイックソート結果: 単一挿入ノードプロセス: ヒルソート、ステップ長の特徴を取り、減少: 循環キュー長:
総合問題(絵を主とする):は図の隣接行列を与え、最小生成ツリー: バブルソートプロセス: 8皇后、書くアルゴリズム: 周遊遍歴代価最小: スタック調整アルゴリズム: トポロジソート: 質問コーナー:自己紹介3分、中国語と英語はいずれも可能で、基本的な状況を理解して、試験にまたがる配列のポインタとポインタの配列の違いを聞いたことがあって、自己紹介に対して質問する可能性があります.2019:1.簡単な答え:1.1再帰関数とは何ですか.ネスト関数とは?例を挙げて説明してください.再帰関数とは、関数を呼び出す過程で、関数自体を直接または間接的に呼び出すことを意味し、関数の再帰呼び出しと呼ばれる.
nの階乗を求める.
ネスト関数:関数を定義するとき、1つの関数内で別の関数を定義することはできません.つまり、定義をネストすることはできませんが、呼び出し関数をネストすることができます.つまり、1つの関数を呼び出す過程で、別の関数を呼び出すことができます.例えば、fun 1(){fun 2();}fun 2(){fun 3();}fun 3(){printf("Hello");}1.2グローバル変数の理解について、グローバル変数の長所と短所について話します.•関数の外部で定義された変数をグローバル変数と呼びます.•グローバル変数はすべての関数でアクセスできます.•グローバル変数の名前とローカル変数の名前が同じであれば、ローカル変数が使用されます.利点:1)グローバルに表示され、任意の関数またはスレッドがグローバル変数を読み書きできる-同期操作が簡単です.2)メモリアドレスが固定されており、読み書き効率が高い.欠点:1)グローバル変数は静的記憶領域に格納され、システムはメモリを割り当てる必要があり、プログラムが終了するまでメモリを解放しないと、ローカル変数の動的割り当ては、スタックから申請し、使い終わったら(関数呼び出しが完了する)解放されない.2)関数のパッケージング性能に影響する:私たちが書いた関数が再入性を持つことを望んでいるに違いない.黒い箱のように、関数パラメータだけで戻ることができ、内部実装は独立しなければならないが、関数にグローバル変数を使用すると、関数のパッケージング性を破壊し、グローバル変数への依存をもたらすに違いない.3)関数のシフト性を低下させ,原因は同じである.4)コードの可読性を低下させることは、システムのメンテナンスが不便であることを意味し、グローバル変数にプログラムの各段階が現れる可能性があり、関数の実行も環境によって変化するため、デバッグが不便である.5)グローバル変数の読み書きは、遅延する可能性があります.これは主に「書く」操作に現れています.書く操作は、一般的に2サイクルの操作が必要なので、現れる可能性があります.こちらが書き終わっていないときは、あちらはすでに読んでいます.結果は最終値ではありません.これは確率イベントで、確率は小さいですが、ないわけではありません.
2.コードの空欄:2.1基礎文の理解(for,switch)はC言語の基礎のコードを与える.コード構造は(for,switch文からなる).プログラムの実行結果を書き出します.2.2ソートアルゴリズムは、2つのコードを差し引いた選択ソートアルゴリズムを与える(空白).コード補完.
3.プログラミング問題:
3.1一つの箱の中に12個のボールが入っていて、その中の3個の赤い、3個の白い、6個の黒い、中から8個のボールを取って、プログラミングして何種類の異なる色の組み合わせがあるかを求めます.
3.2予め定義された次元行列Mを与え、プログラミングして求める:3.2.1この行列Mの主、副対角線上のすべての要素の和を求める;
3.2.2この行列Mの主、副対角線上の要素の合計が偶数であるすべての要素の積を求める:
3.3関数StringTransfer(char*s,int n)を記述する.この関数は、文字列Sを入力し、要素をnビット左にシフトし、左にシフトしてオーバーフローした要素を文字列の末尾に埋め込む機能を実現する.
#include #define N 100 void StringTransfer(char *s, int n) { int i = 0; char temp = s[i++]; if(sizeof(temp) == 0) { return; } while(s[i] != ‘\0’) { s[i-1] = s[i]; i++; } s[i-1] = temp; if(n > 1) { StringTransfer(s, n-1); } } int main() { char a[N]; int n; printf(“input a string:”); gets(a); printf(“input move numbers n:”); scanf("%d",&n); StringTransfer(a, n); printf("%s", a); return 0; }
1.順次記憶されたn個の整数、プログラミング出力最大の上位k個
#include
#define N 10
void sort(int *a,int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=0;j<n-i-1;j++)
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
void main()
{
int i,a[N],k;
printf("input 10 numbers:");
for(i=0;i<N;i++)
scanf("%d",&a[i]);
printf("input k:");
scanf("%d",&k);
sort(a,N);
for(i=0;i<k;i++)
printf("%3d",a[i]);
}
2.再帰関数で1からnの和を求める:
#include
int sum(int n)
{
int result;
if(n==1)
result=1;
else
result=sum(n-1)+n;
return result;
}
void main()
{
int n;
printf("input n:");
scanf("%d",&n);
printf("%d
",sum(n));
}
3.swap(int a,int b)関数によるパラメータ交換:
#include
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void main()
{
int a,b;
printf("input a,b:");
scanf("%d%d",&a,&b);
swap(&a,&b);
printf("a=%d,b=%d
",a,b);
}
4.関数を編んで文字列の中の数字の個数を求めます:
#include
int main()
{
int sum=0;
char c;
printf("Please input some characters!
");
while((c=getchar())!='
')
{
if(c>='0'&&c<='9')
sum++;
}
printf("Including %d numbers
",sum);
return 0;
}
5.文字列中の文字ASCIIの総和を求める:
#include
#include
#define N 100
void main()
{
char s[N];
int len,i,sum=0;
gets(s);
len=strlen(s);
for(i=0;i<len;i++)
sum=sum+s[i];
printf("%d
",sum);
}
6.学生情報、氏名、学号、英語、数学、政治成績、a:学生構造体情報b:finput入力学生情報c:単科と総点が最も高い学生情報を求める
#include
#define N 3
struct student
{
char name[50];
char ID[20];
double English;
double Math;
double political;
};
student finput(struct student std)
{
printf(" , , ( , , ):
");
printf(" :");
scanf("%s", std.name);
printf(" :");
scanf("%s", std.ID);
printf(" :");
scanf("%lf", &std.English);
printf(" :");
scanf("%lf", &std.Math);
printf(" :");
scanf("%lf", &std.political);
return std;
}
int maxScore(double a[])
{
int i,j;
double max = 0;
for (i = 0; i < N; i++)
{
if (a[i]>max)
{
max = a[i];
j = i;
}
}
return j;
}
void main()
{
struct student std[N];
int i;
for (i = 0; i < N; i++)
{
std[i] = finput(std[i]);
printf("
");
}
double sum[N],math[N],english[N],political[N]; //
for (i = 0; i < N; i++)
{
sum[i] = std[i].English + std[i].Math + std[i].political;
printf("%lf \t %lf \t %lf
",std[i].English, std[i].Math, std[i].political);
printf("%lf
", sum[i]);
math[i] = std[i].Math; //
english[i] = std[i].English;
political[i] = std[i].political;
}
int s = maxScore(sum); //
int m = maxScore(math);
int e = maxScore(english);
int p = maxScore(political);
printf(" %lf, %s
", sum[s], std[s].name);
printf(" %lf, %s
", english[e], std[e].name);
printf(" %lf, %s
", math[m], std[m].name);
printf(" %lf, %s
", political[p], std[p].name);
}
2018:(選択問題8問:)
総合問題(絵を主とする):
nの階乗を求める.
#include
int fac(int n)
{
if(n<0)
printf("n<0,data error!");
else if(n==0||n==1)
return 1;
else
return fac(n-1)*n;
}
int main()
{
int n,t;
printf("input an interger number:");
scanf("%d",&n);
t=fac(n);
printf("%d!=%d
",n,t);
return 0;
}
ネスト関数:関数を定義するとき、1つの関数内で別の関数を定義することはできません.つまり、定義をネストすることはできませんが、呼び出し関数をネストすることができます.つまり、1つの関数を呼び出す過程で、別の関数を呼び出すことができます.例えば、fun 1(){fun 2();}fun 2(){fun 3();}fun 3(){printf("Hello");}1.2グローバル変数の理解について、グローバル変数の長所と短所について話します.•関数の外部で定義された変数をグローバル変数と呼びます.•グローバル変数はすべての関数でアクセスできます.•グローバル変数の名前とローカル変数の名前が同じであれば、ローカル変数が使用されます.利点:1)グローバルに表示され、任意の関数またはスレッドがグローバル変数を読み書きできる-同期操作が簡単です.2)メモリアドレスが固定されており、読み書き効率が高い.欠点:1)グローバル変数は静的記憶領域に格納され、システムはメモリを割り当てる必要があり、プログラムが終了するまでメモリを解放しないと、ローカル変数の動的割り当ては、スタックから申請し、使い終わったら(関数呼び出しが完了する)解放されない.2)関数のパッケージング性能に影響する:私たちが書いた関数が再入性を持つことを望んでいるに違いない.黒い箱のように、関数パラメータだけで戻ることができ、内部実装は独立しなければならないが、関数にグローバル変数を使用すると、関数のパッケージング性を破壊し、グローバル変数への依存をもたらすに違いない.3)関数のシフト性を低下させ,原因は同じである.4)コードの可読性を低下させることは、システムのメンテナンスが不便であることを意味し、グローバル変数にプログラムの各段階が現れる可能性があり、関数の実行も環境によって変化するため、デバッグが不便である.5)グローバル変数の読み書きは、遅延する可能性があります.これは主に「書く」操作に現れています.書く操作は、一般的に2サイクルの操作が必要なので、現れる可能性があります.こちらが書き終わっていないときは、あちらはすでに読んでいます.結果は最終値ではありません.これは確率イベントで、確率は小さいですが、ないわけではありません.
2.コードの空欄:2.1基礎文の理解(for,switch)はC言語の基礎のコードを与える.コード構造は(for,switch文からなる).プログラムの実行結果を書き出します.2.2ソートアルゴリズムは、2つのコードを差し引いた選択ソートアルゴリズムを与える(空白).コード補完.
3.プログラミング問題:
3.1一つの箱の中に12個のボールが入っていて、その中の3個の赤い、3個の白い、6個の黒い、中から8個のボールを取って、プログラミングして何種類の異なる色の組み合わせがあるかを求めます.
#include
int main()
{
int m, n, number=0;
printf("
");
printf("......................
");
for( m=0; m<=3; m++ ) //
for( n=0; n<=3; n++ ) //
if(8-m-n<=6) // 6, 8 - m - n ≤ 6。
printf(" %2d: %d %d %d
", ++number, m, n, 8-m-n);
return 0;
}
3.2予め定義された次元行列Mを与え、プログラミングして求める:3.2.1この行列Mの主、副対角線上のすべての要素の和を求める;
#include
#define M 3
void main()
{
int i,j,a[M][M],sum=0;
for(i=0;i<M;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++)
for(j=0;j<M;j++)
{
if(i==j||i+j==2)
sum=sum+a[i][j];
}
printf("sum=%d
",sum);
}
3.2.2この行列Mの主、副対角線上の要素の合計が偶数であるすべての要素の積を求める:
#include
#define M 3
void main()
{
int i,j,a[M][M],sum=1;
for(i=0;i<M;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
for(i=0;i<M;i++)
for(j=0;j<M;j++)
{
if((i==j||i+j==2)&&(i+j)%2==0)
sum=sum*a[i][j];
}
printf("sum=%d
",sum);
}
3.3関数StringTransfer(char*s,int n)を記述する.この関数は、文字列Sを入力し、要素をnビット左にシフトし、左にシフトしてオーバーフローした要素を文字列の末尾に埋め込む機能を実現する.
#include #define N 100 void StringTransfer(char *s, int n) { int i = 0; char temp = s[i++]; if(sizeof(temp) == 0) { return; } while(s[i] != ‘\0’) { s[i-1] = s[i]; i++; } s[i-1] = temp; if(n > 1) { StringTransfer(s, n-1); } } int main() { char a[N]; int n; printf(“input a string:”); gets(a); printf(“input move numbers n:”); scanf("%d",&n); StringTransfer(a, n); printf("%s", a); return 0; }