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
Forum > Tematy dowolne > Pomoc w małym zadaniu (język C)
Wysłane 2013-11-15 16:44
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;
}
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.
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.
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 :)
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?
Kto jest online: 0 użytkowników, 252 gości