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. 删数问题
【问题描述】输入一个高精度的大正整数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 }