Commit 90212901 by krkris

Kommenteeritud lõppkood

parent 5f13a17b
Showing with 49 additions and 95 deletions
#include <stdio.h> #include <stdio.h>
...@@ -2,26 +2,22 @@ ...@@ -2,26 +2,22 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
// kood kommenteerida, muutujate nimed, funktsioonide lisamine
// STRUCT // STRUCT
typedef struct{ typedef struct{
char kood[5]; char kood[5];
bool kleebitud; bool kleebitud;
bool lihtimplikant;
}implikandid; // kleepimata implikandid }implikandid; // kleepimata implikandid
typedef struct{ typedef struct{
char kood[5]; char kood[5];
bool kleebitud; bool kleebitud;
bool lihtimplikant;
}implikandid2; // 1.kleepimise tulemus }implikandid2; // 1.kleepimise tulemus
typedef struct{ typedef struct{
char kood[5]; char kood[5];
bool kleebitud; bool kleebitud;
bool lihtimplikant;
}implikandid3; // 2.kleepimise tulemus }implikandid3; // 2.kleepimise tulemus
typedef struct{ typedef struct{
...@@ -30,22 +26,22 @@ typedef struct{ ...@@ -30,22 +26,22 @@ typedef struct{
// FUNKTSIOONIDE PROTOTÜÜBID // FUNKTSIOONIDE PROTOTÜÜBID
int kontroll(char[]); int kontroll(char[]); // Funktsioon sisestuse kontrollimiseks, parameetriks sisestus
int sisestus(const char[], char[], char[], char[], char[]); int sisestus(const char[], char[], char[], char[], char[]); // Funktsioon kasutajalt sisestuse võtmiseks, parameetriteks muutujad, kuhu salvestatakse sisestus
void info(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char); void info(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char); // Funktsioon, mis kuvab infot polünoomi kohta, parameetriteks TVT väärtused
void kontuur(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char); void kleepimine(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char); // Funktsioon, mis saab kleepimise teel kätte lihtimplikandid ja kuvab TaDNK, parameetriteks TVT väärtused
// MAIN // MAIN
int main(void){ int main(void){
char a[16], b[16], c[16], d[16]; char a[16], b[16], c[16], d[16]; // Kui kasutaja sisestab 4 K-kaardi rida, siis need salvestatakse nelja char tüüpi massiivi, kui mitte, siis salvestatakse kõik esimesse.
char f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF; char f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF; // 4-muutuja loogikafunktsiooni loogikaväärtused f0 - f15
int input; int input;
input = sisestus("Sisestage 4x4 Karnaugh kaart voi 16 loogikavaartust: \n", a, b, c, d); input = sisestus("Sisestage 4x4 Karnaugh kaart voi 16 loogikavaartust: \n", a, b, c, d);
if (input == 1){ if (input == 1){ // Kui sisestus funktsioonis tekkis viga, siis programm lõpeb
return 1; return 1;
} }
if (strlen(a) >= 16){ if (strlen(a) >= 16){ // Kui esimene sisestus on suurem või võrdne 16 tähemärki, siis määratakse muutujad selle järgi
f0 = a[0]; f0 = a[0];
f1 = a[1]; f1 = a[1];
f2 = a[2]; f2 = a[2];
...@@ -63,7 +59,7 @@ int main(void){ ...@@ -63,7 +59,7 @@ int main(void){
fE = a[14]; fE = a[14];
fF = a[15]; fF = a[15];
} }
else{ else{ // Kui toimus Karnaugh' kaardi sisestus, siis määratakse muutujad 4 erineva sisestuse järgi
f0 = a[0]; f0 = a[0];
f1 = a[1]; f1 = a[1];
f2 = a[3]; f2 = a[3];
...@@ -85,7 +81,7 @@ int main(void){ ...@@ -85,7 +81,7 @@ int main(void){
fF = c[2]; fF = c[2];
} }
info(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF); info(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF);
kontuur(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF); kleepimine(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF);
return 0; return 0;
} }
...@@ -94,13 +90,13 @@ int main(void){ ...@@ -94,13 +90,13 @@ int main(void){
// Kasutaja sisestatu kontrollimine: // Kasutaja sisestatu kontrollimine:
int kontroll(char a[16]){ int kontroll(char a[16]){
int i; int i;
for (i = 0; i < strlen(a); i++){ for (i = 0; i < strlen(a); i++){ // Sisestatud tähemärkide kontroll.
if (a[i] != '0' && a[i] != '1'){ if (a[i] != '0' && a[i] != '1'){
printf("Lubamatu sisend: %s\n", a); printf("Lubamatu sisend: %s\n", a);
return 1; return 1;
} }
} }
if (strlen(a) != 4){ if (strlen(a) != 4){ // Kui sisestuse suurus on alla nelja tähemärgi:
printf("Lubamatu sisend %s\n", a); printf("Lubamatu sisend %s\n", a);
return 1; return 1;
} }
...@@ -113,18 +109,18 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16 ...@@ -113,18 +109,18 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16
int i; int i;
printf("%s", tekst); printf("%s", tekst);
scanf("%s", a); scanf("%s", a);
for (i = 0; i < strlen(a); i++){ for (i = 0; i < strlen(a); i++){ // Kui 1. sisestus koosneb millegist muust kui 0 või 1, siis programm teeb exit.
if (a[i] != '0' && a[i] != '1'){ if (a[i] != '0' && a[i] != '1'){
printf("Lubamatu sisend: %s\n", a); printf("Lubamatu sisend: %s\n", a);
return 1; return 1;
} }
} }
if (strlen(a) == 4){ if (strlen(a) == 4){ // Kui kasutaja sisestab neljast tähemärgist koosneva rea:
do{ do{
printf("\n%s\n", a); printf("\n%s\n", a);
printf("Sisestage K-kaardi TEINE rida: \n"); printf("Sisestage K-kaardi TEINE rida: \n");
scanf("%s", b); scanf("%s", b);
}while(kontroll(b) == 1); }while(kontroll(b) == 1); // Kui sisestus on vale, siis küsitakse sisestust uuesti.
do{ do{
printf("\n%s\n", a); printf("\n%s\n", a);
printf("%s\n", b); printf("%s\n", b);
...@@ -139,7 +135,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16 ...@@ -139,7 +135,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16
scanf("%s", d); scanf("%s", d);
}while(kontroll(d) == 1); }while(kontroll(d) == 1);
printf("\n"); printf("\n");
printf("\nTerviklik kaart:\n"); printf("\nTerviklik kaart:\n"); // Prinditakse välja terve kaart
for (i = 0; i < strlen(a); i++){ for (i = 0; i < strlen(a); i++){
printf("%c ", a[i]); printf("%c ", a[i]);
} }
...@@ -158,7 +154,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16 ...@@ -158,7 +154,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16
printf("\n"); printf("\n");
} }
else if (strlen(a) >= 16){ else if (strlen(a) >= 16){ // Kui kasutaja sisestab 16+ tähemärki, millest esimesed 16 on loogikaväärtused, siis kontrollitakse tähemärke.
for (i = 0; i < 16; i++){ for (i = 0; i < 16; i++){
if (a[i] != '0' && a[i] != '1'){ if (a[i] != '0' && a[i] != '1'){
printf("\nLubamatu sisend: %s\n", a); printf("\nLubamatu sisend: %s\n", a);
...@@ -166,7 +162,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16 ...@@ -166,7 +162,7 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16
} }
} }
printf("\n"); printf("\n");
printf("\nK-kaardi kujul:\n"); printf("\nK-kaardi kujul:\n"); // 16 loogikaväärtuse sisestuse korral kuvab programm loogikaväärtused ka K-kaardi kujul.
printf("%c %c %c %c\n", a[0], a[1], a[3], a[2]); printf("%c %c %c %c\n", a[0], a[1], a[3], a[2]);
printf("%c %c %c %c\n", a[4], a[5], a[7], a[6]); printf("%c %c %c %c\n", a[4], a[5], a[7], a[6]);
printf("%c %c %c %c\n", a[12], a[13], a[15], a[14]); printf("%c %c %c %c\n", a[12], a[13], a[15], a[14]);
...@@ -259,15 +255,15 @@ void info(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char f7 ...@@ -259,15 +255,15 @@ void info(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char f7
} }
// Kontuuride leidmine // Kleepimine ja väljastamine
void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char f7, char f8, char f9, char fA, char fB, char fC, char fD, char fE, char fF){ void kleepimine(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char f7, char f8, char f9, char fA, char fB, char fC, char fD, char fE, char fF){
implikandid implikant[16]; implikandid implikant[16];
int i = 0; int i = 0;
int j, k; int j, k;
if(f0 == '1'){ if(f0 == '1'){
strcpy(implikant[i].kood, "0000"); strcpy(implikant[i].kood, "0000"); // Structi salvestatakse argumentvektorid, mille korral funktsioon arvutub üheks - neist saavad algsed implikandid.
i++; i++;
} }
...@@ -347,15 +343,16 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -347,15 +343,16 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
i++; i++;
} }
// Esimene kleepimine
int eri = 0; int eri = 0;
implikandid2 implikant2[16]; implikandid2 implikant2[16];
int q; int q;
int t = 0; int t = 0;
int o; int o;
printf("Esimese kleepimise tulemus: \n");
for (j = 0; j < i; j++){ for (j = 0; j < i; j++){
for (k = 0; k < i; k++){ for (k = 0; k < i; k++){
if(implikant[j].kood[0] != implikant[k].kood[0]){ if(implikant[j].kood[0] != implikant[k].kood[0]){ // Kontrollib, kas kaks implikanti erinevad järgus
eri++; eri++;
q = 0; q = 0;
} }
...@@ -372,10 +369,10 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -372,10 +369,10 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
q = 3; q = 3;
} }
if (eri == 1){ if (eri == 1){ // Ühe järgu võrra erinevad vektorid on kleebitavad.
if (q == 0){ if (q == 0){
strcpy(implikant2[t].kood, implikant[j].kood); // des, source strcpy(implikant2[t].kood, implikant[j].kood); // Kui on kleebitavad vektorid, siis tõstetakse argumentvektor
implikant2[t].kood[q] = '-'; implikant2[t].kood[q] = '-'; // 1.kleepimise tulemuse Structi ning asendatakse erinev järk määramatusega.
} }
if (q == 1){ if (q == 1){
strcpy(implikant2[t].kood, implikant[j].kood); strcpy(implikant2[t].kood, implikant[j].kood);
...@@ -389,13 +386,13 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -389,13 +386,13 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
strcpy(implikant2[t].kood, implikant[j].kood); strcpy(implikant2[t].kood, implikant[j].kood);
implikant2[t].kood[q] = '-'; implikant2[t].kood[q] = '-';
} }
implikant[j].kleebitud = true; implikant[j].kleebitud = true; // Võrreldav implikant salvestatakse "kleebituna"
t++; t++; // Suurendatakse muutuja, mis määrab ära uute implikantide arvu.
} }
eri = 0; eri = 0;
} }
} }
for(j=0; j<t; j++){ for(j=0; j<t; j++){ // Kordused 1. kleepimistulemuses eemaldatakse.
for(k=j+1; k<t; k++){ for(k=j+1; k<t; k++){
if(strcmp(implikant2[j].kood, implikant2[k].kood) == 0){ if(strcmp(implikant2[j].kood, implikant2[k].kood) == 0){
for(o = k; o<t-1; o++){ for(o = k; o<t-1; o++){
...@@ -406,17 +403,13 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -406,17 +403,13 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
} }
} }
} }
for(j = 0; j<t; j++){
printf("%s\n", implikant2[j].kood);
}
printf("\n"); printf("\n");
printf("\n");
printf("\n");
// Teine kleepimine
implikandid3 implikant3[16]; implikandid3 implikant3[16];
int v = 0; int v = 0;
printf("Teise kleepimise tulemus: \n");
for (j = 0; j < t; j++){ for (j = 0; j < t; j++){
for (k = 0; k < t; k++){ for (k = 0; k < t; k++){
if (implikant2[j].kood[0] != implikant2[k].kood[0]){ if (implikant2[j].kood[0] != implikant2[k].kood[0]){
...@@ -474,17 +467,10 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -474,17 +467,10 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
} }
} }
} }
for(j = 0; j<v; j++){
printf("%s\n", implikant3[j].kood);
}
printf("\n");
printf("\n");
printf("\n");
// Kolmas kleepimine - kindlad lihtimplikandid
implikandid4 implikant4[16]; implikandid4 implikant4[16];
int r = 0; int r = 0;
printf("Kolmanda kleepimise tulemus: \n");
for (j = 0; j < v; j++){ for (j = 0; j < v; j++){
for (k = 0; k < v; k++){ for (k = 0; k < v; k++){
if (implikant3[j].kood[0] != implikant3[k].kood[0]){ if (implikant3[j].kood[0] != implikant3[k].kood[0]){
...@@ -527,8 +513,6 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -527,8 +513,6 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
} }
} }
printf("\n");
printf("Pärast kustutamist: \n");
for(j=0; j<r; j++){ for(j=0; j<r; j++){
for(k=j+1; k<r; k++){ for(k=j+1; k<r; k++){
if(strcmp(implikant4[j].kood, implikant4[k].kood) == 0){ if(strcmp(implikant4[j].kood, implikant4[k].kood) == 0){
...@@ -540,70 +524,40 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -540,70 +524,40 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
} }
} }
} }
for(j = 0; j<r; j++){
printf("%s\n", implikant4[j].kood);
}
printf("\n");
printf("\n");
printf("\n");
printf("Lihtimplikandid: \n");
for(j = 0; j<i; j++){
if(implikant[j].kleebitud != true){
printf("%s\n", implikant[j].kood);
}
}
for(j = 0; j<t; j++){
if(implikant2[j].kleebitud != true){
printf("%s\n", implikant2[j].kood);
}
}
for(j = 0; j<v; j++){
if(implikant3[j].kleebitud != true){
printf("%s\n", implikant3[j].kood);
}
}
for(j = 0; j<r; j++){
printf("%s\n", implikant4[j].kood);
}
printf("\n");
printf("\n");
printf("\n");
// Lihtimplikantide disjunktsiooni loomine, loogikamuutujate vastavaks seadmine TaDNK jaoks // Lihtimplikantide disjunktsiooni loomine, loogikamuutujate vastavaks seadmine TaDNK jaoks
printf("TaDNK:\n"); printf("TaDNK:\n");
int m; int m;
char indeks[10]; char indeks[10]; // Loogikamuutuja indeks ehk numbriline osa, nt X1 indeks on 1.
char tulemus[50]; char tulemus[50]; // Massiiv, kuhu salvestatakse TaDNK tähemärgi haaval.
int z = -1; int z = -1;
for(j = 0; j<i; j++){ for(j = 0; j<i; j++){
if(implikant[j].kleebitud != true){ if(implikant[j].kleebitud != true){ // Kui implikanti ei ole kasutatud kleepimises, siis on see lihtimplikant
for (m = 0; m < 4; m++){ for (m = 0; m < 4; m++){
if (implikant[j].kood[m] == '0'){ if (implikant[j].kood[m] == '0'){ // Kui lihtimplikandi massiivi element on 0, siis peab TaDNK-s olema inversioon, muutuja ja indeks, nt -X1.
z++; z++; // z saab väärtuseks 0.
tulemus[z] = '-'; tulemus[z] = '-';
z++; z++;
tulemus[z] = 'X'; tulemus[z] = 'X';
z++; z++;
sprintf(indeks, "%d", m+1); sprintf(indeks, "%d", m+1); // sprintf: integer -> char massiiv
tulemus[z] = indeks[0]; tulemus[z] = indeks[0]; // indeks[] massiivis asuv number ehk loogikamuutuja indeks,
} } // on massiivi esimene element, see salvestatakse tulemus[] massiivi.
else if (implikant[j].kood[m] == '1'){ else if (implikant[j].kood[m] == '1'){ // Kui lihtimplikandi massiivi element on 1, siis peab TaDNK-s olema muutuja ja indeks, nt X1.
z++; z++;
tulemus[z] = 'X'; tulemus[z] = 'X';
z++; z++;
sprintf(indeks, "%d", m+1); sprintf(indeks, "%d", m+1);
tulemus[z] = indeks[0]; tulemus[z] = indeks[0];
} }
if (m == 3){ if (m == 3){ // Lihtimplikandi viimane element, prinditakse "vahe", disjunktsiooni tehe V, "vahe".
z++; z++;
tulemus[z] = '\t'; tulemus[z] = '\t'; // Vahe
z++; z++;
tulemus[z] = 'V'; tulemus[z] = 'V'; // Disjunktsioon
z++; z++;
tulemus[z] = '\t'; tulemus[z] = '\t'; // Vahe
} }
} }
} }
...@@ -704,7 +658,7 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char ...@@ -704,7 +658,7 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
} }
// TaDNK välja printimine // TaDNK välja printimine
tulemus[z-1] = ' '; tulemus[z-1] = ' '; // Kustutab massiivi viimase elemendi, saades lahti üleliigsest disjunktsioonist
printf("%s", tulemus); printf("%s", tulemus);
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment