Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Just_dake
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 78
1

Подсчитать количество различных элементов в каждой строке матрицы

24.09.2011, 17:15. Просмотров 858. Ответов 14
Метки нет (Все метки)

Доброго вечера всем! Необходимо подкорректировать нижеследующий код. А само задание звучит так:
Подсчитать количество различных элементов в каждой строке матрицы.
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
#include <stdio.h>
#include <conio.h>
#define n 4
 
int main()
{
    int matr[n][n] = {{11, 11, 41, 59},
                      {32, 11, 43, 24},
                      {72, 21, 67, 89},
                      {39, 44, 48, 34}};
    int i,j,s,razl;
    printf("Matrica: \n\n");
    for (i = 0; i < n; i++)
     { for (j = 0; j < n; j++)
        {
          printf(" %i", matr[i][j]);
        }
      printf("\n\n");
     }
    printf("\nRazlichnih elementov v kazhdoi stroke: "); 
    for (i = 0; i < n; i++)
     {  s = 0; razl = matr[0][0];
       for (j = 0; j < n; j++)
        { 
          if (razl != matr[i][j]) s++;
        }
      printf("\ %i",s);
     }
getch();
}
Выводит
Razlichnih elementov v kazhdoi stroke: 2 3 4 4

А должно быть
Razlichnih elementov v kazhdoi stroke: 3 4 4 4


Заранее спасибо! За уделенное время!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2011, 17:15
Ответы с готовыми решениями:

Подсчитать количество положительных элементов в каждой строке массива
Ввести массив размерностью m*n. Подсчитать количество положительных элементов в каждой строке...

Определить количество элементов в каждой строке матрицы А, модуль которых равен порядковому номеру элемента в строке
1 Дано матрицу А размером 4х5. Определить количество элементов в каждой строке матрицы А, модуль...

Определить количество элементов в каждой строке матрицы
Дано матрицу А, 4х5. Определить кол-во элементов в каждой строке матрицы А, модуль которых равен...

В каждой строке матрицы найти количество элементов, меньших среднего арифметического ее элементов
Дана матрица. В каждой строке найти количество элементов, меньших среднего арифметического всех...

В каждой строке матрицы найти количество четных элементов
Задан двумерный массив целых чисел. В каждом его строке найти количество четных элементов

14
Чистый
Автор FAQ
2720 / 1416 / 89
Регистрация: 08.09.2011
Сообщений: 3,741
Записей в блоге: 1
24.09.2011, 17:32 2
цикл проверки должен быть таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 for (i = 0; i <n; i++) 
    {
        s = 0;
        razl = -100;
        for (j = 0; j < n; j++) 
        {
            if (razl != matr[i][j])
            {
                s++;
                razl =matr[i][j];
            }
        }
        
        printf("%i", s);
    }
1
soon
2547 / 1312 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.09.2011, 17:48 3
Цитата Сообщение от Чистый Посмотреть сообщение
цикл проверки должен быть таким:
Да ну?
А что будет, если ему скормить строчку 11 22 33 11?
1
Just_dake
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 78
24.09.2011, 18:10  [ТС] 4
Цитата Сообщение от soon Посмотреть сообщение
А что будет, если ему скормить строчку 11 22 33 11?
Будет плохо=).
soon, не могли бы вы истолковать эту ситуацию, если вас это не затруднит.
0
24.09.2011, 18:10
Thinker
Эксперт С++
4238 / 2212 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.09.2011, 18:37 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Функция считает кол-во различных элементов в массиве. Такой алгоритм к каждой строке матрицы можно применить

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int Count(double *a, int n) 
{
    int count = 0, i, j;
    for (i = 0; i < n; i++) 
    {
        j = i;
        while (++j < n && a[i] != a[j]) 
            ;
        if (j >= n)  
            count++;
    }
    return count;
}
1
Just_dake
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 78
24.09.2011, 19:06  [ТС] 6
Thinker, спасибо. Но хотелсь бы довести до ума этот код:
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
#include <stdio.h>
#include <conio.h>
#define n 4
 
int main()
{
    int matr[n][n] = {{11, 11, 41, 59},
                      {32, 11, 43, 24},
                      {72, 21, 67, 89},
                      {39, 44, 48, 34}};
                      
    int i, j, count, razl;
    printf("Matrica: \n\n");
    for (i = 0; i < n; i++)
     { for (j = 0; j < n; j++)
        {
          printf(" %i", matr[i][j]);
        }
      printf("\n\n");
     }
    printf("\nRazlichnih elementov v kazhdoi stroke: "); 
  
   for (i = 0; i < n; i++) 
    {
        count = 0;
        razl = -100;
        for (j = 0; j < n; j++) 
        {
            if (razl != matr[i][j])
            {
                count++;
                razl = matr[i][j];
            }
        }
        
      printf(" %i", count);
    }
 
getch();
}
Если сделать первые три элемента любой строки одинаковыми, то все выводится нормально.
К примеру если написать так
C
1
2
3
4
5
6
...
int matr[n][n] = {{11, 11, 11, 59},
                      {32, 11, 43, 24},
                      {72, 21, 67, 89},
                      {39, 44, 48, 34}};
...

Вывод будет таким
Razlichnih elementov v kazhdoi stroke: 2 4 4 4


А если сделать так
C
1
2
3
4
5
6
...
int matr[n][n] = {{11, 11, 22, 11},
                      {32, 11, 43, 24},
                      {72, 21, 67, 89},
                      {39, 44, 48, 34}};
...

Выводит
Razlichnih elementov v kazhdoi stroke: 3 4 4 4
0
soon
2547 / 1312 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.09.2011, 19:23 7
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Собственно, вот мой вариант. Готов был еще час назад, обстоятельства не позволяли.
Caution! Probably bad code.
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
#include <stdio.h>
#include <conio.h>
 
#define N 4
 
int main(void)
{
    int arr[N][N] =  {{1, 1, 1, 1},
                      {1, 1, 1, 2},
                      {1, 1, 2, 3},
                      {1, 2, 3, 4}};
    int i, j, k, count;
    
    printf("Array: \n\n");
    for(i = 0; i < N; ++i)
    {
        for(j = 0; j < N; ++j)
            printf(" %i", arr[i][j]);
        printf("\n\n");
    }
    
    printf("\nNumber of different elements in rows: "); 
    for(i = 0; i < N; ++i) 
    {
        count = N;
        for(j = 0; j < N; ++j)
            for(k = 0; k < N; ++k)
            {
                if(j == k)
                    continue;
                if((arr[i][j] == arr[i][k]) && (j > k))
                    break;
                else if(arr[i][j] == arr[i][k])
                    --count;
 
            }
        printf("%i ", count);
    }
    
    getch();
    return 0;
}
1
Just_dake
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 78
24.09.2011, 19:31  [ТС] 8
soon, интересный вариант, спасибо!
0
Thinker
Эксперт С++
4238 / 2212 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.09.2011, 19:33 9
soon, когда вы ищите количество различных элементов в каждой строке, то делаете примерно http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^2}{2} лишних проверок. А для всей матрицы http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^3}{2}. Согласитесь, это очень много)
0
soon
2547 / 1312 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.09.2011, 19:59 10
Да, все так. Но, полагаю, что для учебного решения задачи вполне сойдет.
Для ТС(я правильно предположил? Это действительно учебная задача?): если будете брать код Thinker-а(который вне всяких сомнений лучше) потрудитесь разобрать его, и будьте готовы к встречным вопросам от преподавателя. По моему коду, конечно, тоже могут быть вопросы, но он более "в лоб".
1
Just_dake
1 / 1 / 1
Регистрация: 21.03.2011
Сообщений: 78
24.09.2011, 20:06  [ТС] 11
soon, все верно, это учебное задание.
0
Thinker
Эксперт С++
4238 / 2212 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
24.09.2011, 20:11 12
Цитата Сообщение от Just_dake Посмотреть сообщение
soon, все верно, это учебное задание.
Тем более, выжимайте из алгоритма максимум, вы же пришли учиться и цель ваша не любым способом сдать работу и получить зачет, а самому понять все тонкости. Не стоит так просто сдаваться и махать рукой, мол, сойдет и так, тренируйте логику, она вам в течении всей жизни понадобится.
2
soon
2547 / 1312 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
24.09.2011, 21:07 13

Не по теме:

Ну вот, я столько всего понаписал, а он мне выдал bad gateway :(


Собственно, все что я не отправил можно сократить до одного предложения: ТС, используйте тот код, который сможете сами воспроизвести, если будет такая необходимость.
1
alkagolik
Заблокирован
24.09.2011, 21:13 14
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

замечание! компилятор должен поддерживать стандарт С99, думаю что поддерживает, хотя тут и на дедушках любят работать . полный справочник по С
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 <stdlib.h>
 
const int size = 10;
 
int main(){
    int arr[size][size], i = 0, k = 0, count = size, tmp_index, tmp;
    _Bool check = 1;
 
    for(i = 0; i != size; ++i)
        for(k = 0; k != size; ++k)
            arr[i][k] = rand() % size + 1;
 
    for(i = 0; i != size; ++i){
        for(k = 0; k != size; ++k)
            printf(" %d", arr[i][k]);
        printf("\n");
    }
 
    printf("\n\n\n");
 
    for(i = 0; i != size; ++i){
 
        count = size;
 
        for(k = 0; k != size - 1; ++k){
 
            check = 1;
            tmp = arr[i][k];
            tmp_index = k + 1;
 
            while((tmp_index < size) && check){
                if(tmp == arr[i][tmp_index]){
                    --count;
                    check = 0;
                }
                ++tmp_index;
            }
        }
        printf(" %d", count);
    }
    printf("\n");
    return 0;
}
результат работы
$ ./system
4 7 8 6 4 6 7 3 10 2
3 8 1 10 4 7 1 7 3 7
2 9 8 10 3 1 3 4 8 6
10 3 3 9 10 8 4 7 2 3
10 4 2 10 5 8 9 5 6 1
4 7 2 1 7 4 3 1 7 2
6 6 5 8 7 6 7 10 4 8
5 6 3 6 5 8 5 5 4 1
8 9 7 9 9 5 4 2 5 10
3 1 7 9 10 3 7 7 5 10



7 6 8 7 8 5 6 6 7 6
1
zek921
9 / 9 / 2
Регистрация: 30.04.2011
Сообщений: 130
Записей в блоге: 1
25.09.2011, 14:40 15
а если отсортировать - будет проще
0
25.09.2011, 14:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.09.2011, 14:40

В каждой строке матрицы найти количество элементов, больших среднего арифметического
Дана матрица размера 5 x 10. В каждой строке найти количество элементов, больших среднего...

Подсчитать количество различных пар букв в заданной строке
Помогите переделать код из С++ в С Дана строка из строчных букв латинского алфавита, содержащая не...

Создать словарь, и подсчитать количество различных слов в строке
Снова я обращаюсь к Вам за помощью. Мне нужно ввести строку, создать массив слов и подсчитать...


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

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

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