ANSI C - konwersja tablicy znakow na liczby

smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: smiechowiec »

czyli wszystko jest ok ?
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Ten twoj kod dziala mi dobrze :/ Masz moj programik. Troche dlugi i nie wiem czy sie polapiesz:

Kod: Zaznacz cały

#include <stdio.h>
#include <ctype.h>   //isspace, itd
#include <stdlib.h>  //atof
#define n  30

int coto(char *tab,int element);  
//1 - cyfra; 2- litera j; 10 -cos innego(blad); 0 - koniec tablicy

int main()
{
    char liczba[n];
    char Re[n],Im[n];
    int stan=1;    //1 - czesc Re; 2- czesc Im; 0- koniec  -1 - blad 
    int blad=-1;   //miejsce bledu w liczbie; -1 - brak
    int i=0,j=0;

    memset(liczba, 0, n);
    memset(Re,0,n);
    memset(Im, 0, n);

    
    printf("Liczba: ");
    scanf("%s",liczba);
        
    while(stan!=-1 && stan!=0)  //az koniec albo blad
    {
        printf("i: %d\tstan: %d\t liczba: %c\tcoto[i]: %d\n",i,stan,liczba[i],coto(liczba,i));
        switch (coto(liczba,i))  //co jest w polu tablicy
        {
            case 0: stan=0; break;  //0 - koniec tablicy
            case 1:                 //1 - liczba
                if(stan==1) Re[i]=liczba[i];  
                if(stan==2)
                { 
                    Im[j]=liczba[i];
                    j++;
                } 
                break;
            case 2:                 // j - poczatek Im
                if(stan==2)         // czy nie drugie j z rzedu
                {
                    blad=i;         //podwojne j - miejsce bledu
                    stan=-1;
                } else stan=2; 
                break;
            case 10: stan=-1; blad=i; break;   //cos innego - blad
            default: stan=-1; blad=i; break;   
        }getch();
        
        i++;
    }
        
    printf("Stan: %d", stan);
    printf("\nBlad: %d", blad);
    printf("\nRe: %s", Re);
    printf("\nIm: %s", Im);

    printf("\n%lf", atof(Re));

    printf("\n");
    getch();
    return 0; 
}

int coto(char *tab,int element)
{
    int zwrot;

    zwroc=10;
    
    if (isdigit(tab[element]) || tab[element]=='.') zwrot=1;
    if (tab[element]=='j') zwrot=2;
    if (isspace(tab[element])) zwrot=-1;
    if (tab[element]=='\0') zwrot=0;
    
    return zwrot;
}
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

W 23. linijce radze zmienic scanf("%s",liczba) na gets(liczba), bo scanf'em pobierasz wszystko az do bialego znaku(spacja, tabulator czy entera), wiec jak wpiszujesz dajmy na to '12.33 j456' to liczba = '12.33', zatem nie ma potrzeby sprawdzania w funkcji coto czy natrafiono na spacje, bo jej na pewno nie bedzie w 'liczba'. Czyli coto nigdy nie zwroci -1. A przy gets(liczba) jest zapisywana cala linijka.
No i w linii 69 zwroc na zwrot :P

A moglbys objasnic co program ma robic, co w nim nie dziala? ;] Narazie rozumiem, ze pobierane jest wejscie i w Re zbierane sa cyfry jakiejs liczby. Litera 'j' pelni funkcje czegos w rodzaju separatora miedzy Re a Im, a Im to costam - to troche za malo ;)
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Dzieki wielkie Ze tez nie pomyslalem o wyswietleniu liczby Rzeczywiscie scanf ucina sobie wszystko po spacji i dlatego nie moglem wygenerowac bledu gdy wpisalem spacje Teraz oczywiscie wszystko dziala jak nalezy. Co do tego programu - mam taki projekt do zrobienia. Jak sobie nie bede z czyms radzil - napisze tutaj znow. Narazie wszystko dziala dzieki tobie POZDRO i kolejny plus dla ciebie.

Btw. gets to standardowa biblioteka stdio.h??
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

Tak. Jak masz jakieś wątpliwości w jakim pliku znajduje się jakaś tam funkcja to zaglądaj - mi nie raz sie przydało
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Kolejne pytanko: Czy mozna (jesli tak to jak) zadeklarowac funkcje, ktora by zwracala kilka tablica char [30], albo lepiej float??

Np mam:

Kod: Zaznacz cały

char tab1[30]="2343 asd";
char tab2[30]="909 wer";
float t1,t2;

t1=atof(tab1);
t2=atof(tab2);

return t1,t2;
Czy jest to wogole mozliwe?? POZDRO
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: tmk »

A gdzie tam, o takich rzeczach w C mozna pomarzyć ;) Trzeba kombinować. Np deklarujesz globalna tablice na wyniki atof'ow i w srodku funckji zapisujesz je do tej tablicy, a po zakonczeniu ow funkcji mozna sie odwolywac do tych wynikow w calym programie.
Btw zamiast deklarowac dwie tablice tab1 i tab2 po 30 elementow mozna zrobic jedna dwuwymiarowa tablice - tab[2][30]. Ja bym to tak zrobil:

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#define N 2

float wyniki[N];
//przechowywane wyniki konwersji

void f(char tab[N][30]){

	float t[N] = {0, 0};

	strcpy(tab[0], "2343 asd");
	strcpy(tab[1], "909 wer");

	t[0] = atof(tab[0]);
	t[1] = atof(tab[1]);

wyniki[0] = t[0];
wyniki[1] = t[1];
}

int main(){

	char tablice[N][30];//zamiast char tab1[30], tab2[30];
	f(tablice);
	printf("%f\n%f", wyniki[0], wyniki[1]);
return 0;
}
Nie wiem czy o to chodziło, jak coś to pytaj.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

Hehe Tak to ja wiem, ze mozna, ale gosciu nie lubi u nas zmiennych globalnych :/ Masz plusa, bo widac, ze sie znasz na rzeczy Ja to zrobilem struktura, chociaz to tez jakby jest zmienna globalna POZDRO
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: smiechowiec »

Nie ma potrzeby deklarowania zmienne globalnej, to może być zmienna lokalna.

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#define N 2


void f(char tab[N][30], float *wyniki){

    float t[N] = {0, 0};

    strcpy(tab[0], "2343 asd");
    strcpy(tab[1], "909 wer");

    t[0] = atof(tab[0]);
    t[1] = atof(tab[1]);

wyniki[0] = t[0];
wyniki[1] = t[1];
}

int main(){
  float wyniki[N];
  //przechowywane wyniki konwersji

    char tablice[N][30];//zamiast char tab1[30], tab2[30];
    f(tablice, wyniki);
    printf("%f
%f", wyniki[0], wyniki[1]);
return 0;
}
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

To juz chyba ostatnie pytanie: Jak oczyscic bufor klawiatury?? Potrzebne mi to, gdyz zle dziala mi ten kod:

Kod: Zaznacz cały

#include <stdio.h>

int main()
{
    int x,y=0,ile;
    char liczba[30];

    memset(liczba, 0, 30);
    
    printf("Podaj ile liczb chcesz wczytac: ");
    scanf("%d", &ile);
    
   for(x=0;x<ile;x++)
    {
        printf("
Podaj liczbe: ");
        gets(liczba);
        printf("%s
",liczba);
        y+=x;
}

    printf("%d",y);
    getch();
    return 0; 
}
POZDRO
Awatar użytkownika
Szemek
Użytkownik
Użytkownik
Posty: 4819
Rejestracja: 10 paź 2006, o 23:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 43 razy
Pomógł: 1407 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: Szemek »

fflush ( stdin );
... flush.html

tego nigdy nie używałem, ale sprawdź, czy o to chodzi
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: soku11 »

O teraz spoko dziala Najwidoczniej scanf i gets sie jakos gryza, ale ta funkcja pelnie swoja role:P POZDRO
MGT
Użytkownik
Użytkownik
Posty: 107
Rejestracja: 7 lis 2006, o 12:03
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Pomógł: 20 razy

ANSI C - konwersja tablicy znakow na liczby

Post autor: MGT »

polecam fgets zamist gets

co do "konfliktu" między scanfem a getsem, to w buforze prawdopodobnie może być jeszcze poprzednia linia, może pomoże:
scanf("%d
",&ile);
ODPOWIEDZ