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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
#1

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

05.01.2013, 02:05. Просмотров 1183. Ответов 25
Метки нет (Все метки)

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++
Есть задание: Найти номер первого максимального значения среди элементов, меньших Т и расположенных правее первого элемента, кратного 3. ...

Найти сумму и количество положительных элементов, расположенных между минимальным и максимальным элементами массива. - C++
Дан массив А(30). Найти сумму и количество положительных элементов, расположенных между минимальным и максимальным элементами массива. С++

Посчитать количество слов в предложении (найти ошибку) - C++
Здравствуйте! Вот несложная задача на строки. Я ее решил стандартным методом, через потоки. Но в последнем тесте - неправильный ответ....

Определить количество положительных и количество отрицательных элементов до первого нуля. Найти ошибку в коде - C++
В маcсиве A(n) (n&lt;=7) хотя бы один элемент ноль. Определить количество положительных и количество отрицательных элементов до первого нуля! ...

Не могу найти ошибку в коде, двумерные и одномерные массивы - C++
# include &lt;iostream.h&gt; # include &lt;iomanip.h&gt; # include &lt;conio.h&gt; # include &lt;fstream.h&gt; # define m 10 # define n 5 # define k 50...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 21:34 #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Удаляет одну строку с минимальным числом положительных элементов. Если таких строк несколько, удаляет ту, которая попадется первой, остальные не трогает.
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
#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 rowcount)
{
    int i;
    for (i = 0; i < rowcount; i++)
        F[index][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),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
05.01.2013, 21:48  [ТС] #17
Psilon, работает, ток нулевую строку делает вместо той, с минимальным количеством положительных, мне по заданию надо сделать так: строку с минимальным удалить, последующие строки сдвинуть назад, последнюю обнулить) это попытаюсь сама сделать) спасибо за помощь
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 21:51 #18
Nekonoko, не за что. По сути вам просто нужно все строки ниже "удаляемой" сместить на одну позицию вверх, тогда эта строка затрется, ну а последняя будет дублировать предпоследнюю - её вам занулить и надо. Удачи)
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 00:30  [ТС] #19
Psilon, у меня снова проблема( не могу ни сдвинуть строки, ни занулить последнюю строку
другие функции не трогала в коде кроме как
C++
1
2
3
4
5
6
void ZeroRow(double **F, int index, int rowcount)
{
    int i; 
    for (i = 0; i < rowcount; i++)
        F[index][i] = 0;
}
пыталась изменить, чтобы строки перемещались вверх от запомнящейся строки( насколько я поняла, в функции MinPosIndex запомниется номер строки, если не так может в этом моя ошибка)
C++
1
2
3
4
5
6
7
8
void ZeroRow(double **F, int index, int n)
{
    int i;
    for (i=n; i<index; i--)
    {
        F[i]=F[i+1];
    }
}
но ничего не изменилось, мб потому что я не разобралась где именно м и н
C++
1
2
3
4
5
6
7
8
void ZeroRow(double **F, int index, int n)
{
    int i;
    for (i=n; i<index; i--)
    {
        F[i]=F[i+1];
    }
}
выводит матрицу без изменений ничего не происходит
вначале пыталась просто изменить код зероров, но я даже не буду писать, что у меня получалось, я наверное просто не поняла какая роль отведена переменным.. насколько я поняла rowcount как н идёт, а index как индекс, получившийся в функции MinPosIndex.. или с функциями я так и не разобралась help
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 00:44 #20
Nekonoko, ну я бы делал так
C
1
2
3
4
5
6
7
8
9
10
void ZeroRow(double **F, int index, int n, int m)
{
    int i;
    for (i=index; i < n - 1; i++)
    {
        F[i]=F[i+1];
    }
    for (i = 0; i < m; i++)
       F[n-1][i] = 0;
}
код не проверял, но логика такая должна быть
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 00:56  [ТС] #21
Psilon, ошибку выдаёт
Это может быть вызвано повреждением кучи и указывает на ошибку в help.exe или в одной из загруженных им DLL.

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

Добавлено через 2 минуты
к слову хэлп - эт не тот хэлп, а так я прогу назвала хд
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 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
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 5
Завершенные тесты: 4
07.01.2013, 01:33 #24
Напоследок, небольшая картинка с пояснением, что собственно делаем в функции:
Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
07.01.2013, 01:41  [ТС] #25
Psilon, ясно.. чтобы ссылку на удаляемую строку просто так не бросать, вы через указатель её переместили в конец и обнулили ( ну наскок я поняла по коду, на моём примитивном языке ) и ещё спросить хотела. раньше не особо использовала тип double, но заметила что если его на флоат изменить, программа не работает, ну отладка то запускается но результата никакого, почему так?
Psilon
Master of Orion
Эксперт .NET
5887 / 4784 / 633
Регистрация: 10.07.2011
Сообщений: 14,405
Записей в блоге: 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");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2013, 01:56
Привет! Вот еще темы с ответами:

C++. Списки. Необходимо удалить элементы структуры. Не могу найти ошибку - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; void EnterF(int **matrix_connect,int number_of_peak); void...

Двумерные массивы. Найти количество положительных элементов в каждой строке массива - C++
Задан двумерный массив действительных чисел m на n. Элементы массива инициализируются или вводятся с клавиатуры. Найти количество...

Двумерные массивы. Найти количество положительных элементов в каждой строке массива - C++
Задан двумерный массив действительных чисел a на b. Элементы массива инициализируются или вводятся с клавиатуры. Найти количество...

Посчитать количество строк и символов, удалить 2-ую строку и отдельно добавить в другой файл - C++
Уважаемые Форумчане, можете подсказать: 1) Есть текст какой то , например ывафывафывафыв аываывваа 23423 кцукцу ыава ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.01.2013, 01:56
Ответ Создать тему
Опции темы

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