GG第四次作業


填空題

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. 刪數問題

【問題描述】輸入一個高精度的大正整數SS最長可達240位),去掉其中任意N位數字后剩下的數字按原次序組成一個新的正整數S’。編程對給定的NS,尋找一種方案使得剩下的數字組成的新數S’最小。

【輸入形式】輸入有兩行:

1.第一行是大整數S。其中S最長可達240位。

2.第二行是整數NSN均以非0數字開頭。

【輸出形式】輸出有一行,是在S中刪除N位后所得的最小數字S’。

【樣例輸入1

178543

4

【樣例輸出113

【樣例輸入2

1002

1

【樣例輸出2002

【樣例說明】樣例1中輸入整數S=178543N=4,要求在178543中刪除4位,使剩下的數字最小。正確答案為S= 13。樣例2中輸入整數S1002N1,刪完一位后S= 002,而不是2,即2之前的0也必須輸出。

【運行時限】程序一次運行的最長時間限制在15秒內,超出則認為程序錯誤。

【評分標准】該題要求輸出一個大整數的各位數字。結果完全正確得20分,每個測試點4分。上傳C語言文件名為delete.c

【算法提示】將整數看作字符串形式讀入;刪數時,從前往后尋找第一個比后一個數字大的數字,然后刪除之,按照這種方法刪除N個數字即得最小數字。

 

2. 擴展字符

【問題描述】

編寫一函數expand(s1,s2),用以將字符串s1中的縮記符號在字符串s2中擴展為等價的完整字符,例如將a-d擴展為abcd。該函數可以處理大小寫字母和數字,並可以處理a-b-ca-z0-9-a-z等類似的情況。在main函數中測試該函數:從鍵盤輸入包含縮記符號的字符串,然后調用該函數進行擴展,輸出擴展結果。

(教材 P63Exercise 3-3

注意:

待擴展字符串中有可能包含空格,例如:a-d x-z應擴展成:abcd xyz。所以讀入待擴展字符串時,應能夠讀入包含空格的字符串。

只要縮記符號-之后的字符比之前的字符的ASCII碼值大,就要將它們之間的所有字符擴展出來,例如:Z-a之間的字符也要擴展出來;

特殊情況:a-b-c將被擴展為:abca-a將被擴展為:a-a

【輸入形式】

從鍵盤輸入包含擴展符的字符串

【輸出形式】

輸出擴展后的字符串

【輸入樣例】

a-c-u-B

【輸出樣例】

abcdefghijklmnopqrstu-B

【樣例說明】

擴展輸入a-c-u為:abcdefghijklmnopqrstu,而Bu值小,所以無法擴展,直接輸出。

【評分標准】

結果完全正確得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.infcopy.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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM