Komprimirana ikona
Sestavi program, ki bo iz vnešene ali naključno generirane tabele enk in ničel zapisal "kompromiran" string. In sicer za vsako vrstico določi črko, jo zapiši, nato pa zapiši začetni znak in število zaporadnih enakih znakov. Torej črka se v isti vrstici lahko pojavi večkrat, če se zaporedno v vrstici spremni znak.
Primer:
napišemo dve vrstici do 8 ničel ali enk:
11110000
10101010
se bo izpisalo: a14a04b11b01b11b01b11b01b11b11
Rešitev (C#)
class Program
{
static void Main(string[] args) {
// tukaj nastaviš št. vrstic
int vi = 2;
// tukaj nastaviš št. znakov v vrstici
int vn = 8;
//opis uporabniku na ekran, kaj bomo delali
Console.WriteLine("Komprimiranje ikon " + vi + "x" + vn);
Console.WriteLine();
Console.WriteLine("Program bo generirano ali vnešeno tabelo komprimiral (stisnil) po naslednjem algoritmu");
Console.WriteLine("najprej se generira index vrstice (črka)");
Console.WriteLine("Zatem vrednost v tabeli v prvem polju na začetku vrstice ali po spremembi vrednosti v vrstici");
Console.WriteLine("Nato še število enakih znakov v tem delu vrstice.");
Console.WriteLine();
Console.WriteLine("Ali želite da Program sam generira ikono? d/n"); //vprašanje
string dane = Console.ReadLine();
bool da;
string izvrstica = "";
string izcrka = "";
// če d potem generiraj tabelo, drugače ročni vnos
da = string.Equals(dane, "d");
// definicija tabele
int[,] ikona = new int[vi, vn];
// generiranje tabele
if (da == true) {
// random
Random rnd = new Random();
Console.WriteLine();
//ob generiranji še izpiši tabelo
Console.WriteLine("Generirana ikona izgleda takole; ");
// random vrstice
for (int i = 0; i < vi; i++) {
izvrstica = "";
//postavi na prazno
izcrka = "";
//random stolpci
for (int n = 0; n < vn; n++) {
// določi random 0 ali 1 in zapiši v tabelo
ikona.SetValue(rnd.Next(0, 2), i, n);
//vzemi iz tabele za izpis
izcrka = Convert.ToString(ikona.GetValue(i, n));
bool zamenjajena;
// zamenjaj 1 z "*" in 0 z " " za lepši izpis
zamenjajena = string.Equals(izcrka, "1");
if (zamenjajena == true) {
izcrka = "*";
} else {
izcrka = " ";
}
// sestavi vrstico
izvrstica = izvrstica + izcrka;
}
Console.WriteLine(izvrstica);// izpiši vrstico
}
} else { //če ne random potem vnesi vrstico ročno
Console.WriteLine("Vnesi " + vi + " vrstic po " + vn + " enk ali ničel");
// zanka vrstice
for (int i = 0; i < vi; i++) {
Console.WriteLine("Vnesi vrstico " + i + " :");
//preberi vrstico
string prebranavrstica = Console.ReadLine();
//omeji vnesene znake na velikost vrstice v tabeli
prebranavrstica = prebranavrstica.Substring(0, vn);
//zanka stolpca
for (int n = 0; n < vn; n++) {
//dobi en znak iz vrstice
int znak = int.Parse(prebranavrstica.Substring(n, 1));
//zapiši ga v tabelo
ikona.SetValue(znak, i, n);
}
}
}
string vsevrstice = "abcdefghijklmnopqrstuvzxy";// komprimiranje
//začetne vrednosti
string vrstica = "";
bool znak1 = false;
string prejsniznak = "";
string zadnjiznak = "";
int enak = 0;
string komprimiran = "";
string komprimiranavrstica = "";
// zanka vrstice
for (int i = 0; i < vi; i++) {
enak = 0;
// iz vsevrstice dobi katera črka odgovarja indexu vrstice
vrstica = vsevrstice.Substring(i, 1);
//zanka stolpca v vrstici
for (int n = 0; n < vn; n++) {
int r = n - 1;
if (r < 0 == true) {
r = 0;// predzadnja črka na začetku ne more biti na mestu manj kot 0
}
// dobi prejšnji znak v vrstici//če prvi sta enaka z zadnjim
prejsniznak = "" + (ikona.GetValue(i, r));
// dobi zadnji znak
zadnjiznak = "" + (ikona.GetValue(i, n));
// primerjaj še sta znaka enaka
znak1 = string.Equals(prejsniznak, zadnjiznak);
if (znak1 == true) {
enak = enak + 1;// še sta enaka prištej +1 spremenljivki enak
} else {
// če nista enaka dodaj zapis v vrstico drugače preskoči
komprimiranavrstica = komprimiranavrstica + vrstica + prejsniznak + enak;
enak = 1;
}
bool konec;
konec = int.Equals(n, vn - 1);// ugotovi če je konec vrstice
if (konec == true) {
// če je konec vrstice vseskupaj zapiši v spremenljivlo in pojdi na novo
komprimiranavrstica = komprimiranavrstica + vrstica + prejsniznak + enak;
//zapiši črko vrstice , 1 ali 0, ter št enakih zaporednih znakov enk ali ničel
}
izvrstica = izvrstica + ikona.GetValue(i, n);// sestavi vrstico iz tabele
}
// dodajaj vrstice
komprimiran = komprimiran + komprimiranavrstica;
//sprazni spremenljivko za novo vrstico
komprimiranavrstica = "";
}
Console.WriteLine();
Console.WriteLine("Komprimirana tabela bi po tem algoritmu izgledala takole: ");
Console.WriteLine();
Console.WriteLine(komprimiran);// izpiši komprimiran izpis
Console.ReadLine();
}
}