改错题
函数Swap将两个字符串交换(字符串作为实参,最大长度不超过100)修改程序
Void change(char *p1,char *p2)
{
Char *temp;
Temp=p1;
P1=p2;
P2=temp;
}
原函数1)change(char* p1,char *p2)的参数为字符串常量而非字符串的指针所以在change函数中无法正常交换。
修改结果为:
void swap(char** p1,char** p2)
{
char *temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
程序片段为:
char pa[ ]="ABCDE";
char *pb="EFG";
pb[1]='A';
pb=pa;
strcpy(pa,"ABCDEFG");
pb="D";
错误语句为pb[1]=’A’;原因为字符串指针类变量不能使用字符串数组的方式进行操作,同时不能对字符串指针常量中的单个字符进行赋值。pb=“D”是允许的;
简答题
1. 设arr为整数数组,num和item为整数变量,N=数组个数-1;查找item是否在arr中,如程序片段为
for(num=N;arr[num]!=item;num-);printf("%d",num)
可能导致什么异常结果?为什么?
可能导致数组越界异常,当item不在num中for循环中的num值将会超过数组arr的下届地址,此时会越界
2. 设有递归函数:
int value(int n){
int x;
if(n==0)
return 0;
else
{
scanf("%d",&x);
return (value(n-1)+x);
}
若函数被调用时参数n值为4,输入x的值依次为11,22,33,44,函数调用结束时返回值时?
返回值为44+33+22+11=110;
3. 数组作为函数参数有三种形式:1)实参是数组元素;2)形参是指针,实参是函数,3)函数的形参和实参都是数组,分别是采用什么参数传递方式?
函数实参与形参的区别
1)传递数组元素的值;
2)传递数组的起始地址指针;
3)传递数组的起始地址
4.
采用高度抽象概念有利于子程序设计,C语言中循环语句do s while(B);
对应的显示控制结构是什么?用伪代码形式(通过条件转移指令)表达。
label:s
if(B) goto:label
程序设计
1. 编写完整程序:利用2个函数对输入的两个分数进行加、减、乘、除四则运算和输出用分数表示的结果。(注:输入格式为:%ld/%ld%c%ld/%ld,输出格式为%ld/%ld),例如:输入1/4+1/3,输出:7/12
#include
struct fraction{
int numerator;
int denominator;
}
void add(struct fraction a ,struct fraction b);
void del(struct fraction a ,struct fraction b);
void mul(struct fraction a ,struct fraction b);
void dev(struct fraction a ,struct fraction b);
void LCM_GCD(int num1,int num2,int* LCM,int*GCD);
int main()
{
struct fraction a,b;
char op;
scanf("%ld/%ld%c%ld/%ld",&a.numerator,&a.denominator,&op,&b.numerator,&b.denominator)
if(op=='+')
add(a,b);
else if(op=='-')
del(a,b);
else if(op=='*')
mul(a,b);
else if(op=='/')
dev(a,b);
else
printf("error op");
}
void LCM_GCD(int num1,int num2,int* LCM,int*GCD)
{
int sum=num1*num2;
if(num1int temp=num1;
num1=num2;
num2=temp;
}
while(1)
{
int temp=num1%num2;
if(temp==0)
{
*GCD=num2;
*LCM=sum/num2;
break;
}
else
{
num1=num2;
num2=temp;
}
}
}
void add(struct fraction a ,struct fraction b)
{
struct fraction result;
if(a.denominator==b.denominator)
{
result.numerator=a.numerator+b.numerator;
result.denominator=b.denominator;
LCM_GCD(reslut.denominator,reslut.denominator,&LCM,&GCD);
result.denominator=result.denominator/GCD;
result.numerator=result.numerator/GCD;
}
else
{
int LCM=0,GCD=0;
LCM_GCD(a.denominator,b.denominator,&LCM,&GCD);
result.denominator=LCM;
result.numerator=LCM/a.denominator*a.numerator+LCM/b.denominator*b.numerator;
LCM_GCD(reslut.denominator,reslut.denominator,&LCM,&GCD);
result.denominator=result.denominator/GCD;
result.numerator=result.numerator/GCD;
}
}
- 编写函数,将单链表进行逆序,即表头变表尾,表尾变表头(15分)
其中,节点定义为:
struct node{
int num;
struct node *next
};
函数原型为:
void turn(struct node *head);
方法一:后插法
void turn(struct node *head)
{
struct node *end=NULL;
struct node *temp=head;
while(temp->next!=NULL)
{
temp=temp->next;
}
end=temp;
while(head->next!=end)
{
temp->next=head->next;
temp=head->next;
head->next=head->next->next;
}
}
方法二:前查法:从头结点开始之后的第一个结点开始依次插入头结点之后,注意结点断开之后的操作。
3. 接受从键盘输入的仅由数字字符构成的字符串(假设字符串的最大长度为50),统计并输出每个数字(0-9)的重复次数
int main()
{
int count[10]={0};
char num[50];
gets(num);
for(int i=0;num[i]!='