Проблема с преобразованием элементов очереди в C - PullRequest
0 голосов
/ 29 октября 2019

Упражнение следующее:

"пользователь вводит несколько чисел (например, 129109212). Затем это число фильтрует, где остаются только '0' и '1' (1101). Затем, если длина последнего числа равнабольше 4, то каждый раздел из 4 чисел преобразуется в десятичную (из двоичного числа), называемую теперь «res». Если одно из «res» больше 8, целое введенное число удаляется из очереди, а следующее число преобразуется. Затем выведите все результаты ".

ПРИМЕР (с 2 числами): введите число: 10203040506071 Двоичный файл: 10000001 (здесь два числа: 1000 и 0001. они преобразуют (8 и 1)). РЕЗУЛЬТАТ IS: 81


Введите номер: 11023232030232 Двоичный файл: 11000 (Здесь 1100 и 0 - 1100 больше 8 (12) и число удаляется из очереди)


КОНЕЦ РЕЗУЛЬТАТА: 1) 81

--- КОНЕЦ --- ЗДЕСЬ КОД (ЛОГИЧЕСКИ ВПЕРЕД, НО ОШИБКИ ПРОИСХОДЯТ (ошибка чтения и т. Д. ())

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 
#include <string.h>
#include <math.h>

#define QMAX 100
typedef long long int li;
struct queue {
    li qu[QMAX];
    int rear, frnt;
};

//FUNCTIONS FOR THER QUEUE
void init(struct queue* q) {
    q->frnt = 1;
    q->rear = 0;
    puts("--------THE QUEUE WAS CREATED SUCCESSFULLY!!!--------");
    return;
}

void insert(struct queue* q, li x) {
    if (q->rear < QMAX - 1) {
        q->rear++;
        //strcpy(q->qu[q->rear], str);
        q->qu[q->rear] = x;
    }
    else
        printf("---THE QUEUE IS FULL!---\n");
    return;
}

int isempty(struct queue* q) {
    if (q->rear == 0) return(1);
    else  return(0);
}

void print(struct queue* q) {
    puts("----THE ELEMENTS OF THRE QUEUE ARE: ----");
    int h;
    if (isempty(q) == 1) {
        printf("Очередь пуста!\n");
        return;
    }
    for (h = q->frnt; h <= q->rear; h++)
        printf("%lli\n", q->qu[h]);
    return;
}

li removeEl(struct queue* q) {
    int h; li x;
    if (isempty(q) == 1) {
        printf("Очередь пуста!\n");
        return(0);
    }
    x = q->qu[q->frnt];
    for (h = q->frnt; h < q->rear; h++) {
        q->qu[h] = q->qu[h + 1];
    }
    q->rear--;
    return(x);
}
int main()
{
    char str[20], inputStr[100];
    int i, num;
    printf("Enter the amount of numbers: \n"); scanf("%d", &num);
    struct queue* queue;
    queue = (struct queue*)malloc(sizeof(struct queue));
    init(queue);

    for (i = 0; i < num; i++) {
        li x;
        printf("Enter your string : "); getchar();
        scanf("%lli", &x); getchar();
        insert(queue, x);
    }
    puts("THE QUEUE IS: ");
    print(queue);

    int h;
    for (h = queue->frnt; h < queue->rear + 1; h++) {
        char inputStr[127], res[20];
        sprintf(inputStr, "%lli", queue->qu[h]);
        //DLETING EVERYTHING IS NOT 0 OR 1
        int j = 0;
        for (i = 0; inputStr[i]; i++)
            if (inputStr[i] >= '0' && inputStr[i] <= '1' || inputStr[i] == ' ' || inputStr[i] == '\0') {
                inputStr[j] = inputStr[i];
                j++;
            }
        inputStr[j] = '\0';
        printf("String after modification : ");
        printf("%s\n", inputStr); getchar();

        int len = strlen(inputStr);
        int temp[4];
        int k;
        char str[4] = "";
        for (i = 0; i < len; i += 4) {
            if (inputStr[i] != '\0' || inputStr[i] == '1' || inputStr[i] == '0')
                temp[0] = inputStr[i] - '0';
            if (inputStr[i + 1] != '\0' || inputStr[i + 1] == '1' || inputStr[i + 1] == '0')
                temp[1] = inputStr[i + 1] - '0';
            if (inputStr[i + 2] != '\0' || inputStr[i + 2] == '1' || inputStr[i + 2] == '0')
                temp[2] = inputStr[i + 2] - '0';
            if (inputStr[i + 3] != '\0' || inputStr[i + 3] == '1' || inputStr[i + 3] == '0')
                temp[3] = inputStr[i + 3] - '0';

            sprintf(str, "%d%d%d%d", temp[0], temp[1], temp[2], temp[3]);
            k = str - '0';
            //convertation into decimal system
            int counter = 1, timeless, decimal = 0;
            strcpy(res, "");
            while (k != 0) {
                timeless = k % 10 * counter;
                decimal += timeless;
                k /= 10;
                counter *= 2;
            }
            if (decimal > 8) { removeEl(queue->qu[h]);}
            else {
                char dec; dec = decimal + '0';
                strcat(res, dec);
            }
            strcat(res, '\0');
        }
        int num = res - '0';
        queue->qu[h] = num;
        printf("The decimal is: %d", queue->qu[h]);
    }


    /*
    fgets(inputStr, 100, stdin); getchar();
    int j = 0;
    for (i = 0; inputStr[i]; i++) {
        if (inputStr[i] >= '0' && inputStr[i] <= '1' || inputStr[i] == ' ' || inputStr[i] == '\0') {
            inputStr[j] = inputStr[i];
            j++;
        }

    }
    inputStr[j] = '\0';
    printf("String after modification : ");
    printf("%s\n", inputStr); getchar();
    int len = strlen(inputStr);
    enqueue(queue, inputStr);
    char num1[100] = "";
    int temp[4];
    int res = 0;
    strcpy(str, "");
    for (i = 0; i < len; i += 4) {
        if (inputStr[i] != '\0' || inputStr[i] == '1' || inputStr[i] == '0')
            temp[0] = inputStr[i] - '0';
        if (inputStr[i + 1] != '\0' || inputStr[i + 1] == '1' || inputStr[i + 1] == '0')
            temp[1] = inputStr[i + 1] - '0';
        if (inputStr[i + 2] != '\0' || inputStr[i + 2] == '1' || inputStr[i + 2] == '0')
            temp[2] = inputStr[i + 2] - '0';
        if (inputStr[i + 3] != '\0' || inputStr[i + 3] == '1' || inputStr[i + 3] == '0')
            temp[3] = inputStr[i + 3] - '0';

        sprintf(str, "%d%d%d%d", temp[0], temp[1], temp[2], temp[3]);
        strcat(num1, str);
        strcat(num1, " ");
        sscanf(str, "%d", &res);
        printf("\nres is: %d", res);
        //RES is converted to number char
        //convertation into decimal system
        int counter = 1, timeless, decimal = 0;
        while (res != 0) {
            timeless = res % 10 * counter;
            decimal += timeless;
            res /= 10;
            counter *= 2;
        }
        printf("\ndecimal is: %d", decimal);
        if (decimal > 9) dequeue(queue);
    }

    for (int i = queue->front; i < queue->size; i++) {
        char str1[100] = "";
        int len = strlen(&queue->array[i]);
        int temp1[4];
        int c = 0;
        char decimals[32] = "";
        char deca[32];
        int res = 0;
        for (i = 0; i < len; i += 4) {
            strcpy(deca, "");

            if (queue->array[i] != '\0' || queue->array[i] == '1' || queue->array[i] == '0')
                temp1[0] = queue->array[i] - '0';
            if (queue->array[i + 1] != '\0' || queue->array[i + 1] == '1' || queue->array[i + 1] == '0')
                temp1[1] = queue->array[i + 1] - '0';
            if (queue->array[i + 2] != '\0' || queue->array[i + 2] == '1' || queue->array[i + 2] == '0')
                temp1[2] = queue->array[i + 2] - '0';
            if (queue->array[i + 3] != '\0' || queue->array[i + 2] == '1' || queue->array[i + 2] == '0')
                temp1[3] = queue->array[i + 2] - '0';

            sprintf(str, "%d%d%d%d", temp1[0], temp1[1], temp1[2], temp1[3]);
            strcat(str1, str);
            strcat(str1, " ");
            sscanf(str, "%d", &res);
            printf("\nres is: %d", res);
            //RES is converted to number char
            //convertation into decimal system
            int counter = 1, timeless, decimal = 0;
            while (res != 0) {
                timeless = res % 10 * counter;
                decimal += timeless;
                res /= 10;
                counter *= 2;
            }
            char aka = decimal + '0';
            strcat(decimals, &aka);

        }
        //printf("%s --- %s", str1, decimals);
    }
    */
    getchar();
    return 0;
}

int convertBinaryToDecimal(long long n)
{
    int decimalNumber = 0, i = 0, remainder;
    while (n != 0)
    {
        remainder = n % 10;
        n /= 10;
        decimalNumber += remainder * pow(2, i);
        ++i;
    }
    return decimalNumber;
}
...