C語言綜合研究與高強度程式設計訓練綜合研究0
第一題
分別定義 char 型、int 型、long 型、float 型、double 型資料,並打印出各型別資料的值。
程式碼
void test01() { int i_num = 1; char c_num = 'H'; long l_num = 327688; float f_num = 1.0e9; double d_num = 2.4e9; printf("\nint num : %d", i_num); printf("\nchar num : %d", c_num); printf("\nlong num : %ld", l_num); printf("\nfloat num : %f", f_num); printf("\ndouble num : %e", d_num); }
結果:
第二題
題目
閱讀以下材料,按步驟進行實踐:
C 語言整合開發環境 Tc.exe 自帶有除錯功能。除錯方法如下:
(1)表示式檢視(快捷鍵 Ctrl+F7)在 Tc.exe 開發環境中的 Break/watch 選單中新增
或者刪除表示式檢視。(2)斷點操作(快捷鍵 Ctrl+F8)在 Tc.exe 開發環境中的 Break/watch 選單中新增或
者刪除斷點。
(3)單步執行—不進入函式(快捷鍵 F8)。
(4)單步執行—進入函式(快捷鍵 F7)。
(5)執行到斷點處(快捷鍵 Ctrl+F9)。
程式一實現的功能:從 0 到 19 中依次找到所有偶數並將這個偶數乘以 2 後得到的結果
列印到螢幕上。
過程
對於程式一進行如下除錯:
(1)新增對 i,result,i%2==0 的值的檢視,然後用單步除錯(F7,F8)檢視這三者的值,
觀察是否和自己預判的一樣。
可以看到和預測結果一致
(2)在(1)中表達式檢視的基礎上,在 printf("%d ", result)和 i++兩行處處新增斷點(光
標置於這一行按下 Ctrl+F8 即可),然後按 Ctrl+F9 進行斷點除錯。檢視 i,result,i%2==0
的值是否和自己預判的一樣。
通過下圖可以知道可自己預判的一致
新增完檢視和斷點
斷點除錯
第三題
題目
給定的一個班的 C 語言成績為:
short results[] = {55, 80, 71, 72, 87, 90, 95, 100, 96, 87,
76, 100, 50, 83, 80, 65, 70, 69, 80, 88,
91, 98, 96, 76, 89};
將這些成績進行統計,90 ~ 100 的為 A,80 ~ 89 的為 B,70 ~ 79 的為 C,60 ~ 69 的為
D,60 以下的為 E。
在螢幕上列印輸出每個成績段的人數,即最終輸出應該為:
A:8
B:8
C:5
D:2
E:2
注:分別使用“if...else 語句”與“swith...case 語句”實現。
程式碼
void test03() {
short results[] = {55, 80, 71, 72, 87, 90, 95, 100, 96, 87,
76, 100, 50, 83, 80, 65, 70, 69, 80, 88,
91, 98, 96, 76, 89};
int res[5]={0};
//switch...case
for(int i = 0 ; i<(sizeof(results)/sizeof(results[0])) ; i++){
switch (results[i]/10) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:res[4]++;break;
case 6:res[3]++;break;
case 7:res[2]++;break;
case 8:res[1]++;break;
case 9:
case 10:res[0]++;break;
default:printf("error val");
}
}
printf("\n switch...case");
for (int i = 0; i < 5; ++i) {
printf("\n %c : %d",'A'+i,res[i]);
res[i]=0;
}
//if...else
for (int i = 0; i <(sizeof(results)/sizeof(results[0])) ; ++i) {
if((results[i]/10)<=5){
res[4]++;
} else if ((results[i]/10)<=6){
res[3]++;
} else if ((results[i]/10)<=7){
res[2]++;
} else if ((results[i]/10)<=8){
res[1]++;
} else if ((results[i]/10)<=10){
res[0]++;
} else{
printf("error val");
}
}
printf("\n if...else");
for (int i = 0; i < 5; ++i) {
printf("\n %c : %d",'A'+i,res[i]);
res[i]=0;
}
};
結果
第四題
題目
在螢幕上輸出一個九九乘法表。
注:分別使用 for 迴圈和 while 迴圈實現。
程式碼
void test04() {
printf("\n ***************** for ***************** \n");
for (int i = 1; i <= 9; ++i) {
for (int j = 1; j <= i; ++j) {
printf("%d*%d=%d \t",j,i,i*j);
}
printf("\n");
}
printf("\n ***************** while ******************* \n");
int i = 1;
while (i<=9){
int j = 1;
while (j<=i){
printf("%d*%d=%d \t",j,i,i*j);
++j;
}
printf("\n");
++i;
}
}
結果
第五題
題目
用 if...else 語句與 goto 語句分別構造 while 迴圈結構和 do...while 迴圈結構。
while 迴圈結構:
int count = 0;
while(count < 10)
{
printf("%d ", count);
count++;
}
do...while 迴圈結構:
int count = 0;
do
{
count++;
printf("%d ", count++);
}
while(count < 10)
分析
do while 先執行一次迴圈,然後判斷是否滿足條件再決定是否 goto
while 先 goto 到 判斷語句 然後判斷是否滿足條件再決定是否 goto
程式碼
void test05() {
printf("do..while\n");
int count = 0;
do_while_loop:
count++;
printf(" %d ", count++);
if (count < 10) {
goto do_while_loop;
}
printf("\n");
printf("while\n");
count = 0;
goto while_bg;
while_loop:
printf(" %d ", count++);
while_bg:
if (count < 10) {
goto while_loop;
}
}
結果
第六題
題目
改正程式二中出現的所有語法錯誤,讓程式沒有任何的錯誤和警告。
程式二:
void func1(char);
int func2(char);
main()
{
int c = 0;
for(c = 1; c <= 9; c++)
{
func1(c);
printf("%d ", c);
}
printf("\n");
func2(c);
}
int fun1(char x)
{
retrun x+0x30;
}
int fun2(int x) {
x = fun1(x);
printf("%x");
}
結果
- fun1(char)->func1(int)
- fun2->func2
- retrun->return
- fun2 中的
printf("%x")
改為printf("%x",x);
第七題
設計一個子函式,實現交換兩個變數的值。
注意:指標(*,&,...)的運用。
程式碼
void test07_subfun(int *a,int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
void test07(){
int a=1,b=2;
printf("before exchange\n");
printf("a=%d , b=%d",a,b);
test07_subfun(&a,&b);
printf("\nafter exchange\n");
printf("a=%d , b=%d",a,b);
}
結果
第八題
設計一個包含學生語、數、外三科成績的結構體。定義 3 個此型別的結構體變數來儲存
下列資料:
Tom: 語文 109, 數學 120, 外語 130;
Jack: 語文 95, 數學 140, 外語 99;
Mary: 語文 130, 數學 100, 外語 140;
通過呼叫結構體變數的各個資料項來計算出他們每一個人的總分,並打印出來。
注意:結構體(struct,...)的運用。
程式碼
typedef struct{
float chinese;
float math;
float english;
}score;
void test08(){
score Tom={109,120,130},Jack={95,140,99},Mary={130,100,140};
printf("Tom: %f\n",Tom.chinese+Tom.english+Tom.math);
printf("Jack: %f\n",Jack.chinese+Jack.english+Jack.math);
printf("Mary: %f\n",Mary.chinese+Mary.english+Mary.math);
}
結果
第九題
char daytable[2][13]={
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
以上定義的是一年 12 個月每個月的天數,其中 daytable[0]表示平年每個月的天數,
daytable[1]表示閏年每個月的天數。
設計一個子函式:int day_of_year(int year, int month, int day){}將給定的 x 年 x 月 x 日轉
化為 x 年中的第幾天的表示形式。
提示:閏年判定公式(year%4 == 0 && year%100 !=0) || (year %400 == 0)
此判定公式為“真(1)”時是閏年,“假(0)”時為平年。
注意:陣列、運算子(+,-,*,/,%,&&,||,...)的運用。
程式碼
int day_of_year(int year, int month, int day) {
char daytable[2][13] = {
{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
if (month > 12 || day > 31 || day < 0 || year < 0) {
return 0;
} else {
//閏 平 年
// 1 閏
if ((year%4 == 0 && year%100 !=0) || (year %400 == 0)){
for (int i =0 ; i< month ; i++){
day += daytable[1][i];
}
} else{ // 0 平
for (int i =0 ; i< month ; i++){
day += daytable[0][i];
}
}
}
return day;
}
void test09() {
int day = day_of_year(2020,3,0);
printf("the %d day of %d",day,2020);
}
結果
第十題
運用 Turbo C 的除錯方法找出程式三中存在的錯誤,並修正程式。
程式三定義了一個新的結構體型別 struct Date。功能實現為使用者輸入時間修改指令來修
改對應的年、月、日的值。
實驗過程
- 在TC 中編譯完後執行
- 可以看到與預期結果不相符
- 新增斷點 和 對 data 的檢視
- 執行到斷點後,接著輸入
m 10
然後觀察 data 的值是否正確- 可以看到data的值為10表示輸入資料正確
- 接下來看處理資料是否正確
- 可以發現data在傳參是就發生錯誤
- 觀察
setDate(&date, type, (int)&data);
- 可以看到傳遞的為data的地址而不是data 修改 為
setDate(&date, type,data);
然後在執行- 可以看到值傳遞正確
- 編譯連結生成可執行檔案後執行可以正確執行預期功能