Forum > Tematy dowolne > Pomoc w małym zadaniu (język C)

Strona 1 z 1 1
skocz

Ignacek 9

Wysłane 2013-11-15 16:44

Witam.
Mam zadany projekt z programowania w języku C.
Wszystko już jest zrobione oprócz jednego małego niuansu - otóż muszę sprawdzić, czy podane przez użytkownika dane są liczbami. Potrzebuję liczb całkowitych dodatnich czyli naturalnych.
Otrzymałem podpowiedź, aby wpisać podany przez użytkownika ciąg znaków do tablicy, a później sprawdzić, czy dany ciąg to liczba. Może nie byłoby to takie trudne (myślałem o użyciu komendy 'atoi', gdyby nie fakt, że prowadzący poprosił, aby liczba w notacji inżynierskiej (z użyciem liczby e) też była konwertowana poprawnie.
Chciałbym prosić, w miarę możliwości, o podpowiedź w rozwiązaniu mojego problemu.
Pozdrawiam

krymtON

Wysłane 2013-11-15 18:24

@Ignacek 9 - może TO pomoże :)

Graty jak każde inne ;)

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2013-11-15 19:25 , Edytowane 2013-11-15 19:26

@Ignacek 9
Czyli twoje liczny mogą być w postaci:
C
lub CeC
gdzie C - dowolna liczba cyfr

Zrób tak jak ci podpowiada prowadzący. Wrzuć do tablicy i po kolei sprawdzaj czy "chary" są cyframi lub literą e (max jedną). Jeśli nie są cyfrą lub napotkasz kolejną literę e wychodzisz z pętli z wynikiem "nie jest to cyfra". Wydaje się banalnie proste.

Coś w tym stylu.


function IsNumber(char* tab)
{
int eCount = 0;
for(i = 0; i < tab.length; i++)
{
char c = tab[i];
if(c >= '0' && c <= '9')
{
continue;
}
else if(c == 'e')
{
eCount++;
if(eCount > 1) return false;
}
else
{
return false;
}
}
return true;
}

endriu_l

Wysłane 2013-11-15 21:38 , Edytowane 2013-11-15 22:06

@kowgli

Widzę jeszcze kilka przypadków
- pierwsza część zmiennoprzecinkowa, druga, większa niż ułamek, np.: 1,23e2 = 123
- exponenta < 0, cyfra ma odpowiednią ilośćzer żeby było OK, np: 100e-2 = 1
itp. generalnie sporo if-ów

Proponuję coś takiego (nie kompilowane, trochę z pamięci) :


#include <stdio.h> //scanf
#include <stdlib.h> //EXIT_SUCCESS
#include <math.h> //floorf


int isInt(float f) {
return (floorf(f) == f);
}

int main(void) {
float val = 0.0;

scanf("%f", &val);
printf("val == %.8fn", val);
printf("is int: %d (1 TAK, 0 NIE)n", isInt(val));
return EXIT_SUCCESS;
}


Man do floorf: [LINK]

Jakieś IDE online które to skompilowało i uruchomiło: [LINK]

Generalnie, wczytujesz liczę jako float, scanf łyka notację naukową automagicznie, potem sprawdzasz, czy część całkowita z liczby jej równa jej samej, jeżeli tak, to jest to int.

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2013-11-15 23:58 , Edytowane 2013-11-16 00:02

@endriu_l
W założeniach było o liczbach całkowitych dodatnich. Czyli nie ma potrzeby kombinowania z ułamkami. Wtedy doszedł by jeszcze separator dziesiętny, części tysięcznych itp., co gorsza różne w zależności od kraju. Nie o to tu chodzi.

Całym sensem takiego zadania nie jest podobieranie funkcji z bibliotek takich, czy innych - wiadomo, że są. Tylko pokazanie, że umie się zapisać podstawowy algorytm.

Swoją drogą, czy scanf się nie wywali, jak poda się niepoprawną liczbę, czy wpisze nulla? Nie pisałem w C od 10 lat.

endriu_l

Wysłane 2013-11-16 00:25

ta, w sumie zapomniałem jak to bywało na uczelni - napisać, byle się kompilowało i dla przykładowych danych przeszło.

Jasne że była mowa o liczbach naturalnych, ale zapis naukowy to zapis naukowy, nie możesz zakładać, że użytkownik nie zastosuje ułamkowej mantysy lub ujemnego wykładnika.

Generalnie, życie szybko uczy, że użytkownikowi NIGDY nie można ufać, że wpisze dane jakie zakładamy :)

Poza tym, programowanie to nie sztuka pisania kolejnych linijek kodu, ale znajdowania eleganckich rozwiązań problemów innych ludzi :) Nie ma sensu pisać gąszczu if-ów, skoro można skorzystać z gotowych funkcji (tym bardziej że są w standardowych nagłówkach :)), tym bardziej że w ten sposób powstaje kod który jest łatwiejszy do testowania. No chyba że płacą od linijki, wtedy się nie ograniczamy :)

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2013-11-16 01:06 , Edytowane 2013-11-16 01:07

@endriu_l
Generalnie się z tobą zgadzam. Programowanie polega na szybkim, zarządzalnym i względnie wydajnym, rozwiązywaniu problemów, a nie pisaniu kodu.
W tym jednak wypadku wydaje mi się, że istotą jest właśnie wykazanie umiejętności rozpisania "z palca" odpowiedniego algorytmu. W przeciwnym wypadku, jaki jest sens tego zadania?

endriu_l

Wysłane 2013-11-16 06:55 , Edytowane 2013-11-16 06:55

Sensem każdego zadania jest znalezienie rozwiązania :)

Ignacek 9

Wysłane 2013-11-16 18:16

@kowgli Tylko teraz tak:
Jak wpisać ten ciąg znaków tak, że każdy jest oddzielny elementem tablicy (bo patrząc na Twój sposób to tak właśnie muszę zrobić)?

kowgli

  • kowgli
  • wiadomość Użytkownik

  • 4367 wypowiedzi

Wysłane 2013-11-17 00:58

@Ignacek 9
Tak jak pisałem nie używałem C od wielu lat, ale z tego co pamiętam scanf("%s") powinien Ci zwrócić char*.

Strona 1 z 1 1
skocz

Kto jest online: 0 użytkowników, 275 gości