Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Baexiang
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 6
1

Ввод и вывод динамического массива. "Ошибка C2109: для индекса требуется массив или указатель"

30.01.2015, 11:28. Просмотров 717. Ответов 7
Метки нет (Все метки)

Никак не могу доделать программу,а именно вывод массива на экран,массив выводится не тот,который я сгенерировал раньше,а совершенно рандомный。

Название: jdx91XV.jpg
Просмотров: 37

Размер: 17.2 Кб

Само задание:

Условие: Создать программу, которая выполняет действия из задания 1 и задания 2. По запросу с клавиатуры, программа выполняет следующие действия:
1) Ввести новый массив (динамический);
2) Задание 1;
3) Вывод массива;
4) Задание 2;
5) Выход.

Задание 1. Проверить, есть ли в матрице хотя бы одна строка, содержащая отрицательный элемент, и найти ее номер. Все элементы столбца с таким же номером уменьшить вдвое.

Задание 2. Напишите программу, которая вводит строки текста в массив символов s [100], используя функцию gets. Выведите строки в верхнем и нижнем регистрах.

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <time.h>
#include <Windows.h>
 
 
 
 
int *mas;
int i, j, z, n, min = 0, max = 0, sum1 = 0, sum2 = 0;
void vvod();
void vyvod(int*, int);
void zadanie1();
void zadanie2();
int menu();
 
int main()
{
    setlocale(LC_ALL, "RUS");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    while (1)
    {                                  //вызов функции menu
        switch (menu())         //условное выражение в операторе switch -  
        {
        case 2:
            zadanie1();
            break;
        case 4:
            zadanie2();
            break;
        case 1:
            vvod();
            break;
        case 3:
            vyvod(mas, n);
            break;
 
        case 5:
            return 0;
            //Выполнение функции завершается после выполнения оператора return
        }
 
    }
 
    _getch();
}
 
void vvod()
{
    int i;
    puts("Введите размер массива n : ");          //Ввод строки
    scanf_s("%d", &n);
    //n = 10;
    mas = (int*)calloc(n, sizeof(int));     // Захват памяти
    for (i = 1; i < n + 1; i++)
        mas[i] = rand() % 10;
    printf("Массив на %d элементов сгенерирован  ", n);
}
 
void vyvod(int *mas, int n)
{
    float mas3[6][6];
    int i, j;
    if (!mas)
        printf("Массива нет \n Сгенерируйте массив выбрав пункт 1");
    else
        for (int i = 0; i < n; ++i)
        {
        for (int j = 0; j < n; ++j)
            printf(" %2d", mas3[i][j]);
            printf("\n");
}
}
 
 
 
void zadanie1()
{
    float mas1[6][6];
    int num = 0, fl = 0;
    for (i = 0; i < 6; i++)
    {
        printf("\n");
        for (j = 0; j < 6; j++)
        {
            mas1[i][j] = -1 + rand() % 20;
            if (fl == 0 && mas1[i][j] < 0)
                num = i;
            printf("%4.1f  ", mas1[i][j]);
        }
    }
    printf(" \nОтрицательный элемент в строке  %d ", num + 1);
 
    printf("\nМатрица с уменьшенным вдвое столбцом %d", num + 1);
    for (i = 0; i < 6; i++)
    {
        printf("\n");
        for (j = 0; j < 6; j++)
        {
 
            if (j == num && mas1[i][j] != 0)
                mas1[i][j] = mas1[i][j] / 2;
 
            printf("%4.1f  ", mas1[i][j]);
        }
    }
 
 
 
}
void zadanie2()
{
    char s[100];
    printf("Введите строку: ");
    getchar();
    gets_s(s);
    int i = 0;
    printf("Полученная строка в нижнем регистре равна:");
    while (s[i] != '\0')
    {
        printf("%c", char(tolower(s[i])));
        i++;
    }
    i = 0;
    printf("\n");
    printf("Полученная строка в верхнем регистре равна:");
    while (s[i] != '\0')
    {
        printf("%c", char(toupper(s[i])));
        i++;
    }
 
 
}
 
int menu()  //определение функции menu
{
    int ch;
    do {
        printf("\n   Menu: \n");
        printf("1. Ввод массива  \n");
        printf("2. Задание 1  \n");
        printf("3. Вывод массива\n");
        printf("4. Задание 2\n");
        printf("5. Выход\n");
        printf("\t Ваш выбор: ");
        scanf_s("%d", &ch);
    } while (ch > 5);
    return ch;
}
Укажите пожалуста что я именно сделал не правильно,спасибо。
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2015, 11:28
Ответы с готовыми решениями:

Ошибка при работе с массивом - Для индекса требуется массив или указатель
#include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include&lt;conio.h&gt; #include&lt;time.h&gt; #include&lt;iostream&gt; int...

Списки. Ошибка "используется потенциально неинициализированная локальная переменная-указатель "t""
В 35-й выдает ошибку &quot;используется потенциально неинициализированная локальная переменная-указатель...

Ввод и вывод двумерного массива - Нет доступа при записи "0x80000000"
Построила, ошибок нет. Дальше нажимаю на отладку, ввожу первые 4 цифры, потом нажимаю Enter, чтобы...

Ошибка "error C2109: для индекса требуется массив или указатель"
Помогите, пожалуйста! Имеется программа: double f4 (double x) { double p,f; double a; int...

Найти причины и способы исправления ошибки "error C2109: для индекса требуется массив или указатель"
Добрый день! Подскажите пожалуйста, писала программу, но на протяжении всей программы для...

7
Boleon
Guardian of Asgaard
373 / 316 / 197
Регистрация: 11.11.2013
Сообщений: 1,046
Завершенные тесты: 1
30.01.2015, 11:32 2
62 строка, должно быть: for ( i = 0; i < n; i++ )
1
Baexiang
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 6
30.01.2015, 11:44  [ТС] 3
Спасибо за быстрый ответ,но проблема осталась неизменна.
Только учусь С++ ,код похоже ну очень уж корявый получился.

Добавлено через 7 минут
Немного отредактировал вывод,изменил с предыдущего на вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void vyvod(int *mas, int n)
{
    int i, j;
    if (!mas)
        printf("Массива нет \n Сгенерируйте массив выбрав пункт 1");
    else
        for (int i = 0; i < n; ++i)
        {
        for (int j = 0; j < n; ++j)
            printf("%2d", mas[i]);
            printf("\n");
}
}
Теперь числа уже не рандомные,но просто копируется одна и та же строка.
0
Baexiang
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 6
30.01.2015, 12:36  [ТС] 4
Условие: Создать программу, которая выполняет действия:
1。 Ввод массива(динамический)
2。 Вывод этого же массива на экран.
С меню Проблем нету,а вот с вводом и выводом проблемка.
Программа ругается вот так

Ввод и вывод динамического массива. "Ошибка C2109: для индекса требуется массив или указатель"


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
80
81
82
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <iostream>
#include <time.h>
#include <Windows.h>
 
 
 
 
int *mas;
int i, j, z, n, min = 0, max = 0, sum1 = 0, sum2 = 0;
void vvod();
void vyvod(int*, int);
void zadanie1();
void zadanie2();
int menu();
 
int main()
{
    setlocale(LC_ALL, "RUS");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    while (1)
    {                                  //вызов функции menu
        switch (menu())         //условное выражение в операторе switch -  
        {
        case 2:
            zadanie1();
            break;
        case 4:
            zadanie2();
            break;
        case 1:
            vvod();
            break;
        case 3:
            vyvod(mas, n);
            break;
 
        case 5:
            return 0;
            //Выполнение функции завершается после выполнения оператора return
        }
 
    }
 
    _getch();
}
 
void vvod()
{
    int i, k;
    puts("Введите размер массива n : ");          //Ввод строки
    scanf_s("%d", &n);
    //n = 10;
    mas = (int*)calloc(n, sizeof(int));     // Захват памяти
    for (i = 0; i < n; i++)
    { 
        for (j = 0; j < n; j++)
        mas[i][j] = rand() % 10;
    printf("Массив на %d элементов сгенерирован  ", n);
    }
}
 
void vyvod(int *mas, int n)
{
    int i, j;
    if (!mas)
        printf("Массива нет \n Сгенерируйте массив выбрав пункт 1");
    else
        for (int i = 0; i < n; ++i)
        {
        for (int j = 0; j < n; ++j)
            printf("%2d", mas[i][j]);
        printf("\n");
        }
}
0
korvin_
2307 / 1806 / 337
Регистрация: 28.04.2012
Сообщений: 6,290
30.01.2015, 12:44 5
Цитата Сообщение от Baexiang Посмотреть сообщение
C
1
mas = (int*)calloc(n, sizeof(int));
Ты создаешь одномерный массив, а обращаешься к нему, как к двумерному:
Цитата Сообщение от Baexiang Посмотреть сообщение
C
1
mas[i][j]
1
Baexiang
0 / 0 / 0
Регистрация: 30.01.2015
Сообщений: 6
30.01.2015, 13:36  [ТС] 6
Что-то не получается правильно изменить блок ввода,не могли бы вы помочь с ним разобраться?
0
ScorpiN
3 / 3 / 3
Регистрация: 25.01.2015
Сообщений: 25
30.01.2015, 14:29 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
void vvod()
{
    int i, k;
    puts("Введите размер массива n : ");          //Ввод строки
    scanf_s("%d", &n);
    //n = 10;
    mas = (int*)calloc(n, sizeof(int));     // Захват памяти
    for (i = 0; i < n; i++)
    { 
        mas[i] = rand() % 10;
        printf("Массив на %d элементов сгенерирован  ", n);
    }
}
 
void vyvod(int *mas, int n)
{
    int i, j;
    if (!mas)
        printf("Массива нет \n Сгенерируйте массив выбрав пункт 1");
    else
        for (int i = 0; i < n; ++i)
        {
            printf("%2d", mas[i]);
            printf("\n");
        }
}
0
zss
Модератор
Эксперт С++
7772 / 7007 / 4396
Регистрация: 18.12.2011
Сообщений: 18,527
Завершенные тесты: 1
30.01.2015, 21:18 8
Все Ваши беды от неразумного использования глобальных переменных.
В частности, в функции vvod() вводите m и n в ЛОКАЛЬНЫЕ переменные.
А в выводе почему-то используете m и n ГЛОБАЛЬНЫЕ.

Настоятельно рекомендую отказаться от ВСЕХ глобальных переменных,
а передавать значения через параметры функций.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>
#include <malloc.h>
#include <windows.h>
 
 
 
 
 
//int *a;
//int i, j, z, n,m, min = 0, max = 0, sum1 = 0, sum2 = 0;
void vvod(int** a,int& n,int& m);
void vyvod(int*, int,int);
void zadanie1();
void zadanie2();
int menu();
 
int main()
{
    int n,m;
    int *a;
    setlocale(LC_ALL, "RUS");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
 
    while (1)
    {                                  //вызов функции menu
        switch (menu())         //условное выражение в операторе switch -  
        {
        case 2:
            zadanie1();
            break;
        case 4:
            zadanie2();
            break;
        case 1:
            vvod(&a,n,m);
            break;
        case 3:
            vyvod(a,n,m);
            break;
 
        case 5:
            return 0;
            //Выполнение функции завершается после выполнения оператора return
        }
 
    }
 
    _getch();
}
 
void vvod(int** a,int& n,int& m)
{
    int i, j;
        printf("Введите количество строк: ");
    scanf_s("%d", &n);
    printf("Введите количество столбцов: ");
    scanf_s("%d", &m);
    *a = (int*)malloc(n*m*sizeof(int));      // Захват памяти
    for (i = 0; i < n; i++)  // цикл по строкам
    {
        for (j = 0; j < m; j++)  // цикл по столбцам
        {
            printf("a[%d][%d] = ", i, j);
            scanf_s("%d", ((*a) + i*m + j));
        }
    }
    printf("Массив на %d элементов сгенерирован  ", n);
}
 
void vyvod(int *a, int n,int m)
{
    int i, j;
    if (!a)
        printf("Массива нет \n Сгенерируйте массив выбрав пункт 1");
    else
        for (i = 0; i<n; i++)  // цикл по строкам
        {
        for (j = 0; j<m; j++)  // цикл по столбцам
        {
            printf("%5d ", *(a + i*m + j)); // 5 знакомест под элемент массива
        }
        printf("\n");
        }
}
 
void zadanie1()
{
    float mas1[6][6];
    int num = 0, fl = 0,i,j;
    for (i = 0; i < 6; i++)
    {
        printf("\n");
        for (j = 0; j < 6; j++)
        {
            mas1[i][j] = -1 + rand() % 20;
            if (fl == 0 && mas1[i][j] < 0)
                num = i;
            printf("%4.1f  ", mas1[i][j]);
        }
    }
    printf(" \nОтрицательный элемент в строке  %d ", num + 1);
 
    printf("\nМатрица с уменьшенным вдвое столбцом %d", num + 1);
    for (i = 0; i < 6; i++)
    {
        printf("\n");
        for (j = 0; j < 6; j++)
        {
 
            if (j == num && mas1[i][j] != 0)
                mas1[i][j] = mas1[i][j] / 2;
 
            printf("%4.1f  ", mas1[i][j]);
        }
    }
 
 
 
}
void zadanie2()
{
    char s[100];
    printf("Введите строку: ");
    getchar();
    gets_s(s);
    int i = 0;
    printf("Полученная строка в нижнем регистре равна:");
    while (s[i] != '\0')
    {
        printf("%c", char(tolower(s[i])));
        i++;
    }
    i = 0;
    printf("\n");
    printf("Полученная строка в верхнем регистре равна:");
    while (s[i] != '\0')
    {
        printf("%c", char(toupper(s[i])));
        i++;
    }
 
 
}
 
int menu()  //определение функции menu
{
    int ch;
    do {
        printf("\n   Menu: \n");
        printf("1. Ввод массива  \n");
        printf("2. Задание 1  \n");
        printf("3. Вывод массива\n");
        printf("4. Задание 2\n");
        printf("5. Выход\n");
        printf("\t Ваш выбор: ");
        scanf_s("%d", &ch);
    } while (ch > 5);
    return ch;
}
0
30.01.2015, 21:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.01.2015, 21:18

Error C2109: для индекса требуется массив или указатель
Есть код,делаю его в классы,вот выскочили ошибки,помогите исправить. class PID { private: ...

Error C2109: для индекса требуется массив или указатель
Помогите пожалуйста исправить ошибки. Новичок, пытаюсь разобраться второй день, но ничего не...

Error C2109: для индекса требуется массив или указатель
Здравствуйте, форумчане! Прошу помощи. Пробежался по всем похожим темам в этом форуме, решения для...


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

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

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