Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Dnia 09.11.2005 o 20:08, bart119 napisał:

./program plik1.txt plik2.txt

Program ma być napisany
w ANSI C

Proszę o wszelkie propozycje.



Sorki, już nie pamiętam jak się z pliku wczytuje (bo teraz mam jave, a w javie to jest inaczej) ale ja bym to zrobił tak: (skoro są to pliki txt) tworzysz jakiś string (array of character pointers np: char a[1000] no i drugiego takiego dla drugiego pliku)

i wczytujesz z pliku kolejne charaktery do tego stringa. Pętla działa dopóki
a)nie ma końca pliku (~eof()) - oczywiście musisz sprawdzać dla dwóch plików, jeśli jeden się skończy, a drugi nie - możesz podać na konsolę że pliki się różnią

b)ilość wczytań znaków nie przekroczy rozmiaru twojego bufora (ten array charakterów) - pamiętaj że tablice w C zaczynają się od zera

c)oddzielna funkcja którą napiszesz znajdzie i poda na konsolę róznicę między kolejnymi znakami i zwróci odpowiednią wartośćjeden oznaczającą że znalazła i wyprintowała róznicę między plikami

(funkcja bedzie wyglądać np. tak: int compare(char a[],b[],i) - napisałem tak , w ten sposób bedziesz mógł zamieścić to od razu w pętli (o ile się w C da) lub po prostu w swojim programie zapodasz pętlę sprawdzającą dla kolejnych wartości i od 0 do 999 czy compare(a[], b[], i) jest zero czy jeden. Chodzi o to że ta funkcja zwraca integer inny niż zero jesli jest różnica, lub zero jeśli nie ma róznicy. I podajesz kolejne warotści i oraz te same stringi...


Zapewne napisałem to dość niejasno ,w razie czego pytaj...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Sorki trochę się rąbnąłem, bo na początku chcaiiłem używaćfunkcjii strcomp(); stąd te tablice znaków. Ale nie ma potrzeby, wystarczy tylko jeden znak (własciwie jedna para znaków), i w pętli go wczytujesz, porównujesz, potem w razie potrzeby wczytujesz koleją parę i tak aż nie znajdziesz róznicy lub nie będzie końca plików.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam. Mam prośbę: zamieszczam link do programu, który napisałem... http://flnfsu2.fm.interia.pl/Bartuc.cpp i mam z nim mały problem... Funkcja zliczająca znaki void pob(char tab[], int) działa nie tak jak powinna (jak skompilujecie to sami zobaczycie). Zatem moja prośba: czy ktoś mógłby naprawić ten błąd? Funkcja ta powinna wczytać wprowadzony z klawiatury ciąg znaków, umożliwiać wciśnięcie klawisza backspace (który ma nie być liczony jako znak), kończyć się enterem i przede wszystkim: ma uniemożliwić użytkownikowi przekroczenie rozmiaru max tablicy.

PROSZĘ O POMOC :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.11.2005 o 18:28, Bartuc napisał:

PROSZĘ O POMOC :)

Ciekawy problem. Sam próbowałem to robić na różne sposoby, ale bezskutecznie.
Za to wszystkie moje próby działały, gdy usunąłem a=getchar(), czyli to co najważniejsze. Widocznie ta funkcja powoduje jakiś problem. O ile działa na przykład można z pętli się wybreakować \n, o tyle przy użyciu równości i==max nie da rady. Ale czemu? To bardzo dziwne. Każdy sposób, który sprawdza \n jest dobry, ale żaden z i==max nie działa, dopóki nie usunę tego getchar(). Problem tkwi więc w jakichś specyficznych wymaganiach tej funkcji.
Zawsze programowałem w C++ i nigdy tej funkcji nie używałem, tym niemniej jest to bardzo dziwne.

Poza tym wydaje mi się, żę na końcu powinno być porównanie z max, a nie z max-1. Sprawdzone doświadczalnie przy max=3. Bakcspace nie liczy się, także działa całkiem OK.
Mam nadzieję, że ktoś inny będzie w stanie pomóc, bo sam jestem ciekaw. BTW - w C widziałem już jeden prosty program (kalkulator oparty na nieskończonej pętli while), który nie działał zbyt dobrze - za to po przejściu na C++ i zamianie scanf i printf na cin i cout działał bez zarzutu. Funkcje C wymagają więc pewnie więcej uwagi od programisty.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 13.11.2005 o 18:28, Bartuc napisał:

Witam. Mam prośbę: zamieszczam link do programu, który napisałem... http://flnfsu2.fm.interia.pl/Bartuc.cpp i mam z nim
mały problem... Funkcja zliczająca znaki void pob(char tab[], int) działa nie tak jak powinna

Nic dziwnego bo zawiera kilka błędów.

Dnia 13.11.2005 o 18:28, Bartuc napisał:

void pob(char tab[], int) //funkcja pobiera ciag znakow

//Po pierwsze drugi parametr funkcji jest pobierany, ale nigdy nie używany
//Może miało być "int max"?
//Po drugie lepiej używać w deklaracji wskaźnika bo tablicy nie mozna i tak przekazać przez
//wartość. Powinno być więc "char *tab"

{
int x=0;
char a=0;
//Znak pobierany od getchar musi być typu int, a nie char bo jest deklaracja: int getchar(void)

do
{
a=getchar();
tab[x]=a;
x++;
}
while ((a!=''\n'') && (x<(max-1)));
}
//Ostatnią część można wyprostować tak:
do
tab[x] = getchar();
while( x < max - 1 && tab[x++] != ''\n'');
//kolejnośc warunków została zamieniona bo przekroczenie rozmiaru jest ważniejsze.

Zmieniłem i na x bo forum ładuje to jako znacznik kursywy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Oto najprostsza funkcja w C, która umożliwia wczytanie ciągu znaków do tablicy s ograniczonej do n znaków. Nie trzeba ku temu odkrywać na nowo koła przez robienie edytora wierszowego przez funkcję getchar(), która służy do czegoś zupełnie innego.
Wystarczy uważnie przeczytać dokumentację kobyły scanf (bardzo duża funkcja bo zajmuje kilka KB).
Para funkcji print i scan format, to potężne funkcje porównywalne możliwościami do całego programu edytora ekranowego. Tylko trzeba umieć to wykorzystywać. Czyli czytać, czytać, czytać.

void wez(char znaki[], int ile)
{
fputs("Podaj nazwę pliku: ", stdout);
scanf("%*s\n", ile, znaki);
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 11.11.2005 o 22:14, Vel Grozny napisał:

Choć wydaje mi się, że C++ jest prostszy (cout i cin są prostsze w użyciu od printf i scanf,
bo nie wymagają dodatkowych parametrów).

To tylko pozory. Strumienie cout i cin są równie skomplikowane (a nawet bardziej) jak printf i scanf. Tyle, że jezeli nie używa się dodatkowych metod i znaczników, to i efekty będą zawsze proste.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam , jestem tutaj nowy i potrzebuje waszej pomocy , a dokładnie Kogos kto umie programowac w jezyku C , mam za zadanie wykonania zestaw programow typu producent - konsument realizujacych przy wykorzystaniu mechanizmu łaczy nazwanych (kolejek FIFO) , schemat komunikacji miedzyprocesorowej .

Z Gory mowie , ze zapłace za wykonana robote , czekam na wasza pomoc , czas nagli , ewentualnie na kontakt z osoba , ktora moze sie podjac tego zadania.

dzieki z gory i pozdrawiam.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam taki problem. Coś niecos potrafię w języku C, ale dotychczas wszystko co pisałam było w linuksowym joe i kompilacja tez pod linuksem. Zeby tam wywołać program z większą ilością parametrów (np pliki do odczytu lub zapisu) pisało sie np: ./program plik1.txt plik2.txt Teraz muszę posługiwac sie visuall C++ (mam visualStudio 97) i jak tam używam Build a nastepnie compile project1.c oraz build project1.exe i następnie naciskam execute project1.exe to wyskakuje konsola z której w oczywisty sposób wynika ze pobiera tylko nazwe porgramu ,a
argc[1] oraz argc[2] są pomijane i naciśnij dowolny klawisz w celu kontuacji...(. Jak Taki projekt skompilować jakoś ręcznie w okieku dos-wym moze,bo nie mam pojęcia gdzie podac te nazwy plików txt??
Problem jest pewnie banlny,ale wybaczcie nie znam sie na tym, a czas ucieka a ja stoję z projektem bo nie wiem co dalej:(

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.11.2005 o 16:08, Rachelin napisał:

Problem
jest pewnie banlny,ale wybaczcie nie znam sie na tym, a czas ucieka a ja stoję z projektem bo nie wiem co dalej:(

Spróbuj może dać compile i build, a zamiast execute odpal go ręcznie z wiersza polecenia (Akcesoria w Menu start), albo Start, Uruchom sciezka\project1.exe plik1.txt plik2.txt Powinno działać bez problemu.
Jeśli chodzi Ci o coś innego, to napisz.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jakiejs pomocy prosze, wskazowek cokolwiek. mam napisac programik w c. bedzie sie wyswietlal na konsoli w sunie. latawiec ma spadac po cykloidzie albo innej f.matematycznej . pewnie troche osob przez to przeszlo jak zaczynalo zabawe z c. bede wdzieczny za jakas pomoc

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.11.2005 o 13:37, Matixo napisał:

Z Gory mowie , ze zapłace za wykonana robote , czekam na wasza pomoc
, czas nagli , ewentualnie na kontakt z osoba , ktora moze sie podjac tego zadania.


masakra! a jesli studiujesz informatyke to: MASAKRAx2!!!

tez mam na roku takich co kupowali programy zeby zaliczyc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach




mam problem pisze program w Turbo C++(baaaaaardzo stary kompilator;)) i musze zrobic cos takiego zeby za kazdym razem jak wcisne "a " to tekst przesuwal sie o jeden w gore, i w dwolnym momencie mozna wcisnac enter co spowoduje przesuniecie tekstu w prawo... zrobilem to funkcjami: kbhit, petlą while i warunkiem if/else... ale za kazdym razem wlaczam to mozna tylko raz a wcisnac.... co robic?
z góry dzieki

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.11.2005 o 19:34, BlaszeQ napisał:

mam problem pisze program w Turbo C++(baaaaaardzo stary kompilator;))


szkoda ze nie dales swojego kodu to bysmy widzieli co i jak.
ps. mam nadzieje ze petla tam jest? :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 16.11.2005 o 20:44, Volvox napisał:

> mam problem pisze program w Turbo C++(baaaaaardzo stary kompilator;))

szkoda ze nie dales swojego kodu to bysmy widzieli
co i jak.
ps. mam nadzieje ze petla tam jest? :)

no juz sobie poradzilem... oczywiscie ze byla petla dzieki za checi.. fajne to forum..

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

napisałem taki program w Turbo C++ v1.01

#include <stdio.h>
#include <conio.h>
#include <dos.h>
main()
{
clrscr();
int a,y=12;
gotoxy(70,8);
printf(" ó ");
gotoxy(70,9);
printf(" O ");
gotoxy(70,10);
printf(" XIX ");
gotoxy(70,11);
printf("X I X ");
gotoxy(70,12);
printf(" I ");
gotoxy(70,13);
printf(" | | ");
gotoxy(70,14);
printf("| | ");
gotoxy(10,12);
printf(" >>--->");
while(a!='' '')
{a=getch();
if(a==''a'')
y--;
if(a==''z'')
y++;
clrscr();
gotoxy(10,y);
printf(" >>--->");
gotoxy(70,8);
printf(" ŕ ");
gotoxy(70,9);
printf(" O ");
gotoxy(70,10);
printf(" XIX ");
gotoxy(70,11);
printf("X I X ");
gotoxy(70,12);
printf(" I ");
gotoxy(70,13);
printf(" | | ");
gotoxy(70,14);
printf("| | ");
}
for(int i=10; i<70; i++)
{gotoxy(i,y);
printf(" >>--->");
delay(10);
}
}

wszystko działa.. ale.. (jak go skopiujecie to zobaczycie ze jest to strzala ktora sterujemy a i z a gdy wcisakmy spacje atrzala trafia w postac) musi byc jeszcze wrunek ze gdy strzala udezy w postac ma pojawiac sie komunikat np trafiles a jak nie trafi to np pudlo.. zacialem sie w tym momencie.. prosze o pomoc... jestem uczniem pierwszej klasy liceum wiec prosilbym o mozliwie proste komendy(na poziomie liceum). pozdrawiam

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

OK, dziękuję za pomoc, funkcja jak najbardziej działa :)

Ale jest jedno ale :P Czy to nie jest przypadkiem tak, że ta funkcja wczytuje x znaków (tyle ile wprowadzi użytkownik), więcej niż zadeklarowane max, a dopiero potem ucina je tak żeby było x<max (uwzględniając 0 na końcu łańcucha znaków)? Czy istnieje zatem możliwość napisania takiej funkcji, żeby wczytywała znak po znaku, po osiągnięciu max-1 możliwość wprowadzania znaków zostałaby zablokowana i w tym momencie możnaby wcisnąć tylko ENTER lub BACKSPACE, a co do BACKSPACE - możliwość wciśnięcia tego klawisza jest zawsze aktywna podczas wprowadzania znaków, ale należy w następnej funkcji liczącej znaki uniknąć naliczenia BACKSPACE (tzn tak żeby funkcja policzyła faktyczną liczbę znaków a pominęła wciśnięcie klawisza BACKSPACE) - coś zupełnie jak moduł pisania SMSów w komórkach...

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.11.2005 o 16:13, Vel Grozny napisał:

Jeśli chodzi Ci o coś
innego, to napisz.


chodziło o to i od wczoraj juz chula:) Zadziało:D dzieki!!!!:)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 17.11.2005 o 20:39, Bartuc napisał:

Ale jest jedno ale :P Czy to nie jest przypadkiem tak, że ta funkcja
wczytuje x znaków (tyle ile wprowadzi użytkownik), więcej niż zadeklarowane max, a dopiero potem ucina je
tak żeby było x<max (uwzględniając 0 na końcu łańcucha znaków)?

Tak naprawdę drugi warunek czyli ten: "tab[x++] != ''\n''" raczej nigdy nie zadziała. Funkcja getchar jest w komputerze PC buforowana wierszowo przez bios komputera. Inaczej mówiąc możesz sobie dowolnie wpisywac i kasować wszystko co Ci się podoba, lecz ostateczna wersja pójdzie do standardowego wejścia w momencie wciśnięcia Enter. Żadne znaki edycyjne (typu Bakspace) nie sa zapamiętywane za wyjątkiem znaków \n, które na wejściu są skonwertowanym wciśnięciu klawisza Enter, a na wyjściu zamieniane na dwa znaki CR i LF. Żeby było ciekawiej w Unixie, na którym pierwotnie rozwijał się C (powstał chyba na PDP czy coś) istnieją obydwa znaki ''\r'' i ''\n'', które są ścisłymi odpowiednikami CR i LF. Natomiast problem powstał z klawiaturą bo jeden znak z klawiatury odpowiada dwóm znakom z ekranu. Rozwiązano to tak iż para CR i LF zamieniana jest podczas odczytu strumienia plikowego na pojedynczy znak ''\n''.

Dnia 17.11.2005 o 20:39, Bartuc napisał:

Czy istnieje zatem możliwość napisania takiej funkcji

Możliwość zawsze jest. W programowaniu nie istnieje pytanie "czy" (bo odpowiedzią jest naturalne TAK) - jest ono zawsze zamieniane na słowo "jak". :)

Dnia 17.11.2005 o 20:39, Bartuc napisał:

żeby wczytywała znak po znaku, po osiągnięciu max-1 możliwość wprowadzania znaków zostałaby zablokowana
i w tym momencie możnaby wcisnąć tylko ENTER lub BACKSPACE

Należy użyc funkcji getch().

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Proszę o pomoc.
Jak w c++ wczytać z jednego wiersza dwie liczby (int) oddzielone pojedyńczym odstępem.
Na przykład:
w jednym wierszu wpisuje: 45545 4848
i chciałbym żeby z tego wiersza komputer wczytał dwie oddzielne zmienne np. a=45545 i b=4848.

Męczyłem się z tablicami i jakoś nie wyszło. Ptem próbowałem z char, ale nie można tego potem na int zamienić.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować