Problem z definicją obiektu

Problem z definicją obiektu
Z3
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Śląsk
  • Postów:46
0

Witam, jestem nowy w C# i mam pewien problem.
W tym switchu w 1 case definiuje obiekt "komp1" na podstawie klasy Komputer. Definiuje go dopiero w case 1, oraz nadaje wartości zmiennym w metodzie nadajSpecyfikacje(); , w jakim sposób mogę pokazać zmienne w klasie w case 2 gdy nie może się wykonać metoda pokazSpecyfikacje();?
Chce aby definicja obiektu była w tym case 1.
Cały kod źródłowy programu: https://pastebin.com/fQXpfR5j
Dziękuje też za uwagi odnośne tego kodu, ponieważ to moja 1 godzina z przestawienia się z C++ na C#.

Kopiuj
switch (warunek)
                {
                    case 1:
                        {
                            Komputer komp1 = new Komputer();
                            nadajSpecyfikacje(komp1);
                            break;
                        }
                    case 2:
                        {
                            pokazSpecyfikacje(komp1);
                            break;
                        }
                    case 3:
                        {
                            koniec = 1; // spelnony warunek wyjscia
                            break;
                        }
                    default:
                        {
                            Console.WriteLine("Podano złą wartość");
                            koniec = 1;
                            break;
                        }
                }
edytowany 3x, ostatnio: Zigor36
mr-owl
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad rok
  • Postów:206
0

Witam,

Moze zdradz co ten program ma robic?

mr-owl

Z3
  • Rejestracja:ponad 7 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Śląsk
  • Postów:46
0

To znaczy ten program to jest totalne dno, chciałem tylko zobaczyć jak wygląda obiektowość w C#. Możemy stworzyć nowy komputer i nadać mu specyfikacje typu, że procesor to intel core i7 itp. a następnie pokazać to na ekranie. I w to wszystko dodałem menu główne, żeby to lepiej wyglądało.

edytowany 1x, ostatnio: Zigor36
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
0

Ten komputer to zmienna lokalna w ten sposob jak napisales


λλλ
Z3
Już tak właściwie poradziłem sobie z tym. Definicje obiektu napisałem na początku funkcji głównej main,a w tym cas'ie zapisałem komp1 = new Komputer(); @Edit chociaż to jednak nie działa
stivens
o tym wlasnie mowie
stivens
swoja droga czemu to sa metody klasy Program a nie Komputer?
Z3
Tak właściwie nie wiem czemu tak zrobiłem, lepiej będzie tak jak mówisz.
FL
  • Rejestracja:ponad 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:10
0

Ja od siebie dodam tylko dwie rzeczy: nie będzie fajnie jeśli ktoś najpierw sprawdzi specyfikację, jeszcze przed stworzeniem komputera i każdy nowo utworzony komputer skasuje poprzedni. Może zastanów się nad stworzeniem jakiejś kolekcji np. listy z komputerami? Oczywiście przy założeniu, ze pozbyłeś się problemu ze zmienną lokalną.

Z3
Komputer komp1 = new Komputer(); zapisałem to na początku main'a i załatwiłem problem z zmienną lokalną, a zrobie teraz zresetowanie specyfikacji w case 1. Dobry pomysł z tą listą, to też zrobie :)
FL
W momencie wprowadzenia listy i tak usuniesz tą linijkę bo dodawanie komputera przejdzie do case'a, ale kolega wyżej w komentarzu wytknął ci ciekawy błąd o umiejscowieniu metod, które powinny należeć do klasy Komputer ;)
Z3
Masz może jakiś pomysł jak stworzyć tą liste? Myślałem nad zapisem do pliku txt, który otwiera się po wyborze 2 w menu.
Z3
Chyba, że dałoby się zrobić coś takiego jak tablica struktur i zapisać do niej te dane. I istniał by wtedy jakiś limit np. 10 zapisów
FL
Nie do końca to miałem na myśli, choć tak też możesz zrobić, ale pamiętaj, że tworząc nowy komputer jego również musisz zapisać, musisz również w przypadku wielu komputerów określać, którego specyfikację chcesz zobaczyć. Jeśli ci na tym zależy to możesz pójść o krok dalej i zainteresować się serializacją binarną albo użyć jakiejś biblioteki i serializować do JSONa, oczywiście plik txt też jest jak najbardziej w porządku. Miałem na myśli, byś stworzył obiekt listy w którym trzymałbyś stworzone komputery. List<Komputer> listaKomputerów, a potem dodawał do tego nowo utworzone.
Sunnyline2
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 lata
  • Postów:58
0
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:6 miesięcy
  • Postów:273
0

Na pierwszy rzut oka widzę, że jesteś bardzo początkującym programistą .
Jest coś takiego jak zasięg zmiennych . Zmienna komp1 jest widoczna tylko w bloku case1.

edytowany 1x, ostatnio: Zimny Krawiec
ZK
  • Rejestracja:prawie 7 lat
  • Ostatnio:6 miesięcy
  • Postów:273
2

Wersja robocza . Chętnie wysłucham krytycznych uwag !

Kopiuj

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;


namespace ConsoleApp1
{
    class Program
    {
        static string domyslnyKatalog = Directory.GetCurrentDirectory();
        static void NadajSpecyfikacje(Komputer komp)
        {
            Console.Write("Podaj nazwe komputera: ");
            komp.Nazwa = Console.ReadLine();
            Console.Write("Podaj procesor komputera: ");
            komp.Procesor = Console.ReadLine();
            Console.Write("Podaj karte graficzną komputera: ");
            komp.KartaGraficzna = Console.ReadLine();

        }
        static void PokazSpecyfikacje(Komputer komp)
        {
            Console.Write("Nazwa komputera: "); Console.WriteLine(komp.Nazwa);
            Console.Write("Procesor: "); Console.WriteLine(komp.Procesor);
            Console.Write("Karta graficzna: "); Console.WriteLine(komp.KartaGraficzna);
            Console.ReadKey();
        }

        static void ZapiszListe(List<Komputer> lista)
        {
           
                Console.Write("Podaj nazwę pliku : ");
                
                string nazwaPliku = string.Format("{0}.dat", Console.ReadLine());
              
            BinaryFormatter binFormat = new BinaryFormatter();
            try
            {
                using (Stream fStream = new FileStream(Path.Combine(domyslnyKatalog, nazwaPliku), FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    binFormat.Serialize(fStream, lista);
                }
            }
            catch(ArgumentException)
            {
                Console.WriteLine("Nieprawidłowa nazwa pliku!");
                Console.ReadKey();
            }
                
                
        }

        static List<Komputer> WczytajListe()
        {
            Console.WriteLine("Dostępne pliki :");
            foreach (string elm in Directory.GetFiles(domyslnyKatalog, "*.dat"))
            {
                Console.WriteLine(" - " + Path.GetFileNameWithoutExtension(elm));
            }
            
            Console.Write("Podaj nazwę pliku : ");
           
            string nazwaPliku = string.Format("{0}.dat", Console.ReadLine());
            BinaryFormatter binFormat = new BinaryFormatter();
            try
            {
                using (Stream fStream = File.OpenRead(Path.Combine(domyslnyKatalog, nazwaPliku)))
                {
                    List<Komputer> listaKomputerow = (List<Komputer>)binFormat.Deserialize(fStream);
                    return listaKomputerow;
                }
            }
            catch(FileNotFoundException e)
            {
                Console.WriteLine(e.Message);
                return null;
            }
            catch(SerializationException )
            {
                Console.WriteLine("Nieprawidłowy plik!");
                Console.ReadKey();
                return null;
            }
          
        }
        static void ZmienFolder()
        {
            Console.ForegroundColor = ConsoleColor.Yellow;

            Console.WriteLine(domyslnyKatalog);
            Console.ResetColor();
            Console.Write("Nowy: ");
            string nowaSciezka = Console.ReadLine();
            if (Directory.Exists(nowaSciezka)) domyslnyKatalog = nowaSciezka;
            else
            {
                Console.WriteLine("Podanay katalog nie istnieje!");
                Console.ReadKey();
            }
               
        }
       
        static void Main(string[] args)
        {
            bool koniec = true;
            int wybor;
             Komputer komp;
            List<Komputer> listaKomputerow = new List<Komputer>();
            do
            {
                Console.Clear();
                Console.WriteLine("Witaj w menu głównym!  - liczba komputerów {0}", listaKomputerow.Count);
                Console.WriteLine("[1] Nowy komputer");
                Console.WriteLine("[2] Pokaż specyfikacje");
                Console.WriteLine("[3] Wyjdź z programu");
                Console.WriteLine("[4] Zapisz");
                Console.WriteLine("[5] Wczytaj");
                Console.WriteLine("[6] Zmień folder zapisu/odczytu");
                Console.WriteLine("[7] Wyczyść listę");
                Console.Write("Twój wybór : ");
                if (int.TryParse(Console.ReadLine(), out wybor))
                {
                    switch (wybor)
                    {
                        case 1:
                            
                                komp = new Komputer();
                                NadajSpecyfikacje(komp);
                                int indeks = listaKomputerow.FindIndex(k => komp.Nazwa == k.Nazwa);
                                if (indeks == -1)
                                {
                                listaKomputerow.Add(komp);
                                }
                                else
                                {
                                listaKomputerow[indeks] = komp;
                                }
                                break;
                            
                        case 2:
                            
                                Console.Write("Podaj nazwę komputera : ");
                                string nazwa = Console.ReadLine();

                                Komputer szukanyKomputer = listaKomputerow.Find(k => nazwa == k.Nazwa);
                                if (szukanyKomputer != null) PokazSpecyfikacje(szukanyKomputer);
                                else
                                {
                                    Console.WriteLine("Komputer o podanej nazwie nie istnieje!");
                                    Console.ReadKey();
                                }
                                  
                                break;
                            
                        case 3:
                            koniec = false;
                            break;

                        case 4:; ZapiszListe(listaKomputerow);
                            break;

                        case 5:
                            List<Komputer> nowaLista = WczytajListe();
                            if (nowaLista != null) listaKomputerow = nowaLista;
                            break;

                        case 6: ZmienFolder();
                            break;
                        case 7:
                            listaKomputerow.Clear();
                            break;
                            
                    }
                }

            } while (koniec);
        }
    }
    [Serializable]
    class Komputer
    {
        public string Nazwa { get; set; }
        public string Procesor { get; set; }
        public string KartaGraficzna { get; set; }
    }
}
edytowany 16x, ostatnio: Zimny Krawiec

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.