Zaloguj się, aby obserwować  
UthersonL

Programowanie - pytania, problemy, przykłady programów

1812 postów w tym temacie

/.../

Wybacz, że tyle to trwało. Oto moja propozycja:

# include <iostream>
# include <iomanip>

using namespace std;

int i;

void dec_oct(int l)
{
int tab[l];
int x;

for(i=1; l>0; i++)
{
x=l%8;
if(x==0)
{
tab[ i ]=0;
l=l/8;
}
else
{
tab[ i ]=x;
l=(l-x)/8;
}
}
for(i=i-1; i>0; i--)
cout<<tab[ i ];
}

void dec_hex(int l)
{
int tab[l];
int x;

for(i=1; l>0; i++)
{
x=l%16;
if(x==0)
{
tab[ i ]=0;
l=l/16;
}
else
{
tab[ i ]=x;
l=(l-x)/16;
}
}
for(i=i-1; i>0; i--)
{
if(tab[ i ]==10)
cout << "A";
else if(tab[ i ]==11)
cout << "B";
else if(tab[ i ]==12)
cout << "C";
else if(tab[ i ]==13)
cout << "D";
else if(tab[ i ]==14)
cout << "E";
else if(tab[ i ]==15)
cout << "F";
else
cout << tab[ i ];
}
}

int main()
{
int j, k;

float *TAB = NULL;

int MAX;
int rozmiar;
int dok;

cout << "podaj maksymalny rozmiar tablicy: ";
cin >> MAX;

do
{

cout<<"podaj rozmiar twojej tablicy: ";
cin>>rozmiar;

if(rozmiar>MAX)
cout<<"BLAD! - podany rozmiar przekracza rozmiar maksymalny"<<endl;

}
while(rozmiar>MAX);

cout << "podaj wyswietlana dokladnosc: ";
cin >> dok;

try
{
TAB = new float[rozmiar];
}
catch(bad_alloc)
{
cout << "BLAD! - brak miejsca na utworzenie tablicy";
getchar();
return 0;
}

for(i=0; i<rozmiar; i++)
{
cout << "podaj " << i << " element tablicy" << endl;
cin >> TAB[ i ];
}

cout<<"twoja tablica:\t\t[notacja zwykla] [notacja naukowa] "<<setprecision(dok)<<endl<<endl;

for(j=0,k=0;k,j<rozmiar;j++,k++)

{

cout.width(30);
cout.setf(ios::fixed, ios::floatfield);
cout<<right<<TAB[j];
cout.setf(ios::scientific, ios::floatfield);
cout.setf(ios::uppercase);
cout.width(20);
cout<<right<<TAB[k]<<endl<<endl;

}

cout<<"twoja tablica w systemie osemkowym: "<<endl;

for(j=0;j<rozmiar;j++)
{
dec_oct(TAB[j]);
cout << endl;
}

cout<<"twoja tablica w systemie szesnastkowym: "<<endl;

for(j=0;j<rozmiar;j++)
{
dec_hex(TAB[j]);
cout << endl;
}

cin.ignore();
getchar();
return 0;
}

Znalazłem kilka błędów w warunkach pętlli, usunąłem kilka zmiennych (chociaż da się jeszcze więcej) i dodałem funkcje konwertujące systemy liczbowe. Kod jest mixem trudnym do odczytania ale myślę, że sobie poradzisz. Co do: W programie kontroluj, aby zadany rozmiar nie przekroczył maksymalnego, który jest zadany przez użytkownika (MAX). to jest to dziwne polecenie i nie ingerowałem w Twoje rozwiązanie problemu. :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dzięki! Właśnie tak myślałem, że piękniej byłoby to zrobić funkcyjnie ale nie bardzo wiedziałem w jaki sposób opisać system ósemkowy i szesnastkowy. Program przetestuję jutro ale wygląda toto sensownie... ;)

Jeszcze raz- wielkie dzięki.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak w C# w ConsoleApplication zrobić coś takiego jak wypisanie tekstu znak po znaku, żeby kolejny znak pojawiał się po krótkim czasie? Zwykle napis pojawia się automatycznie, a chciałbym żeby każda litera była po kolei napisana.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../

W C++ jest taka funkcja, _sleep(1), gdzie liczba w nawiasie oznacza ilość milisekund na jaką program ma wstrzymać wykonywanie. Nie wiem czy takie coś przejdzie w C# ale na pewno znajdziesz inną funkcję o identycznym działaniu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.03.2010 o 16:01, o_Orange napisał:

W C++ jest taka funkcja, _sleep(1), gdzie liczba w nawiasie oznacza ilość milisekund
na jaką program ma wstrzymać wykonywanie. Nie wiem czy takie coś przejdzie w C# ale na
pewno znajdziesz inną funkcję o identycznym działaniu.


Tak wiem o tym, ale to trzeba swoją funkcję oddzielnie napisać i każdy napis zapisywać do zmiennej.
Myślałem że jest jakaś taka wbudowana opcja która to robi, ale z tego co rozmawiałem z innymi to wszyscy mówią, że trzeba ręcznie napisać. :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Wracam ponownie z trywialnymi pytaniami.


Całość rozbija się o to jak przekazać:

student *tab=new student[K];

czyli K oraz dynamiczną tablicę studentów do drugiej funkcji- bo chcę żeby jedna funkcja wpisywała ( i powiedzmy, że w niej mogę zawrzeć całość "student *tab=new student[K];") a druga funkcja wypisywała studentów. Ale ta druga funkcja nie zna ani K ani dynamicznej tablicy studentów. Po wielu trudach doszedłem do tego, że K mogę przekazać albo przez argument funkcji albo przez referencję. Ale nadal nie wiem jak przekazać dynamiczną tablicę obiektów typu student. I z tego co czytałem to tablic bezpośrednio nie da się przekazywać ale można przekazać adres jej zerowego elementu, czy coś. Ale tu się właśnie motam. Byłbym wdzięczny za pomoc.

Ps. Tak wygląda polecenie:

Stworzyć klasę Student posiadającą następujące pola:

Imie (String)
Nazwisko (String)
Nr_albumu (integer)
Srednia (float)
Przedmioty (dynamiczna tablica typu String)

Na początku programu użytkownik podaje liczbę tworzonych obiektów K i zostaje przydzielona pamięć na tablicę K obiektów typu Student. Następnie należy wczytać dane poszczególnego Obiektu z klawiatury. W czasie wczytywania każdego obiektu powinno znaleźć się zapytanie o ilość Przedmiotów N dla danego obiektu Student, a następnie dynamicznie przydzielona pamięć na N Przedmiotów oraz ich wczytanie. Należy stworzyć Menu
umożliwiające:

a) Dodanie i wprowadzenie danych nowego studenta (zwiększając pamięć o 1 obiekt klasy student),
b) Wyświetlenie aktualnie zapisanych studentów,
c) Skasowanie całej zawartości i zakończenie programu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../
Aby przekazać tablicę jako argument do innej funkcji, to musisz zrobić coś takiego:

int funkcja(int tablica[], int rozmiar_tablicy)
{
I tutaj tworzymy piękny kod naszej funkcji, tylko nie wolno nam wyjść zakresem poza rozmiar_tablicy.
}

int main()
{
int rozmiar_tablicy=20;
int tablica[rozmiar];
}

W przypadku tablic dynamicznych za wiele się nie zmienia. Dla ułatwienia mogę ci powiedzieć, że wskaźnik na tablicę to adres pierwszego jej elementu. Ale jak dodasz do niego +1, to będzie już wskazywać na drugi element tej tablicy (ale wątpię, żebyś chciał pracować bezpośrednio na pamięci ;))

Osobiście zamiast tablic dynamicznych wolałbym korzystać z wektorów (w sumie to są tablice dynamiczne, ale "obudowane" w kilka przydatnych cech, np. możliwość dynamicznego powiększania, czy to, że wektor "wie" jaki ma rozmiar).

#include <vector>

int funkcja (vector<int> const &v) - referencja do naszego wektora. Traktuj go identycznie jak tablicę.
{
for (int a=0; a<=v.size(); a++){
cout << v[a] << endl; - wyświetlenie zawartości wektora.
}
return 0;
}

int main(){
vector<int> dane(1);
cout << "ile elementow ma miec twoja tablica?";
int a;
cin >> a;
for (int b=0; b<=a; b++){
if (b==dane.size())
{
dane.push_back(0); - czyli powiększenie rozmiaru tablicy o 1 element. Jest to dość prymitywne, ale działa ;)
}
cin >> dane;
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Kolejny raz potrzebuję pomocy dotyczącej C#.
Na zaliczenie mam zrobić prostą gierkę, wszystko ma wyświetlać się w konsoli. Mają być obiekty drapieżnicy i obiekty roślinożercy. Wiadomo, jedni mają uciekać a drudzy ich zjadać. Drapieżnicy tracą wytrzymałość jeżeli nie zjedzą w odpowiednim czasie jakiegoś roślinożercy. Nie mam całej gry jeszcze, ale zatrzymałem się w jednym momencie i nie wiem jak sobie poradzić.
Kod: http://wklej.org/id/306600/

W 153 linii Drapieżnik traci wytrzymałość. Następnie wytrzymałość powinna być sprawdzana, i jeżeli jest równa 0, to Drapieżnik jest usuwany z listy (tutaj też pytanie - skoro jest usuwany z listy to znaczy że jako obiekt kończy swój wirtualny żywot?) i niestety jest problem. Podejrzewam, że przyczyną jest foreach, to znaczy że nie można usuwać obiektów z listy w tej pętli, ponieważ za każdym przebiegiem ta pętla myśli że ten obiekt nadal jest na liście i chce zrobić coś z obiektem który nie istnieje? Mogę się mylić.
W takim razie jak poradzić sobie z tym problemem? Najlepiej byłoby poza pętlą foreach sprawdzać czy jakikolwiek Drapieżnik na liście ma wytrzymałość równą zero i takiego usuwać. Niestety nie mam pojęcia jak to zrobić, jak wydostać z listy takie osobniki i tylko takie usuną? :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Cześć. Mam problem z programowaniem w programie Turbo Pascal. Muszę napisać program z wykozystaniem pętli while który przy wpisaniu liczb z przedziału 2 do 7 nic nie bedzie robił, a jak wpiszę inną liczbę to wypisze komunikat podaj liczbe. Wcześniej robiłem to dla jednej liczby np. 5;

Program ggg;
Uses Crt;
var i:integer;
BEGIN
ClrScr;
writeln (''wpisz dowolną liczbe oprocz 5'');
while i<>5 do begin
writeln (''podaj liczbe'');
readln (i);
end.

Gdyby ktoś mógł mi podać rozwiązanie z tym przedziałem na podstawie tego pierwszego byłbym naprawdę wdzięczny.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

- Pobierasz liczbę od użytkownika
- Czy liczba jest większa niż 2?
-- Jeśli jest większa niż 2 to czy jest mniejsza niż 7
---Tak - zakończ program/pętle
- W przeciwnym wypadku zrób coś

Podpowiedź:

Spoiler

Można to zrobić to 2 zapytaniami if (jeden w drugim), albo pojedynczym if łączącym warunki słówkiem AND

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie wiem czy to nadal aktualne, ale wybór sposobu rob006 i Volvox zależy od tego co zamierzasz zrobić.
W pierwszej propozycji po wprowadzeniu liczby większej od 2 i mniejszej od 7 możesz wypisać ten twój komunikat i program się zakończy.
W drugiej propozycji umieszczasz w pętli funkcje IF z zapytaniem czy liczba jest większa od 2 i mniejsza od 7 i wtedy możesz wyświetlić komunikat.

PS. A teraz drobna uwaga na przyszłość. Zamiast readln(i); i deklarowania niepotrzebnej zmiennej możesz używać prostszego polecenia - readkey; które nie wymaga zmiennych.

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ć