'Program służy do tablicowania nazwisk w kolejności alfabetycznej (lub odwrotnej).
'Użyłem tu algorytmu sortowania przez wstawianie - kolejne nazwiska są od razu wstawiane na odpowiednie miejsce
'dzięki czemu lista jest zawsze posortowana i oddzielny przycisk "sortuj" jest zbędny.
'Należy również zwrócić uwagę na to, że znaki polskie są zapisywane w pamięci nieco inaczej niż całą reszta
'znaków z ASCII (patrz wiki) więc pojawiają się przez to drobne błędy w sortowaniu (myślę że nie musicie ich rozpatrywać
'bo to za dużo odrębnych przypadków). Np nazwisko "Długosz" będzie zawsze za nazwiskiem "Dratewka" mimo że co innego wynika
'z kolejności alfabetycznej.
Public Class Form1
Private Sub btnDodajZPliku_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDodajZPliku.Click
'Procedura tablicowania danych pobranych z pliku
Dim sciezka, nazwisko As String 'deklarowanie zmiennych
Dim k, NrPliku, i, j As Integer
Dim Blad As Boolean
nazwisko = ""
If lstNazwiska.Items.Count = 0 Then 'w przypadku gdy mamy już jakieś nazwiska w liście nie wolno nam ich pobrać ponownie (należy wyczyścić listę)
Blad = False
Else
MsgBox("Nie możesz pobrać ponownie nazwisk z pliku!")
Blad = True
End If
If (txtSciezka.Text = "" Or txtK.Text = "") And Not Blad Then 'odpowiedni błąd w przypadku nie wypełnienia któregoś z pól
MsgBox("Nie podano ścieżki pliku lub liczby nazwisk do pobrania!")
Blad = True
End If
sciezka = txtSciezka.Text
k = Val(txtK.Text)
If k = 0 And Not Blad Then 'sprawdzenie czy nie chcemy przypadkiem pobrać 0 nazwisk (gdy wpiszemy jakiś tekst zamiast liczby to także wartość będzie 0)
MsgBox("Błędnia podana liczba nazwisk do pobrania!")
Blad = True
End If
If Not Blad Then 'jeżeli nie było wcześniej błędu rozpoczynamy wczytywanie zmiennych
NrPliku = FreeFile()
On Error GoTo bladpliku 'tu zaczyna się blok skoku do etykiety który nie jest zaznaczony na schemacie, skok będzie w przypadku błędnie podanej ścieżki lub gdy zechcemy pobrać więcej nazwisk niż mamy w pliku
FileOpen(NrPliku, sciezka, OpenMode.Input)
i = 0 'zmienna zliczająca ile już wstawiliśmy nazwisk
Do While Not EOF(NrPliku) And i < k
Input(NrPliku, nazwisko)'pobranie nazwiska
j = 0 'zmienna za pomocą której znajdziemy odpowiednie miejsce w liście na nazwisko
If lstNazwiska.Items.Count = 0 Then 'jeżeli lista jest pusta to po prostu wstawiamy nazwisko
lstNazwiska.Items.Add(nazwisko)
Else
While j <> lstNazwiska.Items.Count 'w przeciwnym wypadku wykonujemy pętlę wyszukującą odpowiednią pozycję wykonującą się do momentu jej przerwania lub znalezienia odpowiedniej pozycji
If chkOdwrotnie.Checked Then 'czy zaznaczono odwrotne sortowanie, oba przypadki różnią się jedynie znakiem mniejszości w odpowiednią stronę
If UCase(lstNazwiska.Items.Item(j).ToString) > UCase(nazwisko) Then 'instrukcja UCase zamienia ciąg dowolnych liter na duże litery, jakby tego nie było to nazwiska napisane małymi literami byłyby ustawiane zawsze za wszystkimi napisanymi z dużej (rzuć okiem w wiki na ASCII - numery odpowiadające literom)
j = j + 1 'jeżeli to nie jest jeszcze odpowiednie miejsce to zwiększamy pozycję
Else
Exit While 'jeżeli to jest odpowiednie miejsce to przerywamy pętlę, zamiast exit while można się również posłużyć specjalną zmienną odpowiadającą za to czy przerwać pętlę (typ boolean) i użyć w warunku wykonywania pętli koniunkcji (And)
End If
Else
If UCase(lstNazwiska.Items.Item(j).ToString) < UCase(nazwisko) Then 'przeciwny przypadek, sortujemy normalnie (jest symetryczny, nie będę go omawiał)
j = j + 1
Else
Exit While
End If
End If
End While
lstNazwiska.Items.Insert(j, nazwisko) 'wstawiamy nazwisko na ustalonej wcześniej pozycji j
End If
i = i + 1
Loop
If i < k Then
bladpliku: MsgBox("Wystąpił błąd podczas pobierania nazwisk z pliku.") 'błąd opisany wyżej przy instrukcji skoku
Blad = True
End If
FileClose(NrPliku) 'zamykamy plik
lblLicz.Text = Str(lstNazwiska.Items.Count) 'wpisujemy odpowiednią liczbę do polaz liczbami nazwisk
End If
End Sub
Private Sub btnWyczysc_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWyczysc.Click
'Procedura czyszczenia zawartości listy i pola z liczbą nazwisk
lstNazwiska.Items.Clear() 'Czyść listę
lblLicz.Text = " " 'wpisz spację do pola z liczbą nazwisk (w praktyce wyczyść to pole)
End Sub
Private Sub btnWyjscie_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWyjscie.Click
'zamykanie programu
Close()
End Sub
Private Sub btnDodajNazwisko_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDodajNazwisko.Click
'Procedura dodawania nazwisk bezpośrednio z palca
Dim nazwisko As String
Dim j As Integer
Dim blad As Boolean
nazwisko = ""
If txtNoweNazwisko.Text = "" Then 'Upewnienie się czy wpisaliśmy jakieś nazwisko
MsgBox("Nie podano nazwiska do dodania!")
blad = True
Else
nazwisko = txtNoweNazwisko.Text 'Jeżeli wpisaliśmy jakieś to zapisujemy je w zmiennej nazwisko
End If
If Not blad Then 'jeżeli wszystko było ok to szukamy miejsca gdzie by tu je wstawić
j = 0
If lstNazwiska.Items.Count = 0 Then 'jeżeli lista była pusta to dodajemy po prostu nazwisko
lstNazwiska.Items.Add(nazwisko)
Else
While j <> lstNazwiska.Items.Count 'jeżeli nie to szukamy odpowiedniego miejsca (w sposób identyczny jak wyżej)
If chkOdwrotnie.Checked Then
If UCase(lstNazwiska.Items.Item(j).ToString) > UCase(nazwisko) Then
j = j + 1
Else
Exit While
End If
Else
If UCase(lstNazwiska.Items.Item(j).ToString) < UCase(nazwisko) Then
j = j + 1
Else
Exit While
End If
End If
End While
lstNazwiska.Items.Insert(j, nazwisko) 'wstawienie nazwiska na pozycję j
End If
lblLicz.Text = Str(lstNazwiska.Items.Count) 'uaktualnienie pola z liczbą nazwisk
End If
End Sub
Private Sub chkOdwrotnie_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkOdwrotnie.CheckedChanged
'Procedura zmiany sposobu sortowania
Dim i, j, n As Integer
Dim tablica(lstNazwiska.Items.Count - 1) As String 'zapiszemy nazwiska z listy w specjalnej pomocniczej tablicy
n = lstNazwiska.Items.Count - 1
For i = 0 To n 'Tu odbywa się uzupełnienie tablicy
tablica(i) = lstNazwiska.Items.Item(i).ToString
Next
lstNazwiska.Items.Clear() 'Czyścimy listę
For j = 0 To n 'i wstawiamy elementy z tablicy do listy w odwrotnej kolejności
lstNazwiska.Items.Add(tablica(n - j))
Next
End Sub
End Class
'W razie problemów, pytań lub reklamacji pisać na maila: cowboy92@wp.pl
'Reklamacje uwzględniam do 3 dni po otrzymaniu projektu
'Nie mogę oczywiście zagwarantować że nie będzie dopytki ani nawet maksymalnej liczby punktów więc proszę o przeanalizowanie
'tego programu i zgłoszenie to co chcielibyście może żeby działało inaczej. Na wypadek dopytki jest ten myślę całkiem
'szczegółowy opis ale w razie pytań to kierować je na maila
'schemat myślę że jest w miarę dokładny, ale w razie pytań również na maila
Wyszukiwarka
Podobne podstrony:
Platforma Stewarta opis programuZnajdź i zamień opis programuOpis programowania Pioneer 1430Opis programuopis programu czyste powietrze wokol nasBazaFilmów Opis programuPolski opis programu AutorunsPolski opis programu ESTPolski opis programu Chemistry ProblemsOpis programu HEC RASWyznacznik opis programuOpis programu UTC GTPolski opis programu fx CalcKEB F5 opis programuOPIS PROGRAMUrozdzial 8 Opis programowania krokowegoOpis programu DalilyDiarySymantec Endpoint Protection 11 0 4014 MR4 MP1 32 bit PL Full OPIS PROGRAMUwięcej podobnych podstron