C程序设计(第二版 新版)第四章 习题

来源:互联网 发布:网络词强撩是什么意思 编辑:程序博客网 时间:2024/06/06 03:07
1.strindex(s, t) 返回字符串t在字符串s中首次出现的位置,没有返回-1
   strrindex1(s, t) 和 strindex2(s, t)返回字符串t在字符串s中最右边的位置,没有返回-1  (4-1 以及 书本例子)
#include<stdio.h>#include<string.h>#define MAXLINE 100int getline(char line[], int max);int strindex(char source[], char searchfor[]);int strrindex1(char source[], char searchfor[]);int strrindex2(char source[], char searchfor[]);char searchfor[] = "yi";int main(){    char line[MAXLINE];    int found = 0;        while(getline(line, MAXLINE) > 0)    {        printf("strindex = %d\n",strindex(line,searchfor));        printf("strrindex1 = %d\n",strrindex1(line,searchfor));        printf("strrindex2 = %d\n",strrindex2(line,searchfor));    }    }int getline(char line[], int lim){    int c, i;        i = 0;    while( --lim > 0 && (c = getchar()) != EOF && c != '\n')    {           line[i++] = c;    }    if( c == '\n')        line[i++] = c;    line[i] = '\0';    return i;}int strindex(char source[], char searchfor[]){    int i, j, k;        for(i = 0; source[i] != '\0'; i++)    {          for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; j++,k++)                ;          if( k > 0 && searchfor[k] == '\0')              return i;    }    return -1;}int strrindex1(char source[], char searchfor[]){    int i, j, k, pos = -1;        for(i = 0; source[i] != '\0'; ++i)    {          for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; ++j,++k)                ;          if( k > 0 && searchfor[k] == '\0')              pos = i;    }    return pos;}int strrindex2(char source[], char searchfor[]){    int i, j, k;        for(i = strlen(source) - strlen(searchfor); i >= 0; --i)    {          for(j = i, k = 0; searchfor[k] != '\0' && source[j] == searchfor[k]; ++j,++k)                ;          if( k > 0 && searchfor[k] == '\0')              return i;    }    return -1;}


2. atof(s) 把字符串s转化成浮点数作为返回值(该函数可以处理一般的单精度和带e的浮点数如“12.34”,“-12.34e-2”)

#include<stdio.h>#include<ctype.h>double atof(char s[]){       int  i, sign,  exp;       float  val,  power;              i = 0;       while(isspace(s[i]))           i++;       sign = (s[i] == '-' ? -1 : 1);       if(s[i] == '-' || s[i] == '+')           i++;       val = 0;       while(isdigit(s[i]))       {            val = val * 10 + (s[i] - '0');            i++;       }       if(s[i] == '.')            i++;       power = 1.0;       while(isdigit(s[i]))       {            val = val * 10.0 + (s[i] - '0');            i++;            power *= 10.0;       }       val = sign * val / power;       if(s[i] == 'e' || s[i] == 'E')            i++;       sign = (s[i] == '-' ? -1 : 1);       if(s[i] == '-' || s[i] == '+')            i++;       exp = 0;       while(isdigit(s[i]))       {            exp = exp * 10 + (s[i] - '0');            i++;       }        if( sign == 1)       {            while( exp-- > 0 )                val = val * 10.0;       }               else       {            while( exp-- > 0)                val = val / 10.0;       }       return val;} int main(){    char s[100]="  -12.34e-2";    scanf("%s%*c",s);    printf("result = %f\n",atof(s));    getchar();    return 1;}


3. 输入逆波兰式的字符串,求出它的的值(ex > 1 2 - 4 5 + *)(课本p63例题)

#include<stdio.h>#include<stdlib.h>#define MAXOP   100#define NUMBER  '0'void push(double s);double pop();int getop(char s[]);int main(){    int type;    double op2;    char s[MAXOP];        while((type = getop(s))!= EOF)    {        switch(type)        {            case NUMBER:                push(atof(s));                break;            case '+':                push(pop() + pop());                break;            case '*':                push(pop() * pop());                break;            case '-':                op2 = pop();                push(pop() - op2);                break;            case '/':                op2 = pop();                if(op2 == 0.0)                    printf("error: zero divisor\n");                else                    push(pop() / op2);                break;            case '\n':                printf("%8.8f\n", pop());                break;            default:                printf("error: unknown command! \n");                break;        }    }    getchar();    return 1;} #define MAXVAL 100int sp = 0;double val[MAXVAL];void push(double s){    if(sp >= MAXVAL)        printf("error: stack is full\n");    else        val[sp++] = s;}double pop(){    if(sp <= 0)    {        printf("error: stack is empty\n");        return 0;    }    else        return val[--sp];}#include<ctype.h>int  getch();void ungetch(int c);int  getop(char s[]){    int i,  c;        while( (c= s[0]= getch()) == ' ' || c == '\t')        ;    s[1] = '\0';    if(!isdigit(s[0]) && c != '.')        return c;    i = 0;    if(isdigit(c))        while(isdigit(c = s[++i] = getch()))            ;    if(c == '.')        while(isdigit(c = s[++i] = getch()))                ;    s[i] = '\0';    if( c != EOF)        ungetch(c);     return NUMBER;}#define BUFSIZE 100int buf[BUFSIZE];int bufp = 0;int getch(){    return (bufp > 0)? buf[--bufp]: getchar();}void ungetch(int c){    if( bufp >= BUFSIZE)        printf("error: bufstack is full!\n");    else        buf[bufp++] = c;}


4.在课本的基础上加入取模预算,以及考虑负数的情况。

//其中main函数和getop函数的改变:int main(){    int type;    double op2;    char s[MAXOP];        while((type = getop(s))!= EOF)    {        switch(type)        {            case NUMBER:                push(atof(s));                break;            case '+':                push(pop() + pop());                break;            case '*':                push(pop() * pop());                break;            case '-':                op2 = pop();                push(pop() - op2);                break;            case '/':                op2 = pop();                if(op2 == 0.0)                    printf("error: zero divisor\n");                else                    push(pop() / op2);                break;            case '%':                op2 = pop();                if(op2 == 0.0)                    printf("error: zero divisor\n");                else                    push(fmod(pop(),op2));                break;                           case '\n':                printf("%8.8f\n", pop());                break;            default:                printf("error: unknown command! \n");                break;        }    }    getchar();    return 1;}int getop(char s[]){    int i,  c;        while( (c= s[0]= getch()) == ' ' || c == '\t')        ;    s[1] = '\0';    if(!isdigit(s[0]) && c != '.' && c != '-')        return c;    i = 0;    if( c == '-')    {        if(isdigit(c = getch()) || c == '.')            s[++i] = c;        else        {            if( c != EOF)                ungetch(c);            return '-';        }    }    if(isdigit(c))        while(isdigit(c = s[++i] = getch()))            ;    if(c == '.')        while(isdigit(c = s[++i] = getch()))                ;    s[i] = '\0';    if( c != EOF)        ungetch(c);    return NUMBER;}


5. 增加一些变量,以及结果保存在v中(4-6  可在表达式过程中添加 2 A =  这些赋值语句以及保存上一个表达式的值在v中 如:  v 1 +)只需要改动main

int main(){    int type,  i,  var = 0;    double op2,  v;    char s[MAXOP];    double variable[26];        for( i = 0; i < 26; i++)        variable[i] = 0.0;    while((type = getop(s))!= EOF)    {        switch(type)        {            case NUMBER:                push(atof(s));                break;            case '+':                push(pop() + pop());                break;            case '*':                push(pop() * pop());                break;            case '-':                op2 = pop();                push(pop() - op2);                break;            case '/':                op2 = pop();                if(op2 == 0.0)                    printf("error: zero divisor\n");                else                    push(pop() / op2);                break;            case '%':                op2 = pop();                if(op2 == 0.0)                    printf("error: zero divisor\n");                else                    push(fmod(pop(),op2));                break;                           case '\n':                v = pop();                printf("%8.8f\n", v);                break;            case '=':                pop();                if( var >= 'A' && var <= 'Z')                    variable[var - 'A'] = pop();                else                    printf("error: no variable name! \n");                break;            default:                if(type >= 'A' && type <= 'Z')                    push(variable[type - 'A']);                else if (type == 'v')                    push(v);                else                    printf("error: unknown command! \n");                break;        }        var = type;    }    getchar();    return 1;}


6. 用getline(line,limit)输入一行输入来代替getch()  和 ungetch() 函数

#include<stdio.h>#include<stdlib.h>#define MAXOP 100#define NUMBER '0'int getop(char s[]);void push(double f);double pop();int main(){    int type;    double op2;    char s[MAXOP];        while( (type = getop(s)) != EOF)    {        switch(type)        {            case NUMBER:                push(atof(s));                break;            case '+':                push(pop() + pop());                break;            case '*':                push(pop() * pop());                break;            case '-':                op2 = pop();                push(pop() - op2);                break;            case '/':                op2 = pop();                if( op2 != 0.0)                    push(pop() / op2);                else                    printf("error: zero divisor\n");                break;            case '\n':                printf("\t%.8g\n",pop());                break;            default:                printf("error: unknown command %s \n",s);                break;        }    }    return 0;}#define MAXVAL 100int sp = 0;double val[MAXVAL];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\n");        return 0;    }}#include<ctype.h>#define MAXLINE 100int getline(char s[],int limit);char line[MAXLINE];int li = 0;int getop(char s[]){    int i, c;        if(line[li] == '\0')    {        if( getline(line,MAXLINE) == 0)            return EOF;        else            li = 0;    }    while((s[0] = c = line[li++]) == ' ' || c == '\t')        ;    s[1] = '\0';    if(!isdigit(s[0]) && c != '.')        return c;    i = 0;    if(isdigit(c))    {        while(isdigit(s[++i] = c = line[li++]))            ;        if(c == '.')            while(isdigit(s[++i] = c = line[li++]))                ;        s[i] = '\0';        li --;        return NUMBER;    }    }int getline(char line[], int limit){    int c;    int i = 0;        while( --limit > 0 && (c = getchar()) != EOF && c != '\n')        line[i++] = c;    if( c == '\n')        line[i++] = '\n';    line[i] = '\0';    return i;}


 

原创粉丝点击