第四章代码

本文提供了一系列C语言编程实践案例,包括字符串查找、浮点数解析、计算器应用等,通过具体实例帮助读者理解C语言的基本语法及高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

练习4-1 (60页)

int strrindex(char s[], char t[])
{
    int i, j, k;
    for (i = strlen(s) - strlen(t); i >= 0; i--)
    {
        for (j = i, k = 0; t[k] = s[j] && t[k] != '\0'; j++, k++)
            ;
        if (k > 0 && t[k] != '\0')
            return i;
    }
    return -1;
}

练习4-2(62页)

#include <stdio.h>
#include <ctype.h>

double atof(char[]);

int main()
{
    double b = atof("1.2e+2");
    printf("%f\n", b);
    return 0;
}

double atof(char s[])
{
    double val, power;
    int sign, k = 0, j, i= 0;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i]== '-' || s[i] == '+')
        i++;
    for(val = 0.0; isdigit(s[i]); i++) {
        val = val * 10 + s[i] - '0';
    }
    if (s[i] == '.')
        i++;
    for(power = 1.0; isdigit(s[i]); i++) {
        val = val * 10 + s[i] - '0';
        power *= 10;
    }
    if (s[i] == 'e' || s[i] == 'E') {
        i++;
        if (s[i] == '-') {
            i++;
            for(; isdigit(s[i]); i++) {
                k = k * 10 + s[i] - '0';
            }
            for (j = 0; j < k; j++) {
                power *= 10;
            }
        } else if (s[i] == '+') {
            i++;
            for (; isdigit(s[i]); i++) {
                k = k * 10 + s[i] - '0';
            }
            for (j = 0; j < k; j++){
                power /= 10;
            }
        } else {
            for (; isdigit(s[i]); i++) {
                k = k * 10 + s[i] - '0';
            }
            for (j = 0; j < k; j++){
                power /= 10;
            }
        }
    }
    return sign * val / power;
}

习题4-3、4-4、4-5(还是有一些细节问题要考虑)

代码155行左右,使用getchar()函数而没有使用程序本身实现的函数getch()。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>

#define MAXLEN  100 /* 读取字符串s的最大长度 */
#define NUMBER '0'  /* 标识找到的是数字      */
#define FUNCTION 'f'/* 标识找到的是函数      */
#define MAXVAL  100 /* 栈的深度              */
#define BUFSIZ 100

int sp = 0;         /* 栈中下一个空闲位置 */
double val[MAXVAL];

int getop(char []);
void push(double);
double pop(void);

void clear_stack(void);  /* 清空栈 */
void print_op(void);/* 打印栈顶元素 */
void copy_op(void); /* 复制栈顶元素 */
void swap_op(void); /* 交换栈顶两个元素 */
void mathfunction(char[]);
void ungetch(int);
int getch(void);

int main()
{
    int tpye;
    char s[MAXLEN];
    double op2;
    while ((tpye = getop(s)) != EOF) {  /* 处理各种类型数据 */
        switch (tpye) {
        case FUNCTION:
            mathfunction(s);
            break;
        case NUMBER:
            push(atof(s));
            break;
        case '+':
            push(pop() + pop());
            break;
        case '-':
            op2 = pop();
            push(pop() - op2);
            break;
        case '*':
            push(pop() * pop());
            break;
        case '/':
            op2 = pop();
            if (op2 == 0.0)
                printf("error: 除数为0\n");
            else
                push(pop() / op2);
            break;
        case '\n':
            printf("\t%.8g\n", pop());
            break;
        case '%':
            op2 = pop();
            if (op2 != 0.0)
                push(fmod(pop(), op2));
            else
                printf("error: 0不能做除数\n");
        case 'c':       /* 清空栈 */
            clear_stack();
            break;
        case 'p':       /* 复制栈顶元素 */
            copy_op();
            break;
        case '?':       /* 打印栈顶元素 */
            print_op();
            break;
        case ']':       /* 交换栈顶的两个元素 */
            swap_op();
            break;
        default:
            printf("error: 不能处理\n");
            break;
        }
    }
    return 0;
}

/* 判断函数类型 */
void mathfunction(char s[])
{
    double op2;
    if (strcmp(s, "sin") == 0)
        push(sin(pop()));
    else if (strcmp(s, "cos") == 0)
        push(cos(pop()));
    else if (strcmp(s, "exp") == 0)
        push(exp(pop()));
    else if (strcmp(s, "pow") == 0) {
        op2 = pop();
        push(pow(pop(), op2));
    } else
        printf("error: function %s is not find\n", s);

}

void push(double f) /* 入栈 */
{
    if (sp < MAXVAL) {
        val[sp++] = f;
    }

    else
        printf("error: stack full, can't push %g\n", f);
}

double pop()        /* 出栈 */
{
    if (sp > 0)
        return val[--sp];
    else {
        printf("error: stack empty, can't pop");
        return 0.0;
    }
}

void print_op()     /* 打印栈顶元素 */
{
    int i = sp - 1;
    printf("\t%.g\n", val[i]);
}

void copy_op()    /* 复制栈顶元素 */
{
    int i = sp - 1;
    push(val[i]);
}

void swap_op()      /* 交换栈顶两个元素 */
{
    int i = sp -1;
    double f = val[i];
    val[i] = val[i - 1];
    val[i - 1] = f;
}

void clear_stack()  /* 清空栈 */
{
    sp = 0;
}


int getop(char s[])    /* 获取一个输入,将数值以字符串形式存到数组s中 */
{
    int c, i= 0;
    while ((c = getchar()) == ' ' || c == '\t')  /* 跳过空格和制表符 */
        ;
    if (islower(c)) {   /* 如果是小写字母,以函数名存入字符串s中 */
        s[i] = c;
        while (islower(s[++i] = c = getchar()))
            ;
        s[i] = '\0';
        if (c != EOF)
            ungetch(c);
        if (strlen(s) > 1)
            return FUNCTION;
        else
            return c;
    }

    if ( c != '.' && !isdigit(c) && c != '-')
        return c;

    if (c == '-') {     // 处理'-'号
        if (isdigit((c = getch())) || c == '.')
            s[++i] = c;
        else {
            if (c != EOF) {
                ungetch(c);
                return c;
            }
        }
    }


    if (isdigit(c)) {   /* 遇到数字,整数部分 */
        for (; isdigit(c); i++) {
            s[i] = c;
            c = getchar();
        }
    }
    if (c == '.') {     /* 遇到小数点,然后处理小数部分*/
        s[i++] = '.';
        if (isdigit((c = getchar())))
            for (; isdigit(c); i++) {
                s[i] = c;
                c = getchar();
            }
    }
    s[i] = '\0';
    if (c != EOF)
        ungetch(c);   /* 放到输入缓冲中 */
    return NUMBER;
}

char buf[BUFSIZ];    /* 输入缓冲区大小 */
int bufp = 0;        /* 输入缓冲区指针 */
int getch(void)          /* 获取输入       */
{
    return (bufp > 0) ? buf[--bufp] : getchar();
}

void ungetch(int c)  /* 将字符放到缓冲 */
{
    if (bufp < BUFSIZ)
        buf[bufp++] = c;
    else
        printf("ungetch: too many characters\n");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值