1. 程式人生 > >二級C語言真題筆記

二級C語言真題筆記

錯誤 copy 有意義 cas 版本 有意 結構體 csu 初始

二級C語言真題筆記

1. 知識重點:數據類型、循環、數組、函數、指針、結構體與共同體

2. 求程序的運行結果

技術分享圖片 #include <stdio.h>

main()
{
short int m=32767, n=032767;
printf("%d, %o \n", m, n);
return 0;
} 技術分享圖片

3. 自增和自減運算符的運算對象可以為char, int, float

技術分享圖片 #include <stdio.h>

main()
{
float scanf = 9.12345678;
// warning C4305: ‘initializing‘ : truncation from ‘const double‘ to ‘float‘

double main = 9.12345678;

printf("%.10f \n", scanf++); // 9.1234569550
printf("%.10f \n", scanf); // 10.1234569550

printf("%.10f \n", main++); // 9.1234567800
printf("%.10f \n", main); // 10.1234567800

return 0;
} 技術分享圖片

4. 求運行結果

技術分享圖片 #include <stdio.h>

main()
{
char a, b, *c;
//a = ‘\‘; //錯誤。正確的轉義形式為:a = ‘\\‘;
a = ‘\ ‘; //正確。
b = ‘\x31‘; //表示ASCII碼為49的字符,也即字符‘1‘
c = "\0157"; //指針c指向的字符串為"\r7",它包含一個回車符,一個字符‘7‘,和一個‘\0‘
printf("%c, %c, %s \n", a, b, c);

return 0;
} 技術分享圖片

5. C語言中沒有以B結尾的二進制整數常量,如 int x = 101011B; 是不對的

6. 不能定義為用戶標識符的是:( )

(A) scanf (B) Void (C) _3com_ (D) int

註:用戶標識符只能由字母、數字和下劃線組成,且第一個字符必須為字母或下劃線,C語言中的關鍵字(保留字)不能用於用戶標識符。D選項為關鍵字,所以不能作用戶標識符。

7. 以下為非法表達式的是:( )

(A) 0<=x<100 (B) i=j==0 (C) (char) (65+3) (D) x+1=x+1

註:不能對表達式進行賦值。

8. 寫出運行結果:

技術分享圖片 #include <stdio.h>

main()
{
int a;
char c = 10;
float f = 110.0;
double x;

a=f/=c*=(x=6.5);

printf("%d %d %3.2f %3.1f %3.1f\n",a,c,f,f,x);

return 0;
} 技術分享圖片

註:賦值運算符的結合性為從右向左結合;輸出中的精度控制會產生四舍五入。

9. 運算符的優先級,如:

(1) k=(n=b>a)||(m=a<b),先做兩個括號內的表達式,再將兩個表達式的結果做||運算,再將運算結果賦值給k。

(2) 0<=x<100,關系運算符從左往右結合,所以先判斷0<=x,再將判斷結果與100比較。整個表達式的值總是為真。

(3) i=j==0,先判斷變量j是否等於0,再將判斷結果賦值給變量i,因此變量i的值或為0,或為1。

(4) a>b>c

(5) (c-1>=d)==1

註:在整個優先級中,逗號運算符的優先級最低,其次是賦值運算符。關系運算符的優先級高於賦值運算符。

如下為常用運算符的優先級,逗號運算符的優先級最低,圓括號的優先級最高。未寫結合性的為從左往右結合:

( ) (圓括號)

++ -- *(指針) &(取地址) 結合性:R -> L

* / % (乘,除,取余)

+ - (加,減)

< <= > >= (關系運算符)

== != (等於,不等於)

&& (邏輯與)

|| (邏輯或)

= += -= *= /= %= >>= <<= &= ^= != (簡單賦值和復合賦值運算符) 結合性:R -> L

, (逗號運行符)

10. 將x中的值保留到小數點後兩位,並將第三位四舍五入

float x=1.236;
x=(int)(x*100+0.5)/100.0;
printf("%f \n", x); //1.240000

11. (1) 取余運算符%兩邊必須是整數;

(2) 賦值運算符=左邊必須是變量,不能是常量或表達式;

(3) #define n 2 後,n為符號常量;

(4) 當除號 / 兩邊的運算對象都是整型時,為整除,即結果的小數部分被忽略掉。

12. 寫出程序結果

技術分享圖片 #include <stdio.h>

main()
{
char a = ‘D‘-‘A‘+‘0‘;
printf("%c \n", a);

/* 以下為附加內容 */
printf("%c %d \n", ‘z‘-‘A‘, ‘z‘-‘A‘); //9 57
printf("%c %c %c %d \n", ‘0‘, ‘\0‘, ‘\000‘, ‘0‘); //0 48
printf("%c %d \n", a, a); //3 51

return 0;
} 技術分享圖片

註:字符‘0‘的ASCII碼值是十進制的48,或十六進制的30

13. 輸入12<回車>,請寫出程序的運行結果

技術分享圖片 #include <stdio.h>

main()
{
char ch1, ch2;
int n1, n2;

ch1 = getchar();
ch2 = getchar();

n1 = ch1 - ‘0‘;
n2 = n1*10 + (ch2 -‘0‘);

printf("%d \n", n2);

return 0;
} 技術分享圖片

14. 寫程序運行結果:

技術分享圖片 #include <stdio.h>

main()
{
int i;
for(i=0; i<3; i++)
switch(i)
{
case 1: printf("%d", i);
case 2: printf("%d", i);
default: printf("%d", i);
}

return 0;
} 技術分享圖片

15. 與 k=a>b?(b>c?1:0):0;功能等價的是:( )

(A) if((a>B) &&(b>C) ) k=1; (B) if((a>B) ||(b>C) ) k=1
                  else k=0;
(C) if(a<=B) k=0;   (D) if(a>B) k=1;
else if(b<=C) k=1;   else if(b>C) k=1;
       else k=0;

16. int N=5, b[N][N]; 是錯誤的。數組長度應為常量,不能動態定義數組長度。

17. 寫出程序運行結果

技術分享圖片 #include <stdio.h>
#include <string.h>

main()
{
char s1[ ] = "\n123\\";
char s2[8] = "\n123\\";

printf("%d %d ", strlen(s1), sizeof(s1));
printf("%d %d \n", strlen(s2), sizeof(s2));

return 0;
} 技術分享圖片

註:考查轉義字符,空字符‘\0‘,strlen庫函數和sizeof操作符的用法

18. 以下正確的是:( D )

(A) char s[8]; s = {"Beijing"};

(B) char s[8]; s = "Beijing";

(C) char *s; s = {"Beijing"};

(D) char *s; s = "Beijing";

註:{"Beijing"}的表達方式只能在字符串定義時初始化。對於B,數組名s存儲的是該數組的首地址,為一個常量,不能對其賦值。對於D,是將字符串的首地址賦給指針變量s,是對的。

19. 寫出程序的輸出結果

技術分享圖片 #include <stdio.h>

main()
{
int a[3][3], *p, i;
p = &a[0][0];
for(i=0; i<9; i++)
p[i] = i+1;
printf("%d \n", a[1][2]);

return 0;
} 技術分享圖片

註:考查二維數組在內存中的存放方式以及指針的正確使用。

20. 輸入一個含有數字的字符串,輸出數字部分。如輸入abc123kkkj456,則輸出123456。

技術分享圖片 #include <stdio.h>
#define N 30

main()
{
int i, j;
char src[N], dest[N];

gets(src);
for(i=j=0; src[i]!=‘\0‘; i++)
if(src[i]>=‘0‘ && src[i]<=‘9‘)
{
dest[j]=src[i];
j++;
}
dest[j]=‘\0‘;
puts(dest);

return 0;
} 技術分享圖片

21. 全局變量,局部變量,變量的存儲類型,變量作用域(空間角度),生存期(時間角度)

局部變量:函數內部定義。如主函數定義的局部變量的作用範圍僅限於主函數及調用函數

全局變量:函數外部定義。作用範圍從定義開始到源文件結束。

全局變量在一個文件中定義,在別一個文件中引用時,要用extern進行說明。這時該變量的作用域可擴展到有extern說明的其它源文件。若不希望該全局變量在其它文件中被引用,可加static進行限定。

按生存期可分為靜態和動態變量。

沒有對static變量賦初值時,系統自動賦值。如static int x; 系統自動賦值0。auto變量為隨機值。

static變量的生存期貫穿於整個程序運行期間。

函數形參都屬於局部變量。

當函數或復合語句中的局部變量與全局變量同名時,全局變量無效。

22. 將以下程序編譯連接後生成一個text.exe文件,進入MS-DOS窗口,切入該文件所在目錄,輸入test.exe abc<回車>。請寫出運行結果:

技術分享圖片 #include <stdio.h>

int func()
{
static int s=0;
s+=1;
return s;
}

main(int argc, char *argv[])
{
int n, i=0;
while(argv[1][i] != ‘\0‘)
{
n=func();
i++;
}
printf("%d \n", n*argc);

return 0;
} 技術分享圖片

註:局部靜態變量只初始化一次,在以後的調用當中不再進行初始化。

23. 寫出程序運行結果

技術分享圖片 #include <stdio.h>

void func( int *a )
{
a[0] = a[1];
}

main()
{
int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, i;
for(i=2; i>=0; i--)
func(&a[i]);
printf("%d \n", a[0]);

return 0;
} 技術分享圖片

24. 寫出程序運行結果

技術分享圖片 #include <stdio.h>

int a=2;

int f(int *a)
{
return *a++; /* 註意運算符的優先級 */
printf("a=%d", a);
}

main()
{
int s=0;
{
int a=5;
s+=f(&a);
printf("locala=%d ", a);
}
s+=f(&a);
printf("globala=%d ", a);
printf("s=%d \n", s);

return 0;
} 技術分享圖片

25.

int *q;

q=NULL; q指向地址為0的單元

*q=0; 對該單元賦值沒有意義

26. 函數的返回值類型為指針

技術分享圖片 #include <stdio.h>

int *f(int *x, int *y)
{
if(*x<*y)
return x;
else
return y;
}

main()
{
int a=7, b=8, *p, *q, *r;
p=&a;
q=&b;
r=f(p, q);
printf("%d %d %d \n", *p, *q, *r);

return 0;
} 技術分享圖片

27. 寫出程序運行結果

技術分享圖片 #include <stdio.h>

main()
{
char *s[] = { "one", "two", "three" }, *p;
p = s[1];
printf("%c %s \n", *(p+1), s[0]);

return 0;
} 技術分享圖片

28. 寫出以下程序運行結果

技術分享圖片 #include <stdio.h>

union
{
unsigned int n;
unsigned char c;
}u;

main()
{
u.c=‘A‘;
printf("%c \n", u.n);

return 0;
} 技術分享圖片

29. *++p, ++*p, *p++的區別

技術分享圖片 #include <stdio.h>

main()
{
int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}, *p=&a[0];

printf("%d %d %d %d \n", *p, *p++, *p++, *p);
printf("%d %d %d %d \n", *p, *p++, *p++, *p);
printf("%d %d %d %d \n", *p, *++p, *++p, *p);
printf("%d %d %d %d \n", *++p, ++*p, *p++, *p);

return 0;
} 技術分享圖片

技術分享圖片 #include <stdio.h>

main()
{
int a[5] = {1, 2, 3, 4, 5}, *p=&a[0];

printf("%d %d %d %d \n", *++p, ++*p, *p++, *p);
printf("%d %d %d %d \n", *++p, ++*p, *p++, *p);

return 0;
} 技術分享圖片

兩個版本的字符串復制函數 _CRTIMP char * __cdecl strcpy(char *, const char *) 對比:

版本1:

技術分享圖片 strcpy(char * dest, const char * src)
{
char *p=dest;
while(*dest++ = *src++)
;
dest=p;
} 技術分享圖片

版本2:

技術分享圖片 strcpy(char * dest, const char * src)
{
int i=0;
for(; *(src+i)!=‘\0‘; i++)
*(dest+i) = *(src+i);
*(dest+i) = ‘\0‘;
} 技術分享圖片

註:指針運算符*, 自增運算符++是從右往左結合的;

實例:

技術分享圖片 #include <stdio.h>

strcpy_v1(char * dest, const char * src)
{
char *p=dest;
while(*dest++ = *src++)
;
dest=p;
}

strcpy_v2(char * dest, const char * src)
{
int i=0;
for(; *(src+i)!=‘\0‘; i++)
*(dest+i) = *(src+i);
*(dest+i) = ‘\0‘;
}

main()
{
char a[]="abcd";
char b[]="abc";
strcpy_v1(a, b);
puts(a);

char c[]="abcd";
char d[]="abc";
strcpy_v2(c, d);
puts(d);

return 0;
} 技術分享圖片

輸出:

abc
abc

參考答案:

2. 32767, 32767

3. 7 1,

6. D

7. D

8. 1 65 1.69 1.7 6.5

12. 3

13. 12

14. 011122

15. A

17. 5 6 5 8

19. 6

22. 6

23. 4

24. 7

26. 7 8 7

27. w one

28. A

29.

10 10 10 10
30 30 30 30
70 70 60 50
80 71 70 70

2 2 1 1
4 4 3 3

二級C語言真題筆記