Vasago Opublikowano 2 Października 2004 Zgłoś Opublikowano 2 Października 2004 Program ma liczyc wielomiany. Dalem juz sobie spokoj ze skomplikowany(przynajmniej dla mnie) metodami pozwalajacymi wyliczyc pierwiastki wielomianu i zalozylem, ze program dostanie wartosc x jako dane i tylko przemnozy ja przez odpowiednie wspolczynniki po czym doda. Musi za to pozwalac na wybor pomiedzy zrodlem danych - klawiatura albo plik. napisalem cos co widac ponizej (nie smiac sie,to pierwszy program jaki pisze ;) ). Niestety podczas kompilacji wywala mi nastepujacy blad: "error C2664: 'strncpy' : cannot convert parameter 1 from 'int [25]' to 'char *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Error executing cl.exe." " Zdaje sie, ze to dlatego, ze probuje kopiowac przy pomocy strncpy. No ale jezeli nie tak,to jak? Kod wyglada nastepujaco: #include <fstream.h> #include <string.h> #include <iostream> int string[25]; void text(); void manual(); void menu(); void end(); const max=10; int degree; void text() { std::cout << "Enter degree of the polynomial (max " << max << ")n"; } void manual() { int string1[25]; std::cout << "Enter degree of the polynomial (max " << max << ")n"; std::cin >> degree; for(int i=0; i<=degree; i++) { std::cout << "Enter coefficient for x^" <<i<< "n"; std::cin>>string1; } strncpy(string,string1,25); } void menu() { int choice; std::cout<< "********** menu **********n"; std::cout << "[1] Read from a filen"; std::cout << "[2] Enter data from a keyboardn"; std::cout << "[3] Exit programn"; std::cin >> choice; switch(choice) { case 1: text(); break; case 2: manual(); break; case 3: end(); break; default: std::cout << "Wrong number. Choose once againn"; menu(); break; } } void end() { std::cout << " Do you want to close the program?nn"; std::cout << "[1] Close the programn"; std::cout << "[2] Go back to menun"; int close; std::cin >> close; switch(close) { case 1: std::cout << "The program will be closedn"; break; case 2: menu(); break; default: std::cout << "Wrong parameter. Only [1/2] ale allowedn"; end(); break; } } int polynomial(int a,int w[],int rozm) { int res=w[0]; for(int j=1;j<rozm;res=res*a+w[j++]); return res; } int main() { menu(); int a; std::cout<<"Choose xn"; std::cin>>a; std::cout << "The final result is " << polynomial(a,string,degree) << "n"; end(); return 0; } I tu jeszcze jedna prosba. Fukcja text() ma w zamierzeniu pobierac dane z pliku, zapisywac jako string2, kopiwac do string i odsylac do main(). Z tego co wiem plik otwiera fopen("nazwa_pliku"',"r") a zamyka fclose("nazwa_pliku"). Tylko co mam zrobic zeby dane z pliku (w tym przypadku ciag liczb odzdielonych przecinkami) zostaly przeslane do stringa? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Shifter Opublikowano 2 Października 2004 Zgłoś Opublikowano 2 Października 2004 ja ci za wiele nie pomoge bo sie nie znam, ale zdaje sie ze jak do tablicy zapisujesz string to elemety tej tablicy powinny byc char a nie int Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vasago Opublikowano 3 Października 2004 Zgłoś Opublikowano 3 Października 2004 Dzieki :) faktycznie pomoglo. Niestety program zwraca bzdurne wyniki i nie wiem czemu. Moze ktos moglby pomoc? #include <fstream.h> #include <string.h> #include <iostream> char string[25]; void text(); void manual(); void menu(); void end(); const max=10; int degree; void text() { char string2[25]; std::cout << "Enter degree of the polynomial (max " << max << ")n"; std::cin >> degree; if(degree>max) {std::cout << "The limit is set to 10. Choose again pleasen"; text(); } char file_name; std::cout << "Which file do you want to open?n"; std::cin>>file_name; ifstream fin(file_name); if (!file_name) {std::cout<<"Sorry, error during opening. Try again,pleasen"; text(); } fin.get(string2,30); strncpy(string,string2,30); fin.close(); } void manual() { char string1[25]; std::cout << "Enter degree of the polynomial (max " << max << ")n"; std::cin >> degree; for(int i=degree; i>=0;i--) { std::cout << "Enter coefficient for x^" <<i<< "n"; std::cin>>string1; } strncpy(string,string1,25); } void menu() { int choice; std::cout<< "********** menu **********n"; std::cout << "[1] Read from a filen"; std::cout << "[2] Enter data from a keyboardn"; std::cout << "[3] Exit programn"; std::cin >> choice; switch(choice) { case 1: text(); break; case 2: manual(); break; case 3: end(); break; default: std::cout << "Wrong number. Choose once againn"; menu(); break; } } void end() { std::cout << " Do you want to close the program?nn"; std::cout << "[1] Close the programn"; std::cout << "[2] Go back to menun"; int close; std::cin >> close; switch(close) { case 1: std::cout << "The program will be closedn"; break; case 2: menu(); break; default: std::cout << "Wrong parameter. Only [1/2] ale allowedn"; end(); break; } } int polynomial(int a,char w[],int rozm) { int res=w[0]; for(int j=1;j<rozm;res=res*a+w[j++]); return res; } int main() { menu(); int a; std::cout<<"Choose xn"; std::cin>>a; std::cout << string[1] <<"n"; std::cout << "The final result is " << polynomial(a,string,degree) << "n"; end(); return 0; } PS Jak powinna wygladac prawidlowo napisana funkcja text()? Pisalem ja wg materialow jakie znalazlem na temat obslugi plikow,ale najwyrazniej robie cos nie tak. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 3 Października 2004 Zgłoś Opublikowano 3 Października 2004 Witam, 1. Jesli juz musisz uzywaj <fstream> dla C++, a nie <fstream.h> 2. a.cpp:12: error: ISO C++ forbids declaration of `max' with no type ma byc: const int max=10; 3. a.cpp: In function `void text()': a.cpp:28: error: invalid conversion from `char' to `const char*' chyba mialo byc, np.: char file_name[256] ?? 4. Nie prosciej jest otwierac pliki standardowo: fopen()/fclose() Z pliku mozna czytac sformatowane dane funkcja fscanf(), np.: fscanf( file, "%d,%d", &a,&b ); Jesli juz koniecznie musisz pobrac string to zrob to przez fgets(). 5. Pamietaj, ze uzywanie globalnych zmiennych do przesylania danych miedzy funkcjami NIE JEST dobrym ani bezpiecznym rozwiazaniem, od tego sa parametry funkcji. 6. Co zrobisz jesli nagle bedziesz potrzebowal string o wiekszej dlugosci niz zadeklarowane przez Ciebie 25 znakow. I w zasadzie to czemu uzywasz stringa do przechowywania liczb??!?! Dlaczego przynjmniej nie jest to tablica int? Przewaznie char=bajt=8-bitow, a int=32-bity. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vasago Opublikowano 3 Października 2004 Zgłoś Opublikowano 3 Października 2004 Dzieki za pomoc. Dopiero zaczynam,wiec jeszcze sie mocno gubie we wlasciwym uzyciu poszczegolnych polecen. Moge jeszcze pomeczyc gdyby po tych poprawkach ciagle cos nie dzialalo? ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 3 Października 2004 Zgłoś Opublikowano 3 Października 2004 Parę rad na przyszłość : 1 #include <iostream>#include <fstream>#include <string>using namespace std; Pod dyrektywami zawsze dodawaj using namespace std ; dzięki temu nie będziesz musiał pisać std:: na początku np. strumieni cin i cout , co mocno zwiększy czytelność kodu i szybkość pisania. 2 std::cout<< "********** menu **********n";std::cout << "[1] Read from a filen";std::cout << "[2] Enter data from a keyboardn";std::cout << "[3] Exit programn"; Nie wal tyle cout bo to można załatwić jednym , co jest znacznie czytelniejsze i przejemniejsze dla oka jeszcze w kompilatorze. cout << "********** menu **********n" "[1] Read from a filen" "[2] Enter data from a keyboardn" "[3] Exit programn"; 3. Stosuj raczej // << endl ; na przejście do nowej lini bo jest czytelniejsze, a jak jest dużo // 'n' to czasami jest ciężko połapać. 4. Nie wiem czy robisz (bo forum ściąga wszystko do lewej strony ) dużo wcięć bo jak wszyskto zaczyna się od lewej strony to ciężko się połapać o co chodzi. 5. Funkcję int main() zawsze staraj się dawać jako pierwszą . Nie dlatego że tam musi stać ale dlatego że od niej wszystko się zaczyna ( czyli wywoływanie pozostałych funkcji ) ktoś chce sprawdzić co ona uruchamia to musi jechać na sam dół . :lol: 6. Zawsze oddzielaj wszystkie funkcje aby można się było łatwo połapać która gdzie się kończy a gdzie zaczyna następna: //-------------------------------------------------------------------------------void text(){ cout << "Enter degree of the polynomial (max " << max << ")n";}//-------------------------------------------------------------------------------void manual(){int string1[25];cout << "Enter degree of the polynomial (max " << max << ")n";cin >> degree; for(int i=0; i<=degree; i++) { cout << "Enter coefficient for x^" <<i<< "n"; cin>>string1[i]; }strncpy(string,string1,25);} //------------------------------------------------------------------------------- Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Vasago Opublikowano 5 Października 2004 Zgłoś Opublikowano 5 Października 2004 Razor1,zapamietam :) Jeszcze pomecze. Juz widze jak duzy blad przedtem zrobilem z tymi charami zamiast intow. Poprawilem i program dziala pod warunkiem, ze wpisuje dane z klawiatury. Nie umiem napisac funkcji,ktora przyjelaby je z pliku i wrzucila do tablicy int array[]. Zajmowac sie tym miala funkcja void text(), ktora po przerobkach wyglada tak: void text() { std::cout << "Enter degree of the polynomial (max " << max << ")n"; std::cin >> degree; if(degree>max) {std::cout << "The limit is set to 10. Choose again pleasen"; text(); } char file_name[256]; std::cout << "Which file do you want to open?n"; std::cin>>file_name; fopen("file_name","r"); if (!file_name) {std::cout<<"Sorry, error during opening. Try again,pleasen"; main();} FILE* input; fscanf(input,"%d" ,&array); fclose(input); } Mam dziadowski podrecznik,w ktorym o pracy na plikach jest raptem pare linijek,wiec opieralem sie na tym co znalazlem w necie. Nie do konca lapie co wlasciwie znaczy "FILE* input;". Input to nazwa wskaznika pliku? Czyli FILE to slowo zarezerwowane podobnie jak int,bool,const, itd? Probowalem to olac i w fscanf oraz fclose uzyc "file_name" zamaist input,ale nie dziala. Niestety w wersji z input tez nie. Kompilator ostrzega, ze input nie jest zadeklarowane(czyli to chyba jednak nie wskaznik?) a przy kompilacji sie wysypuje. Pomozecie jeszcze raz? :) PS Gdyby to mialo znaczenie to w tej chwili dla calego programu dolaczone sa: <string.h> <iostream> <stdio.h> < stdlib.h > <fstream.h>(Probowalem dac samo fstream,jak radzil marcinEc, ale posypaly sie bledy) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...