diff --git a/1ano/2semestre/labi/tema03/src/tcp_chat_server.py b/1ano/2semestre/labi/tema03/src/tcp_chat_server.py new file mode 100644 index 0000000..6831757 --- /dev/null +++ b/1ano/2semestre/labi/tema03/src/tcp_chat_server.py @@ -0,0 +1,56 @@ +# encoding=utf-8 + +import socket +import select + +def main (): + tcp_s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) + tcp_s.bind (("0.0.0.0", 8080)) + tcp_s.listen (10) + connections = [] + + connections.append (tcp_s) + print ("Chat server started") + + while 1: + # Get the list sockets which are ready to be read through select + read_sockets = select.select (connections, [], [])[0] + + for sock in read_sockets: + #New connection + if sock == tcp_s: + # Handle the case in which there is a new connection received through server_socket + client_s, addr = tcp_s.accept () + connections.append (client_s) + print ("Client connected: %s" % str (addr)) + else: + #Some incoming message from a client, process it + try: + # Incoming message + data = sock.recv (4096) + if len (data) != 0: + print ("From client: %s" % str (sock.getpeername())) + print ("Got Data: " + data.decode ('utf-8')) + + else: + print ("Client disconnected: %s" % str (sock.getpeername())) + sock.close() + connections.remove (sock) + break + + #Do not send the message to master socket + #Create the message identifying the client + message = ('<' + " Fom client: " + str(sock.getpeername()) + '> \n').encode('utf-8') + data.upper() + for client in connections: + if client != tcp_s: # Eventually do not send the message to the source client !!! + client.send (message) + + except: + print ("Client socket error: %s" % str (addr)) + sock.close() + connections.remove (sock) + continue + + tcp_s.close() + +main () diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin2Bcd.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin2Bcd.vhd new file mode 100644 index 0000000..bedb343 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin2Bcd.vhd @@ -0,0 +1,37 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity Bin2Bcd is + port + ( + hexIn : in std_logic_vector(3 downto 0); + decOut0 : out std_logic_vector(3 downto 0); + decOut1 : out std_logic_vector(3 downto 0) + ); +end Bin2Bcd; + +architecture Behavioral of Bin2Bcd is +begin + process (hexIn) is + begin + if hexIn < "1010" then + decOut0 <= hexIn; + decOut1 <= "0000"; + else + if hexIn = "1010" then + decOut0 <= "0000"; + elsif hexIn = "1011" then + decOut0 <= "0001"; + elsif hexIn = "1100" then + decOut0 <= "0010"; + elsif hexIn = "1101" then + decOut0 <= "0011"; + elsif hexIn = "1110" then + decOut0 <= "0100"; + else + decOut0 <= "0101"; + end if; + decOut1 <= "0001"; + end if; + end process; +end Behavioral; diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin7SegDecoder.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin7SegDecoder.vhd new file mode 100644 index 0000000..8f3ce08 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Bin7SegDecoder.vhd @@ -0,0 +1,24 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity Bin7SegDecoder is + port + ( + binInput : in std_logic_vector(3 downto 0); + decOut_n : out std_logic_vector(6 downto 0) + ); +end Bin7SegDecoder; + +architecture Behavioral of Bin7SegDecoder is +begin + decOut_n <= "1111001" when (binInput = "0001") else --1 + "0100100" when (binInput = "0010") else --2 + "0110000" when (binInput = "0011") else --3 + "0011001" when (binInput = "0100") else --4 + "0010010" when (binInput = "0101") else --5 + "0000010" when (binInput = "0110") else --6 + "1111000" when (binInput = "0111") else --7 + "0000000" when (binInput = "1000") else --8 + "0010000" when (binInput = "1001") else --9 + "1000000"; --0 +end Behavioral; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Counter.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Counter.vhd new file mode 100644 index 0000000..2ef53b6 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Counter.vhd @@ -0,0 +1,31 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.NUMERIC_STD.all; + +entity Counter is + port + ( + clk : in std_logic; + reset : in std_logic; + start : in std_logic; + count : out std_logic_vector(3 downto 0) + ); +end Counter; + +architecture Behavioral of Counter is + signal s_count : unsigned(3 downto 0) := to_unsigned(0, 4); +begin + process(clk, reset) + begin + if (reset = '1') then + s_count <= to_unsigned(0, 4); + elsif (start = '1' and rising_edge(clk)) then + if (std_logic_vector(s_count) = "1111") then + s_count <= to_unsigned(0, 4); + else + s_count <= s_count + 1; + end if; + end if; + end process; + count <= std_logic_vector(s_count); +end Behavioral; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterDemo.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterDemo.vhd new file mode 100644 index 0000000..84bd6f7 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterDemo.vhd @@ -0,0 +1,79 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.NUMERIC_STD.all; + +entity CounterDemo is + port + ( + CLOCK_50 : in std_logic; + KEY : in std_logic_vector(1 downto 0); + HEX0 : out std_logic_vector(6 downto 0); + HEX1 : out std_logic_vector(6 downto 0) + ); +end CounterDemo; + +architecture Shell of CounterDemo is + signal s_pulse, s_reset, s_toggle : std_logic; + signal s_count : std_logic_vector(3 downto 0); + + signal s_startStop : std_logic := '1'; + + signal s_display0, s_display1 : std_logic_vector(3 downto 0); +begin + s_reset <= not KEY(1); + + pulse_gen : entity work.pulse_gen(Behavioral) + generic map (MAX => 20_000_000) + port map + ( + clk => CLOCK_50, + pulse => s_pulse + ); + + key_debounce : entity work.Debouncer(Behavioral) + port map + ( + refClk => CLOCK_50, + dirtyIn => KEY(0), + pulsedOut => s_toggle + ); + + start_stop : entity work.ToggleSwitch(Behavioral) + port map + ( + toggle => s_toggle, + reset => s_reset, + startStop => s_startStop + ); + + counter : entity work.Counter(Behavioral) + port map + ( + clk => s_pulse, + reset => s_reset, + start => s_startStop, + count => s_count + ); + + bin2bcd : entity work.Bin2Bcd(Behavioral) + port map + ( + hexIn => s_count, + decOut0 => s_display0, + decOut1 => s_display1 + ); + + display0 : entity work.Bin7SegDecoder(Behavioral) + port map + ( + binInput => s_display0, + decOut_n => HEX0 + ); + + display1 : entity work.Bin7SegDecoder(Behavioral) + port map + ( + binInput => s_display1, + decOut_n => HEX1 + ); +end Shell; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterSimulation.vwf b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterSimulation.vwf new file mode 100644 index 0000000..8cbcfa2 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterSimulation.vwf @@ -0,0 +1,311 @@ +/* +quartus_eda --gen_testbench --tool=modelsim_oem --format=vhdl --write_settings_files=off CounterDemo -c CounterDemo --vector_source="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterSimulation.vwf" --testbench_file="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/simulation/qsim/CounterSimulation.vwf.vht" +quartus_eda --gen_testbench --tool=modelsim_oem --format=vhdl --write_settings_files=off CounterDemo -c CounterDemo --vector_source="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/CounterSimulation.vwf" --testbench_file="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/simulation/qsim/CounterSimulation.vwf.vht" +quartus_eda --write_settings_files=off --simulation --functional=on --flatten_buses=off --tool=modelsim_oem --format=vhdl --output_directory="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/simulation/qsim/" CounterDemo -c CounterDemo +quartus_eda --write_settings_files=off --simulation --functional=off --flatten_buses=off --timescale=1ps --tool=modelsim_oem --format=vhdl --output_directory="/home/tiagorg/repos/uaveiro-leci/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/simulation/qsim/" CounterDemo -c CounterDemo +onerror {exit -code 1} +vlib work +vcom -work work CounterDemo.vho +vcom -work work CounterSimulation.vwf.vht +vsim -c -t 1ps -L cycloneive -L altera -L altera_mf -L 220model -L sgate -L altera_lnsim work.CounterDemo_vhd_vec_tst +vcd file -direction CounterDemo.msim.vcd +vcd add -internal CounterDemo_vhd_vec_tst/* +vcd add -internal CounterDemo_vhd_vec_tst/i1/* +proc simTimestamp {} { + echo "Simulation time: $::now ps" + if { [string equal running [runStatus]] } { + after 2500 simTimestamp + } +} +after 2500 simTimestamp +run -all +quit -f + +onerror {exit -code 1} +vlib work +vcom -work work CounterDemo.vho +vcom -work work CounterSimulation.vwf.vht +vsim -novopt -c -t 1ps -sdfmax CounterDemo_vhd_vec_tst/i1=CounterDemo_vhd.sdo -L cycloneive -L altera -L altera_mf -L 220model -L sgate -L altera_lnsim work.CounterDemo_vhd_vec_tst +vcd file -direction CounterDemo.msim.vcd +vcd add -internal CounterDemo_vhd_vec_tst/* +vcd add -internal CounterDemo_vhd_vec_tst/i1/* +proc simTimestamp {} { + echo "Simulation time: $::now ps" + if { [string equal running [runStatus]] } { + after 2500 simTimestamp + } +} +after 2500 simTimestamp +run -all +quit -f + +vhdl +*/ +/* +WARNING: Do NOT edit the input and output ports in this file in a text +editor if you plan to continue editing the block that represents it in +the Block Editor! File corruption is VERY likely to occur. +*/ + +/* +Copyright (C) 2020 Intel Corporation. All rights reserved. +Your use of Intel Corporation's design tools, logic functions +and other software and tools, and any partner logic +functions, and any output files from any of the foregoing +(including device programming or simulation files), and any +associated documentation or information are expressly subject +to the terms and conditions of the Intel Program License +Subscription Agreement, the Intel Quartus Prime License Agreement, +the Intel FPGA IP License Agreement, or other applicable license +agreement, including, without limitation, that your use is for +the sole purpose of programming logic devices manufactured by +Intel and sold by Intel or its authorized distributors. Please +refer to the applicable agreement for further details, at +https://fpgasoftware.intel.com/eula. +*/ + +HEADER +{ + VERSION = 1; + TIME_UNIT = ns; + DATA_OFFSET = 0.0; + DATA_DURATION = 1000.0; + SIMULATION_TIME = 0.0; + GRID_PHASE = 0.0; + GRID_PERIOD = 10.0; + GRID_DUTY_CYCLE = 50; +} + +SIGNAL("clk") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = INPUT; + PARENT = ""; +} + +SIGNAL("count") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = BUS; + WIDTH = 4; + LSB_INDEX = 0; + DIRECTION = OUTPUT; + PARENT = ""; +} + +SIGNAL("count[3]") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = OUTPUT; + PARENT = "count"; +} + +SIGNAL("count[2]") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = OUTPUT; + PARENT = "count"; +} + +SIGNAL("count[1]") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = OUTPUT; + PARENT = "count"; +} + +SIGNAL("count[0]") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = OUTPUT; + PARENT = "count"; +} + +SIGNAL("reset") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = INPUT; + PARENT = ""; +} + +SIGNAL("start") +{ + VALUE_TYPE = NINE_LEVEL_BIT; + SIGNAL_TYPE = SINGLE_BIT; + WIDTH = 1; + LSB_INDEX = -1; + DIRECTION = INPUT; + PARENT = ""; +} + +TRANSITION_LIST("clk") +{ + NODE + { + REPEAT = 1; + NODE + { + REPEAT = 50; + LEVEL 0 FOR 10.0; + LEVEL 1 FOR 10.0; + } + } +} + +TRANSITION_LIST("count[3]") +{ + NODE + { + REPEAT = 1; + LEVEL X FOR 1000.0; + } +} + +TRANSITION_LIST("count[2]") +{ + NODE + { + REPEAT = 1; + LEVEL X FOR 1000.0; + } +} + +TRANSITION_LIST("count[1]") +{ + NODE + { + REPEAT = 1; + LEVEL X FOR 1000.0; + } +} + +TRANSITION_LIST("count[0]") +{ + NODE + { + REPEAT = 1; + LEVEL X FOR 1000.0; + } +} + +TRANSITION_LIST("reset") +{ + NODE + { + REPEAT = 1; + LEVEL 0 FOR 40.0; + LEVEL 1 FOR 50.0; + LEVEL 0 FOR 910.0; + } +} + +TRANSITION_LIST("start") +{ + NODE + { + REPEAT = 1; + LEVEL 1 FOR 1000.0; + } +} + +DISPLAY_LINE +{ + CHANNEL = "clk"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 0; + TREE_LEVEL = 0; +} + +DISPLAY_LINE +{ + CHANNEL = "reset"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 1; + TREE_LEVEL = 0; +} + +DISPLAY_LINE +{ + CHANNEL = "start"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 2; + TREE_LEVEL = 0; +} + +DISPLAY_LINE +{ + CHANNEL = "count"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 3; + TREE_LEVEL = 0; + CHILDREN = 4, 5, 6, 7; +} + +DISPLAY_LINE +{ + CHANNEL = "count[3]"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 4; + TREE_LEVEL = 1; + PARENT = 3; +} + +DISPLAY_LINE +{ + CHANNEL = "count[2]"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 5; + TREE_LEVEL = 1; + PARENT = 3; +} + +DISPLAY_LINE +{ + CHANNEL = "count[1]"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 6; + TREE_LEVEL = 1; + PARENT = 3; +} + +DISPLAY_LINE +{ + CHANNEL = "count[0]"; + EXPAND_STATUS = COLLAPSED; + RADIX = Binary; + TREE_INDEX = 7; + TREE_LEVEL = 1; + PARENT = 3; +} + +TIME_BAR +{ + TIME = 0; + MASTER = TRUE; +} +; diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Debouncer.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Debouncer.vhd new file mode 100644 index 0000000..5218ac4 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/Debouncer.vhd @@ -0,0 +1,61 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; +use IEEE.NUMERIC_STD.all; + +entity Debouncer is + generic( kHzClkFreq : positive := 50_000; + mSecMinInWidth : positive := 100; + inPolarity : std_logic := '0'; + outPolarity : std_logic := '1'); + port( refClk : in std_logic; + dirtyIn : in std_logic; + pulsedOut : out std_logic); +end Debouncer; + +architecture Behavioral of Debouncer is + constant MIN_IN_WIDTH_CYCLES : positive := mSecMinInWidth * kHzClkFreq; + subtype TCounter is natural range 0 to MIN_IN_WIDTH_CYCLES; + signal s_debounceCnt : TCounter := 0; + signal s_dirtyIn, s_previousIn, s_pulsedOut : std_logic; +begin + + in_sync_proc : process(refClk) + begin + if (rising_edge(refClk)) then + if (inPolarity = '1') then + s_dirtyIn <= dirtyIn; + else + s_dirtyIn <= not dirtyIn; + end if; + s_previousIn <= s_dirtyIn; + end if; + end process; + + count_proc : process(refClk) + begin + if (rising_edge(refClk)) then + if ((s_dirtyIn = '0') or + (s_debounceCnt > MIN_IN_WIDTH_CYCLES)) then + s_debounceCnt <= 0; + s_pulsedOut <= '0'; + elsif (s_dirtyIn = '1') then + if (s_previousIn = '0') then + s_debounceCnt <= MIN_IN_WIDTH_CYCLES; + s_pulsedOut <= '0'; + else + if (s_debounceCnt >= 1) then + s_debounceCnt <= s_debounceCnt - 1; + end if; + if (s_debounceCnt = 1) then + s_pulsedOut <= '1'; + else + s_pulsedOut <= '0'; + end if; + end if; + end if; + end if; + end process; + + pulsedOut <= s_pulsedOut when (outPolarity = '1') else not s_pulsedOut; + +end Behavioral; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/ToggleSwitch.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/ToggleSwitch.vhd new file mode 100644 index 0000000..47ebe71 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/ToggleSwitch.vhd @@ -0,0 +1,31 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.all; + +entity ToggleSwitch is + port + ( + toggle : in std_logic; + reset : in std_logic; + startStop : out std_logic := '1' + ); +end ToggleSwitch; + +architecture Behavioral of ToggleSwitch is + signal current_state : std_logic := '1'; +begin + process(toggle, reset) + begin + if (reset = '1') then + current_state <= '1'; + else + if (toggle = '1') then + if (current_state = '1') then + current_state <= '0'; + else + current_state <= '1'; + end if; + end if; + end if; + end process; + startStop <= current_state; +end Behavioral; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/output_files/CounterDemo.sof b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/output_files/CounterDemo.sof new file mode 100644 index 0000000..e0a4160 Binary files /dev/null and b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/output_files/CounterDemo.sof differ diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/pulse_gen.vhd b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/pulse_gen.vhd new file mode 100644 index 0000000..09e0c9e --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/pulse_gen.vhd @@ -0,0 +1,28 @@ +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.NUMERIC_STD.ALL; + +entity pulse_gen is + generic (MAX : positive := 50_000_000); + port + ( + clk : in STD_LOGIC; + pulse : out STD_LOGIC + ); +end pulse_gen; + +architecture Behavioral of pulse_gen is + signal s_cnt : natural range 0 to MAX-1; +begin + process(clk) + begin + if (rising_edge(clk)) then + pulse <= '0'; + s_cnt <= s_cnt + 1; + if (s_cnt = MAX-1) then + s_cnt <= 0; + pulse <= '1'; + end if; + end if; + end process; +end Behavioral; \ No newline at end of file diff --git a/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/serv_req_info.txt b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/serv_req_info.txt new file mode 100644 index 0000000..57456a0 --- /dev/null +++ b/1ano/2semestre/lsd/projects/MiniProj_Demo_22-23/serv_req_info.txt @@ -0,0 +1,109 @@ + +ERR + + 0x7f1abe1b7be6: ccl_err + 0x7be6 (_ZN15ERR_STACKWALKER15get_stack_traceEPPKviiPv + 0xd8) + 0x7f1abe1bae95: ccl_err + 0xae95 (_Z14err_terminatorv + 0x5a) + 0x7f1ace73eae6: jtag_client + 0x82ae6 (_ZN10__cxxabiv111__terminateEPFvvE + 0x6) + 0x7f1ace75df29: jtag_client + 0xa1f29 + 0x7f1ace73e715: jtag_client + 0x82715 (__gxx_personality_v0 + 0x2b5) + 0x7f1ace7c0b23: jtag_client + 0x104b23 (_Unwind_RaiseException_Phase2 + 0x43) + 0x7f1ace7c11da: jtag_client + 0x1051da (_Unwind_RaiseException + 0xfa) + 0x7f1ace73ec2b: jtag_client + 0x82c2b (__cxa_throw + 0x5b) + 0x7f1abe1bad4f: ccl_err + 0xad4f (err_sigaction_handler + 0x7a) + 0x7f1aaba42520: c.so.6 + 0x42520 + 0x7f1ab18a8f86: QtGui.so.4 + 0x6a8f86 + 0x7f1ab18a9c86: QtGui.so.4 + 0x6a9c86 + 0x7f1ac9dc9864: QtCore.so.4 + 0x1c9864 (_ZN7QObject5eventEP6QEvent + 0x94) + 0x7f1ab1465b3f: QtGui.so.4 + 0x265b3f (_ZN7QWidget5eventEP6QEvent + 0x7f) + 0x7f1ab187c47b: QtGui.so.4 + 0x67c47b (_ZN6QFrame5eventEP6QEvent + 0x2b) + 0x7f1ab190e089: QtGui.so.4 + 0x70e089 (_ZN19QAbstractScrollArea5eventEP6QEvent + 0xa9) + 0x7f1ab18aa65b: QtGui.so.4 + 0x6aa65b (_ZN8QMdiArea5eventEP6QEvent + 0x10b) + 0x7f1ab140484f: QtGui.so.4 + 0x20484f (_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 0xaf) + 0x7f1ab140aea3: QtGui.so.4 + 0x20aea3 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0x183) + 0x7f1ac9db5ac4: QtCore.so.4 + 0x1b5ac4 (_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 0x84) + 0x7f1ac9deba5d: QtCore.so.4 + 0x1eba5d + 0x7f1ac9de881d: QtCore.so.4 + 0x1e881d + 0x7f1ac9de8841: QtCore.so.4 + 0x1e8841 + 0x7f1ab631bd3b: glib-2.0.so.0 + 0x55d3b (g_main_context_dispatch + 0x26b) + 0x7f1ab63706c8: glib-2.0.so.0 + 0xaa6c8 + 0x7f1ab63193e3: glib-2.0.so.0 + 0x533e3 (g_main_context_iteration + 0x33) + 0x7f1ac9de8af5: QtCore.so.4 + 0x1e8af5 (_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 0x65) + 0x7f1ab14b889f: QtGui.so.4 + 0x2b889f + 0x7f1ac9db4ad5: QtCore.so.4 + 0x1b4ad5 (_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE + 0x35) + 0x7f1ac9db4ea8: QtCore.so.4 + 0x1b4ea8 (_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE + 0x128) + 0x7f1ab194f9f7: QtGui.so.4 + 0x74f9f7 (_ZN7QDialog4execEv + 0xe7) + 0x7f1acdda49f3: gcl_afcq + 0x1a49f3 (_ZN16AFCQ_MSG_DISPLAY22internal_error_displayESs + 0x279) + 0x7f1abf15a23d: ccl_msg + 0x4923d (_ZN10MSG_REPORT14internal_errorERKSs + 0x155) + 0x7f1abf1761b5: ccl_msg + 0x651b5 (_ZN14MSG_ERROR_INFO8finalizeEv + 0x5f) + 0x7f1abf17642d: ccl_msg + 0x6542d (_ZN18MSG_INTERNAL_ERROR12report_fatalEPKcPv + 0x6b) + 0x7f1abe1bab0e: ccl_err + 0xab0e (_Z26err_report_fatal_exceptionPKcPv + 0x75) + 0x7f1abe1bae0d: ccl_err + 0xae0d (err_sigaction_handler + 0x138) + 0x7f1aaba42520: c.so.6 + 0x42520 + 0x7f1ab18a8f86: QtGui.so.4 + 0x6a8f86 + 0x7f1ab18a9c86: QtGui.so.4 + 0x6a9c86 + 0x7f1ab18aac8d: QtGui.so.4 + 0x6aac8d (_ZN8QMdiArea11resizeEventEP12QResizeEvent + 0x1ad) + 0x7f1ab1466572: QtGui.so.4 + 0x266572 (_ZN7QWidget5eventEP6QEvent + 0xab2) + 0x7f1ab187c47b: QtGui.so.4 + 0x67c47b (_ZN6QFrame5eventEP6QEvent + 0x2b) + 0x7f1ab190c6e7: QtGui.so.4 + 0x70c6e7 (_ZN19QAbstractScrollArea13viewportEventEP6QEvent + 0x17) + 0x7f1ab18aa285: QtGui.so.4 + 0x6aa285 (_ZN8QMdiArea13viewportEventEP6QEvent + 0x45) + 0x7f1ab190f108: QtGui.so.4 + 0x70f108 + 0x7f1ac9db5dbf: QtCore.so.4 + 0x1b5dbf (_ZN23QCoreApplicationPrivate29sendThroughObjectEventFiltersEP7QObjectP6QEvent + 0x7f) + 0x7f1ab1404820: QtGui.so.4 + 0x204820 (_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 0x80) + 0x7f1ab140aea3: QtGui.so.4 + 0x20aea3 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0x183) + 0x7f1ac9db5ac4: QtCore.so.4 + 0x1b5ac4 (_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 0x84) + 0x7f1ab14acb7d: QtGui.so.4 + 0x2acb7d (_ZN14QWidgetPrivate15setGeometry_sysEiiiib + 0x37d) + 0x7f1ab145ed08: QtGui.so.4 + 0x25ed08 (_ZN7QWidget11setGeometryERK5QRect + 0x78) + 0x7f1ab190d576: QtGui.so.4 + 0x70d576 (_ZN26QAbstractScrollAreaPrivate14layoutChildrenEv + 0x3d6) + 0x7f1ab18a66c1: QtGui.so.4 + 0x6a66c1 + 0x7f1ab18a97b3: QtGui.so.4 + 0x6a97b3 + 0x7f1ab18aa451: QtGui.so.4 + 0x6aa451 (_ZN8QMdiArea13viewportEventEP6QEvent + 0x211) + 0x7f1ab190f108: QtGui.so.4 + 0x70f108 + 0x7f1ac9db5dbf: QtCore.so.4 + 0x1b5dbf (_ZN23QCoreApplicationPrivate29sendThroughObjectEventFiltersEP7QObjectP6QEvent + 0x7f) + 0x7f1ab1404820: QtGui.so.4 + 0x204820 (_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 0x80) + 0x7f1ab140aea3: QtGui.so.4 + 0x20aea3 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0x183) + 0x7f1ac9db5ac4: QtCore.so.4 + 0x1b5ac4 (_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 0x84) + 0x7f1ab18b96fc: QtGui.so.4 + 0x6b96fc (_ZN13QMdiSubWindow10closeEventEP11QCloseEvent + 0xcc) + 0x7f1acf2a88cf: sys_qui + 0xb28cf (_ZN15QUI_MDI_SUB_WND10closeEventEP11QCloseEvent + 0x567) + 0x7f1ab14668aa: QtGui.so.4 + 0x2668aa (_ZN7QWidget5eventEP6QEvent + 0xdea) + 0x7f1ab18b996b: QtGui.so.4 + 0x6b996b (_ZN13QMdiSubWindow5eventEP6QEvent + 0x18b) + 0x7f1ab140484f: QtGui.so.4 + 0x20484f (_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 0xaf) + 0x7f1ab140aea3: QtGui.so.4 + 0x20aea3 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0x183) + 0x7f1ac9db5ac4: QtCore.so.4 + 0x1b5ac4 (_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 0x84) + 0x7f1ab145d3f8: QtGui.so.4 + 0x25d3f8 (_ZN14QWidgetPrivate12close_helperENS_9CloseModeE + 0x1f8) + 0x7f1ab145d4e2: QtGui.so.4 + 0x25d4e2 (_ZN7QWidget5closeEv + 0x12) + 0x7f1acf28c00a: sys_qui + 0x9600a (_ZN13QUI_FRAME_WND17close_all_in_listE5QListIP13QMdiSubWindowES2_5_GUID + 0x374) + 0x7f1acf28c137: sys_qui + 0x96137 (_ZN13QUI_FRAME_WND17close_all_windowsE5_GUID + 0xed) + 0x7f1acf29b269: sys_qui + 0xa5269 (_ZN13QUI_FRAME_WND10closeEventEP11QCloseEvent + 0x25f) + 0x7f1acf3f5aa9: sys_qgq + 0x19aa9 (_ZN15QGQ_MAIN_WINDOW10closeEventEP11QCloseEvent + 0x35) + 0x7f1ab14668aa: QtGui.so.4 + 0x2668aa (_ZN7QWidget5eventEP6QEvent + 0xdea) + 0x7f1ab189995c: QtGui.so.4 + 0x69995c (_ZN11QMainWindow5eventEP6QEvent + 0x13c) + 0x7f1ab140484f: QtGui.so.4 + 0x20484f (_ZN19QApplicationPrivate13notify_helperEP7QObjectP6QEvent + 0xaf) + 0x7f1ab140aea3: QtGui.so.4 + 0x20aea3 (_ZN12QApplication6notifyEP7QObjectP6QEvent + 0x183) + 0x7f1ac9db5ac4: QtCore.so.4 + 0x1b5ac4 (_ZN16QCoreApplication14notifyInternalEP7QObjectP6QEvent + 0x84) + 0x7f1ab145d3f8: QtGui.so.4 + 0x25d3f8 (_ZN14QWidgetPrivate12close_helperENS_9CloseModeE + 0x1f8) + 0x7f1ab147e882: QtGui.so.4 + 0x27e882 + 0x7f1ab1480fa5: QtGui.so.4 + 0x280fa5 (_ZN12QApplication16x11ClientMessageEP7QWidgetP7_XEventb + 0x1e5) + 0x7f1ab148d7a1: QtGui.so.4 + 0x28d7a1 (_ZN12QApplication15x11ProcessEventEP7_XEvent + 0xfa1) + 0x7f1ab14b8d62: QtGui.so.4 + 0x2b8d62 + 0x7f1ab631bd3b: glib-2.0.so.0 + 0x55d3b (g_main_context_dispatch + 0x26b) + 0x7f1ab63706c8: glib-2.0.so.0 + 0xaa6c8 + 0x7f1ab63193e3: glib-2.0.so.0 + 0x533e3 (g_main_context_iteration + 0x33) + 0x7f1ac9de8af5: QtCore.so.4 + 0x1e8af5 (_ZN20QEventDispatcherGlib13processEventsE6QFlagsIN10QEventLoop17ProcessEventsFlagEE + 0x65) + 0x7f1ab14b889f: QtGui.so.4 + 0x2b889f + 0x7f1ac9db4ad5: QtCore.so.4 + 0x1b4ad5 (_ZN10QEventLoop13processEventsE6QFlagsINS_17ProcessEventsFlagEE + 0x35) + 0x7f1ac9db4ea8: QtCore.so.4 + 0x1b4ea8 (_ZN10QEventLoop4execE6QFlagsINS_17ProcessEventsFlagEE + 0x128) + 0x7f1ac9db9cc4: QtCore.so.4 + 0x1b9cc4 (_ZN16QCoreApplication4execEv + 0xb4) + 0x401eab: quartus + 0x1eab (_Z8qgq_mainiPPKc + 0x7b) + 0x7f1abf14fe30: ccl_msg + 0x3ee30 (_Z15msg_main_threadPv + 0x10) + 0x7f1abe181acc: ccl_thr + 0x5acc (thr_final_wrapper + 0xc) + 0x7f1abf14feef: ccl_msg + 0x3eeef (_Z18msg_thread_wrapperPFPvS_ES_ + 0x62) + 0x7f1abe1e9f9c: ccl_mem + 0x9f9c (_Z18mem_thread_wrapperPFPvS_ES_ + 0x5c) + 0x7f1abe1b8b39: ccl_err + 0x8b39 (_Z18err_thread_wrapperPFPvS_ES_ + 0x27) + 0x7f1abe181b0f: ccl_thr + 0x5b0f (thr_thread_wrapper + 0x15) + 0x7f1abf151ea1: ccl_msg + 0x40ea1 (_Z12msg_exe_mainiPPKcPFiiS1_E + 0xb2) + +*** Fatal Error: Unhandled Exception +Tue May 2 10:47:59 2023 + +Version 20.1.1 Build 720 11/11/2020 SJ Lite Edition + \ No newline at end of file diff --git a/1ano/2semestre/poo/README.md b/1ano/2semestre/poo/README.md index 2188a49..0335569 100755 --- a/1ano/2semestre/poo/README.md +++ b/1ano/2semestre/poo/README.md @@ -21,6 +21,7 @@ | [06](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula06) | Inheritance | | [07](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula07) | Polymorphism | | [08](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula08) | Interfaces, Collections | +| [09](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula09) | Collections | --- *Pode conter erros, caso encontre algum, crie um* [*ticket*](https://github.com/TiagoRG/uaveiro-leci/issues/new) diff --git a/1ano/2semestre/poo/guides/POO-2022-aula09.pdf b/1ano/2semestre/poo/guides/POO-2022-aula09.pdf new file mode 100644 index 0000000..0dd3da8 Binary files /dev/null and b/1ano/2semestre/poo/guides/POO-2022-aula09.pdf differ diff --git a/1ano/2semestre/poo/src/README.md b/1ano/2semestre/poo/src/README.md index e7a7bb8..aef3573 100644 --- a/1ano/2semestre/poo/src/README.md +++ b/1ano/2semestre/poo/src/README.md @@ -13,6 +13,7 @@ | [06](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula06) | Inheritance | | [07](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula07) | Polymorphism | | [08](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula08) | Interfaces, Collections | +| [09](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/src/aula09) | Collections | --- *Pode conter erros, caso encontre algum, crie um* [*ticket*](https://github.com/TiagoRG/uaveiro-leci/issues/new) diff --git a/1ano/2semestre/poo/src/aula06/ex1/Person.java b/1ano/2semestre/poo/src/aula06/ex1/Person.java index c1b5386..4512c05 100644 --- a/1ano/2semestre/poo/src/aula06/ex1/Person.java +++ b/1ano/2semestre/poo/src/aula06/ex1/Person.java @@ -2,6 +2,8 @@ package aula06.ex1; import utils.DateYMD; +import java.util.Objects; + public class Person { private String name; private int cc; @@ -44,4 +46,17 @@ public class Person { public String toString() { return String.format("%s; CC: %d; Data de nascimento: %s", this.name, this.cc, this.birthDate); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return cc == person.cc && Objects.equals(name, person.name) && Objects.equals(birthDate, person.birthDate); + } + + @Override + public int hashCode() { + return Objects.hash(name, cc, birthDate); + } } diff --git a/1ano/2semestre/poo/src/aula09/README.md b/1ano/2semestre/poo/src/aula09/README.md new file mode 100755 index 0000000..04dece5 --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/README.md @@ -0,0 +1,23 @@ +# Programação Orientada a Objetos +## Aula 09 +### Tópico principal da aula: Collections + +* [Guião](https://github.com/TiagoRG/uaveiro-leci/tree/master/1ano/2semestre/poo/guides/POO-2022-aula09.pdf) + +### File List per Exercise + +#### Ex1 +* [ALDemo.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex1/ALDemo.java) + +#### Ex2 +* [CollectionTester.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex2/CollectionTester.java) + +#### Ex3 +* [PlaneTester.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex3/PlaneTester.java) +* [PlaneManager.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex3/PlaneManager.java) +* [Plane.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex3/Plane.java) +* [CommercialPlane.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex3/CommercialPlane.java) +* [MilitaryPlane.java](https://github.com/TiagoRG/uaveiro-leci/blob/master/1ano/2semestre/poo/src/aula09/ex3/MilitaryPlane.java) + +--- +*Pode conter erros, caso encontre algum, crie um* [*ticket*](https://github.com/TiagoRG/uaveiro-leci/issues/new) diff --git a/1ano/2semestre/poo/src/aula09/ex1/ALDemo.java b/1ano/2semestre/poo/src/aula09/ex1/ALDemo.java new file mode 100644 index 0000000..ba1b60c --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex1/ALDemo.java @@ -0,0 +1,42 @@ +package aula09.ex1; + +import aula06.ex1.Person; +import utils.DateYMD; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class ALDemo { + public static void main(String[] args) { + ArrayList c1= new ArrayList<>(); + for(int i= 10; i<= 100; i+=10) c1.add(i);System.out.println("Size: "+ c1.size()); + + for(int i= 0; i< c1.size(); i++) + System.out.println("Elemento: "+ c1.get(i)); + + ArrayList c2= new ArrayList<>(); + c2.add("Vento"); + c2.add("Calor"); + c2.add("Frio"); + c2.add("Chuva"); + System.out.println(c2); + Collections.sort(c2); + System.out.println(c2); + c2.remove("Frio"); + c2.remove(0); + System.out.println(c2); + + Set c3 = new HashSet<>(); + c3.add(new Person("Ana", 12345678, new DateYMD(1, 1, 2000))); + c3.add(new Person("Joao", 42342289, new DateYMD(1, 1, 2000))); + c3.add(new Person("Maria", 12346789, new DateYMD(1, 1, 2000))); + c3.add(new Person("Marco", 12356789, new DateYMD(1, 1, 2000))); + c3.add(new Person("Ana", 12346789, new DateYMD(1, 1, 2000))); + + for (Person p : c3) { + System.out.println(p); + } + } +} diff --git a/1ano/2semestre/poo/src/aula09/ex2/CollectionTester.java b/1ano/2semestre/poo/src/aula09/ex2/CollectionTester.java new file mode 100644 index 0000000..e860748 --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex2/CollectionTester.java @@ -0,0 +1,46 @@ +package aula09.ex2; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; + +public class CollectionTester { + public static void main(String[] args) { + int DIM= 5000; + Collection col= new ArrayList<>(); + checkPerformance(col, DIM); + } + + private static void checkPerformance(Collection col, int DIM) { + double start, stop, delta; + // Add + start = System.nanoTime(); // clock snapshot before + for(int i=0; i iterator = col.iterator(); + while(iterator.hasNext()) { + iterator.next(); + iterator.remove(); + } + stop = System.nanoTime(); // clock snapshot after + delta = (stop-start)/1e6; // convert nanoseconds to milliseconds + System.out.println(col.size() + ": Remove from "+ col.getClass().getSimpleName() +" took "+ delta+ "ms"); + } +} diff --git a/1ano/2semestre/poo/src/aula09/ex3/CommercialPlane.java b/1ano/2semestre/poo/src/aula09/ex3/CommercialPlane.java new file mode 100644 index 0000000..9877124 --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex3/CommercialPlane.java @@ -0,0 +1,50 @@ +package aula09.ex3; + +import java.util.Objects; + +public class CommercialPlane extends Plane { + private int numOfCrewMembers; + + public CommercialPlane(String id, String manufacturer, String model, int year, int maxNumOfPassengers, double maxSpeed, int numOfCrewMembers) { + super(id, manufacturer, model, year, maxNumOfPassengers, maxSpeed); + this.numOfCrewMembers = numOfCrewMembers; + } + + public int getNumOfCrewMembers() { + return this.numOfCrewMembers; + } + + public void setNumOfCrewMembers(int numOfCrewMembers) { + this.numOfCrewMembers = numOfCrewMembers; + } + + public String getPlaneType() { + return "Commercial"; + } + + @Override + public String toString() { + return "CommercialPlane {" + + "\n\tid='" + super.getId() + '\'' + + ",\n\tmanufacturer='" + super.getManufacturer() + '\'' + + ",\n\tmodel='" + super.getModel() + '\'' + + ",\n\tproductionYear=" + super.getProductionYear() + + ",\n\tmaxPassengers=" + super.getMaxPassengers() + + ",\n\tmaxSpeed=" + super.getMaxSpeed() + + ",\n\tnumOfCrewMembers=" + this.getNumOfCrewMembers() + + ",\n}"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CommercialPlane plane)) return false; + if (!super.equals(o)) return false; + return this.getNumOfCrewMembers() == plane.getNumOfCrewMembers(); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), this.getNumOfCrewMembers()); + } +} diff --git a/1ano/2semestre/poo/src/aula09/ex3/MilitaryPlane.java b/1ano/2semestre/poo/src/aula09/ex3/MilitaryPlane.java new file mode 100644 index 0000000..38c6eb7 --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex3/MilitaryPlane.java @@ -0,0 +1,50 @@ +package aula09.ex3; + +import java.util.Objects; + +public class MilitaryPlane extends Plane { + private int numMissiles; + + public MilitaryPlane(String id, String manufacturer, String model, int year, int maxPassengers, double maxSpeed, int numMissiles) { + super(id, manufacturer, model, year, maxPassengers, maxSpeed); + this.numMissiles = numMissiles; + } + + public int getNumMissiles() { + return this.numMissiles; + } + + public void setNumMissiles(int numMissiles) { + this.numMissiles = numMissiles; + } + + public String getPlaneType() { + return "Military"; + } + + @Override + public String toString() { + return "MilitaryPlane {" + + "\n\tid='" + super.getId() + '\'' + + ",\n\tmanufacturer='" + super.getManufacturer() + '\'' + + ",\n\tmodel='" + super.getModel() + '\'' + + ",\n\tproductionYear=" + super.getProductionYear() + + ",\n\tmaxPassengers=" + super.getMaxPassengers() + + ",\n\tmaxSpeed=" + super.getMaxSpeed() + + ",\n\tnumMissiles=" + this.getNumMissiles() + + ",\n}"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof MilitaryPlane plane)) return false; + if (!super.equals(o)) return false; + return this.getNumMissiles() == plane.getNumMissiles(); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), this.getNumMissiles()); + } +} \ No newline at end of file diff --git a/1ano/2semestre/poo/src/aula09/ex3/Plane.java b/1ano/2semestre/poo/src/aula09/ex3/Plane.java new file mode 100644 index 0000000..143348f --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex3/Plane.java @@ -0,0 +1,90 @@ +package aula09.ex3; + +import java.util.Objects; + +public class Plane { + private final String id; + private String manufacturer; + private String model; + private int productionYear; + private int maxPassengers; + private double maxSpeed; + + public Plane(String id, String manufacturer, String model, int productionYear, int maxPassengers, double maxSpeed) { + this.id = id; + this.manufacturer = manufacturer; + this.model = model; + this.productionYear = productionYear; + this.maxPassengers = maxPassengers; + this.maxSpeed = maxSpeed; + } + + + public String getId() { + return id; + } + + public String getManufacturer() { + return manufacturer; + } + + public void setManufacturer(String manufacturer) { + this.manufacturer = manufacturer; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public int getProductionYear() { + return productionYear; + } + + public void setProductionYear(int productionYear) { + this.productionYear = productionYear; + } + + public int getMaxPassengers() { + return maxPassengers; + } + + public void setMaxPassengers(int maxPassengers) { + this.maxPassengers = maxPassengers; + } + + public double getMaxSpeed() { + return maxSpeed; + } + + public void setMaxSpeed(double maxSpeed) { + this.maxSpeed = maxSpeed; + } + + @Override + public String toString() { + return "Plane {" + + "\n\tid='" + id + '\'' + + ",\n\tmanufacturer='" + manufacturer + '\'' + + ",\n\tmodel='" + model + '\'' + + ",\n\tproductionYear=" + productionYear + + ",\n\tmaxPassengers=" + maxPassengers + + ",\n\tmaxSpeed=" + maxSpeed + + ",\n}"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Plane plane)) return false; + return this.getProductionYear() == plane.getProductionYear() && this.getMaxPassengers() == plane.getMaxPassengers() && Double.compare(plane.getMaxSpeed(), this.getMaxSpeed()) == 0 && Objects.equals(this.getId(), plane.getId()) && Objects.equals(this.getManufacturer(), plane.getManufacturer()) && Objects.equals(this.getModel(), plane.getModel()); + } + + @Override + public int hashCode() { + return Objects.hash(this.getId(), this.getManufacturer(), this.getModel(), this.getProductionYear(), this.getMaxPassengers(), this.getMaxSpeed()); + } +} diff --git a/1ano/2semestre/poo/src/aula09/ex3/PlaneManager.java b/1ano/2semestre/poo/src/aula09/ex3/PlaneManager.java new file mode 100644 index 0000000..10a6d1c --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex3/PlaneManager.java @@ -0,0 +1,76 @@ +package aula09.ex3; + +import java.util.*; + +public class PlaneManager { + private final LinkedList planes = new LinkedList<>(); + + public void addPlane(Plane plane) { + planes.add(plane); + } + + public void removePlane(String id) { + for (Plane plane : planes) { + if (plane.getId().equals(id)) { + planes.remove(plane); + return; + } + } + } + + public Plane searchPlane(String id) { + for (Plane plane : planes) { + if (plane.getId().equals(id)) { + return plane; + } + } + return null; + } + + public LinkedList getCommercialPlanes() { + LinkedList commercialPlanes = new LinkedList<>(); + for (Plane plane : planes) { + if (plane instanceof CommercialPlane) { + commercialPlanes.add(plane); + } + } + return commercialPlanes; + } + + public LinkedList getMilitaryPlanes() { + LinkedList militaryPlanes = new LinkedList<>(); + for (Plane plane : planes) { + if (plane instanceof MilitaryPlane) { + militaryPlanes.add(plane); + } + } + return militaryPlanes; + } + + public Plane getFastestPlane() { + Plane fastestPlane = null; + for (Plane plane : planes) { + if (fastestPlane == null || plane.getMaxSpeed() > fastestPlane.getMaxSpeed()) { + fastestPlane = plane; + } + } + return fastestPlane; + } + + public void printAllPlanes() { + for (Plane plane : planes) { + System.out.println(plane); + } + } + + public void printAllPlanes(String type) { + for (Plane plane : planes) { + if (plane instanceof CommercialPlane && type.equals("commercial")) { + System.out.println(plane); + } + else if (plane instanceof MilitaryPlane && type.equals("military")) { + System.out.println(plane); + } + } + } +} diff --git a/1ano/2semestre/poo/src/aula09/ex3/PlaneTester.java b/1ano/2semestre/poo/src/aula09/ex3/PlaneTester.java new file mode 100644 index 0000000..31e1f59 --- /dev/null +++ b/1ano/2semestre/poo/src/aula09/ex3/PlaneTester.java @@ -0,0 +1,104 @@ +package aula09.ex3; + +import java.util.Scanner; + +public class PlaneTester { + public static void main(String[] args) { + PlaneManager planeManager = new PlaneManager(); + Scanner scanner = new Scanner(System.in); + int choice; + + do { + System.out.println("\nPlane Fleet Menu:"); + System.out.println("1. Add a plane to the fleet"); + System.out.println("2. Remove a plane from the fleet"); + System.out.println("3. Search for a plane"); + System.out.println("4. Print summary of all planes in the fleet"); + System.out.println("5. Print list of all commercial planes in the fleet"); + System.out.println("6. Print list of all military planes in the fleet"); + System.out.println("7. Print the fastest plane in the fleet"); + System.out.println("0. Exit"); + + System.out.print("Enter your choice: "); + choice = Integer.parseInt(scanner.nextLine()); + + switch (choice) { + case 1 -> addPlane(planeManager, scanner); + case 2 -> removePlane(planeManager, scanner); + case 3 -> searchPlane(planeManager, scanner); + case 4 -> printAllPlanes(planeManager); + case 5 -> printCommercialPlanes(planeManager); + case 6 -> printMilitaryPlanes(planeManager); + case 7 -> printFastestPlane(planeManager); + case 0 -> System.out.println("Exiting program..."); + default -> System.out.println("Invalid choice. Please try again."); + } + } while (choice != 0); + + scanner.close(); + } + + private static void addPlane(PlaneManager planeManager, Scanner scanner) { + System.out.print("Enter the plane's ID: "); + String id = scanner.nextLine(); + System.out.print("Enter the plane's manufacturer: "); + String manufacturer = scanner.nextLine(); + System.out.print("Enter the plane's model: "); + String model = scanner.nextLine(); + System.out.print("Enter the plane's year of manufacture: "); + int year = Integer.parseInt(scanner.nextLine()); + System.out.print("Enter the plane's passenger count: "); + int passengerCount = Integer.parseInt(scanner.nextLine()); + System.out.print("Enter the plane's maximum speed: "); + int maxSpeed = Integer.parseInt(scanner.nextLine()); + System.out.print("Enter the plane's type (commercial/military): "); + String type = scanner.nextLine(); + if (type.equals("commercial")) { + System.out.print("Enter the plane's crew members count: "); + int crewMembersCount = Integer.parseInt(scanner.nextLine()); + planeManager.addPlane(new CommercialPlane(id, manufacturer, model, year, passengerCount, maxSpeed, crewMembersCount)); + } + else if (type.equals("military")) { + System.out.print("Enter the plane's missile count: "); + int missileCount = Integer.parseInt(scanner.nextLine()); + planeManager.addPlane(new MilitaryPlane(id, manufacturer, model, year, passengerCount, maxSpeed, missileCount)); + } + } + + private static void removePlane(PlaneManager planeManager, Scanner scanner) { + System.out.print("Enter the plane's ID: "); + String id = scanner.nextLine(); + if (planeManager.searchPlane(id) == null) { + System.out.println("Plane not found."); + return; + } + planeManager.removePlane(id); + } + + private static void searchPlane(PlaneManager planeManager, Scanner scanner) { + System.out.print("Enter the plane's ID: "); + String id = scanner.nextLine(); + Plane plane = planeManager.searchPlane(id); + if (plane == null) { + System.out.println("Plane not found."); + return; + } + System.out.println(plane); + } + + private static void printAllPlanes(PlaneManager planeManager) { + planeManager.printAllPlanes(); + } + + private static void printCommercialPlanes(PlaneManager planeManager) { + planeManager.printAllPlanes("commercial"); + } + + private static void printMilitaryPlanes(PlaneManager planeManager) { + planeManager.printAllPlanes("military"); + } + + private static void printFastestPlane(PlaneManager planeManager) { + System.out.print(planeManager.getFastestPlane()); + } +} diff --git a/1ano/2semestre/poo/src/utils/Validations.java b/1ano/2semestre/poo/src/utils/Validations.java index 902d67c..c333fc3 100644 --- a/1ano/2semestre/poo/src/utils/Validations.java +++ b/1ano/2semestre/poo/src/utils/Validations.java @@ -3,6 +3,10 @@ package utils; import java.util.regex.Pattern; public class Validations { + public static boolean validateEmail(String email) { + return Pattern.matches("^[a-zA-Z0-9._]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$", email); + } + public static boolean validateVehiclePlate(String plate) { return Pattern.matches("^[A-Z]{2}-\\d{2}-\\d{2}|\\d{2}-[A-Z]{2}-\\d{2}|\\d{2}-\\d{2}-[A-Z]{2}|[A-Z]{2}-\\d{2}-[A-Z]{2}|[A-Z]{2}-[A-Z]{2}-\\d{2}|\\d{2}-[A-Z]{2}-[A-Z]{2}$", plate); }