Skocz do zawartości
Vasago

Wielomiany w C++ -nie potrafie skompilowac

Rekomendowane odpowiedzi

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?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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);} //-------------------------------------------------------------------------------

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...