1 Востаннє редагувалося sardar2222 (10.03.2013 13:12:34)

Тема: задано квадратну матрицю

Добрий день!!
хто що потрібно змінити або знає.
Задано квадратну матрицю, всі елементи якої рівні одиниці. Написати функцію void func (int** arr, int n), котра заповняє заштриховану область матриці (згідно варіанту) нулями. Розмір масиву вводиться з клавіатури.

#include <iostream>
#include <iomanip>
using namespace std;
 
// заполнение массива единицами
void fill_array_one( int**, size_t );
// заполнение массива по схеме
void fill_array_scheme( int**, size_t );
// печать массива
void print_array( int**, size_t );
 
 
int main() {
    size_t dimm;
    int **my_arr;
 
    cout << "Введите размерность квадратной матрицы" << endl;
    cin >> dimm;
 
    my_arr = new int *[ dimm ];
 
    for ( size_t i = 0; i < dimm; i++ )
        my_arr[ i ] = new int[ dimm ];
 
    cout << "Квадратная матрица заполнена единицами" << endl;
    fill_array_one( my_arr, dimm );
    print_array( my_arr, dimm );
 
    cout << "Квадратная матрица заполнена по схеме" << endl;
    fill_array_scheme( my_arr, dimm );
    print_array( my_arr, dimm );
 
    for ( size_t i = 0; i < dimm; i++ )
            delete[] my_arr[ i ];
 
        delete[] my_arr;
 
    return 0;
}
 
void fill_array_one( int** arr, size_t n ){
    for ( size_t i = 0; i < n; ++i )
            for ( size_t j = 0; j < n; ++j )
                arr[ i ][ j ] = 1;
}
 
void fill_array_scheme( int** arr, size_t n ){
    for ( size_t i = 0; i < n; ++i )
            for ( size_t j = 0; j < n; ++j )
                if ( i >= j )
                    arr[ i ][ j ] = 0;
}
 
void print_array( int** array, size_t n ) {
    for ( size_t i = 0; i < n; ++i ){
        for ( size_t j = 0; j < n; ++j )
            cout << setw(2) << array[ i ][ j ] ;
    cout << endl;
    }
}

Вона заповню з лівого верхнього кута до правого нижнього, а мені потрібно навпаки з правого верхнього до нижнього лівого

2

Re: задано квадратну матрицю

Потрібно обов'язково C++? можу зробити на C.

3

Re: задано квадратну матрицю

потрібно на с++!!!якщо зможеш зроби на с я потім попробую під с++ переробити, там просто ось цей цикл функції

void fill_array_one( int** arr, size_t n ){
    for ( size_t i = 0; i < n; ++i )
            for ( size_t j = 0; j < n; ++j )
                arr[ i ][ j ] = 1;

його потрібно якось змінити все перепробував напевне

4 Востаннє редагувалося Ярослав (11.03.2013 08:28:12)

Re: задано квадратну матрицю

Тримайте:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i, j, l, len, corner;
    char c;
    // len - Довжина однієї сторони
    // corner - Кут, з якого починається заповнення нулями
    start:
    printf("How many elements in 1 side of the matrix?\n");
    scanf("%d", &len);
    int matrix[len][len];
    --len; // Індексування елементів починається з нуля
    for(i = 0; i <= len; i++)
        for(j = 0; j <= len; j++)
            matrix[i][j] = 1; // Заповнюємо матрицю одиницями
    for(i = 0; i <= len; i++){
        for(j = 0; j <= len; j++)
            printf("%d ", matrix[i][j]); // Друкуємо матрицю
        putchar('\n');
    }

    printf("How much elements to change?\n");
    scanf("%d", &l);
    l--;
    if(l > len || l < 0)
        return 1;
    printf("Choose corner to start filling matrix with 0:\n");
    printf("1   2\n");
    printf(" *** \n");
    printf(" *** \n");
    printf(" *** \n");
    printf("3   4\n");
    scanf("%d", &corner);
    switch(corner){
        case 1:
            for(i = 0; i <= l; i++)
                for(j = 0; j <= l; j++)
                    matrix[i][j] = 0;
            break;
        case 2:
            for(i = 0; i <= l; i++)
                for(j = len; j >= len - l; j--)
                    matrix[i][j] = 0;
            break;
        case 3:
            for(i = len; i >= len-l; i--)
                for(j = 0; j <= l; j++)
                    matrix[i][j] = 0;
            break;
        case 4:
            for(i = len; i >= len-l; i--)
                for(j = len; j >= len-l; j--)
                    matrix[i][j] = 0;
            break;
        default:
            printf("Wrong corner\n");
            break;
    }
    for(i = 0; i <= len; i++){
        for(j = 0; j <= len; j++)
            printf("%d ", matrix[i][j]);
        putchar('\n');
    }
    printf("Once more? [y/n]\n");
    scanf("%s", &c);
    if(c == 'y')
        goto start;
    return 0;
}

5

Re: задано квадратну матрицю

хто зможе змінити мою вже на с++, ця норм але по перше помилки незрозкмілі вибиває і ще змінювати багато і переводити на с++!!!Буду вдячний!!

6

Re: задано квадратну матрицю

sardar2222 написав:

хто зможе змінити мою вже на с++, ця норм але по перше помилки незрозкмілі вибиває і ще змінювати багато і переводити на с++!!!Буду вдячний!!

Достатньо замінити printf() на std::cout, і програма автоматично компілюватиметься лише як хрестова.

З.І: А можна трохи детальніше про помилки? Бо ж ліньки буває іноді копіпастити собі код і запускати, щоб виявити помарку...

7

Re: задано квадратну матрицю

keithfay написав:

Тримайте:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i, j, l, len, corner;
    char c;
    // len - Довжина однієї сторони
    // corner - Кут, з якого починається заповнення нулями
    start:
    printf("How many elements in 1 side of the matrix?\n");
    scanf("%d", &len);
    int matrix[len][len];
    --len; // Індексування елементів починається з нуля
    for(i = 0; i <= len; i++)
        for(j = 0; j <= len; j++)
            matrix[i][j] = 1; // Заповнюємо матрицю одиницями
    for(i = 0; i <= len; i++){
        for(j = 0; j <= len; j++)
            printf("%d ", matrix[i][j]); // Друкуємо матрицю
        putchar('\n');
    }

    printf("How much elements to change?\n");
    scanf("%d", &l);
    l--;
    if(l > len || l < 0)
        return 1;
    printf("Choose corner to start filling matrix with 0:\n");
    printf("1   2\n");
    printf(" *** \n");
    printf(" *** \n");
    printf(" *** \n");
    printf("3   4\n");
    scanf("%d", &corner);
    switch(corner){
        case 1:
            for(i = 0; i <= l; i++)
                for(j = 0; j <= l; j++)
                    matrix[i][j] = 0;
            break;
        case 2:
            for(i = 0; i <= l; i++)
                for(j = len; j >= len - l; j--)
                    matrix[i][j] = 0;
            break;
        case 3:
            for(i = len; i >= len-l; i--)
                for(j = 0; j <= l; j++)
                    matrix[i][j] = 0;
            break;
        case 4:
            for(i = len; i >= len-l; i--)
                for(j = len; j >= len-l; j--)
                    matrix[i][j] = 0;
            break;
        default:
            printf("Wrong corner\n");
            break;
    }
    for(i = 0; i <= len; i++){
        for(j = 0; j <= len; j++)
            printf("%d ", matrix[i][j]);
        putchar('\n');
    }
    printf("Once more? [y/n]\n");
    scanf("%s", &c);
    if(c == 'y')
        goto start;
    return 0;
}

keithfay, а чому саме goto? Чом не while(1), наприклад? :)

Re: задано квадратну матрицю

Bartash написав:

keithfay, а чому саме goto? Чом не while(1), наприклад? :)

Кажуть з тими, хто юзав goto ставалися загадкові випадки.
Не до добра юзати goto :D

9

Re: задано квадратну матрицю

справа в тому що мені потрібно щоб вводився розмір матриця (вона зразу квадратна) і забув сказати це завдання з моєї лабораторної і вона полягає щоб навчитися виділяти динамічну память, вказівник на неї, як зроблено в коді де я кинув!!!

10 Востаннє редагувалося Ярослав (11.03.2013 21:35:12)

Re: задано квадратну матрицю

Там все це є.
Замініть рядки так, як вам радив Bartash, бо я на C++ іще не писав.
Про покажчики (вказівники) в вашому коді начебто не йдеться, тільки для того щоб застосувати функцію до масиву.
У мене на машині мій код працює добре, повідомляйте про ті помилки які виходять у вас.
Загальний принцип я показав. Вводьте іще одну змінну і ставте межу циклу як різницю між загальною кількістю елементів сторони і кількістю елементів, які потрібно змінити на одиниці.

11

Re: задано квадратну матрицю

Hanter написав:

Кажуть з тими, хто юзав goto ставалися загадкові випадки.
Не до добра юзати goto :D

Зауважте: багато привидів минулого й досі ходять поміж програмного коду... :)
Взагалі, у кривих руках і VBA спричинить креш системи, а от уміле вживання goto часом корисне. Здається, у PHP була така річ, як break(n), для виходу з кількох вкладених циклів. У хрестах це можна втілити міткою.
Просто цікаво, з якою метою цей оператор узято у контексті поставленої ТС задачі. Його використання тут цілком нормальне, але ж священі книги пишуть про праведні цикли... :)

12

Re: задано квадратну матрицю

keithfay написав:

Там все це є.
Замініть рядки так, як вам радив Bartash, бо я на C++ іще не писав.

За особистим досвідом скажу: якщо візьмете довідник Шилдта з С++, то освоєння хрестів стане простішим, бо пан Герберт починає з С, після чого показує альтернативні можливості у хрестах, і лише далі переходить до власне хрестовійства. :)

13

Re: задано квадратну матрицю

1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(11) : warning C4996: 'scanf' was declared deprecated
1>        c:\program files (x86)\microsoft visual studio 8\vc\include\stdio.h(295) : see declaration of 'scanf'
1>        Message: 'This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(12) : error C2143: syntax error : missing ';' before 'type'
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(16) : error C2065: 'matrix' : undeclared identifier
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(16) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(19) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(39) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(44) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(49) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(54) : error C2109: subscript requires array or pointer type
1>c:\users\user\documents\visual studio 2005\projects\msdsf\msdsf\sdds.c(62) : error C2109: subscript requires array or pointer type
1>Build log was saved at "file://c:\Users\User\Documents\Visual Studio 2005\Projects\msdsf\msdsf\Debug\BuildLog.htm"
1>msdsf - 9 error(s), 1 warning(s)

14

Re: задано квадратну матрицю

Викладайте код, sardar2222. Здається, у вас там трохи замарано.

15

Re: задано квадратну матрицю

))Це код який кинув мені keithfay!!!Я просто не розумію...Мій код неможливо змінити??Він же робить все як треба тільки потрібно поміняти кути з яких заповнювати нулями??Там справа в функції а саме в циклі, який є в цій функції!!я пробув замінювати там і сторони і т.д

16

Re: задано квадратну матрицю

Достатньо змінити логіку проходження масивом, а саме напрям.
Рух по рядках той же, однак у межах кожного рядка - у зворотньому напрямку.

void fill_array_scheme( int** arr, size_t n )
{
    for ( size_t i = 0; i < n; ++i )
            for ( size_t j = n-1; j > 0; --j )
                if ( j > i )
                    arr[ i ][ j ] = 0;
}

17

Re: задано квадратну матрицю

Код, написаний keithfay, компілюється і виконується без помилок. Єдине - він втілює загальнішу задачу, оскільки заповнення іде від кута в усі боки (фактично - expanding the matrix inside matrix). Додавши перевірку на діагональні елементи, отримаєте свій варіант, sardar2222.

З.І: і раджу перевірити комп на вірусовмісність.
Дивні помилки у вас студія видала.

18

Re: задано квадратну матрицю

та поміняти 0 з 1 я би міг сам...в мене діагональ йде з правого верхнього кута до нижнього лівого!!!!!

19

Re: задано квадратну матрицю

sardar2222 написав:

та поміняти 0 з 1 я би міг сам...в мене діагональ йде з правого верхнього кута до нижнього лівого!!!!!

Вибачаюся, випустив я трохи цей момент. Вам потрібен варіант із побічною діагоналлю.
Зараз накидаю.

20

Re: задано квадратну матрицю

От воно:

void fill_array_scheme( int** arr, size_t n ){
    for ( size_t i = 0; i < n; ++i )
            for ( size_t j = n-1; j > 0; --j )
                if ( j > (n-1-i) )
                    arr[ i ][ j ] = 0;
}