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

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

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

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

05.01.2013, 02:05. Просмотров 1167. Ответов 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     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Посмотрите здесь:

Дан текстовый файл.текст. числа, разделённые пробелами. Найти количество положительных чисел. Удалить строку с min количеством чисел (на С) - C++
Дан текстовый файл, состоящий из одной или нескольких строк. Каждая строка файла содержит числа, разделенные пробелами. Найти количество...

Не могу найти ошибку. Массивы. - C++
Есть задание: Найти номер первого максимального значения среди элементов, меньших Т и расположенных правее первого элемента, кратного 3. ...

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

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

Не могу найти ошибку в коде, двумерные и одномерные массивы - 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...

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

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

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

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

Добавлено через 2 минуты
к слову хэлп - эт не тот хэлп, а так я прогу назвала хд
Psilon
Master of Orion
Эксперт .NET
5848 / 4745 / 628
Регистрация: 10.07.2011
Сообщений: 14,285
Записей в блоге: 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
5848 / 4745 / 628
Регистрация: 10.07.2011
Сообщений: 14,285
Записей в блоге: 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     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Еще ссылки по теме:

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

Найти минимальное значение положительных элементов - C++
Найти минимальное значение положительных элементов, расположенных правее первого элемента, кратного двум

Найти сколько положительных элементов располагается между максимальным и минимальным элементами - C++
#include&lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using std::cout; using std::cin; using std::endl; int main() { ...

Найти максимальный и минимальный элемент,их номера вывести на экран и посчитать сумму между максимальным и минимальным - C++
Доброго время суток,помогите пожалуйста написать программку )если будет возможность то до буду очень очень благодарен... Во общем...

Массивы. Найти минимальное значение элементов массива - C++
Задание на масив на С++ Найти минимальное значение элементов массива. Вывести на дисплей полученное значение.После этого изменить...


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

Или воспользуйтесь поиском по форуму:
Psilon
Master of Orion
Эксперт .NET
5848 / 4745 / 628
Регистрация: 10.07.2011
Сообщений: 14,285
Записей в блоге: 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     Массивы. Посчитать количество положительных, найти минимальное, удалить строку с минимальным (Не могу найти ошибку)
Ответ Создать тему
Опции темы

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