Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] работа с двумерным массивом, удаление элементов под диагоналями 
:(
    Опции темы
Death_muse
Дата 3.1.2008, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Здравствуйте все. Конечно понимаю что щас новогодние каникулы, но сейчас  как раз есть время у вас, так почему бы его не потратить на следующее:
в двухмерном N* K массиве целых чисел обнулить элементы над главной диагональю , если их сумма меньше суммы элементов под главной диагональю. в противном случае обнулить элементы под главной диагональю. 
PM MAIL   Вверх
Xenon
Дата 4.1.2008, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Если правильно понял ...
Код

#include <iostream>

const int N = 4;
const int K = 4;

bool isUpperSumBigger(int arr[N][K])
{
    int upperSum = 0;
    int lowerSum = 0;
    for(int i = 0; i < N - 1; ++i)
    {
        for(int j = i + 1; j < K; ++j)
        {
            upperSum += arr[i][j];
            lowerSum += arr[j][i];
        }
    }
    return upperSum > lowerSum;
}


int main(int argc, char argv[]) 
{    
    int arr[N][K] = { {4,2,5,6}, 
                      {1,2,1,1}, 
                      {1,1,3,4},
                      {1,1,1,7} };
    bool result = isUpperSumBigger(arr);
    for(int i = 0; i < N - 1; ++i)
    {
        for(int j = i + 1; j < K; ++j)
        {
            if(result)
                arr[j][i] = 0;
            else
                arr[j][i] = 0;
        }
    }
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < K; ++j)
            std::cout << arr[i][j] << ' ';
        std::cout << std::endl;
    }
    std::cin.get();
    return 0;
}



--------------------
user posted image  
PM MAIL   Вверх
Dov
Дата 4.1.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(Xenon @  4.1.2008,  01:31 Найти цитируемый пост)
Код
if(result)
    arr[j][i] = 0;
else
    arr[j][i] = 0;

 smile 



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Xenon
Дата 4.1.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Dov, упс  smile 
Код

#include <iostream>

const int N = 4;
const int K = 4;

bool isUpperSumBigger(int arr[N][K])
{
    int upperSum = 0;
    int lowerSum = 0;
    for(int i = 0; i < N - 1; ++i)
    {
        for(int j = i + 1; j < K; ++j)
        {
            upperSum += arr[i][j];
            lowerSum += arr[j][i];
        }
    }
    return upperSum > lowerSum;
}


int main(int argc, char argv[]) 
{    
    int arr[N][K] = { {4,2,5,6}, 
                      {1,2,1,1}, 
                      {1,1,3,4},
                      {1,1,1,7} };
    bool result = isUpperSumBigger(arr);
    for(int i = 0; i < N - 1; ++i)
    {
        for(int j = i + 1; j < K; ++j)
        {
            if(result)
                arr[j][i] = 0;
            else
                arr[i][j] = 0;
        }
    }
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < K; ++j)
            std::cout << arr[i][j] << ' ';
        std::cout << std::endl;
    }
    std::cin.get();
    return 0;

}



--------------------
user posted image  
PM MAIL   Вверх
Death_muse
Дата 4.1.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Биг спс но вот пара маленьких вопросов:
1) Работать ли будет код массива произвольногоо размера?
2) Подскажите как использовать фулкцию s.rand   -чтоб каждый раз пир запуске проги значение массива были разными
Заранее спс

Добавлено через 2 минуты и 14 секунд
Подправлю 1) вопрос если я изменю код и буду вводить матрицу произвольного массива то  код будет  работать?
И еще вопрос почему в циклах просмотра массива вы пишете не i++ а ++i  - в чем разница?
PM MAIL   Вверх
Xenon
Дата 4.1.2008, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Ну тогда так.
Код

#include <iostream>
#include <iomanip>
#include <algorithm>

bool isUpperSumBigger(int** arr, int height, int width)
{
    int upperSum = 0;
    int lowerSum = 0;
    for(int i = 0; i < height - 1; ++i)
    {
        for(int j = i + 1; j < width; ++j)
        {
            upperSum += arr[i][j];
            lowerSum += arr[j][i];
        }
    }
    return upperSum > lowerSum;
}


int main(int argc, char argv[]) 
{    
    int N = 4;
    int K = 4;
    int** arr = new int*[N];
    for(int i = 0; i < N; ++i)
    {
        arr[i] = new int[K];
        std::generate(arr[i], arr[i] + K, rand);
    }
    bool result = isUpperSumBigger(arr, N, K);
    for(int i = 0; i < N - 1; ++i)
    {
        for(int j = i + 1; j < K; ++j)
        {
            if(result)
                arr[j][i] = 0;
            else
                arr[i][j] = 0;
        }
    }
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < K; ++j)
            std::cout <<  std::setw(10) << arr[i][j];
        std::cout << std::endl;
    }
    for(int i = 0; i < N; ++i)
        delete [] arr[i];
    delete [] arr;
    std::cin.get();
    return 0;
}



Это сообщение отредактировал(а) Xenon - 4.1.2008, 23:32


--------------------
user posted image  
PM MAIL   Вверх
ahtohin
Дата 5.1.2008, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.12.2007

Репутация: нет
Всего: нет



Разница в том , что  i++ увеличивает i на 1 после выполнения впереди стоящей операции (например =  ) , а ++i до выполнения smile 
PM MAIL   Вверх
Xenon
Дата 5.1.2008, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Death_muse, не обратил внимания на вопросы ...
Ну преинкремент (++i) в ортодоксально каноническом классе производит инкремент и возвращает ссылку на объект, а постинкремент (i++) возвращает копию объекта, а затем производит икремент. Но тут у нас интегральные типы ... 
Вообще, компилятор оптимизировав код выкинет возвращение объекта временного, если мы будем писать ++i и если он заметит, что мы не используем значения переменной. Но тут, по большому счету, компилятор вообще развернет этот цикл в линейную структуру, где вместо i понасует циферок smile Поэтому разницы нет особой. Просто привык писать преинкремент там, где не пользуюсь возвращаемым значением, ибо это не создает временной копии объекта - экономия. Да и Саттер советует поступать именно  таким образом - устранение преждевременной пессимизации smile


--------------------
user posted image  
PM MAIL   Вверх
Death_muse
Дата 5.1.2008, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Черт я твой должник
вот токо пара уточняющих вопросов функция generate (которая по хочу скорее всего является аналогом s.rand) каждый раз выводит новые знаачения массива  - ща не могу проверить опытным путем(

что значит new в создании массива new int ?
и что за библиотека функций <iomanip?
int main(int argc, char argv[])  - что значит argc  - если такой переменной я не встречаю по ходу этой функции
std::setw(10) << arr[i][j] - что значит setw?

PM MAIL   Вверх
orthrus
Дата 5.1.2008, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 400
Регистрация: 30.10.2007
Где: г. Усть-Илимск(Ир кутская обл.)

Репутация: 5
Всего: 16



Цитата(Death_muse @  5.1.2008,  04:23 Найти цитируемый пост)
что значит new в создании массива new int ?

Создается 2-х мерный динамический массив. New выделяет участок памяти в куче.
Цитата(Death_muse @  5.1.2008,  04:23 Найти цитируемый пост)
и что за библиотека функций <iomanip?

Заголовочник где описанны манипуляторы над потоком ввода/вывода, т.е. такие как std::setw.
Цитата(Death_muse @  5.1.2008,  04:23 Найти цитируемый пост)
int main(int argc, char argv[])  - что значит argc  - если такой переменной я не встречаю по ходу этой функции

Это для передачи параметров запуска программы. argc - количество переданных программе параметров, argv[] - вектор переданных параметров.
Цитата(Death_muse @  5.1.2008,  04:23 Найти цитируемый пост)
std::setw(10) << arr[i][j] - что значит setw?

std::setw( int n ) - установка ширины поля в значение n.


Это сообщение отредактировал(а) orthrus - 5.1.2008, 06:58


--------------------
У того, кто ничего не делает, всегда много помощников.© Л.Н. Толстой
user posted image
PM MAIL ICQ   Вверх
Death_muse
Дата 5.1.2008, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



Всем ответившим биг спс
PM MAIL   Вверх
Xenon
Дата 5.1.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Death_muse, Функция generate, грубо говоря, берет каждый элемент контейнера из диапозона, который ты указываешь в виде двух первых аргументов и сует в них значение, возвращаемое после вызова функции. Я написал
Код

std::generate(arr[i], arr[i] + K, rand);

Мы же знаем, что arr - массив массивов. Вот мы берем i-ый подмассив. Мы знаем, что длина каждого подмассива (это как бы количество столбцов, если рассматривать как матрицу) равна K, вот я и говорю, что мне нужно для каждому элементу от arr[i] (первого элемента подмассива i, или иначе строки) до arr[i]+K (последнего элемента строки) присвоить значение функции rand. А rand просто генерирует случайное число. Неплохо было бы в программе в начало пхнуть srand(), чтобы каждый раз последовательность псевдослучайных чисел разная была.


--------------------
user posted image  
PM MAIL   Вверх
Death_muse
Дата 5.1.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 24.11.2007

Репутация: нет
Всего: нет



спс за разъяснения
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0590 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.