The C programing language 제4 장, 방과 후 문제
/*The C programing language , */
#include <stdio.h>
//#include "chap2.c"
#include <ctype.h>
//#include "chap1.c"
#include <string.h>
#include "chap4_calculator.c" //for 4-3 to 4-10
#define abs(x) ((x > 0) ? (x) : -(x))
extern void calculator();
/* 4-1 strindex function which return the position of the righmost occurrence of t in s , or -1 if there in none. */
int strindex(char s[], char t[])
{
int i, j, k;
int position = -1;
for(i = 0; s[i] != '\0'; i++)
{
for(j=i,k=0; s[j]!='\0' && t[k]!='\0' && t[k]==s[j];k++,j++);
if(k>0 && t[k]=='\0')
position = i;
}
return position;
}
/* , , */
int _strindex(char s[], char t[])
{
int i, j, k;
for(i = strlen(s)-strlen(t); i>=0; i--)
{
for(j=i,k=0; s[j]!='\0' && t[k]!='\0' && t[k]==s[j];k++,j++);
if(k>0 && t[k]=='\0')
return i;
}
return -1;
}
void evaluated_strindex()
{
char s[] = "afscbajcbai";
char t[] = "cba";
printf("rightmost positon : %d
",strindex(s, t));
printf("rightmost positon : %d
",_strindex(s, t));
}
/* Exercise 4-2 convert string s to double test : char s[] = "10.12e10"; printf("%g
", _atof(s)); */
double _atof(char s[])
{
double val, power;
int i, sign, exp;
for(i = 0; isspace(s[i]); i++)
;
sign = (s[i] == '-') ? -1: 1;
if(s[i] == '-' || s[i] == '+')
i++;
for(val = 0.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i]-'0');
if(s[i] == '.')
i++;
for(power = 1.0; isdigit(s[i]); i++)
{
val = 10.0 * val + (s[i] - '0'); //
power *= 10.0; // ,
}
val = sign * val / power; // ,
if(s[i] == 'e' || s[i] == 'E')
{
sign = (s[++i] == '-') ? -1 : 1;
if(s[i] == '-' || s[i] == '+')
i++;
for(exp = 0; isdigit(s[i]); i++) // e atoi
exp = 10 * exp + (s[i] - '0');
if(sign == -1) //
while(exp-- > 0)
val /=10;
else //
while(exp-- > 0)
val *= 10;
}
return val;
}
/* from 4-3 to 4-10 */
void calculator_()
{
calculator();
}
/* 4-12 atoi : convert n to characters in s by calling a recursive routine */
void itoa(int n, char s[]) {
static int i = 0;
if (n/10)
itoa(n/10, s);
else {
if (n < 0)
s[i++] = '-';
}
// recursive
s[i++] = abs(n%10) + '0';
s[i] = '\0';
}
/*4-13 reverse : reverses string s in place */
void reverse(char s[])
{
void reverse_r(char [], int index, int len);
reverse_r(s, 0, strlen(s));
}
/* reverse : reverses string s in place ;recrusive */
void reverse_r(char s[], int index, int len)
{
int temp, j;
j = len - (index + 1);/*why +1 */
if (index < j) {
temp = s[index];
s[index] = s[j];
s[j] = temp;
reverse_r(s, ++index, len);
}
}//the why is :the len is begin 1 ,but the index is begin from 0
/* 4-14 interchages two arguments of type t */
#define swap(t, x, y) { t temp;\
temp = x; \
x = y; \
y = temp; \
}
main()
{
calculator_();
}
chap4_calculator.c //handle calculator
/*e calculator control of main while(getop(s)) if(number ) push it else if(operator) pop operands do operation push result else if(newline) pop and print top of stack else error we seperator the funcion from sames source files includes : stack.c getop.c */
#include <stdio.h>
#include "stack.c" // has push() and pop() funtions
#include "getop.c" //has getop() function
#include <stdlib.h> // has atof()
//#include "chap4.c" // has _atof() declare and defition by myself
#include <string.h>//for strcmp()
#include <math.h> // for sin() exp() pow()
#define NUMBER '0'
#define MATHFUN 'n'
extern void push(double); /* store the digit into the top of stack*/
extern double pop(void); /* return with the top of stack into */
extern void clear(void);/* clear the stack */
extern int getop(char []);/* return with an operator or operand */
extern double mathfun(char []); /* access the math function through the function's name*/
//extern void ungets(char []) /* push back an entire string onto the input*/
void calculator()
{
int type, i, var = 0;
double op2, v;
char strop[100];
double variables[26];
for (i = 0; i < 26; i++)
variables[i] = 0.0;
while ((type = getop_line(strop)) !=EOF) {
switch (type) {
case NUMBER://handle didit
// printf("debug strop : %s
",strop);
push(atof(strop));
break;
case MATHFUN: //handle the math function
mathfun(strop);
break;
case '+':
push(pop() + pop());
break;
case '*':
push(pop() * pop());
break;
case '-':
printf("debug - :
");
op2 = pop();
push(pop() - op2);
break;
case '/':
op2 = pop();
if (op2 > 0.0)
push(pop() / op2);
else
printf("errot : zero divisor
");
break;
case '%':
op2 = pop();
if (op2 > 0.0)
push((int)pop() % (int)op2);
else
printf("errot : zero divisor
");
break;
case 'd': /* operator stack : duplicate the top element*/
op2 = pop();
push(op2);
printf("ths number top of stack is : %.5g
", op2);
break;
case 's': /* operator stack : swap the top two elements */
op2 = pop();
double temp = pop();
push(op2);
push(temp);
printf("swap successful
");
break;
case 'c': /* operator stack : clear the stack */
clear();
printf("clear the stack successful
");
break;
case '=':
if (var >= 'A' && var <= 'Z') {
pop(); //pop the value of A
variables[var-'A'] = pop(); //store the value of A into array variables
}
case '
':
v = pop();
printf("the result is : %g
", v);
break;
default :
if (type >= 'A' && type <= 'Z')
push(variables[type - 'A']);
else if (type == 'v')
push(v);
else
printf("error input ,unknown command %s
",strop);
}
var = type;
}
}
double mathfun(char s[])
{
double temp;
if (strcmp(s, "sin") == 0)
push(sin(pop()));
else if (strcmp(s, "exp") == 0)
push(exp(pop()));
else if (strcmp(s, "pow") == 0) {
temp = pop();
push(pow(pop(), temp));
}
else {
printf("mathfun errot : input %s , I can't understading
", s);
}
}
getop.c
/* getop.c for getop() : store the characters of input into string opstr and return the type of opstr */
#pragma once
#include <string.h> //for strlen()
#include <ctype.h> //for isdigit()
#include "getch.c"// for getch() ungetch() getline()
#define MAXSIZE 100;
#include <stdio.h>
extern int getch(void);
extern void ungetch(int);
extern int _getline(char [], int limit);
int getop(char opstr[])
{
int cr, next;
int i = 0;
while ((cr = getch()) == ' ' || cr == '\t');
/* handle the mathfun */
if (islower(cr))
{
opstr[i++] = cr;
while (islower(opstr[i++] = cr = getch()));
opstr[i-1] = '\0';
printf("handle the mathfun : %s, lentgh=%d
", opstr, (int)strlen(opstr));
if (cr != EOF)
ungetch(cr);
if (strlen(opstr) > 1)
return 'n';
else
return cr;
}
if (isdigit(cr)==0 && cr != '.' && cr != '-')//add provision the negative numners
{
opstr[i] = '\0';
return cr;
}
if (cr == '-')
{
if (isdigit(cr = getch()) || cr == '.')//add provision the negative numners
{
opstr[i++] = '-';
opstr[i++] = cr;
cr = getch();
}
else
{
if (cr != EOF)
ungetch(cr);
opstr[i] = '\0';
return '-';
}
}
while(isdigit(cr))
{
opstr[i++] = cr;
if (cr != EOF)
cr = getch();
}; // collect integer part
if (cr == '.') {
opstr[i] = '.';
while(isdigit(opstr[++i] = cr = getch()))
;
}
opstr[i] = '\0';
// printf("debug return ungetch : %c
", cr);
if (cr != EOF)
ungetch(cr);
printf("collect the digit : %s, lentgh=%d
", opstr, (int)strlen(opstr));
return '0';
}
/* _getline() exchange getch() */
int li = 0; //li of line
char line[100];
int getop_line(char opstr[])
{
int cr, next;
int i = 0;
if (line[li] == '\0') {
if (!_getline(line, 100)) {
//printf("line : %s, %c, li=%d
", line, line[li-1], li-1);
opstr[i] = '\0';
return EOF;
}
//printf("line : %s, %c, li=%d
", line, line[li], li);
li = 0;
}
while ((cr = line[li++]) == ' ' || cr == '\t')
;
/* handle the mathfun */
if (islower(cr))
{
opstr[i++] = cr;
while (islower(opstr[i++] = cr = line[li++]));
opstr[i-1] = '\0';
printf("handle the mathfun : %s, lentgh=%d
", opstr, (int)strlen(opstr));
if (cr != EOF)
li--;
if (strlen(opstr) > 1)
return 'n';
else
return cr;
}
if (isdigit(cr)==0 && cr != '.' && cr != '-')//add provision the negative numners
{
opstr[i] = '\0';
return cr;
}
if (cr == '-')
{
if (isdigit(cr = line[li++]) || cr == '.')//add provision the negative numners
{
opstr[i++] = '-';
opstr[i++] = cr;
cr = line[li++];
}
else
{
if (cr != EOF)
li--;
opstr[i] = '\0';
return '-';
}
}
while(isdigit(cr))
{
opstr[i++] = cr;
if (cr != EOF)
cr = line[li++];
}; // collect integer part
if (cr == '.') {
opstr[i] = '.';
while(isdigit(opstr[++i] = cr = line[li++]))
;
}
opstr[i] = '\0';
// printf("debug return ungetch : %c
", cr);
if (cr != EOF)
li--;
printf("collect the digit : %s, lentgh=%d
", opstr, (int)strlen(opstr));
return '0';
}
getch.c
#define BUFFSIZE 100
#pragma once
#include <stdio.h>
#include <string.h>
char buf[BUFFSIZE]; // buffer for ungetch
int bufp = 0;// next free position in buf
int getch(void)
{
return (bufp > 0)? buf[--bufp]: getchar();
}
void ungetch(int c)
{
if(bufp < BUFFSIZE)
buf[bufp++] = c;
else
printf("ungetch : too many characters
");
}
void ungets(char s[])
{
int i = 0;
for (i = strlen(s) - 1; i >= 0; i--) {
buf[bufp++] = s[i];
}
}
/* line line , lim */
int _getline(char line[],int lim)
{
int c,i;
for(i=0;i<lim-1 && (c=getchar())!=EOF && c!='
';i++)
line[i] = c;
if(c == '
')
{
line[i] = c;
i++;
}
line[i] = '\0';
return i;
}
stack.c
#define NUMBER '0'
#define MAXVAL 100
double val[MAXVAL]; //value stack
int sp=0; //next the free position
void push(double f)
{
if (sp < MAXVAL)
val[sp++] = f;
//printf("stack : %g,
", val[sp-1]);
}
double pop(void)
{
if (sp > 0)
return val[--sp];
else
printf("pop : the stack is empty
");
return 0.0;
}
void clear(void)
{
sp =0;
}
getch_4-8.c
/* 4-8 */
#include <stdio.h>
char buf = '\0';
int getch() /*return a char */
{
int c;
if (buf != '0') {
c = buf;
buf = '\0';
}
else
c = getchar();
return c;
}
void ungetch(int cr)
{
if (buf != '\0')
printf("ungetch : too many characters
");
else
buf = cr;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.