Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dzięki za długie wytłumaczenie.

Teraz jest kolejny problem. Muszę za pomocą znaków narysować figury geometryczne i chciałbym wiedzieć czy jest jakaś funkcja, która wykonuje pętlę x razy i wyskakuje. Coś w stylu for (i=0;i<x;i++), ale z jedną zmienną.
Wiem jak to zrobić z for, ale jak muszę umieszczać for w for w for, to zaczyna to brzydko wyglądać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bardzo możliwe, że będzie musiał być zagnieżdżany for. Można próbować kombinować z wieloma if, ale for są moim zdaniem najlepsze.

Na przykładzie kwadratu (napisane w C)


#include <iostream>
#include <stdio.h>

int main()
{
int a=1;
for(a==1; a<=2; a++)
{
printf("=");
int b=1;
if(a==2)
{
printf("\n");
for(b==1; b<=2;b++)
{
printf("=");
}
}
}
getchar();
}


I jest to to samo, co:

#include <iostream>
#include <stdio.h>

int main()
{
int a=1;
while(a<=2)
{
printf("=");
a++;
int b=1;
if(a==3)
{
printf("\n");
while(b<=2)
{
printf("=");
b++;
}
}
}
getchar();
}


Według mnie łatwiej robić z for, w while można się poplątać łatwiej.

A w odpowiednim miejscu można zakończyć pętlę, pisząc na przykład (w pętli oczywiście):
if(a=8)
{
break;
}
Przy jednolinijkowym if nie są wymagane klamry, ale ja wolę je pisać dla przejrzystości kodu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.04.2013 o 13:50, Sigu napisał:

Teraz jest kolejny problem. Muszę za pomocą znaków narysować figury geometryczne i chciałbym
wiedzieć czy jest jakaś funkcja, która wykonuje pętlę x razy i wyskakuje. Coś w stylu
for (i=0;i<x;i++), ale z jedną zmienną.

Przecież to jest pętla z jedną zmienną. Tą zmienną jest ''i''.
Jeżeli chodzi o nazwy zmiennych, to pisanie ich nazw jako jednoliterowych np. i, j k jest jednym z bardzo złych nawyków. Po pierwsze nie wiadomo na pierwszy rzut oka co ta zmienna ma reprezentować, po drugie jednoliterówki najłatwiej pomylić. Dużo lepsze jest coś takiego
for(int pionowo = 0; pionowo < wysokość; ++pionowo)
for(int poziomo = 0; poziomo < szerokość; ++poziomo)
rysujOkna(poziomo, pionowo, szerokośćOkna, wysokośćOkna);
Czytelne i trudne do pomylenia (nawet tu gdzie nie ma żadnego formatowania).

Dnia 15.04.2013 o 13:50, Sigu napisał:

Wiem jak to zrobić z for, ale jak muszę umieszczać for w for w for, to zaczyna to brzydko wyglądać.

Brzydko wygląda kilka poziomów zagnieżdżeń bez użycia podprocedur, z mnóstwem enigmatycznych zmiennych i fatalnym formatowaniem. Wtedy się zgodzę. :)
Nie rozwiązuje się tego innymi typami pętli bo każdy z nich służy do czego innego:
1. while() instrukcja; - pętla z warunkiem iteracji na jej początku
2. for(;;) instrukcja; - przypadek szczególny pętli while dla iteracji sterowanych zmiennymi
3 do instrukcja; while() - pętla z warunkiem iteracji na końcu (wykonywana przynajmniej raz). Ze względu na swoją własność jest często używana do interakcji z użytkownikiem lub obsługi błędów.
Każda z tych powyższych może być zagnieżdżona w każdej innej (bo sama jest instrukcją).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

No wiem, że i jest tą zmienną. Chodziło mi o coś troszeczkę innego jak pisałem o "jednej zmiennej".

Muszę przyznać, że samodzielne nauczenie się podstaw Javy od strony praktycznej to 2-3 godziny. Z takim zestawem wiedzy można zacząć tworzyć proste programy.

Udostępnij ten post


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

Możecie mi powiedzieć jedną rzecz? Jeśli do tablicy która jest w strukturze pobieram
przez ''gets'' tekst, to by go wypisać mogę użyć %s?

Tak ponieważ funkcja ta dodaje na końcu znak ''\0''. Natomiast problemem jest to, że pobierany wiersz zawsze może przekroczyć przydzielony rozmiar pamięci dla takiej tablicy. Wtedy funkcja zacznie mazać po pamięci i skutki tego będą nie do przewidzenia. Dlatego funkcja ta jest już od dawna niezalecana i jest już całkowicie usunięta z najnowszej edycji języków C/C++.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

#include <stdlib.h>
#include <stdio.h>

int main()
{
struct studia
{
char imie[20];
char nazwisko[30];
int rok_std; //std-studiow
}student;

printf("Podaj imie studenta: \n");
scanf("%s",student.imie);

printf("Podaj nazwisko studenta: \n");
scanf("%s", student.nazwisko);

printf("Podaj rok na ktorym jest: \n");
scanf("%d", student.rok_std);

printf("Imie: %s, nazwisko: %s, rok: %d\n", student.imie, student.nazwisko, student.rok_std);

system("pause");
return 0;
}

Co robie źle, że nie chce mi wypisać?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 18.04.2013 o 15:42, Dregorio napisał:

(...)
Co robie źle, że nie chce mi wypisać?


Bardzo pospolity błąd :) W każdym scanf przed zmienną dodaj znak &. To co teraz robisz, to przekazujesz funkcji wartość zmiennych niezainicjalizowanych (czyli losowe wartości), a nie ich adresy w pamięci. Skutkiem może być naruszenie ochrony pamięci.

http://www.cplusplus.com/reference/cstdio/scanf/ (patrz: additional arguments)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Krótkie pytanie.

Czy da się przysłaniać przeciążone operatory?

Jako zadanie mam przeciążenie operatorów coby macierz sumować/odejmować/dzielić/mnożyć przez stałą k. Na intach to zrobiłem, ale nie bardzo mam pomysł jak się zabrać, żeby to rozpoznało, czy aby k nie jest float/double.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 18.04.2013 o 21:20, Piciambeer napisał:

Krótkie pytanie.

Czy da się przysłaniać przeciążone operatory?

Tak. Reguły przesłaniania, czyli tworzenia metod polimorficznych są dość skomplikowane w przypadku wielu wariantów, ale wszystko bazuje na typach argumentów metod. Dla kompilatora metody o tej samej nazwie (i nawet wyniku) są różne jeżeli mają przynajmniej jeden różniący się parametr lub jego typ po wykonaniu konwersji standardowych. Konwersje standardowe to konwersje polegające w uproszczeniu na zwiększaniu precyzji np. float do double lub char i short do int. Szczególnym przypadkiem tej zasady są metody operatorowe, które z definicji mają ograniczoną pulę nazw.
Na przykład jeżeli masz metody
virtual int A::operator!(int a);
virtual int A::operator!(double a);
To możesz spokojnie zdefiniować metody:
virtual int B::operator!(int a);
virtual int B::operator!(double a);

Nie możesz jednak stworzyć metod:
virtual char B::operator!(int a); //brak metody virtual char A::operator!(int a)
virtual int B::operator!(float a); //niezgodność typu parametru z virtual int B::operator!(double a);

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dzięki wielkie. Niestety nadal program coś mi się sypał, wiecznie widział operatory jako dwuznaczne. Problem rozwiązało przekabacenie całej macierzy na float - teraz i inty i floaty funkcjonują. Jedyną niedogodnością może być, że przy dzieleniu wywinie się za dużo miejsc po przecinku... Ale naprawienie tego to już nie za duży problem :)
Jeszcze raz dziękuję za odzew!

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam taką klasę, z przeciążonym operatorem:

class krawedz_grafu
{
int poczatek, koniec;
public:
ostream & operator << (ostream & str);
};

Następnie w drugiej klasie:

class graf_nieskierowany
{
list<krawedz_grafu> krawedzie;
list<krawedz_grafu>::iterator itk;
public:
void wypisz();
};

mam metodę wypisz:

void graf_nieskierowany::wypisz()
{
for(itk=krawedzie.begin(); itk!=krawedzie.end(); itk++)
cout << (*itk);
}

Problem jest niestety taki, że VS wywala mi błąd, że nie znajduje żadnego pasującego operatora. Czy ktoś może mi powiedzieć co robię nie tak?

EDIT: Chyba znalazłem odpowiedź. Operator w takiej formie jest używany jako obiekt << cout. Widzę, że będę musiał umieścić przeciążenie poza klasą.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 29.04.2013 o 12:08, Noirr napisał:

Problem jest niestety taki, że VS wywala mi błąd, że nie znajduje żadnego pasującego
operatora. Czy ktoś może mi powiedzieć co robię nie tak?
EDIT: Chyba znalazłem odpowiedź. Operator w takiej formie jest używany jako obiekt <<
cout. Widzę, że będę musiał umieścić przeciążenie poza klasą.

W przypadku operatorów i kłopotów z nimi należy po prostu użyć jawnej składni wywołania funkcji/metody. Np. Zamiast:
a += b
należy użyć
a.operator+=(b) lub operator+=(a,b)
zależnie od wersji jaką chcemy lub możemy użyć.
Wtedy komunikaty, które ewentualnie się pojawią będą precyzyjnie pokazywały w czym jest problem.
Czasem zmiana składni na wyrażeniową spowoduje pojawienia się ostrzeżenia lub błędu niejednoznaczności - ale wtedy dość łatwo poradzić sobie z takim czymś bo wiadomo co go spowodowało.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 09.05.2013 o 21:42, Dregorio napisał:

Swap jest tylko obsługiwany w C++? Jeśli tak, to co mam zrobić w C?


Napisać funkcje...


która robi coś, ala

//Schemat

np. dla inta

//Do funkcji przekazujesz adresy pamieci zmiennych. (wskaźniki)

void swap_int(x, y)
{
int tmp = x;
x = y;
y = tmp;
}

//Mam nadzieję, że czegoś nie przeoczyłem : )

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam problem.

Mam sortowanie bubblesort.java:
http://wklej.to/LYtWy

Muszę w mainie spowodować, że weźmie sortowanie z bubblesort i podstawi w odpowiednie miejsce stworzoną przeze mnie tablicę 10-elementową.

Czy mógłby mi ktoś pomóc?

Mam coś takiego:

package zadanie1;

public class Main {
public static void main(int[] tablica)
{
int[] tab ={1,55,33,89,102,321,2013,22,3,5,22};
Bubblesort bubble = new Bubblesort(tab[10]);
System.out.println(bubble);

}
}


i konsola wywala taki błąd:

Error: Main method not found in class zadanie1.Main, please define the main method as:
public static void main(String[] args)

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ć