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

改错题
函数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<stdio.h>
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(num1<num2)
    {
        int 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<stdio.h>

int main()
{
    int count[10]={0};
    char num[50];
    gets(num);
    for(int i=0;num[i]!='\0';i++)
    {
        count[num[i]-'0']++;
    }
    printf("数字0出现%5d次\n", count[0]);
    printf("数字1出现%5d次\n", count[1]);
    printf("数字2出现%5d次\n", count[2]);
    printf("数字3出现%5d次\n", count[3]);
    printf("数字4出现%5d次\n", count[4]);
    printf("数字5出现%5d次\n", count[5]);
    printf("数字6出现%5d次\n", count[6]);
    printf("数字7出现%5d次\n", count[7]);
    printf("数字8出现%5d次\n", count[8]);
    printf("数字9出现%5d次\n", count[9]);
    return 0;
}
  1. 编写完整程序,采用结构数组和指向结构的指针,接收输入的100个学生信息(包括学号和C语言课程期末总成绩),输出最高、最低成绩和分别对应的学号(可能有多个同学都是最高分,可能有多个同学都是最低分)
    使用结构体数组保存最高分和最低分学生的学号并且保存数组的元素个数(删除数组中内容时使用)
  2. 从程序执行效率方面考虑,请简述C语言采取的一些措施和原因
    1.使用指针:对于指针的理解简单点可以认为类似于汇编中的寻址方式,正是指针的存在使C语言威力无穷。有些程序用其他语言也可以实现,但C能够更有效地实现;有些程序无法用其它语言实现,如直接访问硬件,但C却可以。正因为指针可以拥有类似于汇编的寻址方式,所以可以使程序更高效。
    2.使用宏函数:函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间。函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间。而宏函数不存在这个问题。宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,而使程序可以高效运行。在频繁调用同一个宏函数的时候,该现象尤其突出。
    3.使用位操作:位操作可以减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用”位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。
    4.循环嵌套中将较长循环设为内存循环,较短循环设为外置循环,以减少cpu跨切循环层的次数,提高程序的运行效率。
    关键字: 1:指针,可以操作内存 2:位移,可以作位运算 3:API,可以调用系统API,接近底层 4:宏define可以编译的时候替换
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值