C基础练习4(2012电科复试C)

2019-04-14 08:53发布

改错题
函数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);//求最小公倍数LCM和最大公约数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; } }
  1. 编写函数,将单链表进行逆序,即表头变表尾,表尾变表头(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)的重复次数 # include int main() { int count[10]={0}; char num[50]; gets(num); for(int i=0;num[i]!='