Веб программирование

Лаб. по С: Массивы и строки. Преобразование матрицы.

 
 

Тема:

Двумерные массивы и строки.

Условие задачи:

Дана матрица (M x N), содержащая целые числа и некоторое кол-во произвольно расположенных нулей. Преобразовать матрицу, переместив нули в конец матрицы. Нулевые строки удалить. Изменить размер до (M x Кол-во строк, содержащих хотя бы один ненулевой элемент). Преобразования выполнить за один цикл.

Задача данная выполнена без хранения вводимых элементов и без указания размера матрицы, потому что так делать неинтересно) Сделан непосредственно ввод матрицы, как мы привыкли ее видеть. Также, в коде оставлены printf'ы для наблюдения за работой алгоритма.


#include <stdio.h>

void main(void) {
    int array[20][20], M = -1, N = 0, i, j, z = 0;
    int sign, number, cur_m = -1; //позиция элемента в строке;
    char in[100];

    printf("n << Введите матрицу [макс. = 20х20]. Конец ввода - пустая строка [Enter] >>n");

    for(i = 0; i < 20; i++) {
        fgets(in, sizeof(in) / sizeof(char), stdin); //ввод строки значений;
        number = j = 0; sign = 1;

        if(in[0] == 10) break; //проверка завершения ввода;
        do { //разбитие строки на числа
            switch(in[j]) {
                case 10: //т.к. fgets() добавляет chr(10), введенное с клавиатуры, служит признаком конца строки => признаком последнего числа в строке;
                case ' ':
                  //находим позицию записи элемента в матрицу, записываем число;
                    if(M == -1) {
                        if(number == 0) {z++; break;}
                        cur_m++;
                        //printf("n(if)cur_m++: %dn", cur_m);
                    } else {
                        if(number == 0) break;
                        if(cur_m < M) {
                            cur_m++;
                            //printf("n(else)cur_m++: %dn", cur_m);
                        } else {
                            N++;
                            //printf("nN set to: %d, cur_m = 0n", N);
                            cur_m = 0;
                        }
                    }

                    array[cur_m][N] = number * sign;
                    number = 0; sign = 1;
                    break;
                case '-':
                    sign = -1;
                    break;
                default: //формирование числа;
                    number = number * 10 + in[j] - 48; // 48 - код '0';
                    //printf("nnum: %d;", number);
            }
        } while(in[++j] != '');

        if(M == -1) {
            M = cur_m + z;
            //printf("nM set to: %dn", M);
        }
    }

    for(cur_m++; cur_m <= M; cur_m++) array[cur_m][N] = 0; //заполнение оставшихся элементов нулями;

    printf("n << Введенная матрица преобразована в следующую: [%d x %d] >>n", M+1, N+1);
    for(j = 0; j <= N; j++) {
        for (i = 0; i <= M; i++) printf(" %d", array[i][j]);
        printf("n");
    }

    printf("nДля выхода из программы введите любой символ >> ");
    getchar();
} //main func

О непонятках, которых может возникнуть довольно много, пишите в комментарии.


Есть вопросы? Спроси на нашем форуме!!
EverybodyLies280 [30.04.2013 16:18]

в статье порезан символ '\', будьте осторожны)

bondarenkoanya [10.04.2014 10:20]

Помогите пожалуйста
почему в этой строке } while(in[++j] != '');
у меня ошибка выходит:character constant too long(or empty)

Stertor370 [10.04.2014 20:20]

Я не знаю сишку, но могу предположить, что нужно использовать типизованную переменную.

Edward300 [10.04.2014 21:40]

bondarenkoanya попробуйте добавить пробел между скобок!



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.