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ń?
LIFO: http://msdn.microsoft.com/en-us/library/3278tedw.aspx
FIFO: http://msdn.microsoft.com/en-us/library/7977ey2c.aspx
Przykłady na dole obu stron z linków.
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.
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 ;)
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;
}
}
}
Chodzi o odróżnienie danych tekstowych od numerycznych ale może źle zrozumiałem strukturę tej klasy
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.
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);
}
}
}
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;
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ą?
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ąć.
- Main niech będzie w klasie Program, a Twoja klasa Kontakt niech będzie w ogóle w innym pliku.
- Niech klasa Kontakt ma konstruktor, który ustawia wartości wszystkich pól (imię, nazwisko, email, itd.).
- 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ę.
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)
{
}
}
}
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;
}
}
}
Nie bardzo to rozumiem, czy mam przenieść spod metody main w przestrzeń klasy program?
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);
{
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#?
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);
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.
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?
Z jakiej książki się uczysz?
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'));
}
}
}
}
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.
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.