Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
#1

Странное решение - C++

01.09.2009, 16:21. Просмотров 950. Ответов 17
Метки нет (Все метки)

Тут встретился в книжонке с таким выводом 2-мерного массива, вроде простой, но вывод странный. Не дадите комент по странной строке:
Код
nums[t][i] = (t*4)+i+1;
Весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
int main()
{
int t,i, nums[3][4];
for(t = 0; t < 3; t++){
    for(i = 0; i < 4; i++){
    nums[t][i] = (t*4)+i+1;
cout<<endl<<nums[t][i] <<' ';
    }
}
cin.get();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
EnzoMatrix
120 / 120 / 4
Регистрация: 14.03.2009
Сообщений: 462
01.09.2009, 16:25     Странное решение #2
ну так, это ж не вывод, а ввод, массив заполняется числами от 1 до 12
а вывод строкой ниже
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 16:30     Странное решение #3
C++
1
nums[t][i] = (t*4)+i+1;
nums[номер_строки][номер_столбца] присваивается (номер_строки*4)+номер_столбца+1;
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 16:32     Странное решение #4
Цитата Сообщение от Syltan Посмотреть сообщение
но вывод странный
В чем странность то?
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
01.09.2009, 16:53  [ТС]     Странное решение #5

nums[t][i]
присваивается (номер_строки*4)+номер_столбца+1;

Получается как-то не логично. Ну начнём считать вручную. За первым разом должно вывестись.
1*4+1+1=6
2*4+2+1=11
3*4+3+1=16
.....................
Что-то я не възжаю, как оно считается,если брать такую формулу решения.
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 16:59     Странное решение #6
Syltan,
C++
1
cout << endl << ((t*sizeof(int))+i) << " " << *(*(nums + t) + i);
если адрес вывести то
C++
1
&(*(*(nums + t) + i))
разница адресов четверка( 4 )
EnzoMatrix
120 / 120 / 4
Регистрация: 14.03.2009
Сообщений: 462
01.09.2009, 17:00     Странное решение #7
t принимает значения не от 1 до 3, а от 0 до 2,
i в свою очередь от 0 до 3
и все предельно логично
у элемента nums[0][0] значение 1
nums[0][1] значение 2
nums[0][2] значение 3
nums[0][3] значение 4
nums[1][0] значение 5
и т.д.
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 17:12     Странное решение #8
Syltan, кстати ошибка в коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
using namespace std;
int main()
{
int t,i, nums[3][4];
for(t = 0; t < 3; t++){
        for(i = 0; i < 4; i++){
        nums[t][i] = (t*4)+i+1;
cout<<endl<<nums[t][i] <<' ';
        }
}
cin.get(); // задержку лучше делать system("pause").
 
return 0; // main типа int, а не void, поэтому он должен что-то возвращать
// 0 - корректное завершение программы и высвобождение ресурсов
}
Gravity
557 / 551 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
01.09.2009, 17:14     Странное решение #9
Код
cin.get(); // задержку лучше делать system("pause").
Лучше все-таки cin.get, ибо по стандарту.
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 17:24     Странное решение #10
Цитата Сообщение от Gravity Посмотреть сообщение
ибо по стандарту
а вот это Странное решение по стандарту?
Цитата Сообщение от Syltan Посмотреть сообщение
<<' ';
или << ' ' << ends;
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 17:27     Странное решение #11
mirso, а что не так? Пробел тоже символ
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 17:32     Странное решение #12
Цитата Сообщение от M128K145 Посмотреть сообщение
Пробел тоже символ
и зачем он там?
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 17:37     Странное решение #13
это второй вопрос. Но к стандарту это никак не относится. Просто человек только учится и, наверно, плохо понимает как и что работает. Ладно, давайте послушаем, что нам скажет ТС
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
01.09.2009, 17:45  [ТС]     Странное решение #14
C++
1
 (t*4)+i+1;
t*4 - это строка t умножается на 4, потому что в столбце 4 элемента?
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 17:50     Странное решение #15
Syltan, нет, простот так захотелось автору книги. если хочеш можеш сделать даже так
Код
(2 * t + 20) * i - 1;
Автор написал для себя такой генератор неслучайных значений
mirso
524 / 342 / 17
Регистрация: 05.04.2009
Сообщений: 709
01.09.2009, 17:50     Странное решение #16
Цитата Сообщение от Syltan Посмотреть сообщение
t*4 - это строка t умножается на 4, потому что в столбце 4 элемента
не..
потому что значения массива распологается в памяти компьютера через 4 адреса(индексы)
хотя в каком-то компьютере может быть и через два.
т.е. sizeof(int) == 2
Syltan
181 / 7 / 0
Регистрация: 27.08.2009
Сообщений: 868
01.09.2009, 18:23  [ТС]     Странное решение #17
Тогда подсчёт такой получается:

C++
1
2
3
4
5
6
7
0*4+0+1 = 1
0*4+0+2 = 2
0*4+0+3 = 3
0*4+0+4 = 4
1*4+0+1 = 5
1*4+0+2 = 6
.................
Но почему все 4 раза значение t не меняется,постоянно 0 умножить на 4,потом а ж через 4 меняется,цикл же идёт, должно же за каждым разом менятся.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2009, 20:50     Странное решение
Еще ссылки по теме:

Странное с return метода C++
C++ Странное поведение в коде
C++ Странное распараллеливание
Странное присвоение переменной C++
Преобразовать решение используя указатели (дано решение без указателей) C++

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

Или воспользуйтесь поиском по форуму:
M128K145
Эксперт C++
8280 / 3499 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
01.09.2009, 20:50     Странное решение #18
если хочеш узнать как оно все работает, то посмотри этот
код
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
#include <iostream>
using namespace std;
int main()
{
    int t,i, nums[3][4];
    t = 0;
  tt:
    if(t < 3)
    {
        i = 0;
      im:
        if(i < 4)
        {
            nums[t][i] = (t*4)+i+1;
            cout<<endl<<nums[t][i];
            ++i;
            goto im;
        }
        else
        {
            ++t;
            goto tt;
        }
    }
    else
        goto end;
  end:
    cin.get();
}
. Я попытался тут все расписать, так что должно быть все понятно
Yandex
Объявления
01.09.2009, 20:50     Странное решение
Ответ Создать тему
Опции темы

Текущее время: 09:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru