Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
#1

Дайте совет по оптимизации - C++

08.01.2012, 20:24. Просмотров 673. Ответов 10
Метки нет (Все метки)

Необходимо оптимизировать реализацию морского боя.
Изначально поле представлял в виде символьного массива, естественно длинной 10х10
при этом каждое обращение к элементу массива (х,у) сопровождалось вычислениями величины 10*y+x.
Можно попробовать заменить его на двумерный
так вот, хотелось бы узнать, действительно ли это даст нам преимущество во времени?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 20:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Дайте совет по оптимизации (C++):

Дайте совет :) - C++
Вообщем есть задание. Вводиться строка например: аааа бббб 222 ыыыы кккк енен 2313 Нужно чтобы прога раскидала эти строки вот так: 1...

Дайте совет - C++
Всем привет.У меня такая ситуация сложилась. Я с учительницей по информатике изучаю паскаль. Дошли до процедур и функций. Но...

Дайте совет по изучению программирования - C++
читал пару книжек по С++ но не до конца.Сейчас читаю Прата, вроде понимаю все что пишут, но есть упражнения после 11 глав которые зделать...

Разрженные матрицы дайте совет - C++
Здравствуйте, есть вот задание на курсовую: 1. Разреженная матрица С(пxп) хранится по схеме Кнута. Написать программу, которая создает...

Среда разработки. Дайте совет - C++
Подскажите пожалуйста такой момент: я только изучаю ооп, так что пишу под консоль. Сейчас пользуюсь MVS.Все хорошо, но напрягает количество...

Дайте совет по продолжению обучения - C++
Сейчас учусь на первом курсе комп.инженерии.Уже прошли делфи- сечас группа учит С++, а мне этот язык показался очень интересным и я усердно...

10
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:27 #2
символьного массива
Может лучше массив из bool?
true = корабль есть
false = нет или он/его часть в этой клетки убита
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
08.01.2012, 20:29 #3
Доступ к одномерному массиву a[i] производиться так:
*(a+i)
а к двумерному a[i][j]
*(*(a+i)+j)
Как видите, и там(двумерный) и там(*(a+(10*y+x))) умножение

Цитата Сообщение от somebody11 Посмотреть сообщение
Можно попробовать заменить его на двумерный
Попробуйте. Вполне возможно, что читабельность кода возрастет, хотя может быть я и не прав.
Цитата Сообщение от somebody11 Посмотреть сообщение
Необходимо оптимизировать реализацию морского боя.
Код собственно не покажете?
0
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 20:30  [ТС] #4
Цитата Сообщение от hepr Посмотреть сообщение
Может лучше массив из bool?
true = корабль есть
false = нет или он/его часть в этой клетки убита
Дело в том, что вся работа проги завязана на символьных обозначениях, тем более Вы забыли про ранен или мимо
0
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:35 #5
забыли про ранен или мимо
Пользователь попадает в клетку с true, далее проверяем клетки вверху внизу справа снизу, если там хоть одна true, то ранил, если нет о убил
Если пользователь выбирает клетку с false, то мимо
0
NoMasters
Псевдослучайный
1900 / 1111 / 75
Регистрация: 13.09.2011
Сообщений: 3,159
08.01.2012, 20:40 #6
dimcoder, я тебе больше скажу, в одномерном при запросе по индексу тоже присутствует умножение(на sizeof(type)), но механизмы доступа у ТС и обычный для двумерного массива от этого одинаковыми не становятся.
1
hepr
61 / 33 / 5
Регистрация: 21.10.2010
Сообщений: 538
08.01.2012, 20:44 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "iostream"
 
using namespace std;
 
int main()
{
    bool arr[10][10];
    //Генерируем поле
    for (int a=0;a<10;a++)
        for (int b=0;b<10;b++)
        {
            if((a+b)%2==0)
                arr[a][b] = true;
            else
                arr[a][b] = false;
        }
 
    //Цикл обработки
    while(true)
    {
        cout << "Enter x and y of point to kill it or 0 to go away: ";
        int x,y;
        cin >> x;
        if(x==0)
            break;
        cin >> y;
        if(arr[x][y])
        {
            /*Можно добавить код на проверку соседних клеток на возможность ранения*/
            arr[x][y] = false;
            cout << "You kill me, baybe!" << endl;
        }
        else
        {
            cout << "You did not get!" << endl;
        }
    }
    system("pause");
    return 0;
}
Примерный код того что я говорю
0
dimcoder
Полярный
466 / 439 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
08.01.2012, 20:47 #8
NoMasters, тогда и при операции (a+i) (из *(*(a+i)+j)), тоже происходит умножение на sizeof(type).
somebody11, код код код код код кодкодкодкодкокдокодкодокодкдокдокдокдодокдокд
0
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 21:02  [ТС] #9
Цитата Сообщение от dimcoder Посмотреть сообщение
тогда и при операции (a+i) (из *(*(a+i)+j)), тоже происходит умножение на sizeof(type).
даа, кстати, это был второй семестр, память меня подводит )
Цитата Сообщение от dimcoder Посмотреть сообщение
код код код код код кодкодкодкодкокдокодкодокодкдокдокдокдодокдокд
ну
он большой очень и разбит на несколько срр для удобства работы. впрочем, если пожелаете ознакомиться, можно выложить архивом куда-нибудь

вообще говоря, передо мной стоит задача его оптимизировать по быстродействию и размеру (ну это на второй план). поэтому если подскажете еще что, будет весьма неплохо
0
агерон
271 / 272 / 33
Регистрация: 12.10.2009
Сообщений: 1,078
08.01.2012, 21:19 #10
ох уж эти оптимизаторы, оптимизирующие доступ к таблице на 100 элементов, у вас что компы Atari 8086?
лучше бы сделали код более менее читабельным да проверки на ввод данных отпользователя, к примеру так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int _tmain(int argc, _TCHAR* argv[])
{
        int x,y;
        bool area[10][10];
        for (int a=0;a<10;a++)
            for (int b=0;b<10;b++)
                area[a][b]=(a+b)%2; 
        do
        {
            do
            {
                cout << "Enter x and y of point to kill it: ";
                cin >> x >> y;
            }
            while ((x<1||x>10)||(y<1||y>10));            
            if(area[x][y])
            {
                area[x][y] = false;
                cout << "You kill me, baybe!" << endl;
            }
            else
            {
                cout << "You did not get!" << endl;
            }
            cout<<"Press Enter for continue"<<endl;
        }
        while (_getch()==13);
        system("pause");
        return 0;
}
0
somebody11
14 / 0 / 0
Регистрация: 11.12.2011
Сообщений: 29
08.01.2012, 21:39  [ТС] #11
Цитата Сообщение от агерон Посмотреть сообщение
ох уж эти оптимизаторы, оптимизирующие доступ к таблице на 100 элементов, у вас что компы Atari 8086?
дело в том, что алгоритмы расстановки и стрельбы сделаны вполне логично и аккуратно, есть все проверки и прочие мелочи, поэтому нужно за что-то зацепиться, чтобы выполнить поставленную задачу.

Добавлено через 12 минут
кстати говоря
непонятен случай
если мы когда-то подстрелили корабль (он 3х или 4х палубный)
затем опять в него попали - тогда наш алгоритм проверки на ранен-убит дает сбой
0
08.01.2012, 21:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2012, 21:39
Привет! Вот еще темы с ответами:

Профессионалы программирования дайте совет - C++
Хочу стать отличным программистом. Если честно в школе до 9-го класса учился плохо в 10-11 поднажал чтобы поступить в институт,как бы...

Дайте совет, куда двигаться дальше - C++
В общем хочу начать с того что 3 года назад я начинал совсем чайником который ничего не понимал в ЭВМ, я очень хотел стать программистом...

Дайте,пожалуйста, совет по поводу задания - C++
Есть односвязный список, нужно в і-ую позицию вставить элемент, как лучше бы это сделать? Создать вспомогательный указатель и с его помощью...

Цветной рисунок в С++ консоль, Дайте совет!! - C++
Доброго времени суток! Я новичок в программировании, посему не обессудьте. Вопрос состоит в следующем, создается рисунок в данной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru