填空題
1. 給出下述程序的執行結果
#include <stdio.h>
int a=4,b=5;
int max(int a,int b)
{
int c;
c=a>b?a:b;
return c;
}
void main()
{
int a=6;
printf("%d\n",max(a,b));
}
2. 下面的函數invert的功能是將一個字符串的內容顛倒過來。(所有答案填寫在此空內,答案間以空格隔開)
void invert (char str [] )
{
int i,j,填空1______;
for(i=0,j=strlen(str)填空2_______;i<j;i++,j--)
{
k=str[i];
str[i]=str[j];
str[j]=k;
}
}
3. 寫出下述程序的輸出結果
#include <stdio.h>
void main()
{
int a[] = {8,0,3,7,2,5}, i, j, t;
i = 1;
while ( i<6 )
{
t = a[i];
j = i-1;
while( j>=0 && t>a[j] )
{
a[j+1] = a[j];
j--;
}
a[j+1] = t;
i++;
}
i = 0;
while(i<5)
printf("%d,",a[i++]);
printf("%d",a[i]);
}
4. 下面程序段的運行結果是
char ch[ ] = "600";
int a, s = 0;
for (a = 0; ch[a] >= ’0’ && ch[a] <= ’9’; a++)
s = 10 * s + ch[a] - ’0’;
printf("%d", s);
5. 以下程序的運行結果是
#include<stdio.h>
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int k,s,i;
float ave;
for (k=s=i=0;i<10;i++)
{
if (a[i]%2!=0)
continue;
s+=a[i];
k++;
}
if (k!=0)
{
ave=s/k;
printf("%d,%.2f\n",k,ave);
}
}
選擇題
# 題目
1. 下述對C語言字符數組的描述中錯誤的是
(A) 字符數組可以存放字符串
(B) 字符數組的字符串可以整體輸入,輸出
(C) 可以在賦值語句中通過賦值運算符"="對字符數組整體賦值
(D) 不可以用關系運算符對字符數組中的字符串進行比較
2. 有下面的程序段:
char a[3], b[] = "China";
a = b;
printf("%s", a);
則
(A) 運行后將輸出China
(B) 運行后將輸出Ch
(C) 運行后將輸出Chi
(D) 編譯出錯
3. 下面程序的功能是將字符串s中所有的字符’c’刪除。請選擇填空。
#include<stdio.h>
main()
{
char s[80];
int i,j;
gets(s);
for(i=j=0;s[i]!=’\0’;i++)
if(s[i]!=’c’);
s[j]=’\0’;
puts(s);
}
(A)s[j++]=s[i];
(B)s[++j]=s[i];
(C)s[j]=s[i];j++
(D)s[j]=s[i]
4. 下面程序段的運行結果是。(其中#表示空格)
char a[7]="abcdef",b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
(A)#
(B)\0
(C)e
(D)f
5. C語言中,對文件操作的一般步驟是
A. 打開文件->操作文件->關閉文件 B. 操作文件->修改文件->關閉文件
C. 讀寫文件->打開文件->關閉文件 D. 讀文件->寫文件->關閉文件
6. 下列語句中,將c定義為文件型指針的是
A. FILE c; B. FILE *c; C. file c; D. file *c;
7. 下列關於文件的結論中正確的是
A.對文件的操作必須先關閉文件
B.對文件的操作必須先打開文件
C.對文件的操作順序沒有統一規定
D.以上三個答案全部錯誤
答案:
填空題:
1.6 2.k k=0 3.8,7,5,3,2,0 4.600 5.5,6.00
選擇題:
1.C 2.D 3.A 4.D 5.A 6.B 7.B
編程題:
1. 刪數問題
【問題描述】輸入一個高精度的大正整數S(S最長可達240位),去掉其中任意N位數字后剩下的數字按原次序組成一個新的正整數S’。編程對給定的N和S,尋找一種方案使得剩下的數字組成的新數S’最小。
【輸入形式】輸入有兩行:
1.第一行是大整數S。其中S最長可達240位。
2.第二行是整數N。S、N均以非0數字開頭。
【輸出形式】輸出有一行,是在S中刪除N位后所得的最小數字S’。
【樣例輸入1】
178543
4
【樣例輸出1】13
【樣例輸入2】
1002
1
【樣例輸出2】002
【樣例說明】樣例1中輸入整數S=178543,N=4,要求在178543中刪除4位,使剩下的數字最小。正確答案為S’ = 13。樣例2中輸入整數S=1002,N=1,刪完一位后S’ = 002,而不是2,即2之前的0也必須輸出。
【運行時限】程序一次運行的最長時間限制在15秒內,超出則認為程序錯誤。
【評分標准】該題要求輸出一個大整數的各位數字。結果完全正確得20分,每個測試點4分。上傳C語言文件名為delete.c。
【算法提示】將整數看作字符串形式讀入;刪數時,從前往后尋找第一個比后一個數字大的數字,然后刪除之,按照這種方法刪除N個數字即得最小數字。
2. 擴展字符
【問題描述】
編寫一函數expand(s1,s2),用以將字符串s1中的縮記符號在字符串s2中擴展為等價的完整字符,例如將a-d擴展為abcd。該函數可以處理大小寫字母和數字,並可以處理a-b-c、a-z0-9與-a-z等類似的情況。在main函數中測試該函數:從鍵盤輸入包含縮記符號的字符串,然后調用該函數進行擴展,輸出擴展結果。
(教材 P63:Exercise 3-3)
注意:
待擴展字符串中有可能包含空格,例如:a-d x-z應擴展成:abcd xyz。所以讀入待擴展字符串時,應能夠讀入包含空格的字符串。
只要縮記符號-之后的字符比之前的字符的ASCII碼值大,就要將它們之間的所有字符擴展出來,例如:Z-a之間的字符也要擴展出來;
特殊情況:a-b-c將被擴展為:abc。a-a將被擴展為:a-a。
【輸入形式】
從鍵盤輸入包含擴展符的字符串
【輸出形式】
輸出擴展后的字符串
【輸入樣例】
a-c-u-B
【輸出樣例】
abcdefghijklmnopqrstu-B
【樣例說明】
擴展輸入a-c-u為:abcdefghijklmnopqrstu,而B比u值小,所以無法擴展,直接輸出。
【評分標准】
結果完全正確得20分,每個測試點4分,提交程序文件expand.c。
#include<stdio.h> #include<stdlib.h> #include<string.h> void expand(char s1[],char s2[]) { int len=strlen(s1); int i,j=0,k; s2[0]=s1[0]; for (i=1; i<len; i+=2) if (s1[i-1]<s1[i+1]) for (k=1; k<=(s1[i+1]-s1[i-1]); k++) s2[++j]=s1[i-1]+k; else { s2[++j]='-'; s2[++j]=s1[i+1]; } s2[++j]='\0'; return; } void main() { char s1[100],s2[100]; gets(s1); expand(s1,s2); printf("%s",s2); return; }
3.略
4.文件拷貝2
【問題描述】
寫一程序將一個文件fcopy.in拷貝至另一個文件fcopy.out, 其中在所拷貝的文件中, 多個連續空白符(包括空格符、制表符)只拷貝一個空格符, 其它字符不變。
【輸入形式】
源文件名和目標文件名分別為fcopy.in和fcopy.out,程序將從當前目錄下讀取fcopy.in文件。
【輸出形式】
將fcopy.in文件內容拷貝至當前目錄下的fcopy.out文件中。在所拷貝的文件中, 多個連續空白符(包括空格符、制表符)只拷貝一個空格符,若非空白符之間有一個制表符,則該制表符也要替換為空格符,其它字符不變。
【輸入樣例】
假如文件fcopy.in中內容如下:
Alcatel provides end-to-end solutions.
【輸出樣例】
輸出文件fcopy.out中內容為:
Alcatel provides end-to-end solutions.
【樣例說明】
將文件fcopy.in拷貝到fcopy.out,同時做適當的轉換。
【評分標准】
其中在所拷貝的文件中, 多個連續空白符(包括空格符、制表符)只拷貝一個空格符,其它字符不變,完全符合要求得20分,每個測試點4分。提交程序名為copy.c。
#include<stdio.h> #include<stdlib.h> int main() { char s[100000]; int i=0; FILE*in,*out; in=fopen("fcopy.in","r"); out=fopen("fcopy.out","w"); while (!feof(in)) fscanf(in,"%c",&s[i++]); int j=0; for (; j<i; j++) if (s[j]==' ') { if (s[j-1]!=' ') fprintf(out,"%c",s[j]); } else if (s[j]=='\t') { if (s[j-1]!='\t' && s[j+1]!='\t' && s[j-1]!=' ' && s[j+1]!=' ') fprintf(out,"%c",s[j]); } else fprintf(out,"%c",s[j]); fclose(in); fclose(out); return 0; }
5.表達式計算(支持空格,連乘,連除)(選做題,不計分)
【問題描述】
從標准輸入中讀入一個整數算術運算表達式,如5 - 1 * 2 * 3 + 12 / 2 / 2 = 。計算表達式結果,並輸出。
要求:
1、表達式運算符只有+、-、*、/,表達式末尾的’=’字符表示表達式輸入結束,表達式中可能會出現空格;
2、表達式中不含圓括號,不會出現錯誤的表達式;
3、出現除號/時,以整數相除進行運算,結果仍為整數,例如:5/3結果應為1。
【輸入形式】
在控制台中輸入一個以’=’結尾的整數算術運算表達式。
【輸出形式】
向控制台輸出計算結果(為整數)。
【樣例1輸入】
5 - 1 * 2 * 3 + 12 / 2 / 2 =
【樣例1輸出】
2
【樣例2輸入】
500 =
【樣例2輸出】
500
【樣例1說明】
輸入的表達式為5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整數運算規則,計算結果為2,故輸出2。
【樣例2說明】
輸入的表達式為500 = ,沒有運算符參與運算,故直接輸出500。
算法之一提示:
1、可以利用gets函數,讀取整行表達式;
2、對於空格,可以考慮首先去除表達式中的所有空格
3、可以設一計數器用來記錄已讀取、但未參加運算的運算符的個數,根據該計數器來判斷如何進行運算;
4、可以設計一函數:實現二元整數算術運算。
【評分標准】
該題要求輸出整數表達式的計算結果,共有5個測試點。上傳C語言文件名為example1c.c。
分析:這道題我想起了后綴表達式……但是這里並沒有學到棧。所以就寫了個簡單的程序。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<string.h> 5 6 int main() 7 { 8 int a1,a2,a3; 9 char op1,op2,op3; 10 //為了保證計算順序,在最開始加上一個0+ 11 a1=0; 12 op1='+'; 13 while (op1!='=') 14 { 15 scanf("%d %c",&a2,&op2); 16 //一口氣把乘除計算完畢 17 while (op2=='*' || op2=='/') 18 { 19 scanf("%d %c",&a3,&op3); 20 if (op2=='*') a2*=a3; 21 else if (op2=='/') a2/=a3; 22 op2=op3; 23 } 24 if (op1=='+') a1+=a2; 25 else if (op1=='-') a1-=a2; 26 op1 = op2; 27 } 28 printf("%d",a1); 29 return 0; 30 }
