zablokowanie wpisywania liter w textbox'ie

0

siemacie. mam taki problem, otóż mam program kalkulator i muszę zablokować w nim wejścia, tj. chciałbym, aby wyświetlało mi komunikat błędu, kiedy user wpiszę jakąś literę. Próbuję i próbuję i nie działa. Macie pomysł na jakąś funkcję, którą tam mógłbym zaimplementować?

#include <stdio.h>
#include "StdAfx.h"

float add(float,float);
float subtract(float,float);
float product(float,float);
float divide(float,float);

void main()
{
    float n1,n2;
    char sym,choice;
    printf("Write your equation, eg. 2+2 or 2/2 \nYou can add, divide, subtract and multiply.\n\n ");
    	
int zmienna;
while(scanf("%f%c%f",&n1,&sym,&n2) != 1) //dopóki nie uda się wczytać
{
 printf("not this time");
  fflush(stdin);
}

scanf("%f%c%f",&n1,&sym,&n2);
    if(sym=='+')
        printf("\n%f",add(n1,n2));
    if(sym=='-')
        printf("\n%f",subtract(n1,n2));
    if(sym=='*')
        printf("\n%f",product(n1,n2));
    if(sym=='/')
        printf("%f",divide(n1,n2));
    printf("\nDo you wish to continue[y/n]");
    scanf("%s",&choice);
    if(choice=='y'||choice=='Y')
        main();
}


float add(float m1,float m2)
{
    return(m1+m2);
}

float subtract(float m1,float m2)
{
    return(m1-m2);
}

float product(float m1,float m2)
{
    return(m1*m2);
}

float divide(float m1,float m2)
{
    return(m1/m2);
} 
0

możesz zrobić tak:

  • wczytujesz cały tekst (za pomocą np. getline)
  • liczysz znaki aż do momentu znalezienia dowolnego operatora.
  • pierwsza liczba = ftoa(tekst[0] .. tekst[ilość znaków przed operatorem])
  • zapisujesz operator
  • liczysz znaki od operatora do końca
  • druga liczba analogicznie jak pierwsza

Jeśli gdziekolwiek pojawi się znak inny niż 1..9+-*/ albo np. będzie więcej operatorów niż 1, wiesz że dane wejściowe są złe.

0
Tezcatlipoca napisał(a)

możesz zrobić tak:

  • wczytujesz cały tekst (za pomocą np. getline)
  • liczysz znaki aż do momentu znalezienia dowolnego operatora.
  • pierwsza liczba = ftoa(tekst[0] .. tekst[ilość znaków przed operatorem])
  • zapisujesz operator
  • liczysz znaki od operatora do końca
  • druga liczba analogicznie jak pierwsza

Jeśli gdziekolwiek pojawi się znak inny niż 1..9+-*/ albo np. będzie więcej operatorów niż 1, wiesz że dane wejściowe są złe.

pomysł dobry, lecz muszę to napisać w czystym C. :/

0

ogółem wpadłem na pomysł, żeby to zrobić jakimiś pętlami, a w pętlach po kolei sprawdzać czy pierwsza liczba wyrażenia isdigit(), później znak, a później drugą liczbę, ale nie wychodzi mi to. ktoś mi pomoże?

0

nie bardzo rozumiem wiekszosc komend. a getline jest komendą w c++

  1. przecież trudno czegoś nie rozumieć w getline.
  2. jest, tylko się inaczej nazywa. Możesz użyć do tego gets ale jest niebezpieczne, najlepiej użyć fgets (jako plik przekazać stdin).

ogółem wpadłem na pomysł, żeby to zrobić jakimiś pętlami, a w pętlach po kolei sprawdzać czy pierwsza liczba wyrażenia isdigit(), później znak, a później drugą liczbę, ale nie wychodzi mi to. ktoś mi pomoże?

To pokaż co masz na razie...

0

getline jest komendą w c++
są trzy różne getline()-y:
jeden jest funkcją globalną w C++,
drugi metodą klasy istream w C++,
trzeci funkcją globalną C/C++, zdefiniowaną w standardzie POSIX (zwykle niedostępna pod Windowsem, ale można skopiować jej kod źródłowy np. z Linuksa)

0

W C odpowiednikiem getline jest fgets

int ReadEquation(FILE *file, float *n1, char * sym, float *n2)
{
    char line[80];
    return
            fgets(line, sizeof(line), file) != NULL && // wczytujemy linię
            sscanf(line, "%f%c%f",n1,sym,n2) == 3 && // zamieniamy linię na liczby i znak działania
            strchr("+-*/", sym) != NULL; // sprawdzamy, czy znak działania jest poprawny
}

for (;;) {
    if (!ReadEquation(stdin, &n1, &sym, &n2)) {
        if (feof(stdin) || ferror(stdin)) break; // błąd lub koniec danych
        puts("not this time"); // wprowadzono niepoprawne działanie
    } else {
        // OK
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1