Tablica kontaktów w C#

0

Witam jestem nowy na forum, chciałbym zrobić tablicę kontaktów w C# o strukturze imię i nazwisko adres email itp oraz ich usuwanie edycję wraz z implementacją kolejki LIFO FIFO, niestety dotychczas udało mi się zrobić tylko tablice numeryczne i ich sortowanie oraz tablice dni tygodnia. Nie mogę nigdzie w necie znaleźć opisu takiego przypadku. Będę wdzięczny za pomoc, proszę o wyrozumiałość jeśli problem jest banalny. Czy możecie polecić jakąś literaturę gdzie jest wiele przykładów na których można się nauczyć takich rozwiązań?

0

Musisz zrobić to sam, czy możesz użyć gotowych rozwiązań?
Zdefiniowałeś już klasę przechowującą te dane kontaktowe? Jeśli nie, to to jest pierwszy krok.

0
somekind napisał(a)

Zdefiniowałeś już klasę przechowującą te dane kontaktowe? Jeśli nie, to to jest pierwszy krok.

No właśnie z tym jest chyba problem. Masz użyć struktur? Nic prostszego http://msdn.microsoft.com/en-us/library/ah19swz4(v=VS.100).aspx ;)

0

W chwili wolnej od pracy zdefiniowałem klasę, czy w ten sposób może ona być skonstruowana?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Collections
{
    public class Kontakty
    {
        public int KontaktyId { get; private set; }
        public string Imie { get; private set; }
        public string Nazwisko { get; private set; }
        public int Wiek { get; private set; }
        public string Adres { get; private set; }
        public int Telefon { get; private set; }
        public string Email { get; private set; }

        public Kontakty(int nKontaktyId, string sImie, string sNazwisko, int nWiek, string sAdres, int nTelefon, string sEmail)
        {
            KontaktyId = nKontaktyId;
            Imie = sImie;
            Nazwisko = sNazwisko;
            Wiek = nWiek;
            Adres = sAdres;
            Telefon = nTelefon;
            Email = sEmail;
        }
    }
} 
0

Chodzi o odróżnienie danych tekstowych od numerycznych ale może źle zrozumiałem strukturę tej klasy

0

Visual Studio ma Intelisense czyli podpowiedzi, dzięki którym używanie takich przedrostków stało się zbyteczne (na szczęście).

Jeżeli chodzi o klasę, to zastanawia mnie, czy dla Ciebie raz utworzony kontakt nie ma być już zmieniany? priavate set i w ogóle enkapsulacja stosowana jest po to, żeby obiekt nie mógł być "zepsuty" przez niewłaściwe użycie. Tutaj to chyba nie ma większego sensu. Możesz zamiast tego użyć prywatnych pól i sprawdzać we właściwościach czy wpisywana wartość jest ok czy nie. Dla przykładu:

public class Kontakt
{
    private string email;
    public string Email
    {
        get
        {
           return email;
        }
        set
        {
           if (!value.Contains("@"))
           {
               throw new Exception("Adres email w kontakcie jest nieprawidłowy");
           }     
           email = value;
        }
    }
}

Zaznaczę tutaj, że to jest tylko przykład i niekoniecznie musi to być dobre - zależy od kontekstu.
Powinieneś też zmienić nazwę klasy. Reprezentuje ona jeden kontakt, a nie kontakty. Tyle na razie ode mnie. Pokaż więcej kodu.

0

Nie ukrywam, że trochę utknąłem, musiałem dodaćstatic void Main()
bo inaczej program generuje mi błąd poza tym nie mogę zidentyfikować jeszce jednego błędu w linii
public string Email { get; private set; }
Error 1 The type 'Collections.Kontakt' already contains a definition for 'Email'
już pewnie to wpływ nocy poza tym skorzystałem z podpowiedzi i dołożyłem fragment kodu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Collections
{
    public class Kontakt
    {
    private string email;
    public string Email
    {
        get
        {
           return email;
        }
        set
        {
           if (!value.Contains("@"))
           {
               throw new Exception("Adres email w kontakcie jest nieprawidłowy");
           }     
           email = value; }
    } 

        public int KontaktId { get; private set; }
        public string Imie { get; private set; }
        public string Nazwisko { get; private set; }
        public int Wiek { get; private set; }
        public string Adres { get; private set; }
        public int Telefon { get; private set; }
        static void Main()
        {
        List<string> Kontakty = new List<string>();

        Console.WriteLine("\nPojemnosc: {0}", Kontakty.Capacity);

        Kontakty.Add("Piotr Nowakowski");
        Kontakty.Add("Anna Nowakowska");
        Kontakty.Add("Robert Ziober");
        Kontakty.Add("Jan Nowak");
        Kontakty.Add("Ewa Kowalska");

        Console.WriteLine();
        foreach(string Kontakt in Kontakty)
        {
            Console.WriteLine(Kontakt);
        }

        Console.WriteLine("\nPojemnosc: {0}", Kontakty.Capacity);
        Console.WriteLine("Licznik: {0}", Kontakty.Count);

        Console.WriteLine("\nZawiera(\"Jan Nowak\"): {0}",
            Kontakty.Contains("Jan Nowak"));

        Console.WriteLine("\nWstaw(2, \"Ewa Kowalska\")");
        Kontakty.Insert(2, "Ewa Kowalska");

        Console.WriteLine();
        foreach(string Kontakt in Kontakty)
        {
            Console.WriteLine(Kontakt);
        }

        Console.WriteLine("\nKontakty[3]: {0}", Kontakty[3]);

        Console.WriteLine("\nUsuń(\"Ewa Kowalska\")");
        Kontakty.Remove("Ewa Kowalska");

        Console.WriteLine();
        foreach(string Kontakt in Kontakty)
        {
            Console.WriteLine(Kontakt);
        }

        Kontakty.TrimExcess();
        Console.WriteLine("\nObetnij()");
        Console.WriteLine("Pojemnosc: {0}", Kontakty.Capacity);
        Console.WriteLine("Licznik: {0}", Kontakty.Count);

        Kontakty.Clear();
        Console.WriteLine("\nClear()");
        Console.WriteLine("Pojemnosc: {0}", Kontakty.Capacity);
        Console.WriteLine("Licznik: {0}", Kontakty.Count);
      }
    }
  }
0

Błąd:

The type 'Collections.Kontakt' already contains a definition for 'Email'

oznacza zapewne, że:

Typ "Collections.Kontakt" zawiera już definicję 'Email' tłumaczeniem Google Translator;

Stąd można wywnioskować, że dublujesz e-mail; Nie znam się zbytnio na C#, ale tyle przychodzi mi do głowy; Przejżyj klasę i odpowiedz sobie co jest źle;

Poza tym masz kod błędu, którego znaczenie możesz sprawdzić w sieci;

0

Dokładnie, już poprawiłem to zdublowanie.

Mam pytanie do programistów C# jak poprawić tą strukturę kodu aby można było dodawać, edytować, usuwać, wypisywać strukturę imię, nazwisko, adres, email itp a nie tylko same imię i nazwisko, czy łączyć to np w poleceniach writeline z + czy jakoś inaczej na osobnych poleceniach? Poza tym jak do tego zastosować polecenia z LIFO i FIFO oraz jak to ładnie okrasić np oddzielić w osobnych kolumnach np imię nazwisko e-mail oddzielając jakąś ramką?

0

To po co Ty zrobiłeś tę klasę Kontakt skoro w Main i tworzysz listę string?

List<string> Kontakty = new List<string>();

Bez sensu. :|

Nie da się wszystkiego zrobić jedną klasą i jedną metodą, co Ty chyba próbujesz osiągnąć.

  1. Main niech będzie w klasie Program, a Twoja klasa Kontakt niech będzie w ogóle w innym pliku.
  2. Niech klasa Kontakt ma konstruktor, który ustawia wartości wszystkich pól (imię, nazwisko, email, itd.).
  3. W klasie Program utwórz listę Kontaktów:
static private List<Kontakt> kontakty = new List<Kontakt>();

Nazwy zmiennych i pól pisze się małą literą.
4) W klasie Program potrzebujesz dodatkowo metod: DodajKontakt, UsunKontakt, WyswietlKontakty, które będą operowały na polu z powyższego punktu.
5) Metoda DodajKontakt niech pobierze od użytkownika dane, utworzy nowy obiekt Kontakt i doda go do listy przez: kontakty.Add().
6) Metoda WyswietlKontakty niech w pętli przejdzie po liście kontakty i niech je wyświetli.
7) A w metodzie Main niech będzie menu programu, w którym będzie wybierało się opcje (1 - wyświetl kontakty, 2 - dodaj kontakt, 3 - usuń kontakt, itd.).

Na razie tyle, jak to zrobisz, to będzie już łatwiej dorobić resztę.

0

Jeśli dobrze to rozumiem to podzieliłem na 2 odrębne pliki cs, dziękuję za wyrozumiałość to jest tak jak człowiek się uczy a takiego programu jeszcze nie robiłem dotychczas jakieś tabele, pętle i to proste :-)

Pierwszy to program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Program
{
class Program
{
public void DodajKontakt();
public void UsunKontakt();
public void WyswietlKontakty();
{
static private List<Kontakt> kontakty = new List<Kontakt>();
KontaktList.Add(new Kontakt(1, "Jan", "Kowalski", 24,"Warszawa ul. Nowowiejska 5","22 453-54-65"));
KontaktList.Add(new Kontakt(2, "Jan", "Nowak", 26,"Łódź ul. Piotrkowska 17","42 553-54-65"));
KontaktList.Add(new Kontakt(3, "Anna", "Gruszka", 28,"Warszawa 
Al. Ujazdowskie 45","22 443-34-25"));
KontaktList.Add(new Kontakt(4, "Ewa", "Kowalska", 27,"Warszawa 
Al. Jerozolimskie 11 m. 5","22 440-12-15"));
KontaktList.Add(new Kontakt(5, "Piotr", "Nowakowski", 25,"Warszawa 
ul. Śródmieście 6 m. 22","22 431-62-11"));
{
    static void Main()
    {

    }
  }
}

drugi kontakt.cs i tu powiem szczerze utknąłem

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Kontakt
{
class Kontakt
{
    public class Kontakt
    {
    public Kontakt(kontaktid, imie, nazwisko, wiek, adres, telefon)
{

    }
  }
}

0
sylwekb napisał(a)

Pierwszy to program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Program
{
class Program
{
    static void Main()
    {
    static private List<Kontakt> kontakty = new List<Kontakt>();
KontaktList.Add(new Kontakt(1, "Jan", "Kowalski", 24,"Warszawa ul. Nowowiejska 5","22 453-54-65"));
KontaktList.Add(new Kontakt(2, "Jan", "Nowak", 26,"Łódź ul. Piotrkowska 17","42 553-54-65"));
KontaktList.Add(new Kontakt(3, "Anna", "Gruszka", 28,"Warszawa 
Al. Ujazdowskie 45","22 443-34-25"));
KontaktList.Add(new Kontakt(4, "Ewa", "Kowalska", 27,"Warszawa 
Al. Jerozolimskie 11 m. 5","22 440-12-15"));
KontaktList.Add(new Kontakt(5, "Piotr", "Nowakowski", 25,"Warszawa 
ul. Śródmieście 6 m. 22","22 431-62-11"));
    }
  }
}

Nie tak. Na liście kontaktów musisz operować z różnych metod klasy Program, więc musi być ona polem klasy. Tymczasem u Ciebie jest ona lokalną zmienną metody Main, nie będziesz miał do niej dostępu z innych metod. Popraw to, bo dalej nie ruszysz.

drugi kontakt.cs i tu powiem szczerze utknąłem

Kod klasy Kontakt podałeś już wczoraj, trochę go poprawię:

    public class Kontakt
    {
        public int IdKontaktu { get; private set; }
        public string Imie { get; private set; }
        public string Nazwisko { get; private set; }
        public int Wiek { get; private set; }
        public string Adres { get; private set; }
        public int Telefon { get; private set; }
        public string Email { get; private set; }

        public Kontakt(int idKontaktu, string imie, string nazwisko, int wiek, string adres, string telefon, string email)
        {
            this.IdKontaktu = idKontaktu;
            this.Imie = imie;
            this.Nazwisko = nazwisko;
            this.Wiek = wiek;
            this.Adres = adres;
            this.Telefon = telefon;
            this.Email = email;
        }
    }
} 
0

Nie bardzo to rozumiem, czy mam przenieść spod metody main w przestrzeń klasy program?

0

Czy taka konstrukcja będzie prawidłowa?

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Program
{
class Program
{
Program.DodajKontakt(idKontaktu, imie, nazwisko, wiek, adres, telefon, email);
Program.UsunKontakt(idKontaktu, imie, nazwisko, wiek, adres, telefon, email);
Program.WyswietlKontakty(idKontaktu, imie, nazwisko, wiek, adres, telefon, email);
{
1

Wygląda na to, że wpisujesz losowe znaki licząc, że zadziała. Wiesz w ogóle jak się definiuje metody w języku C#?

0

Wzór definicji metody może być tak jak na tym przykładzie

      public DodajKontakt(int idKontaktu, string imie, string nazwisko, int wiek, string adres, string telefon, string email);
      public UsunKontakt(int idKontaktu, string imie, string nazwisko, int wiek, string adres, string telefon, string email);
      public WyswietlKontakty(int idKontaktu, string imie, string nazwisko, int wiek, string adres, string telefon, string email); 
0

No dobra, a po co te metody mają mieć parametry? Metoda ma spytać użytkownika o dane, a potem utworzyć nowy kontakt i dodać go do listy, nie potrzebuje żadnych parametrów.

0

Czyli bez tych stringów, int będzie prawidłowo czy jeszcze jakoś inaczej bo jeszcze w tym programowaniu się gubię, cóż początki bywają trudne?

0

Z jakiej książki się uczysz?

0

Książka C# Programowanie i kursów internetowych ale jeszcze się gubię bo to są początki,każdy ma do tego prawo tymbardziej jeśli się jeszcze pracuje i wykonuje się wiele czynności na raz.

W sumie to już mam ale jeszcze generuje mi 2 błędy, których jakoś nie mogę poprawić

'Bibliotekakontaktow.Osoba' does not contain a definition for 'WprowadzOsobe' ...\Visual Studio 2010\Projects\Bazakontaktow\Bazakontaktow\Program.cs 18 11 Bazakontaktow

dotyczy linii: Osoba.WprowadzOsobe(

'Bibliotekakontaktow.Osoba' does not contain a definition for 'WypiszOsobe' ...\Visual Studio 2010\Projects\Bazakontaktow\Bazakontaktow\Program.cs 28 13 Bazakontaktow

dotyczy linii: Osoba.WypiszOsobe(kontakty.Osoby[i]);

bibliotekakontaktow która stanowi plik dll podłączany przez add references do bazy kontaktow

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bibliotekakontaktow
{
  public struct Data
{
   public int Rok;
   public byte Miesiac;
   public byte Dzien;
   public static void WprowadzDate(out Data d)
{
   Console.Write("Podaj rok: ");
   d.Rok = Convert.ToInt32(Console.ReadLine());
   do
   {
      Console.Write("Podaj miesiąc: ");
      d.Miesiac = 
			Convert.ToByte(Console.ReadLine());
   }
   while (d.Miesiac < 1 || d.Miesiac > 12);
   bool flaga = true;
   do
   {
      Console.Write("Podaj dzień: ");
      d.Dzien = 
			Convert.ToByte(Console.ReadLine());
      if(d.Dzien>=1 && d.Dzien<=31)
      {
         switch (d.Miesiac)
         {
            case 2:
               if (d.Dzien < 29)
                  flaga = false;
               break;
            case 4:
            case 6:
            case 9:
            case 11:
               if(d.Dzien<=30)
                  flaga = false;
               break;
            default:
               flaga = false;
               break;
         }
      }
   
   }
   while (flaga);
}

public static void WypiszDate(Data d)
{
   Console.Write("{0}-{1}-{2}", 
				d.Dzien, d.Miesiac, d.Rok);
}
   }
   public struct Osoba
{
   public string Imie;
   public string Nazwisko;
   public Data DataUrodzenia;
   public static void WprowadzOsobe(out Osoba os)
{
   Console.Write("Podaj imie: ");
   os.Imie = Console.ReadLine();
   Console.Write("Podaj nazwisko: ");
   os.Nazwisko = Console.ReadLine();
   Data.WprowadzDate(out os.DataUrodzenia);
}

public static void WypiszOsobe(Osoba os)
{
   Console.Write("Pan(i) {0} {1}, urodzony(a): ", 
					os.Imie, os.Nazwisko);
   Data.WypiszDate(os.DataUrodzenia);
}
}
}


 

bazakontaktow

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Bibliotekakontaktow;
namespace Bazakontaktow
{
    struct Kontakty
{
   public Osoba [] Osoby;
   public uint LiczbaOsob;
   public static void WprowadzKontakt(
				ref Kontakty kontakty)
{
   if (kontakty.LiczbaOsob >= 
				kontakty.Osoby.Length)
      throw new Exception("Baza jest pełna");
    Osoba.WprowadzOsobe(
   out kontakty.Osoby[kontakty.LiczbaOsob]);
   kontakty.LiczbaOsob++;
}
public static void WypiszKontakty(
					Kontakty kontakty)
{
   for (int i = 0; i < kontakty.LiczbaOsob; i++)
   {
      Console.Write("{0}. ", i+1);
      Osoba.WypiszOsobe(kontakty.Osoby[i]);
      Console.WriteLine();
      if ((i+1) % Console.WindowHeight == 0)
         Console.ReadKey();
   }
   Console.ReadKey();
}
public static void UtworzKontakty(
	out Kontakty kontakty, uint liczbaKontaktow)
{
   kontakty.Osoby = new Osoba[liczbaKontaktow];
   kontakty.LiczbaOsob = 0;
}
    class Program
    {
static char Menu()
{
   Console.Clear();
   Console.WriteLine("\n\t\tA - Dodaj kontakt");
   Console.WriteLine("\n\t\tA - Wypisz wszystkie kontakty");
   Console.WriteLine("\n\t\tA - Dodaj kontakt");
   return Console.ReadKey().KeyChar;
}
        static void Main(string[] args)
{
   Kontakty mojeKontakty;
   Kontakty.UtworzKontakty(out mojeKontakty, 5);
   char c;
   do
   {
      c = Menu();
      switch (c)
      {
         case 'a':
         case 'A':
            Kontakty.WprowadzKontakt(
					ref mojeKontakty);
            break;
         case 'b':
         case 'B':
           Kontakty.WypiszKontakty(mojeKontakty);
            break;
      }
   }
   while (!(c == 'k' || c == 'K'));
}
}
}
} 
0

FORMATOWANIE KODU! Ciężko tu cokolwiek zobaczyć. Poza tym kolorowania składni mógłbyś użyć.
Co do błędu kompilator wskazuje, że klasa osoba nie ma metody WypiszOsobe, a to dlatego, że zadeklarowałeś jako static, a wywołujesz na rzecz obiektu (Osoba.WypiszOsobe(kontakty.Osoby[i])), czego nie możesz zrobić. Wróć do książki i przeczytaj fragment o metodach statycznych.

0

Włączyłem kolorowanie składni w tym kodzie, byłem pewien, że wcześniej właczyłem, co do kodu to postaram się poprawić wieczorem bo jestem teraz w pracy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1