Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6

Вопрос про динамический массив

21.05.2008, 22:00. Показов 2493. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с проблемой при использовании динамического массива.
Вот код
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
void main()
{
int *c,**a;
int n,i,j,k;
char buf[90];
do
{
 printf("n=");
 gets(buf);
 n=atoi(buf);
 if (n<=1)
  printf("n must be greater than 1\n");
}
while(n<=1);
a = (int **)malloc((n+1) * sizeof (int*)) ;
for(i=1;i<=n;i++)
 a[i] = (int *)malloc((n+1) * sizeof (int)) ;
if(a == NULL)
 printf("Not enogh memory for \"a\"\n");
else
 printf("\"a\" array memory reserved \n");
c = (int *)malloc((n+1) * sizeof (int)) ;
if(c == NULL)
 printf("Not enogh memory for \"c\"\n");
else
 printf("\"c\" array memory reserved \n");
printf("Input array elemnts\n");
for(i=1;i<=n;i++)
 {
 for(j=1;j<=n;j++)
  {
  printf("a[%d,%d]=",i,j);
  gets(buf);
  a[i,j]=(int *)(atoi(buf));
  }
 }
for(i=1;i<=n;i++)
 {
 printf("c[%d]=",i);
 gets(buf);
 c[i]=atoi(buf);
 }
for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
  printf("a[%d,%d]=%d\n",i,j,a[i,j]);
/*
 k=0;
 for(i=1;i<=n;i++)
  {
  for(j=1;j<=n;j++)
   {
   if(c[i]==c[j])
     k=1;
   }
 if(k==1)
  {
  for(i=1;i<=n;i++)
   c[i]+=a[i,i];
  }
 else
  printf("Elements not repeated\n"
*/
for(i=1;i<=n;i++)
 printf("c[%d]=%d\n",i,c[i]);
free(a);
free(c);
getch();
}
Запускаю.
Компилируется всё отлично.
Ввожу n=2
a[1,1]=1
a[1,2]=2
a[2,1]=3
a[2,2]=4
и сразу же за вводом следует вывод, но выводится
a[1,1]=3
a[1,2]=4
a[2,1]=3
a[2,2]=4
Объясните пожалуйста, что в программе сделано некорректно.
Очевидно, что ошибка здесь:
C++
1
2
3
4
5
6
7
8
9
 for(i=1;i<=n;i++)
 {
 for(j=1;j<=n;j++)
  {
  printf("a[%d,%d]=",i,j);
  gets(buf);
  a[i,j]=(int *)(atoi(buf));
  }
 }
Но, как исправить я не понимаю.
P.S.Использование динамического масиива обязательно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.05.2008, 22:00
Ответы с готовыми решениями:

Вопрос про инициализацию
Всем привет. Народ подскажите, хочу сделать клиент-серверное приложение, как сделать чтобы в TForm сделать окошко и в этом окошке...

Вопрос про таймер
пишу програмулину, и появился такой вопрос, как себя ведет таймер, если код который находится у него внутри выполняется нааамного дольше,...

Вопрос про МЕМО
Можно ли программно сделать так, что бы при заполнении поля МЕМО оно не прокручивалось?

9
0 / 0 / 0
Регистрация: 16.05.2008
Сообщений: 7
22.05.2008, 08:28
Вместо a[i,j]=... писать a[i][j]=...
И не стоит делать так (int *)(atoi(buf))
А почему бы не обращаться к массиву начиная с 0-вых индексов?
И не забывать освобождать память.
Примерно так:
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
int main(int argc, char* argv[])
{
    int *c,**a;
    int n,i,j,k;
    char buf[90];
    do
    {
        printf("n=");
        gets(buf);
        n=atoi(buf);
        if (n<=1)
            printf("n must be greater than 1\n");
    }
    while(n<=1);
    a = (int **)malloc((n) * sizeof (int*)) ;
    for(i=0;i<n;i++)
        a[i] = (int *)malloc((n) * sizeof (int)) ;
    if(a == NULL)
        printf("Not enogh memory for \"a\"\n");
    else
        printf("\"a\" array memory reserved \n");
 
    printf("Input array elemnts\n");
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("a[%d,%d]=",i+1,j+1);
            gets(buf);
            a[i][j]=(atoi(buf));
        }
    }
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            printf("a[%d,%d]=%d\n",i+1,j+1,a[i][j]);
    for(i=0;i<n;i++)
        free(a[i]);
    free(a);
        return 0;
}
0
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6
22.05.2008, 19:11  [ТС]
wolfram, спасибо тебе добрый человек))
0
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6
25.05.2008, 19:03  [ТС]
Итак, благодоря советам wolfram'а программа более менее работает. Созрел ещё один вопрос: как правильно сделать из обработки отдельную процедуру (сложность опять таки в динамических массивах)?
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
/*Условие: если в массиве c[i] есть одинаковые элементы, то происходит замена
 c[i]=c[i]+a[i][i]*/
void main()
{
    int *c,**a;
    int n,i,j,k;
    char buf[90];
    do
    {
        printf("n="); 
        gets(buf);
        n=atoi(buf);
        if (n<=1)
            printf("n must be greater than 1\n");
    }
    while(n<=1);
    a = (int **)malloc((n) * sizeof (int*)) ;
    for(i=1;i<=n;i++)
        a[i] = (int *)malloc((n) * sizeof (int)) ;
    if(a == NULL)
        printf("Not enogh memory for \"a\"\n");
    else
        printf("\"a\" array memory reserved \n");
        c = (int *)malloc((n+1) * sizeof (int)) ;
        if(c == NULL)
                printf("Not enogh memory for \"c\"\n");
        else
                printf("\"c\" array memory reserved \n");
    printf("Input array elemnts\n");
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            printf("a[%d,%d]=",i,j);
            gets(buf);
            a[i][j]=(atoi(buf));
        }
    }
        for(i=1;i<=n;i++)
        {
                printf("c[%d]=",i);
                gets(buf);
                c[i]=(atoi(buf));
        }
        printf("\n\n");
     /* k=0;
        for(i=1;i<=n;i++)
        {
                for(j=1;j<=n;j++)
                {
                        if(c[i]==c[j])
                                k=1;
                }
                if(k==1)
                {
                        for(i=1;i<=n;i++)
                                c[i]=c[i]+a[i][i];
                }
                else
                        printf("Elements not repeated\n");
        }
     */
        for(j=1;j<=n;j++)
            printf("c[%d]=%d\n",j,c[j]);
        //return 0;
        getch();
}
P.S. то, что надо запихнуть в процедуру закомментено.
0
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
25.05.2008, 19:34
вместо закоменченого писать
procedure (c);
а перед void main():
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      int procedure (int c[])
      k=0;
        for(i=1;i<=n;i++)
        {
                for(j=1;j<=n;j++)
                {
                        if(c[i]==c[j])
                                k=1;
                }
                if(k==1)
                {
                        for(i=1;i<=n;i++)
                                c[i]=c[i]+a[i][i];
                }
                else
                        printf("Elements not repeated\n");
        }
       return c;
0
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6
25.05.2008, 20:53  [ТС]
MsDos, хм.... не совсем так. Ладно сформулирую поточнее. Надо чтобы в процедуру входили "a" и "c", на выходе обработанный массив "с". Да и насколько мне известно, нехорошо в процедуре использовать те же обозначения что и в основном модуле...
P.S. не обижайся, но я просто хочу разобраться ОТ и ДО.
0
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
25.05.2008, 21:10
да, действительно, извиняюсь. тогда вопрос: что подразумевается под словосочетанием 'правильно сделать из обработки отдельную процедуру' ?
0
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6
25.05.2008, 21:23  [ТС]
Правильно, это правильно...Как положено по мировым стандартам))) Ну, а если серьезно, то чтобы в процедуру входили динамические массивы "a"(двумерный) и "c"(одномерный), в самой процедуре они будут, скажем "аТ" и "сТ", результат выполнения, процедуры это обработанный массив "с".
По крайней мере мне кажется правильно будет так. Если я неправ, поправьте, пожалуйста.
0
 Аватар для MsDos
5 / 5 / 1
Регистрация: 13.05.2008
Сообщений: 96
25.05.2008, 23:06
тогда все по правилам. как писать, знаете.

Добавлено через 36 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
      int procedure (int cT[], int aT[][])
      k=0;
        for(i=1;i<=n;i++)
        {
                for(j=1;j<=n;j++)
                {
                        if(cT[i]==cT[j])
                                k=1;
                }
                if(k==1)
                {
                        for(i=1;i<=n;i++)
                                cT[i]=cT[i]+aT[i][i];
                }
                else
                        printf("Elements not repeated\n");
        }
       return cT;
Добавлено через 2 минуты
вместо int 'aT[][]' можно писать 'int *(*aT)'
0
0 / 0 / 0
Регистрация: 21.05.2008
Сообщений: 6
26.05.2008, 07:21  [ТС]
Благодарю всех кто помог разобраться, также огромное спасибо гуглу))
На всякий случай приведу полностью рабочий код, вдруг кому пригодится
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
 
void main()
{
    int *c,**a;
    int n,i,j,k;
    char buf[90];
        int procedure(int,int *,int **);
    do
    {
        printf("n=");
        gets(buf);
        n=atoi(buf);
        if (n<=1)
            printf("n must be greater than 1\n");
    }
    while(n<=1);
    a = (int **)malloc((n) * sizeof (int*)) ;
    for(i=1;i<=n;i++)
        a[i] = (int *)malloc((n) * sizeof (int)) ;
    if(a == NULL)
        printf("Not enogh memory for \"a\"\n");
    else
        printf("\"a\" array memory reserved \n");
        c = (int *)malloc((n+1) * sizeof (int)) ;
        if(c == NULL)
                printf("Not enogh memory for \"c\"\n");
        else
                printf("\"c\" array memory reserved \n");
    printf("Input array elemnts\n");
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            printf("a[%d,%d]=",i,j);
            gets(buf);
            a[i][j]=(atoi(buf));
        }
    }
        for(i=1;i<=n;i++)
        {
                printf("c[%d]=",i);
                gets(buf);
                c[i]=(atoi(buf));
        }
        printf("\n\n");
        procedure(n,c,a);
        for(j=1;j<=n;j++)
            printf("c[%d]=%d\n",j,c[j]);
    /*for(i=1;i<=n;i++)
        free(a[i]);
    free(a);
        free(c);*/
        //return 0;
        getch();
}
      int procedure (int nT,int *cT,int **aT)
      {
      int iT,jT,kT;
      kT=0;
        for(iT=1;iT<=nT;iT++)
        {
                for(jT=1;jT<=nT;jT++)
                {
                        if(cT[iT]==cT[jT])
                                kT=1;
                }
                if(kT==1)
                {
                        for(iT=1;iT<=nT;iT++)
                                cT[iT]=cT[iT]+aT[iT][iT];
                }
                else
                        printf("Elements not repeated\n");
        }
        return *cT;
       }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.05.2008, 07:21
Помогаю со студенческими работами здесь

Вопрос про AnsiString
Имеется задача: дан некий байтовый буффер, его нужно сохранить в ini файл. Проще всего буффер перевести в текстовый вид через 16-ричную...

вопрос про интернет
подскажите как отслеживать какие сайты посещали и их html-код для C++ Builder 6

Вопрос про сокет
Здравствуйте, есть консольное приложение которое с помощь сокетов грузит картинку из интернета. Структура программы самая тривиальная ...

Вопрос про getline
Читая ман по getline, я наткнулся на интересный для меня момент:DESCRIPTION getline() reads an entire line from stream, storing...

Вопрос про воиспроизведение *.wav
О своей программе: Вользователь вводит в Макс эдиты нужное ему время(часы, минуты, секунды). Пользователь жмёт на кнопку пуск(батон 1),...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru