Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

05.01.2013, 02:05. Просмотров 1216. Ответов 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;
}
Плохо пока разбираюсь в указателях и функциях, программу пыталась написать, пользуясь примерами с интернета, и примерами одногруппников... по заданию рассуждала так: задать массив, посчитать количество положительных, найти минимальное, удалить строку с минимальным.. вот там, где я искала просто количество, должно быть верно по идее, но именно там прога выдаёт ошибку. а как среди этих количеств найти уже минимальное, запомнить номер строки, где оно находится, удалить эту строку, и вместо последней записать нули.. там, наверное, полный бред -__-" вот мои попытки выполнить задачу, не могу найти проблему, просьба не делать рукалицо, если это уж слишком примитивная задача.
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...

25
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 03:05 #2
Nekonoko, ну так выделять память надо нормально:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int **p;
    int nr,nc,j,i;
 
    printf ("Razmernost:");
    scanf ("%i%i",&nr,&nc);
    p =(int**)malloc(sizeof(int) * nr);
    for (i=0; i<nr; i++)
    {
        p[i] = (int*)malloc(sizeof(int) * nc);
        for (j=0; j<nc; j++)
        {
            p[i][j]=(rand() + MIN) % MAX;
            printf("%-5i", p[i][j]);
        }
        printf("\n");
    }
    printf("\n");
...
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 03:30  [ТС] #3
пишет индификатор MIN MAX не определён, подчёркивает
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 04:08 #4
Nekonoko, ну так введите их. Если вы сами написали тот код, что выше, не думаю, что такая мелочь могла бы ввести вас в заблуждение, тем более, что это тестовый пример
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 04:18  [ТС] #5
Psilon, сама, ток пишу от фонаря. но ошибка осталась прежней.. когда запускаю отладку, прерывает выдаёт ошибку что-то типа индификатор kx не инициализирован или что-то вроде того:

Run-Time Check Failure #3 - The variable 'kx' is being used without being initialized.

думаю, я неправилно написала ту часть программы, где искала минимальное количество, вот только не знаю, как и что исправить
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 09:21 #6
Ну так инициализируйте их...
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 17:25  [ТС] #7
Psilon, инициализировала, но всё равно выдаёт ту же ошибку( мб я в другом что-то неправильно сделала
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 17:27 #8
Nekonoko, ждите ответ после 22.00, пока не за рабочим компьютером )
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 17:29  [ТС] #9
Psilon, хорошо =)
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 19:03 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Хотя попробую щас тут, выдались свободные 15 минуток)

Добавлено через 49 минут
Вот, смотрите, что получилось (ненужные библиотеки зависят от компилятора, неизвестные просто уберите )
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
#pragma hdrstop
#pragma argsused
 
#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)
            result = i;
    }
    return result;
}
 
 
double **RemoveRow(double **F,int m, int n, int index)
{
    int i,j;
    double **result;
    result =(double**)malloc(sizeof(double) * m - 1);
    for (i = j = 0; i < m; i++)
    {
        if (i == index)
            continue;
        result[j++] = F[i];
    }
    return result;
}
 
void TestProgram(int m, int n, double a, double b, char *name)
{
    int i;
    double **F, **G;    //Объявляем нужные переменные
    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);
    G = RemoveRow(F,m,n,MinPosIndex(F,m,n));
    PrintMatrix(G,m-1,n);
    free(F);
    free(G);
}
 
 
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;
}
Добавлено через 16 минут
Алсо, я в формировании матрицы прибавил единичку в знаменателе, потому что ничего не знаю о том, кто составлял задание, и о его умственных способностях, но в случае j==0 получаем замечательное деление на ноль (если у вас его не было, значит неправильно считали, потому что i/(a*j) в случае j ==0 дает i / (a * 0) == i/0). Так что аккуратнее
3
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 19:45  [ТС] #11
Psilon, да препод задала, эта задача лабы, 1 курс, учим си. первые 2 библиотеки в коде не знаю) спасибо за помощь, покручу код)) будут вопросы - напишу ^^

Добавлено через 11 минут
насколько я поняла в отладке должна печататься исходная матрица, потом матрица без столбца с минимальным количеством положительных и последним нулевым столбцом ( как по заданию) но печатает непонятно что.. хотя почему непонятно что? удаляется первая строка(а не столбец) - не зависимо от того что даже если и построкам смотреть ( а не по столбцам как в задании) не всегда минимальное количество именно в 1 строке, но удаляется только она. матрица же записывается вообще без последней строки.
то есть программа не выполняет поставленную задачу(

у себя на компе я не пписала первые 2 библиотеки и подключила "stdlib.h" "conio.h" тк до этого у меня подчёркивало malloc

Добавлено через 3 минуты
Matrix X

-0.32 -0.32 -0.32 -0.32
0.62 -0.08 -0.19 -0.23
1.00 0.17 -0.04 -0.13
0.45 0.41 0.10 -0.03
-0.50 0.62 0.24 0.07
-1.00 0.80 0.38 0.17
-0.57 0.92 0.50 0.27
0.38 0.99 0.62 0.36

Matrix X w/o row with minimal count of positives

0.62 -0.08 -0.19 -0.23
1.00 0.17 -0.04 -0.13
0.45 0.41 0.10 -0.03
-0.50 0.62 0.24 0.07
-1.00 0.80 0.38 0.17
-0.57 0.92 0.50 0.27
0.38 0.99 0.62 0.36
Matrix Y

0.83 0.83 0.83 0.83 0.83
-0.01 0.61 0.71 0.75 0.77
-0.85 0.32 0.55 0.65 0.69
-0.90 -0.01 0.38 0.53 0.61
-0.13 -0.34 0.19 0.40 0.52

Matrix Y w/o row with minimal count of positives

-0.01 0.61 0.71 0.75 0.77
-0.85 0.32 0.55 0.65 0.69
-0.90 -0.01 0.38 0.53 0.61
-0.13 -0.34 0.19 0.40 0.52
Matrix Z

0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17 0.17
0.92 0.36 0.28 0.25 0.23 0.22 0.21 0.20 0.20
0.83 0.54 0.38 0.32 0.28 0.26 0.25 0.24 0.23
-0.03 0.70 0.48 0.39 0.34 0.31 0.29 0.27 0.26
-0.86 0.83 0.58 0.46 0.40 0.35 0.32 0.30 0.29
-0.90 0.92 0.66 0.53 0.45 0.40 0.36 0.34 0.32

Matrix Z w/o row with minimal count of positives

0.92 0.36 0.28 0.25 0.23 0.22 0.21 0.20 0.20
0.83 0.54 0.38 0.32 0.28 0.26 0.25 0.24 0.23
-0.03 0.70 0.48 0.39 0.34 0.31 0.29 0.27 0.26
-0.86 0.83 0.58 0.46 0.40 0.35 0.32 0.30 0.29
-0.90 0.92 0.66 0.53 0.45 0.40 0.36 0.34 0.32


вот что в отладке
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 19:47 #12
Ну я в курсе. Там только free неправильно работает: он удаляет ссылки, а элементы, на которые он указывает, не удаляет. Надо немного изменить. На работу не влияет, но утечка памяти происходит. А вывод, который вы напечатали, правильный, то есть соответствует поставленной задаче.
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 19:51  [ТС] #13
Psilon, да моя ошибка, я неправильно сформулировала задачу, всё же строки надо изменить, но не проблема переписать код, чтобы работало по столбцам ведь. как сделать, чтобы последнюю строку не удаляла программа а вместо элементов записывались нули? то есть размерность матрицы меняться не должна
0
Psilon
Master of Orion
Эксперт .NET
5908 / 4805 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
05.01.2013, 19:52 #14
Nekonoko, так даже проще будет. Я сейчас уезжаю, через час напишу) Лучше пока разбирайтесь с тем, что есть
0
Nekonoko
0 / 0 / 0
Регистрация: 05.01.2013
Сообщений: 17
05.01.2013, 19:55  [ТС] #15
и + всё же не всегда программа корректно работает. например, в матрице У первая строка содержит не минимальное количество положительных а максимальное, но удаляется она.

Добавлено через 34 секунды
Цитата Сообщение от Psilon Посмотреть сообщение
Nekonoko, так даже проще будет. Я сейчас уезжаю, через час напишу) Лучше пока разбирайтесь с тем, что есть
окей..
0
05.01.2013, 19:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2013, 19:55
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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