• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ONP przerobienie programu

Object Storage Arubacloud
0 głosów
129 wizyt
pytanie zadane 16 marca 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

Cześć

Mam problem, jak można przerobić ten program żeby można było wprowadzać liczby więcej niż jednocyfrowe ?


//#include <locale>

#include<stdlib.h>
#include"curses.h"
#include<locale.h>
struct stack_node
{
    int data;
    struct stack_node *next;
};

int main(void)
{
    if(setlocale(LC_ALL,"")==NULL)
    {
        fprintf(stderr,"B³¹d inicjacji ustawieñ jêzykowych!\n");
        return -1;
    }
    if(!initscr())
    {
        fprintf(stderr,"B³¹d inicjacji biblioteki curses!\n");
        return -1;
    }
    printw("WprowadŸ wyra¿enie w Odwrotnej Notacji Polskiej\n");
    (void)refresh();
    printw("\nWynik dzia³ania to: %d.\n",calculate_rpn_expression());
    (void)refresh();
    getch();
    if(endwin()==ERR)
    {
        fprintf(stderr,"B³¹d funkcji endwin()!\n");
        return -1;
    }
    return 0;
}



struct stack_node *push(struct stack_node *top, int number)
{
    struct stack_node *new_node = (struct stack_node *)
                                  malloc(sizeof(struct stack_node));
    if(new_node!=NULL)
    {
        new_node->data = number;
        new_node->next = top;
        top = new_node;
    }
    return top;
}

int pop(struct stack_node **top)
{
    int result = -1;
    if(*top)
    {
        result = (*top)->data;
        struct stack_node *tmp = (*top)->next;
        free(*top);
        *top = tmp;
    }
    return result;
}

int calculate_rpn_expression(void)
{
    int input = 0;
    struct stack_node *top = NULL;
    do
    {
        input = getch();
        int first_argument=0, second_argument=0, result=0;
        switch(input)
        {
        case '+':
            result = pop(&top) + pop(&top);
            top = push(top,result);
            break;
        case '-':
            first_argument = pop(&top);
            second_argument = pop(&top);
            top = push(top,second_argument - first_argument);
            break;
        case '*':
            result = pop(&top)*pop(&top);
            top = push(top,result);
            break;
        default:
            if(input>='0'&&input<='9')
                top=push(top,input-'0');
        }
    }
    while(input!='=');
    return pop(&top);
}

 

1 odpowiedź

+1 głos
odpowiedź 17 marca 2018 przez j23 Mędrzec (194,920 p.)
wybrane 18 marca 2018 przez kikosiak
 
Najlepsza

Zamiast czytać po znaku ze strumienia, czytaj całą linie (gets), a do konwersji text -> bin użyj funkcji strtol.

komentarz 17 marca 2018 przez kikosiak Obywatel (1,010 p.)

Dzięki za odpowiedź. Wydaje mi się, że ten program powinien działać jednak daje jakieś dziwne wyniki. Czy chodzi o błędne przekazanie parametru top? Czy o coś całkowicie innego?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 20
struct stack_node
{
    char data;
    struct stack_node *next;
};

char string[MAX];
int wynik;
int main()
{
    struct stack_node *top=NULL;

    fgets(string,MAX,stdin);
   // printf("%s",&string);
    wynik=calculate(top,string);
    printf("%d",wynik);

    return 0;
}

struct stack_node *push(struct stack_node *top, char znak)
{
    struct stack_node *new_node = (struct stack_node *)malloc(sizeof(struct stack_node));
    if(new_node!=NULL)
    {
        new_node->data = znak;
        new_node->next = top;
        top = new_node;
    }
    return top;
}

int pop(struct stack_node **top)
{
    int result = -1;
    if(*top)
    {
        result = (*top)->data;
        struct stack_node *tmp = (*top)->next;
        free(*top);
        *top = tmp;
    }
    return result;
}

int calculate(struct stack_node *top,char *string)
{
    int a,b=0,results=0;
    char *e,*w=" \t\n\r\f";

    for (string = strtok(string, w); string; string=strtok(0, w))
    {

        a=strtol(string,&e,10);
       // printf("%d,%d",*e,a);
        if(e>string)
        {
            printf(" :"),
            push(top,a);
            //printf("top=%d",top);

        }
        else if (*string == '+')
        {
            a=pop(&top);
            //printf("a=%d",a);
            b=pop(&top);
            //printf("b=%d",b);
            results=a+b;

        }
        else if (*string == '-')
         {
            a=pop(&top);
            b=pop(&top);
            results=b-a;
         }
        else if (*string == '*')
        {
            a=pop(&top);
            b=pop(&top);
            results=a*b;
        }

    }
    printf("%d",b);

    return results;
}

komentarz 17 marca 2018 przez j23 Mędrzec (194,920 p.)
edycja 17 marca 2018 przez j23

push tak powinien wyglądać:

void push(struct stack_node **top, int val)
{
	struct stack_node *new_node = (struct stack_node *)malloc(sizeof(struct stack_node));
	if(new_node != NULL)
	{
		new_node->data = val;
		new_node->next = *top;
		*top = new_node;
	}
}

stack_node::data powinien być typu int, a nie char.

 

Po każdej operacji wynik (result) powinieneś odłożyć na stos.

komentarz 18 marca 2018 przez kikosiak Obywatel (1,010 p.)
Wszystko działa, bardzo dziękuję.

Podobne pytania

0 głosów
0 odpowiedzi 380 wizyt
0 głosów
1 odpowiedź 469 wizyt
pytanie zadane 2 kwietnia 2020 w C i C++ przez SensejChmiel Nowicjusz (180 p.)
+1 głos
1 odpowiedź 482 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...