Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
- /**
- * Objectif
- * Une porte logique est un dispositif électronique qui met en œuvre une fonction booléenne, effectue une opération logique sur une ou plusieurs entrées binaires et produit une seule sortie binaire.
- *
- * Énoncé :
- * Étant donné n noms de signaux d'entrée et leurs données respectives, et m noms de signaux de sortie avec leur type de porte logique respective et deux noms de signaux d'entrée, fournissez les noms des signaux de sortie m et leurs données respectives, dans le même ordre que ceux fournis dans la description de l'entrée.
- *
- * Tous les types de portes auront toujours deux entrées et une sortie.
- * Toutes les données des signaux d'entrée ont toujours la même longueur.
- *
- * Les types de portes sont les suivants :
- * - AND : effectue une opération ET logique.
- * - OR : effectue une opération OU logique.
- * - XOR : effectue une opération OU exclusif logique.
- * - NAND : effectue une opération ET logique inversée.
- * - NOR : effectue une opération OU logique inversée.
- * - NXOR : effectue une opération OU exclusif logique inversée.
- *
- * Les signaux sont représentés par des caractères de soulignement et de tiret, un soulignement correspondant à un niveau bas (0, ou faux) et un tiret correspondant à un niveau élevé (1, ou vrai).
- **/
- char boolToCharLogicGates(bool b) {
- return b ? '-' : '_';
- }
- bool charToBoolLogicGates(char c) {
- return c == '-' ? true : false;
- }
- typedef enum {
- AND,
- OR,
- XOR,
- NAND,
- NOR,
- NXOR
- } LogicOperator;
- bool doOperator(LogicOperator op, bool a, bool b) {
- switch (op) {
- case AND:
- return a && b;
- case OR:
- return a || b;
- case XOR:
- return a != b;
- case NAND:
- return !(a && b);
- case NOR:
- return !(a || b);
- case NXOR:
- return a == b;
- default:
- return false;
- }
- }
- int main()
- {
- int n;
- scanf("%d", &n);
- int m;
- scanf("%d", &m);
- // Traitement des données des signaux d'entrée
- char inputSignals[n][9];
- char inputValues[n][65];
- for (int i = 0; i < n; i++) {
- scanf("%s%s", inputSignals[i], inputValues[i]);
- }
- // Traitement des signaux de sortie
- for (int i = 0; i < m; i++) {
- char outputName[9];
- char type[9];
- char inputName1[9];
- char inputName2[9];
- scanf("%s%s%s%s", outputName, type, inputName1, inputName2);
- // Récupère les données des signaux d'entrée
- char* signalForm1 = NULL;
- char* signalForm2 = NULL;
- for (int j = 0; j < n; j++) {
- if (strcmp(inputSignals[j], inputName1) == 0) {
- signalForm1 = inputValues[j];
- }
- if (strcmp(inputSignals[j], inputName2) == 0) {
- signalForm2 = inputValues[j];
- }
- }
- if (signalForm1 == NULL || signalForm2 == NULL) {
- return 1; // Erreur : signal d'entrée introuvable
- }
- int length = strlen(signalForm1) < strlen(signalForm2) ? strlen(signalForm1) : strlen(signalForm2);
- // Détermine le type d'opérateur logique
- LogicOperator gateType;
- if (strcmp(type, "AND") == 0) {
- gateType = AND;
- }
- else if (strcmp(type, "OR") == 0) {
- gateType = OR;
- }
- else if (strcmp(type, "XOR") == 0) {
- gateType = XOR;
- }
- else if (strcmp(type, "NAND") == 0) {
- gateType = NAND;
- }
- else if (strcmp(type, "NOR") == 0) {
- gateType = NOR;
- }
- else if (strcmp(type, "NXOR") == 0) {
- gateType = NXOR;
- }
- // Calcule la sortie
- char outputSignal[65] = "";
- for (int j = 0; j < length; j++) {
- bool signal1 = charToBoolLogicGates(signalForm1[j]);
- bool signal2 = charToBoolLogicGates(signalForm2[j]);
- bool result = doOperator(gateType, signal1, signal2);
- outputSignal[j] = boolToCharLogicGates(result);
- }
- // Affiche le nom de la sortie et le signal
- printf("%s %s\n", outputName, outputSignal);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement