Skocz do zawartości

Programowanie


xemi

Rekomendowane odpowiedzi

spojrzalem na to i dodalem troche swoich komentarzy

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Random;

public class NewClass {

public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader reader = new BufferedReader(new
InputStreamReader(System.in));

boolean wynik=false;
int ocena=0;
char a='a';
char b='b';
char c='c';
Random rand = new Random(); // co robi ten random?
while (wynik==false){
System.out.print("Odpowiedz na pytania i wpisz litere z poprawna odpowiedzia.");
System.out.print("Pytanie nr 1: 1+1=?");
System.out.print("a=2__b=3__c=4");
int odp = Integer.parseInt(reader.readLine()); 
if (odp==a){

ocena++;
wynik=false;
}
else if (odp==b || odp==c){ // po co sprawdzanie tego warunku skoro nic sie nie dzieje w petli?

}
System.out.print("Pytanie nr 2: 2+1=?");
System.out.print("a=2__b=3__c=8");
int odp2 = Integer.parseInt(reader.readLine());
if (odp2==b){

ocena++;
wynik=false;
}
else if (odp2==a || odp2==c){

System.out.print("Pytanie nr 3: 5-3=?");
System.out.print("a=1__b=8__c=2");
int odp3 = Integer.parseInt(reader.readLine());
if (odp3==c){

ocena++;
wynik=false;
}
else if (odp3==a || odp3==b);
wynik=false;
}

if (ocena==0){
System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene 0");
}
else if (ocena==1){
System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene 1");
}
else if (ocena==2){
System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene 2");
}
else if (ocena==3){
System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene 3");
System.in.read();
wynik=true;
}
}
// nie bardzo rozumiem idee takiego pseudosekwencyjnego dostepu do pytan
// byc moze to ma sens, ale ja go nie widze dlatego trudno mi to ocenic 
}
}

 

a ja tez mam problem:

 

Wykorzystaj stos do znalezienia otoczki wypukłej z wykorzystaniem algorytmu Grahama

Odnośnik do komentarza

No i dziala :)

 

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.IOException;

import java.util.Random;

 

public class szkola {

 

public static void main(String[] args) throws

NumberFormatException, IOException {

BufferedReader reader = new BufferedReader(new

InputStreamReader(System.in));

 

 

int ocena=0;

char a='a';

char b='b';

char c='c';

{

System.out.println("Odpowiedz na pytania i wpisz liczbe poprawnej odpowiedzi.");

System.out.println("");

System.out.println("Pytanie nr 1: 1+1=?");

System.out.println("1.=2 2.=3 3.=4");

int odp = Integer.parseInt(reader.readLine());

if (odp==1){

ocena++;

 

}

else if (odp==b || odp==c){

 

}

{

System.out.println("Pytanie nr 2: 2+1=?");

System.out.println("1.=2 2.=3 3.=8");

int odp2 = Integer.parseInt(reader.readLine());

if (odp2==2){

ocena++;

 

}

else if (odp2==a || odp2==c){

 

}

{

System.out.println("Pytanie nr 3: 5-3=?");

System.out.println("1.=1 2.=8 3.=2");

int odp3 = Integer.parseInt(reader.readLine());

if (odp3==3){

ocena++;

 

}

else if (odp3==a || odp3==b);

 

}

 

if (ocena==0){

System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene ndst");

System.in.read();

}

else if (ocena==1){

System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene dst");

System.in.read();

}

else if (ocena==2){

System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene db");

System.in.read();

}

else if (ocena==3){

System.out.println("Udzieliles "+ocena+" poprawnych odpowiedzi i uzyskales ocene bdb");

System.in.read();

 

 

}

}

}

}

}

 

Tylko jeszcze male pytanie czy da sie utworzyc zmienna ktora wczytuje z klawiatury by to byla litera? Bo nie bardzo wiem jak :/

Odnośnik do komentarza

@Manort, litera jest jednoelementowym Stringiem wiec ja bym go wczytywal StreamTokenizerem mniej wiecej tak jak to zrobilem

 

btw. ja mam tak wlasciwie dwa powazne problemy programistyczne, licze na pomoc:

4. Zaimplementuj klase kolejki priorytetowej z nieograniczona liczba priorytetów (im mniejsza liczba oznaczajaca priorytet tym on jest wa6niejszy). Wykorzystaj liste uporzadkowana kolejek FIFO, odpowiadajacej ka6demu priorytetowi. Nowa kolejka FIFO powinna pojawiac sie na liscie kolejek tylko w przypadku, gdy dodawany element ma priorytet jeszcze nie wystepujacy na liscie. Po zdjeciu ostatniego elementu z najwy6szym priorytetem lista kolejek powinna zostac skrócona. Przygotuj zestaw metod testujacych, wsród których beda losowo wykonywane operacje dodawania i usuwania elementów z kolejki, wraz z losowym ustalaniem priorytetu wstawianych elementów. Kolejno usuwane elementy powinny zostac zapisane do pliku.

 

5. Wykorzystaj stos do znalezienia otoczki wypukłej z wykorzystaniem algorytmu Grahama

Odnośnik do komentarza

Mam nowe zadanie do zrealizowania: mianowicie mam napisać symulację realizacji procesów według algorytmu Round Robin (algorytm rotacyjny). Napisałem wsio, ale wywala mi sie program podczas uruchomienia - wyjątek ClassCastException, który dla mnie jest zupełnie w tym przypadku bez sensu, bo przecież do listy dodaję tylko elementy typu Process.

Może ktoś będzie umiał mi pomóc?

 

Kod źródłowy:

package SJF.iterators;
public abstract interface Iterator {
 // Methods
 void previous();
 void next();
 void first();
 void last();
 boolean isDone();
 Object current();
}

package SJF.iterators;
public interface Iterable
{
Iterator iterator();
}

package SJF.lists;
import SJF.iterators.Iterator;
import java.util.Comparator;
// dwukierunkowa lista wiązana z wartownikiem wskazującym na początek i koniec listy
// element listy jest zdefiniowany jako wewnętrzna prywatna klasa
public class LinkedList implements List
{
private final Element _headAndTail = new Element(null); // wartownik 
private int _size;	// dlugość listy
private Comparator comparator;

public LinkedList(ProcessComparator comparator) 
  { 
	this.comparator = comparator;
	clear();
}

public LinkedList()
{
	comparator = new ProcessComparator();
	clear();
}

public void insert(Object value) throws IndexOutOfBoundsException 
{
	ValueIterator listIt = new ValueIterator();
	listIt.first();
	while(!listIt.isDone() && comparator.compare(value, listIt.current())>=0) 
	{
		listIt.next();
	}
	Element element = new Element(value);
	element.attachBefore(listIt._current);
	++_size;
}

public void add(Object value) throws IndexOutOfBoundsException 
{
	Element element = new Element(value);
	element.attachBefore(getElement(size()));
	++_size;
}

public Object delete(int index) throws IndexOutOfBoundsException {
	checkOutOfBounds(index);
	Element element = getElement(index);
	element.detach();
	--_size;
	return element.getValue();
}

public Object deleteObject(Object value)
{
	Element e = _headAndTail.getNext();
	while (e != _headAndTail && ! value.equals(e.getValue()))
		   e = e.getNext();
	if (e != _headAndTail) {
			e.detach(); 
			--_size; 
			return e;
		}
	else return null;
}

public boolean delete(Object value) 
{
	assert value != null : "Przekazana wartosc nie moze byc null";
	Element e = _headAndTail.getNext();
	while (e != _headAndTail && ! value.equals(e.getValue()))
		   e = e.getNext();
	if (e != _headAndTail) {
			e.detach(); --_size; return true;
		}
	else return false;
}

public void addElement(Object value) 
{ 
	assert value != null : "Przekazana wartosc nie moze byc null";
	new Element(value).attachBefore(_headAndTail); 
}

public boolean contains(Object value)
{ 
	assert value != null : "Przekazana wartosc nie moze byc null";
	return indexOf(value) != -1; 
}

public boolean isEmpty() 
{ 
	return _size == 0; 
}

public void clear() 
{
	_headAndTail.setPrevious(_headAndTail);
	_headAndTail.setNext(_headAndTail);
	_size = 0;
}

public Object set(int index, Object value) throws IndexOutOfBoundsException 
{
	assert value != null : "Przekazana wartosc nie moze byc null";
	checkOutOfBounds(index);
	Element element = getElement(index);
	Object oldValue = element.getValue();
	element.setValue(value);
	return oldValue;
}

public Object get(int index) throws IndexOutOfBoundsException 
{
	return getElement(index).getValue();
}

public Iterator iterator()
{  return new ValueIterator(); }

public int indexOf(Object value) 
{
	assert value != null : "Przekazana wartosc nie moze byc null";
	int index = 0;
	Element e = _headAndTail.getNext();
	while( e != _headAndTail && ! value.equals(e.getValue()))
		{ e = e.getNext(); ++index; }
	return e!=_headAndTail ? index : -1;
}

public int size() 
{
	return _size;
}

// wybór kierunku przeszukiwania przyspiesza działanie
// zapamiętanie ostatnio odczytywanego elementu i jego indeksu daje większe przyspieszenie
private Element getElement(int index) 
 {
	return index< _size/2 ? getElementForwards(index) : getElementBackwards(index); 
 }

// dojście do podanej pozycji w przód
private Element getElementForwards(int index) 
{
	Element element = _headAndTail.getNext();
	for (int i = index; i > 0; --i)
		element = element.getNext();
	return element;
}

private Element getElementBackwards(int index) 
{
	Element element = _headAndTail;
	for (int i = _size - index; i > 0; --i) 
		element = element.getPrevious();
	return element;
}
private void checkOutOfBounds(int index) throws IndexOutOfBoundsException 
{
	if (index < 0 || index >= size())
		throw new IndexOutOfBoundsException();
}

// pomocnicza klasa definiująca element listy   
private static final class Element 
{
	private Object _value;
	private Element _previous;
	private Element _next;

	public Element(Object value)
	{ 
		assert value != null : "Przekazana wartosc nie moze byc null";
		setValue(value); 
	}

	public void setValue(Object value)
	{ 
		assert value != null : "Przekazana wartosc nie moze byc null";
		_value = value;  
	}

	public Object getValue()
	{ 
		return _value;   
	}

	public Element getPrevious() 
	{ 
		return _previous;
	}

	public void setPrevious(Element previous)
	{ 
		_previous = previous; 
	}

	public Element getNext()
	{ 
		return _next; 
	}

	public void setNext(Element next)
	{ 
		_next = next; 
	}

	// wstaw dany (this) element przed element next
	public void attachBefore(Element next) 
	{
		Element previous = next.getPrevious();
		setNext(next);
		setPrevious(previous);
		next.setPrevious(this);
		previous.setNext(this);
	}
	public void detach() 
	{
		_previous.setNext(_next);
		_next.setPrevious(_previous);
	}

	public String toString()
	{
		String mem = super.toString();
		return mem+" "+getValue();
	}
}	
// iterator po wartościach elementów listy
private final class ValueIterator implements Iterator 
{
	private Element _current = _headAndTail;
	public void first() 
	{ 
		_current = _headAndTail.getNext(); 
	}

	public void last() 
	{ 
		_current = _headAndTail.getPrevious(); 
	}

	public boolean isDone() 
	{ 
		return _current == _headAndTail; 
	}

	public void next() 
	{ 
		_current = _current.getNext(); 
	}

	public void previous() 
	{ 
		_current = _current.getPrevious(); 
	}

	public Object current() throws IndexOutOfBoundsException 
	{
		if (isDone())
			throw new IndexOutOfBoundsException();
		return _current.getValue();
	}
}
}

package RR;
public class Process 
{
private int identifier; // identyfikator procesu
private int arrivalTime; // czas przybycia procesu
private int processingTime; // czas realizacji procesu
private final int maxProcessingTime; // maksymalny czas realizacji procesu
private int idCounter = 0; // licznik procesow - zwiekszany gdy dodajemy proces

public Process(int arrivalTime)
{
	maxProcessingTime = 250;
	identifier = idCounter++;
	this.arrivalTime = arrivalTime;
	processingTime = (int) (1 + (Math.random()*maxProcessingTime));
}

public int getArrivalTime()
{
	return arrivalTime;
}

public int getProcessingTime()
{
	return processingTime;
}

public int getIdentifier()
{
	return identifier;
}

}

package RR;
import SJF.lists.*;
import SJF.iterators.*;
public class ProcessQueue 
{
	private List list; // lista procesow (jako kolejka)
private int numServed; // liczba obslugiwanych procesow
private int totalWait; // laczny czas oczekiwania procesow
private final double arrivalRate = 0.5; // sredni czas przychodzenia nowego procesu

ProcessQueue()
{
	list = new LinkedList();
	numServed = 0;
	totalWait = 0;
}

public void checkNewArrival(int clock)
{
	if (Math.random() < arrivalRate)
	{
		Process temp = new Process(clock);
		list.add(temp);
		System.out.println("Czas "+clock+", nowy proces w liscie"+", nowy rozmiar listy "+list.size()+
				", czas wykonywania procesu: "+temp.getProcessingTime()+".");
	}
}

public int update(int clock, Process proces)
{
	Process nextProcess = (Process)list.deleteObject(proces);
	int timeInterval = nextProcess.getArrivalTime();
	int wait = clock - timeInterval;
	totalWait += wait;
	numServed++;
	System.out.println("Czas "+clock+", zdjecie procesu z kolejki ze znacznikiem czasowym "+timeInterval+"," +
			" czas wykonania procesu zdjetego z listy: "+nextProcess.getProcessingTime()+".");
	return clock + nextProcess.getProcessingTime();
}

public int getNumServed()
{
	return numServed;
}

public int getTotalWait()
{
	return totalWait;
}

public boolean isEmpty()
{
	return list.isEmpty();
}

public int getSize()
{
	return list.size();
}

public Iterator iterator()
{
	return list.iterator();
}

}

package RR;
import SJF.iterators.Iterator;
import java.io.BufferedReader;
import java.io.StreamTokenizer;
import java.io.InputStreamReader;
import java.io.IOException;

public class Simulation 
{

private ProcessQueue pq = new ProcessQueue(); // kolejka (ze wspolczynnikiem)
private int totalTime; // laczny czas symulacji
private int clock = 0; // zegar symulacji
private int timeDone; // po jakim czasie zostanie obsluzony nastepny proces

public void enterData() throws IOException
{
	StreamTokenizer input = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	System.out.println("===================================================================");
	System.out.println("Witamy w systemie do symulacji ruchu procesow w kolejce.");
	System.out.println("Aby uruchomic symulacje potrzebne sa pewne parametry wejsciowe.");
	System.out.println("Prosze podac laczny czas symulacji w minutach");
	input.nextToken();
	totalTime = (int) input.nval;
}

public void runSimulation()
{
	for (clock = 0; clock < totalTime; clock++)
	{			
		pq.checkNewArrival(clock);
		Iterator iterator = pq.iterator();
		for (iterator.first(); !iterator.isDone(); iterator.next())
		{
			if (clock >= timeDone)
			{
				if (!pq.isEmpty())
				{
					timeDone = pq.update(clock, (Process)iterator.current());
				}
			}
		}
	}
}


public void showStats()
{
	System.out.println("================================================");
	System.out.println("Laczna liczba obsluzonych procesow: "+pq.getNumServed());
	double averageWaitingTime = (double) pq.getTotalWait() / (double) pq.getNumServed();
	System.out.println("Ze srednim czasem oczekiwania wynoszacym: "+averageWaitingTime);
	System.out.println("Laczny czas obslugi procesow: "+pq.getTotalWait());
	System.out.println("Laczna liczba procesow w kolejce: "+pq.getSize());
	System.out.println("=================================================");
}

public int getTotalTime()
{
	return totalTime;
}

}

package RR;
import java.io.*;
public class Main 
{

public static void main(String [] args) throws IOException
{
	Simulation simulation = new Simulation();
	simulation.enterData();
	simulation.runSimulation();
	simulation.showStats();
	System.exit(-1);
}
}

Odnośnik do komentarza

Mozliwe, a nawet mocno prawdopodobne (uzywasz jakiegos IDE typu Eclipse czy cos ?) jest to, ze ClassCast leci dlatego iz:

1. w klasie LinkedList implementujesz List

2. implementujesz metode iterator(); , ktora wg API zwracac ma jakis iterator implementujacy taki interfejs - java.util.Iterator, ty tymczasem zwracasz return new ValueIterator();, ktory implementuje twoj wlasny interfejs - Iterator z pakietu sjf.Iterators, nie zwiazany nijak z java.util.Iterator

Odnośnik do komentarza

Mam nadzieje, ze ktos z was bedzie mogl mi pomoc. W zasadzie to prosta sprawa, ale jakos nie moge sobie z tym dac rady. Chodzi o to, ze w pracy mam kompy do testowania oprogramowania. Po nowej instalacji systemu jest robiony image. Jednak nikt nie dba o te kompy i zostawia swoje smieci (pliki) zawsze na partycji D. Potrzebowalbym cos co po ponownym wczytaniu imagu formatuje partycje D, ale nie robi tego przy kazdym nowym wlaczeniu komputera, tylko ten jeden raz. Moze mi ktos pomoc?

Odnośnik do komentarza
Taa - tylko robiąc to co napisał Manort, otrzymasz format przy każdym załadowaniu autoexeca, czyli po każdym restarcie kompa :> O to Ci chodzi?

Nie ale odkrylem mozliwosc ze ten plik sam sie moze kasowac, wiec mam to co chcialem :) Formatuje i sie sam sie kasuje.

Odnośnik do komentarza

Dobra, mam nastepny problem :] Musze napisac metody generujace i zapisujace do pliku liczby, ktore ukladaja sie w ciag monotoniczny. Ma byc takich metod cztery rodzaje: ciag monotoniczny, ciag scisle monotoniczny, ciag monotoniczny z elementami zaburzajacymi monotonicznosc (np. 5% takich elementow) i ciag scisle monotoniczny z elementami zaburzajacymi jego monotonicznosc (tez, np. 5% takich elementow) - do tego co prawda dochodza jeszcze inne rodzaje ciagow, ale z pozostalymi sobie poradzilem wiec nie warto o tym pisac

generalnie to generatory "prawie" dzialaja - to znaczy zachowana jest monotonicznosc (w wiekszosci przypadkow), ale niepokoi mnie to, ze w tych ciagach bardzo duzo elementow sie powtarza - nie podoba mi sie to, ale nie wiem jak to wyeliminowac

wstepnie chcialem to zrobic na tablicach, ale stwierdzilem ze to zbyt nieefektywne i udalo mi sie zrobic znacznie prosciej - na dwoch zmiennych :) jedna pamieta wartosc obecnie wpisywana jako kolejny wyraz ciagu, a druga wyraz poprzedni - dzieki temu pilnuje monotonicznosci

 

package Generators;
import java.io.*;
public class Generator {

public static void generateRandom(int size, int up, int down, String file) throws IOException
{
	PrintWriter print = new PrintWriter(new BufferedWriter(new FileWriter(file)));
	int number;
	for (int i=0; i<size; i++)
	{
		number = (int) (Math.random()*(up - down)+down);
		print.println(number);
	}
	print.close();
}

public static void generateRandomMonotonic(int size, boolean mnt, int up, int down, String file)
		throws IOException
{
	PrintWriter print = new PrintWriter(new BufferedWriter(new FileWriter(file)));
	int number = (int) (Math.random()*(up-down)+down);
	print.println(number);
	if (mnt == true)
	{
		int temp = down;
		int i=1;
		while (i<size)
		{
			if (number >= temp)
			{
				temp = number;
				number = (int) (Math.random()*(up-down)+down);
				print.println(temp);
				i++;
			}
			else
			{
				number += (temp - number);
				i++;
			}
		}
	}
	else
	{
		int temp = up;
		int i=1;
		while (i<size)
		{
			if (number <= temp)
			{
				temp = number;
				number = (int) (Math.random()*(up-down)+down);
				print.println(temp);
				i++;
			}
			else
			{
				number -= (number - temp);
				i++;
			}
		}
	}
	print.close();
}

public static void generateRandomIntenselyMonotonic(int size, boolean mnt, 
		int up, int down, String file) throws IOException
{
	PrintWriter print = new PrintWriter(new BufferedWriter(new FileWriter(file)));
	int number;
	if (mnt == true)
	{
		int temp = down;
		print.println(temp);
		int i=1;
		while (i<size)
		{
			number = (int) (Math.random()*(up-down)+down);
			if (number > temp)
			{
				temp = number;
				print.println(temp);
				i++;
			}
			else
			{
				number += (temp - number + 1);
				print.println(number);
				i++;
			}
		}
	}
	else
	{
		int temp = up;
		int i=1;
		while (i<size)
		{
			number = (int) (Math.random()*(up-down)+down);
			if (number < temp)
			{
				temp = number;
				print.println(temp);
				i++;
			}
			else
			{
				number -= (number - temp - 1);
				print.println(number);
				i++;
			}
		}
	}
	print.close();

}

public static void generateRandomMonotonicWithGarbage (int size, boolean mnt, 
		double ratio, int up, int down, String file) throws IOException
{
	PrintWriter print = new PrintWriter(new BufferedWriter(new FileWriter(file)));
	int numberOfGarbage = (int) (size * ratio);
	int number;
	int counter = 0;
	if (mnt == true)
	{
		int temp = down;
		print.println(temp);
		int i=1;
		while (i<size)
		{
			number = (int) (Math.random()*(up-down)+down);
			if (number >= temp)
			{
				temp = number;
				print.println(temp);
				i++;
			}
			else
			{
				if (counter < numberOfGarbage)
				{
					print.println(number);
					i++;
					counter++;
				}
				else
				{
					number += (number - temp + 1);
					print.println(number);
					i++;
				}
			}
		}
	}
	else
	{
		int temp = up;
		print.println(temp);
		int i=1;
		while (i<size)
		{
			number = (int) (Math.random()*(up-down)+down);
			if (number <= temp)
			{
				temp = number;
				print.println(temp);
				i++;
			}
			else
			{
				if (counter < numberOfGarbage)
				{
					print.println(number);
					i++;
					counter++;
				}
				else
				{
					number -= (number - temp - 1);
					print.println(number);
					i++;
				}
			}
		}
	}
	print.close();   
}

public static void generateConstant(int size, int up, int down, String file) throws IOException
{
	PrintWriter print = new PrintWriter(new BufferedWriter(new FileWriter(file)));
	int number = (int) (Math.random()*(up - down) + down);
	for (int i=0; i<size; i++)
	{
		print.println(number);
	}
	print.close();
}

public static void main(String [] args) throws IOException
{
	generateRandom(100, 1000, 100, "random.txt");
	generateRandomMonotonic(100, true, 1000, 100, "monotonicR.txt");
	generateRandomMonotonic(100, false, 1000, 100, "monotonicF.txt");
	generateRandomIntenselyMonotonic(100, true, 1000, 100, "intenselyMonotonicR.txt");
	generateRandomIntenselyMonotonic(100, false, 1000, 100, "intenselyMonotonicF.txt");
	generateRandomMonotonicWithGarbage(100, true, 0.1, 1000, 100, "monotonicWithGarbageR.txt");
	generateRandomMonotonicWithGarbage(100, false, 0.1, 1000, 100, "monotonicWithGarbageF.txt");
	generateConstant(100, 1000, 100, "constant.txt");
}

}

Odnośnik do komentarza

Musialbys w swoich metodach te generowane liczby dodawac do Listy (a scislej mowiac do LinkedHashSet) i dopiero potem taka cala kolekcje zapisywac do pliku.

 

LinkedHashSet implementuje interfejs Set, a co za tym idzie, dba o unikalnosc obiektow w kolekcji. Jesli masz np. Integer = 5, to drugiej piatki juz do Set'a nie dodasz. Natomiast ty uzylbys LinkedHashSet, a nie zwykly HashSet, bo zwykly HashSet jest mapa, nie dbajaca o kolejnosc, a jak mniemam w ciagu chcesz miec jakas kolejnosc :D

 

No chyba, ze cos masz skopane w logice algorytmu i nigdy nie powinien generowac powtarzajacych sie liczb...

Odnośnik do komentarza

Temat: Obliczanie funkcji kwadratowej i rysowanie wykresu tej funkcji. - Zaliczenie.

 

Program liczacy napisalem ale gorzej z rysowaniem wykresu :(. Moze ktos pomoc?

 

import java.util.*;

public class pierwiastki{
public static void main(String[] args) {
int a=0, b=0, c=0;
	double delta,wynik;

Scanner wejscie=new Scanner(System.in);
if(wejscie.hasNextInt()){
	a=wejscie.nextInt();
}
if(wejscie.hasNextInt()){
	b=wejscie.nextInt();
}
if(wejscie.hasNextInt()){
	c=wejscie.nextInt();
}

	//wyswietla parametry równania

	System.out.println("Parametry równania: \n");
	System.out.println("A:"+a+"\n"+"B:"+b+"\n"+"C:"+c+ "\n");

	//Sprawdzenie czy równanie jest kwadratowe !!!
	//jezeli a jest równe zero to rownanie nie jest kwadratowe

	if (a==0) {
				System.out.println("To nie jet równanie kwadratowe: A = 0 !!!");
		}else {													  //jezeli A jest rózne od zera to rownanie jest kwadratowe
																						 //obliczanie delty
					delta=b*b-4*a*c;
																	 //jezeli delta jest mniejsza od zera
			if (delta<0){
					System.out.println("Delta < 0 \n wiec to równanie niema rozwiazan");
				}else if (delta==0){
										wynik=-b/2*a;				 //oblicza wynik
										System.out.println("Rozwiazanie: x="+wynik);
					}else{											 // (delta>0) jezeli delta wieksza od zera

							//oblicza wyniki
					wynik=(-b-Math.sqrt(delta))/2*a;
					wynik=(-b+Math.sqrt(delta))/2*a;
											System.out.println("Rozwiazanie x1:"+wynik);
											System.out.println("Rozwiazanie x2:"+wynik);
					}
	}
}

}

Odnośnik do komentarza

na rysowaniu sie nie znam wiec ci nie pomoge

ale sam tez mam problem

musze napisac metode ktora dzieli liste na dwie inne, z ktorych lewa ma zawiera elementy nieparzyste z listy macierzystej, a prawa elementy parzyste

napisalem to tak:

private List mergesort(List list)
{
	if (list.size()==1)
	{
		List result = new LinkedList();
		result.add(list.get(0));
		return result;
	}

	List leftlist = new LinkedList();
	List rightlist = new LinkedList();
	Iterator iterator = list.iterator();
	iterator.first();
	while (!iterator.isDone())
	{
		leftlist.add(iterator.current());
		iterator.next();
		if (!iterator.isDone()) rightlist.add(iterator.current());
		iterator.next();
	}

	// sortowanie lewej polowki
	List left = mergesort(leftlist);

	// sortowanie prawej polowki
	List right = mergesort(rightlist);

	// laczenie posortowanych polowek
	return merge(left, right);		
}

generalnie metoda jest mi potrzebna do tego zeby napisac zmodyfikowana wersje sortowania mergesort - normalnie w nim nastepuje rekurencyjne dzielenie listy na dwie przez branie jej lewej i prawej polowki

 

gdy uruchomie program ktory ma posortowac te dane to wywala sie on wlasnie na tej metodzie - wyrzucony zostaje blad OutOfMemoryError: java heap space

 

bardzo prosze o pomoc tak szybko jak to mozliwe

 

edyta podpowiada ze sprobowalem zmienic metode w ten sposob, ze tworze sobie te dwie listy juz w konstruktorze, a w tej metodzie tylko czyszcze te list przed kazdorazowym dodawaniem elementow do metod, ale wowczas pojawia mi sie blad StackOverFlowExcception :| obawiam sie, ze po prostu mam zle napisany warunek bazowy rekurencji..

Odnośnik do komentarza

a to dzielenie musi byc rekurencyjne ?

 

Na pierwszy rzut oka, na pewno kuleje algorytm rekurencyjny.

 

Powiedzmy, ze list ma rozmiar 3. Wiec teoretycznie za petla while bedziemy mieli w lewej liscie 2 elementy, a w prawej liscie 1 element.

 

Po czym zaczynasz sortowanie lewej polowki, majacej 2 elementy. No i znow, jedziesz w petli while, do lewej listy dodasz 1 element, do prawej listy dodasz 1 element. No i znow zaczynasz sortowanie lewej polowki. I tak do usranej smierci (czyt. OutOfMemoryError ;d ).

 

 

Troche szczerze mowiac zgubilem sie do czego to ma sluzyc :D

 

	public static void main(String[] args) {
	List<Integer> testList = new ArrayList<Integer>();
	testList.add(new Integer(5));
	testList.add(new Integer(54));
	testList.add(new Integer(24));

	Bla bla = new Bla();
	Map leftRightLists = bla.mergesort(testList);

	List leftList = (List) leftRightLists.get("left");
	List rightList = (List) leftRightLists.get("right");

	System.out.println(leftList);
	System.out.println(rightList);

}

private boolean remainderExists(int i) {
	int rest = i % 2;
	if (rest == 0) {
		return false;
	} else {
		return true;
	}
}

private Map mergesort(List list) {
	Map<String, List> lists = new HashMap<String, List>();
	List<Object> left = new ArrayList<Object>();
	List<Object> right = new ArrayList<Object>();

	for (int i = 0; i < list.size(); i++) {

		if (remainderExists(i+1)) {
			left.add(list.get(i));
		} else {
			right.add(list.get(i));
		}
	}

	lists.put("left", left);
	lists.put("right", right);

	return lists;
}

 

rezultat dzialania powyzszego kodu to mapa, majaca w sobie dwie listy: LEWA - [5, 24], PRAWA - [54]

 

 

Troche nie czaje tego co ta twoja metoda ma robic. Dostarczasz liste, ktore dzielisz na dwie listy - parzysta i nieParzysta, po czym znow mergujesz je w jedna ? Rzuc jakis przyklad lopatologiczny, jak ma to dzialac :)

Odnośnik do komentarza

Odnosnie rysowania, hmm sam nie wiem. Przy tym jest troche siedzenia - zalezy co tam macie na uczelni / szkole bo mozna to zrobic na 10'tki sposob, ale przy niklej wiedzy, tak naprawde kazdy bedzie pojebany

 

Mozesz:

1. Zrobic applet i tam pokazywac

2. Mozesz zrobic to w Java Swing

3. Mozesz zrobic uzywajac do tego np. biblioteki JFreeChart (tutaj masz rozne example wykresow z kodem: http://www.java2s.com/Code/Java/Chart/CatalogChart.htm)

4. Mozesz uzywac bilbioteki POI i za jej pomoca narysowac wykres w excelu

5. wiele innych

 

Jednak tak naprawde kazdy z tych sposobow jest czasochlonny i wymaga zapoznania sie z tematem. Chyba stosunkowo najprostszy jest JFreeChart, ale nie jestem pewien czy mozna tam w latwy sposob narysowac funkcje nieliniowa (Ciebie chyba by interesowalo cos z gatunku Line Chart i tam jest taki przyklad jak NormalDistributionDemo, ktory rysuje jakas funkcje nieliniowa). Ogolnie, tak naprawde nie jest to latwe zadanie.

 

moze jutro mi sie uda jakiegos exampla zrobic, ale to zalezy od tego czy bede mial mlyn w pracy :D

Odnośnik do komentarza

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.   Usuń 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ć obrazków. Dodaj lub załącz obrazki z adresu URL.

Ładowanie
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...