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 ",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 ",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]!=;i++)

  if(s[i]!=c);

 s[j]=;

 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)

(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]='';
    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]=='	')
        {
            if (s[j-1]!='	' && s[j+1]!='	' && 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 }
原文地址:https://www.cnblogs.com/Shymuel/p/8520509.html