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

Программа выводит что-то непонятное - C++

Восстановить пароль Регистрация
 
Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
22.10.2013, 20:45     Программа выводит что-то непонятное #1
Помогите пожалуйста, подскажите, почему программа бред выводит?

Вот программа.
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <C:\Users\Ангелина\Documents\Visual Studio 2008\Projects\zpr3\zpr3\function.h>
void main()
{   
    int sort=0;
    float matrica[11][15];
    float (*matrix)[11][15]=&matrica;
    int vector[11];
    int n;
    int m;
    while (1)
    {
        printf("vvedite chislo stolbcov 1-16");
        scanf("%d", &m);
        printf("vvedite chislo strok 1-11");
        scanf("%d", &n);
        if (m>0 && m<16 && n>0 && n<12) 
        {break;}
        else
        {printf("   error\n");
        printf("povtorite vvod\n");}
    }
    input(n, m, matrix);
    result(n, m, *matrix, &vector);
    output1(n, vector);
    output2(n, m, *matrix);
    while ((sort!=1) && (sort!=2) && (sort!=3))
    {
    printf("Enter the number of kind of sorting\n 1 A-Z\n 2 Z-A\n 3 Print without sorting\n");
    scanf("%d", &sort);
    }
    if (sort=1) //сортировка выбором
    {
        sort1(n, m, matrix);
    }
    if (sort=2)//обменная сортировка
    {
        sort2(n, m, matrix);
    }
    output2(n, m, *matrix);
    getch();
}
А вот function.h
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
void input(int n, int m, float (*matrix)[11][15])
{
    int i;
    int j;
    for (i=0; i<n; i+=1)
    {
        for (j=0; j<m; j+=1)
        {
            while (1) 
            {
                printf("Enter matrix element %d %d", i+1, j+1);
                scanf("%f", matrix[i][j]);
                if (*matrix[i][j]<10 && *matrix[i][j]>-10) 
                {
                    break;
                }
                else
                {
                    printf("    error   ");
                    printf("    Repeat  ");
                }
            }
        }
    }
}
void output1(int n,int mas[11])
{
    int i;
    printf("Printing result");
    for (i=0; i<n; i+=1)
    {
        printf("%d", mas[i]);
    }
}
void output2(int n, int m, float matrix[11][15])
{
    int i;
    int j;
    printf("\nPrinting matrix\n");
    for (i=0; i<n; i+=1)
    {
        for (j=0; j<m; j+=1)
        {
            printf("%f", matrix[i][j]);
        }
        printf("\n");
    }
}
void result(int n, int m,float matrix[11][15],int (*vector)[11])
{
    int i;
    int j;
    int maxj;
    int minj;
    float max;
    float min;
    for (i=0; i<n; i+=1)
    {
        maxj=1;
        minj=1;
        max=-10;
        min=10;
        for (j=0; j<m; j+=1)
        {
            if (matrix[i][j]<min)
            {
                minj=j;
                min=matrix[i][j];
            }
            if (matrix[i][j]>max)
            {
                maxj=j;
                max=matrix[i][j];
            }
        }
        if (maxj<minj) 
        {
            *vector[i]=1;
        }
        else
        {
            *vector[i]=0;
        }
    }
}
void sort1(int n, int m,float (*matrix)[11][15])
{
    int i;
    int j;
    float dop=*matrix[0][0];
    float min=*matrix[0][0];
    int mini=0;
    int minj=0;
    int k[2]={0, 0};
    int x;
    int y;
    for (i=0; i<n; i=+1)
    {
        for (j=0; j<m; j+=1)
        {
            k[1]=i; 
            k[2]=j;
            dop=*matrix[i][j];
            for (x=i; x<n; x+=1)
            {
                for (y=j; y<m; y+=1)
                {
            if (*matrix[x][y]<min)
            {
                mini=x;
                minj=y;
            }
                }
            }
            *matrix[i][j]=*matrix[mini][minj];
            *matrix[mini][minj]=dop;
        }
    }
}
void sort2(int n, int m, float (*matrix)[11][15])
{
    int i;
    int j;
    float dop;
    for (i=0; i<n; i+=1)
    {
        for (j=0; j<m; j+=1)
        {
            if (matrix[i][j]<matrix[i][j+1])
            {
                dop=*matrix[i][j];
                *matrix[i][j]=*matrix[i][j+1];
                *matrix[i][j+1]=dop;
            }
            if (*matrix[i][j]<*matrix[i+1][i])
            {
                dop=*matrix[i][j];
                *matrix[i][j]=*matrix[i+1][j];
                *matrix[i+1][j]=dop;
            }
        }
    }
}
Входная матрица
2 3 4
-2 -3 -4
0 -1 1

Скрин того, что выводится вложен.

Объясните пожалуйста, в чем проблема, у меня сейчас мозги вытекут через уши. О сортировке речь не идет, хотя она там тоже написана, но с ней пока проблем нет(я так и не смогла дождаться результата).
Миниатюры
Программа выводит что-то непонятное  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2013, 20:45     Программа выводит что-то непонятное
Посмотрите здесь:

C++ turbo c++ и что-то непонятное
C++ С++ Код Цезаря(программа выводит не то что нужно)
C++ Что-то непонятное с памятью
Выводит непонятное число C++
C++ Вместо нуля выводит непонятное число
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
22.10.2013, 20:56  [ТС]     Программа выводит что-то непонятное #2
Упс, чуть не забыла. Задание:
21. По данной матрице с числом строк не более 11 и числом столбцов не более 15 построить вектор, элемент которого равен 1, если в соответствующей строке матрицы максимальный элемент встретился раньше минимального. Определить моду для полученного вектора. Формат числа ц.ццц. Отсортировать матрицу двумя способами.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
22.10.2013, 20:59     Программа выводит что-то непонятное #3
Angeline,

Не по теме:

я бы рад помочь, но сломал мозг при прочтении задания

Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
23.10.2013, 08:57  [ТС]     Программа выводит что-то непонятное #4
Ну хоть на код и скрин посмотри, без задания. Не должно же вроде такого быть.

Добавлено через 11 часов 37 минут
Помогите пожалуйста.
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
23.10.2013, 09:12     Программа выводит что-то непонятное #5
Angeline, ну ок, сейчас попробую... Вы в след раз если хотите кому то ответить, вначале кликайте на его форумный ник. А то я только сегодня увидел, что мне сообщение написали

Добавлено через 12 минут
Angeline, в том же "results" выводимый массив даже не разделен. Немудрено что визуально выводится огромная цифра
Проверьте еще вычисления, у вас видимо при вычислении ошибки
Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
23.10.2013, 09:34  [ТС]     Программа выводит что-то непонятное #6
Folko, так в том же result элементам массива присваивается либо ноль, либо единица, откуда там восьмерки, девятки и прочее?
Folko
 Аватар для Folko
265 / 253 / 7
Регистрация: 27.09.2013
Сообщений: 877
Записей в блоге: 1
23.10.2013, 09:58     Программа выводит что-то непонятное #7
Angeline,

Не по теме:

Из паралельного мира?



Мне не нравится передача массива в функцию output1. Лучше бы указатель на массив передали и кол-во параметров

Добавлено через 6 минут
Angeline, то же самое относится и к output2
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
23.10.2013, 10:44     Программа выводит что-то непонятное #8
Angeline,
cpp'шник:
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "function.h"
 
void main(int argc, char** argv)
{
    int sort = 0;
    int n, m; //Количество строк и столбцов
    while (true)
    {
        printf("vvedite chislo stolbcov 1-16\t");
        scanf("%d", &m);
        printf("vvedite chislo strok 1-11\t");
        scanf("%d", &n);
        if (m>0 && m<16 && n>0 && n<12)
        {
            break;
        }
        else
        {
            printf("\tError\n\tPovtorite vvod\n");
        }
    }
    //Выделяем память под матрицу и вектор
    float** matrix = createFloatMatrix(n, m);
    int* vector = createIntVector(n);
 
    input(n, m, matrix);
    result(n, m, matrix, vector);
    output1(n, vector);
    output2(n, m, matrix);
    while ((sort!=1) && (sort!=2) && (sort!=3))
    {
      printf("Enter the number of kind of sorting\n 1 A-Z\n 2 Z-A\n 3 Print without sorting\n");
      scanf("%d", &sort);
    }
    if (sort==1) //сортировка выбором
    {
        sort1(n, m, matrix);
    }
    if (sort==2)//обменная сортировка
    {
        sort2(n, m, matrix);
    }
    output2(n, m, matrix);
    //Освобождаем память матрицы
    int i;
    for(i = 0; i < m; i++)
    {
        free(matrix[i]);
    }
    free(matrix);
    //Вектора
    free(vector);
    getch();
}
h'ник:
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
168
169
170
171
#ifndef __function.h__
#define __function.h__
 
//Функция выделения памяти под матрицу
float** createFloatMatrix(unsigned int rows, unsigned int cols)
{
    float** matrix;
    matrix = (float**) calloc(cols, sizeof(float*));
    for(unsigned int i = 0; i < cols; i++)
        matrix[i] = (float*) calloc(rows, sizeof(float));
    return matrix;
}
 
//Функция выделения памяти под вектор
int* createIntVector(unsigned int size)
{
    int* vector;
    vector = (int*) calloc(size, sizeof(int));
    return vector;
}
 
void input(int n, int m, float** matrix)
{
    int i, j;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            while (true)
            {
                printf("Enter matrix element %d %d:\t", i+1, j+1);
                scanf("%f", &matrix[i][j]);
                if (matrix[i][j] < 10 && matrix[i][j] > -10)
                {
                    break;
                }
                else
                {
                    printf("\tError\n\tRepeat\n");
                }
            }
        }
    }
}
 
void output1(int n, int* vector)
{
    int i;
    printf("Printing result:\n");
    for (i = 0; i < n; i++)
    {
        printf("%d\t", vector[i]);
    }
    printf("\n");
}
 
void output2(int n, int m, float** matrix)
{
    int i;
    int j;
    printf("Printing matrix\n");
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < m; j++)
        {
            printf("%f\t", matrix[i][j]);
        }
        printf("\n");
    }
}
 
void result(int n, int m, float** matrix, int* vector)
{
    int i;
    int j;
    int maxj;
    int minj;
    float max;
    float min;
    for (i = 0; i < n; i++)
    {
        maxj=1;
        minj=1;
        max=-10;
        min=10;
        for (j = 0; j < m; j++)
        {
            if (matrix[i][j] < min)
            {
                minj = j;
                min = matrix[i][j];
            }
            if (matrix[i][j] > max)
            {
                maxj = j;
                max = matrix[i][j];
            }
        }
        if (maxj < minj)
        {
            vector[i] = 1;
        }
        else
        {
            vector[i] = 0;
        }
    }
}
 
void sort1(int n, int m, float** matrix)
{
    int i;
    int j;
    float dop = matrix[0][0];
    float min = matrix[0][0];
    int mini=0;
    int minj=0;
    int k[2]={0, 0};
    int x;
    int y;
    for (i=0; i<n; i=+1)
    {
        for (j=0; j<m; j+=1)
        {
            k[1]=i;
            k[2]=j;
            dop = matrix[i][j];
            for (x=i; x<n; x+=1)
            {
                for (y=j; y<m; y+=1)
                {
            if (matrix[x][y]<min)
            {
                mini=x;
                minj=y;
            }
                }
            }
            matrix[i][j]=matrix[mini][minj];
            matrix[mini][minj]=dop;
        }
    }
}
 
void sort2(int n, int m, float** matrix)
{
    int i;
    int j;
    float dop;
    for (i=0; i<n; i+=1)
    {
        for (j=0; j<m; j+=1)
        {
            if (matrix[i][j]<matrix[i][j+1])
            {
                dop=matrix[i][j];
                matrix[i][j]=matrix[i][j+1];
                matrix[i][j+1]=dop;
            }
            if (matrix[i][j]<matrix[i+1][i])
            {
                dop=matrix[i][j];
                matrix[i][j]=matrix[i+1][j];
                matrix[i+1][j]=dop;
            }
        }
    }
}
 
 
#endif
Видимо я слишком плохо понимаю с++, но в Ваших указателях, передаваемых в функции я запутался, не разобрался, и вообще слабо понимаю как они должны были работать. Поэтому просто переделал с выделением памяти.

Заполнение матрицы и вектора теперь работает. В сортировках у меня сейчас разбираться нет времени из-за работы, но они обе не работают, одна залипает где-то в бесконечный цикл, вторая вылетает с ошибкой доступа к памяти. Ищите ошибки.
Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
23.10.2013, 15:38  [ТС]     Программа выводит что-то непонятное #9
Rivory, скорее всего вы настолько хорошо понимаете с++, что мои бредовые указатели вам непонятны
И у меня к вам еще парочка вопросов, если не трудно:
Что делают строки
#ifndef __function.h__
#define __function.h__
#endif
и
matrix = (float**) calloc(cols, sizeof(float*));

И насколько я понимаю(видимо неправильно, потому и спрашиваю) return возвращает только одно значение, а в ваших выделениях памяти получается массивы возвращает. Или это указатель на начало массива?
Rivory
146 / 112 / 2
Регистрация: 15.01.2013
Сообщений: 266
23.10.2013, 15:50     Программа выводит что-то непонятное #10
Angeline,
C++
1
2
3
#ifndef __function.h__
#define __function.h__
#endif
Это команды прекомпилятора. Защита от включения данного заголовочного файла несколько раз в разных местах программы. При первом подключении, он смотрит, что мы раньше не подключали данный файл, определяет конструкцию __function.h__ и при попытке повторного подключения ничего не делает. Можно подробнее почитать в википедии, например. http://ru.wikipedia.org/wiki/Include_guard

C++
1
matrix = (float**) calloc(cols, sizeof(float*));
Выделяет память под массив указателей на float. Это что-то вроде массива столбцов, где каждый столбец - массив строк. Двумерный массив в принципе на самом деле это массив массивов. После этого в цикле выделяется память под каждую строку отдельно. В конце программы эта память освобождается.

И насколько я понимаю(видимо неправильно, потому и спрашиваю) return возвращает только одно значение, а в ваших выделениях памяти получается массивы возвращает. Или это указатель на начало массива?
Моя функция возвращает указатель на начало матрицы. Указатель на массив указателей.

Возможно я очень криво объяснил, или даже ошибся, что вполне возможно, т.к. я в этом разбирался давным давно.Надеюсь, кто-то сможет объяснить лучше. С первого взгляда это кажется очень сложным, но если попытаться вникнуть, то все на самом деле не так сложно, как кажется на первый взгляд.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2013, 12:37     Программа выводит что-то непонятное
Еще ссылки по теме:

Вместо результата выводит непонятное число C++
C++ выводит между результатом непонятное число
fread творит что-то непонятное C++

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

Или воспользуйтесь поиском по форуму:
Angeline
36 / 30 / 2
Регистрация: 21.10.2013
Сообщений: 197
24.10.2013, 12:37  [ТС]     Программа выводит что-то непонятное #11
Всем спасибо, вопрос исчерпан.

Добавлено через 20 часов 46 минут
Rivory, прекрасно объяснил, благодарю
Yandex
Объявления
24.10.2013, 12:37     Программа выводит что-то непонятное
Ответ Создать тему
Опции темы

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