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 @@
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
// kood kommenteerida, muutujate nimed, funktsioonide lisamine
// STRUCT
typedef struct{
char kood[5];
bool kleebitud;
bool lihtimplikant;
}implikandid; // kleepimata implikandid
typedef struct{
char kood[5];
bool kleebitud;
bool lihtimplikant;
}implikandid2; // 1.kleepimise tulemus
typedef struct{
char kood[5];
bool kleebitud;
bool lihtimplikant;
}implikandid3; // 2.kleepimise tulemus
typedef struct{
......@@ -30,22 +26,22 @@ typedef struct{
// FUNKTSIOONIDE PROTOTÜÜBID
int kontroll(char[]);
int sisestus(const char[], char[], char[], char[], char[]);
void info(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char);
void kontuur(char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char);
int kontroll(char[]); // Funktsioon sisestuse kontrollimiseks, parameetriks sisestus
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); // Funktsioon, mis kuvab infot polünoomi kohta, parameetriteks TVT väärtused
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
int main(void){
char a[16], b[16], c[16], d[16];
char f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, fA, fB, fC, fD, fE, fF;
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; // 4-muutuja loogikafunktsiooni loogikaväärtused f0 - f15
int input;
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;
}
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];
f1 = a[1];
f2 = a[2];
......@@ -63,7 +59,7 @@ int main(void){
fE = a[14];
fF = a[15];
}
else{
else{ // Kui toimus Karnaugh' kaardi sisestus, siis määratakse muutujad 4 erineva sisestuse järgi
f0 = a[0];
f1 = a[1];
f2 = a[3];
......@@ -85,7 +81,7 @@ int main(void){
fF = c[2];
}
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;
}
......@@ -94,13 +90,13 @@ int main(void){
// Kasutaja sisestatu kontrollimine:
int kontroll(char a[16]){
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'){
printf("Lubamatu sisend: %s\n", a);
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);
return 1;
}
......@@ -113,18 +109,18 @@ int sisestus(const char tekst[40], char a[16], char b[16], char c[16], char d[16
int i;
printf("%s", tekst);
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'){
printf("Lubamatu sisend: %s\n", a);
return 1;
}
}
if (strlen(a) == 4){
if (strlen(a) == 4){ // Kui kasutaja sisestab neljast tähemärgist koosneva rea:
do{
printf("\n%s\n", a);
printf("Sisestage K-kaardi TEINE rida: \n");
scanf("%s", b);
}while(kontroll(b) == 1);
}while(kontroll(b) == 1); // Kui sisestus on vale, siis küsitakse sisestust uuesti.
do{
printf("\n%s\n", a);
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
scanf("%s", d);
}while(kontroll(d) == 1);
printf("\n");
printf("\nTerviklik kaart:\n");
printf("\nTerviklik kaart:\n"); // Prinditakse välja terve kaart
for (i = 0; i < strlen(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
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++){
if (a[i] != '0' && a[i] != '1'){
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
}
}
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[4], a[5], a[7], a[6]);
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
}
// Kontuuride leidmine
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){
// Kleepimine ja väljastamine
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];
int i = 0;
int j, k;
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++;
}
......@@ -347,15 +343,16 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
i++;
}
// Esimene kleepimine
int eri = 0;
implikandid2 implikant2[16];
int q;
int t = 0;
int o;
printf("Esimese kleepimise tulemus: \n");
for (j = 0; j < i; j++){
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++;
q = 0;
}
......@@ -372,10 +369,10 @@ void kontuur(char f0, char f1, char f2, char f3, char f4, char f5, char f6, char
q = 3;
}
if (eri == 1){
if (eri == 1){ // Ühe järgu võrra erinevad vektorid on kleebitavad.
if (q == 0){
strcpy(implikant2[t].kood, implikant[j].kood); // des, source
implikant2[t].kood[q] = '-';
strcpy(implikant2[t].kood, implikant[j].kood); // Kui on kleebitavad vektorid, siis tõstetakse argumentvektor
implikant2[t].kood[q] = '-'; // 1.kleepimise tulemuse Structi ning asendatakse erinev järk määramatusega.
}
if (q == 1){
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
strcpy(implikant2[t].kood, implikant[j].kood);
implikant2[t].kood[q] = '-';
}
implikant[j].kleebitud = true;
t++;
implikant[j].kleebitud = true; // Võrreldav implikant salvestatakse "kleebituna"
t++; // Suurendatakse muutuja, mis määrab ära uute implikantide arvu.
}
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++){
if(strcmp(implikant2[j].kood, implikant2[k].kood) == 0){
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
}
}
}
for(j = 0; j<t; j++){
printf("%s\n", implikant2[j].kood);
}
printf("\n");
printf("\n");
printf("\n");
// Teine kleepimine
implikandid3 implikant3[16];
int v = 0;
printf("Teise kleepimise tulemus: \n");
for (j = 0; j < t; j++){
for (k = 0; k < t; k++){
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
}
}
}
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];
int r = 0;
printf("Kolmanda kleepimise tulemus: \n");
for (j = 0; j < v; j++){
for (k = 0; k < v; k++){
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
}
}
printf("\n");
printf("Pärast kustutamist: \n");
for(j=0; j<r; j++){
for(k=j+1; k<r; k++){
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
}
}
}
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
printf("TaDNK:\n");
int m;
char indeks[10];
char tulemus[50];
char indeks[10]; // Loogikamuutuja indeks ehk numbriline osa, nt X1 indeks on 1.
char tulemus[50]; // Massiiv, kuhu salvestatakse TaDNK tähemärgi haaval.
int z = -1;
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++){
if (implikant[j].kood[m] == '0'){
z++;
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 saab väärtuseks 0.
tulemus[z] = '-';
z++;
tulemus[z] = 'X';
z++;
sprintf(indeks, "%d", m+1);
tulemus[z] = indeks[0];
}
else if (implikant[j].kood[m] == '1'){
sprintf(indeks, "%d", m+1); // sprintf: integer -> char massiiv
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'){ // Kui lihtimplikandi massiivi element on 1, siis peab TaDNK-s olema muutuja ja indeks, nt X1.
z++;
tulemus[z] = 'X';
z++;
sprintf(indeks, "%d", m+1);
tulemus[z] = indeks[0];
}
if (m == 3){
if (m == 3){ // Lihtimplikandi viimane element, prinditakse "vahe", disjunktsiooni tehe V, "vahe".
z++;
tulemus[z] = '\t';
tulemus[z] = '\t'; // Vahe
z++;
tulemus[z] = 'V';
tulemus[z] = 'V'; // Disjunktsioon
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
}
// TaDNK välja printimine
tulemus[z-1] = ' ';
tulemus[z-1] = ' '; // Kustutab massiivi viimase elemendi, saades lahti üleliigsest disjunktsioonist
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