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

Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 02:05     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #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
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
// Заданы матрицы X(8;4),Y(5;5),Z(6;9). 
// Для каждой из матриц определить строку, в которой находится наименьшее 
// количество положительных элементов.
// Удалить её.
// Последнюю строку матрицы обнулить.
// Элементы указанных матриц определяются по формулам: Хij=cos(1.9-i/3j) ;
// Yij=cos(5.7-i/2j) ;Zij=cos(1.4-i/4j) .
 
#include "stdafx.h"
#include "stdlib.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
 
void form(float **F,int ni,int nj,float a,float b)
{
    int i,j;
    *F=(float*)malloc(ni*nj*sizeof(float));
    for(i=0;i<ni;i++)
        for(j=0;j<nj;j++)
            *(*F+i*nj+j)=cos(a-i/b*j);
}
void vivod(float**F,int ni,int nj)
{
    int i,j;
    for(i=0;i<ni;i++)
    {
        for(j=0;j<nj;j++)
        {
            printf("%8.1f", *(*F+i*nj+j));
            printf("\n");
        }
    }
}
void kolvo(float **F,int ni,int nj)
{
    int i,j,kx,kmin,jmin,s;
    kmin=ni;
    for(j=0;j<nj;j++)
        for(i=0;i<ni;i++)
            if(*(*F+i*nj+j)>0)
                kx++;
                if(kx<kmin)
                    kmin=kx;
                    jmin=s;
 
    printf("%kmin=%d jmin=%d\n",kmin,jmin);
    for(j=0;j>=s;j++)
        for(i=0;i<ni;i++)
        {
            *(*F+i*nj+j)=*(*F+i*nj+j+1);
            *(*F+nj+j)=0;
        }
 
}
int _tmain()
{
    int ni,nj;
    float *X,*Y,*Z;
 
    printf("Input size of array:\n");
    scanf("%d%d",&ni,&nj);
    form(&X,ni,nj,1.9,3);
    vivod(&X,ni,nj);
    kolvo(&X,ni,nj);
    free (X);
 
    printf("Input size of array:\n");
    scanf("%d%d",&ni,&m);
    form(&Y,ni,nj,5.7,2);
    vivod(&Y,ni,nj);
    kolvo(&Y,ni,nj);
    free (Y);
 
    printf("Input size of array:\n");
    scanf("%d%d",&ni,&nj);
    form(&Z,ni,nj,1.4,4);
    vivod(&Z,ni,nj);
    kolvo(&Z,ni,nj);
    free (Z);
 
    getch();
    return 0;
}
Плохо пока разбираюсь в указателях и функциях, программу пыталась написать, пользуясь примерами с интернета, и примерами одногруппников... по заданию рассуждала так: задать массив, посчитать количество положительных, найти минимальное, удалить строку с минимальным.. вот там, где я искала просто количество, должно быть верно по идее, но именно там прога выдаёт ошибку. а как среди этих количеств найти уже минимальное, запомнить номер строки, где оно находится, удалить эту строку, и вместо последней записать нули.. там, наверное, полный бред -__-" вот мои попытки выполнить задачу, не могу найти проблему, просьба не делать рукалицо, если это уж слишком примитивная задача.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2013, 02:05     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Посмотрите здесь:

C++ Дан текстовый файл.текст. числа, разделённые пробелами. Найти количество положительных чисел. Удалить строку с min количеством чисел (на С)
Не могу найти ошибку. Массивы. C++
C++ Двумерные массивы. Найти количество положительных элементов в каждой строке массива
C++ Двумерные массивы. Найти количество положительных элементов в каждой строке массива
Посчитать количество строк и символов, удалить 2-ую строку и отдельно добавить в другой файл C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 00:56  [ТС]     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #21
Psilon, ошибку выдаёт
Это может быть вызвано повреждением кучи и указывает на ошибку в help.exe или в одной из загруженных им DLL.

мне такую же ошибку выдавало, когда я сама примерно таким же образом пыталась поменять этот код(

Добавлено через 2 минуты
к слову хэлп - эт не тот хэлп, а так я прогу назвала хд
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 01:19     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #22
В общем вылетала функция Dispose, почему, тоже понятно: она пыталась удалить все ссылки, а одну ссылку (удаляемую строку) мы бросали просто так, поэтому на последней итерации она не находила ссылку для удаления и висла. Так что хорошая функция, так бы хрен догадался бы, в чем проблема. А вообще: используйте дебаггер и вводите изменения малыми порциями, тогда все будет просто. Вот, это вам надо?
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
#include <stdio.h>
#include <math.h>
 
 
double** InitializeMatrix(int m, int n, double a, double b)
{
    int i,j;
    double **result;
    result =(double**)malloc(sizeof(double) * m);
    for (i = 0; i < m; i++)
    {
        result[i] = (double*)malloc(sizeof(double) * n);
        for (j = 0; j < n; j++)
            result[i][j]=cos(a - i/(b*j + 1));
    }
    return result;
}
 
 
void PrintMatrix(double **F, int m, int n)
{
    int i,j;
    printf("\n");
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
            printf("%4.2f\t", F[i][j]);
        printf("\n");
    }
}
 
double PositiveSum(double *row, int length)
{
    double result;
    int i;
    for (i = 0; i < length; i++)
        if (row[i] > 0)
            result += row[i];
    return result;
}
 
int MinPosIndex(double **F,int m, int n)
{
    int i, j, lastcount, newcount, result = 0;
    for (i = 0, lastcount = n; i < m; i++)
    {
        for (j = newcount = 0; j < n; j++)
            if (F[i][j] > 0)
                newcount++;
        if (newcount < lastcount)
        {
            lastcount = newcount;
            result = i;
        }
    }
    return result;
}
 
 
void ZeroRow(double **F, int index, int m, int n)
{
    int i;
    double *temp = F[index];
    for(i = index + 1; i < m; i++)
        F[i-1] = F[i];
    F[m-1] = temp;
    for(i = 0; i < n; i++)
        F[m-1][i] = 0;
}
 
void Dispose(double **F, int rowcount)
{
    int i;
    for(i = 0; i < rowcount; i++)
        free(F[i]);
    free(F);
}
 
 
void TestProgram(int m, int n, double a, double b, char *name)
{
    int i;
    double **F;    //Объявляем нужные переменные
    F = InitializeMatrix(m,n,a,b);
    printf("Matrix %s \r\n", name);
    PrintMatrix(F,m,n);
    printf("\nMatrix %s w/o row with minimal count of positives\r\n", name);
    ZeroRow(F,MinPosIndex(F,m,n),m,n);
    PrintMatrix(F,m,n);
    Dispose(F,m);
}
 
 
int main()
{
 
    TestProgram(8,4,1.9,3,"X");
    TestProgram(5,5,5.7,2,"Y");
    TestProgram(6,9,1.4,4,"Z");
    getchar();
    return 0;
}
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 01:26  [ТС]     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #23
Psilon, спасибо большое за труд и терпение)) да, то что нужно) я бы не решила сама эту проблему, наверное
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 01:33     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #24
Напоследок, небольшая картинка с пояснением, что собственно делаем в функции:
Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 01:41  [ТС]     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #25
Psilon, ясно.. чтобы ссылку на удаляемую строку просто так не бросать, вы через указатель её переместили в конец и обнулили ( ну наскок я поняла по коду, на моём примитивном языке ) и ещё спросить хотела. раньше не особо использовала тип double, но заметила что если его на флоат изменить, программа не работает, ну отладка то запускается но результата никакого, почему так?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 01:56     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Еще ссылки по теме:

Найти сумму и количество положительных элементов, расположенных между минимальным и максимальным элементами массива. C++
C++ Определить количество положительных и количество отрицательных элементов до первого нуля. Найти ошибку в коде
C++ Не могу найти ошибку в коде, двумерные и одномерные массивы

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

Или воспользуйтесь поиском по форуму:
Psilon
Master of Orion
 Аватар для Psilon
5742 / 4690 / 619
Регистрация: 10.07.2011
Сообщений: 14,162
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 01:56     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку) #26
Nekonoko, float очень неточный тип, поэтому его лучше не использовать. А то может случиться такая ситуация, что
C
1
2
3
double d = 12345678.12345;
float f = (float) d;
printf("%s", d == f ? "equals" : "non equals");
Yandex
Объявления
07.01.2013, 01:56     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Ответ Создать тему
Опции темы

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