void fun (char *s)
{ tchar *p=s,c;
while (*p)
p++;
p--;
if (s
{
c=*s;
*s=*p;
*p='0';
fun (s+1);
*p=c;
puts(s);
}
}
void main()
{
char a[]="ABCDE";
fun (a);
}
以下程序运行时,输出结果是____________。
#include
#define N 10
void fun (int *a,int *b)
{ int i,j,k,n,m=1,r=1;
while (m<=N)
{
for (i=0;i
{
if (b[i]!=0) continue;
k=i;
for (j=i;j
if (b[j]==0 && a[j]
b[k]=r++;
m++;
for (j=0;j
if (b[j]==0 && a[j]==a[k])
{
b[j]=b[k];
m++;
}
break;
}
}
}
void main()
{ int i,a[N]={3,2,7,5,8,3,5,6,9,2},b[N]={0};
fun (a,b);
for (i=0;i
printf ("%d ",b[i]);
}
二、改错题(将正确的程序上传)
下面的程序含有若干个错误,请将这些错误改正以后,将正确的程序上传。
注意:只是改正错误,而不是重新写程序。这些错误可能是语法错误,也可能是逻辑错误。
改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,
但不能增加其他语句,也不能删除整条语句。
1. 以下程序对给出的十进制整数求补码,并输出其正确形式。函数void encode(int a, int b[])的功能是:求出带符号整数a的8位二进制补码,将其补码的每一位二进制数按从低位到高位的顺序分别保存在b数组的b[0]至b[7]中。例如,a=-2时,若程序正确,则程序输出结果应为“1,1,1,1,1,1,1,0”。
注: 程序中含有4处错误,每处错误的改正只涉及一行语句的修改或增加,或者一个头文件包含。
含有错误的源程序如下:
#include
main()
{tint x=-2,y[8],n;
encode(x,y[8]);
putchar('
');
for(n=7;n>=0;n--) printf("%d,",y[n]);
}
void encode(int a, int b[])
{tint k,sign,carry;
for(k=0;k<8;k++) b[k]=0;
if(a>=0) sign=0;
el { sign=1; a=-a; }
k=0;
do{
a=a/2; b[k++]=a%2;
}while(a>0);
if(sign)
{tcarry=1;
for(k=0;k<7;k++)
{tb[k]=1-b[k]+carry;
if(b[k])
{ b[k]-=2; carry=1; }
el carry=0;
}
}
b[7]=sign;
}
2【程序功能】
二维数组c中每行保存着一个整数集合,共有5个集合,每个集合均包含5个元素。本程序求出这五个集合的交集,以及交集中元素的个数。所谓交集是指由所有同时出现在这5个集合中的元素组成的集合。
【测试数据与运行结果】
五个集合分别为:{12,35,3,9,0},{2,35,9,12,1},{35,12,0,1,9},{4,90,35,9,12},{11,9,0,12,35}
五个集合的交集为:{12,35,9}
【含有错误的程序】
#include
int InterSection(int
*a[5], int res[5])
{tint i,k,m,count=0,flag=0;
for(i=0;i<5;i++)
{ for(k=1;k<5;k++)
for(m=0;m<5;m++)
{tif(*(*a+i) = *(*(a+k)+m))
{ flag++; break; }
}
if(flag>=4)
res[count++]=*(*a+i);
}
return count;
}
void main()
{tint c[5][5]={{12,35,3,9,0},{2,35,9,12,1},{35,12,0,1,9},{4,90,35,9,12},{11,9,0,12,35}};
int intc[5],number,i;
number=InterSection(c,res);
for(i=0;i
printf("
");
}
3.以下程序实现的功能是:有二维数组,现根据数组各行元素之和的大小,以行为单位,按从小到大的顺序重新排列,
然后输出新数组的各行元素以及每行元素的和。
【错误的程序】
int sum_line(int *p, int n)
{
int sum=0;
for(;n>=0;n--,p++)
sum+=*p;
return(sum);
}
void swap(int *p1, int *p2)
{
int *p;
p=*p1,*p1=*p2,*p2=p;
}
void main()
{ int sum[5], array[5][4]={{1,4,5,7},{3,5,7,8},{9,10,2,3},{1,3,4,2},{1,2,1,1}};
int k,mink,j,m;
for(k=0;k<5;k++)
sum[k]=sum_line(array[k],4);
for(k=0;k<4;k++)
{
for(j=k+1;j<5;j++)
{
mink=k;
if(sum[mink]>sum[j]) mink=j;
}
if(mink!=k)
{
swap(&sum[mink],sum+k);
for(m=0;m<4;m++)
swap(array[mink]+m,&array[k][m]);
}
}
for(k=0;k<5;k++)
{
for(j=0;j<4;j++)
printf("%5d",array[k][j]);
printf("%5d",sum[k]);
putchar('
');
}
}
五、编程题
4、 请大家编写一个程序,完成以下功能:
(1) 定义以下5个变量或者数组,
(a)一个指向int对象的指针变量;
(b)一个具有5个元素的指针数组,每个数组元素都是指向int对象的指针;
(c)一个指向具有5个元素的int数组的指针变量;
(d)一个指向函数的指针变量,它所指向的函数返回值类型为int,具有两个参数,第一个参数用于接收指向int型数组开始元素的指针,第二个形参是int型的。
(e)一个指向指针变量的指针变量,它所指向的指针变量又指向一个int型对象,也就是定义一个二级指针变量。
(2) 对于上面定义的(a)、(c)、(e)3个指针变量,假设指针变量名为p,打印p和p+1的值,查看p和p+1值的差,并在程序中用注释解释为什么p和p+1相差这么多个字节。
注释示例:
char *p;
/* p和p+1的值相差1一个字节,因为p是指向char型对象的,而char型对象占一个字节。 */
printf("p: %x
p+1:%x
",p,p+1);
(注意:在这道习题中,并未对定义的指针变量做合法的初始化,因为这里只是查看指针变量和其指向的对象类型之间的关系,并未对指针变量指向的存储空间作*运算。但是在实际应用的时候必须在引用指针变量之前对其做合法初始化,使得指针变量指向合法的存储空间。)
5.(1)编写函数long my_operator(char *s):在字符串s中包含一个正确的整数四则运算(+,-,*,/)算式,函数完成该算式的运算并返回运算结果。要求把字符串中的数字和运算符分离出来,将数字字符串转成相应的整数,若运算符错误(除“+,-,*,/”外的其他字符)或运算不合法(如“/”分子为0),则返回-9999。
(2)编写函数main(),声明字符数组x,并用键盘输入测试数据(字符串中间不包含空格),调用函数my_operator计算出x数组中算式的结果,
将算式和结果写到结果文件中。
【测试数据与运行结果】
x字符串键盘输入:1234+567=
输出结果应为:1234+567=1801
x字符串键盘输入:12/2=
输出结果应为:12/2=6
【要求】
1.t源程序文件取名05.c,结果文件取名
2.t数据文件的打开、使用、关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。
3.t提交源程序文件14_05.c和结果文件。
6.编写一个程序,将一个给定的字符串转存到一个二维字符数组中,这个二维字符数组的每行有8个元素,最后将处理结果保存到文件中。
要求编写一个函数int fun(char *sou, char (*dst)[8])来完成转存任务,对于最后一行不足8个字符的情况,在后面补字符'0'。
在主函数中输入字符串,然后调用fun()函数对其处理,并将处理后的二维字符数组保存到文件中并输出到屏幕上,以验证处理情况。
fun()函数的第一个参数是等待处理的字符串,第二个参数是用于存储处理结果的二维字符数组的首地址,
而其返回值表示处理结果的有效行数。
例如,输入字符串为"abcdefgh12345678mnopqrst",则输出结果为:
abcdefgh
12345678
mnopqrst
而如果输入为"abcdefgh12345678mnopqrstijk",则输出为
abcdefgh
12345678
mnopqrst
ijk00000
7 在所给的10个单词中找出不包含元音字母(a,e,i,o,u)的单词,将符合条件的单词的个数以及这些单词按照字典顺序写入结果文件中。
1)编写函数int FindNoVowel(char *str[],int num,char res[][20]),str指向的指针数组中保存若干单词字符串的首地址,num保存单词的个数,res指向的数组保存找到的符合条件的单词字符串,每行存放一个单词,要求将符合条件的单词按字典顺序存储,函数返回符合条件的单词个数。
2)编写主函数main(),声明数组并用测试数据初始化数组,调用函数FindNoVowel,将符合条件的所有单词按字典顺序写入结果文件中,单词之间用空格隔开。
【测试数据与运行结果】
10个字符串为:"ftp","qq","msn","internet","web","google","bbs","mp3","blog","ibm"
结果文件内容为:bbs,ftp,mp3,msn,qq
【要求】
1)源程序文件取名07.c,结果文件取名。
2)
数据文件的打开、使用、关闭均用C语言标准库中缓冲文件系统的文件操作函数实现。
3)提交源程序文件07.c和结果文件。
8.编写一个程序(用带参数的主函数),假设编译后可执行程序的名字为08,则程序的功能是判断输入的参数中哪些是素数,哪些是非素数。
例如,如果在命令行输入
08 2 23 48 5 161 7 8 9
输出将参数的个数打印在第一行,素数打印在第二行上,非素数打印在第三行上。
dos命令:
cd --------------回到根目录
cd fffff -----------进入fffff目录(文件夹)
ttt -----------运行程序
9.定义一个结构体变量(包括年、月、日),输入年月日,写程序计算该日在本年中是第几天。(需要考虑闰年问题)
资料
2006_6 C上机考试试卷(90分钟,可以自己测一下时间,含改错题答案,有些题目已经做过,自己看,有问题可以问我,难度较低)
等级考试试卷(包括考纲,笔试,上机,参考答案)
deadline 5.31 14:00