Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив. Совпадение строки и столбца, и сумма строки с отрицательным элементом 
V
    Опции темы
Kruger2
Дата 30.6.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Для заданной матрицы размером 8 на 8 найти такие k, что k-я строка матрицы совпадает с k-м столбцом.
Найти сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент.

По первой части проблема в том, что он мне всегда выводит последнюю строку, даже если там нет совпадений. Я так понимаю, что не хватает проверки на ложность или на выход из массива? Но пытался вписать else и прога перестала работать вообще.

По всей проге вопрос такой: он мне считает все элементы начиная с 0 (как и полагается в массиве), но когда я пытаюсь сдвинуть цикл for (i=1; i=N-1; i++) всё рушится :(

И третий вопрос нафига тут flag? Без него прога не работала, я просто нагло скопировал часть с флагом и поэтому не врубаюсь фигли без него не работает.


Код

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 8
#define M 8

main ()
{      
       int i, j, sum=0, flag=0, array[N][M];
       
    srand(time(NULL)); 
    
    /*Создаю массив случайных чисел, размерность которого 8 на 8*/
  
      for(i=0; i<N; i++) 
        for(j=0; j<M; j++)
       array[i][j] = -1+ rand () % 9;   /*Заполняю массив случайными числами от -1 до 7*/    
  
      for(i=0; i<N; i++)
       {
        for(j=0; j<M; j++)
         printf("%2d ", array[i][j]);
       printf("\n");  
       }
    printf("\n");
    
    /* 1-ая часть. Нахожу такие k, что k-я строка матрицы совпадает с k-м столбцом */
    
   for(i=0; i<N; i++)
   {
     for (j=0; j<N; j++)
     flag = (array[i][j]==array[j][i]);
      if (flag) 
       printf("V %d stroke esti sovpadenie \n", i);         
        }
   printf("\n\n");
   
   
   /*2-часть, нахожу сумму строк с отрицательным элементом*/
   for(i=0; i<N-1; i++) 
    {
        for (j=0; j<N; j++) 
          if(array[i][j] < 0) /*ищу элементы массива которые меньше 0*/
        {
          for(j=0; j<N; j++) /*проход по строке с отрицательным элементом, для суммирования*/
            sum += array[i][j]; /*нахожу сумму элементов заданной строки*/
        
        printf("Ыumma otricatelinoi stroki %d ravna %d \n", i, sum);
        } 
    }
    printf("\n");
system("pause");
return 0;     
}



Это сообщение отредактировал(а) Kruger2 - 30.6.2011, 14:13
PM MAIL   Вверх
baldina
Дата 30.6.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Kruger2 @  30.6.2011,  14:11 Найти цитируемый пост)
По первой части проблема в том, что он мне всегда выводит последнюю строку, даже если там нет совпадений. Я так понимаю, что не хватает проверки на ложность или на выход из массива? Но пытался вписать else и прога перестала работать вообще.

Цитата(Kruger2 @  30.6.2011,  14:11 Найти цитируемый пост)
for (j=0; j<N; j++)
     flag = (array[i][j]==array[j][i]);
      if (flag) 
       printf("V %d stroke esti sovpadenie \n", i);         

flag надо инициализировать на каждом шаге цикла по i:
Код

flag=0;
for (j=0; j<N; j++)
     flag = (array[i][j]==array[j][i]);
if (flag) 
     printf("V %d stroke esti sovpadenie \n", i);     

Цитата(Kruger2 @  30.6.2011,  14:11 Найти цитируемый пост)
когда я пытаюсь сдвинуть цикл for (i=1; i=N-1; i++

зачем?

Это сообщение отредактировал(а) baldina - 30.6.2011, 14:54
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



baldina
Начал писать и придумал как решить проблемуsmile  У меня ответы получались начиная от 0. Но в printf указать просто i + 1).

Инициализировал flag нулем, но ничего не изменилось. Всегда выдает, что есть совпадение в последней строке.
PM MAIL   Вверх
baldina
Дата 30.6.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Kruger2 @  30.6.2011,  15:27 Найти цитируемый пост)
 Всегда выдает, что есть совпадение в последней строке.

а в действительности нет совпадения?
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Нет. Бывают совпадения в других строках. А последнюю выводит всегда, вне зависимости от того есть там совпадения или нет.

Добавлено @ 15:42
Вот блин, он мне и сложение не правильно дает, каждую строку после первой он начинает не с ноля, а с конечной суммы. Чорд чорд чорд)

Это сообщение отредактировал(а) Kruger2 - 30.6.2011, 15:43
PM MAIL   Вверх
baldina
Дата 30.6.2011, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(Kruger2 @  30.6.2011,  15:40 Найти цитируемый пост)
Нет. Бывают совпадения в других строках.

посмотрите внимательнее. а лучше - задайте массивы вручную.
http://codepad.org/tMdEtddz
PM MAIL   Вверх
newbieone
Дата 30.6.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.3.2010

Репутация: 1
Всего: 1



В условии же сказано о полном равенстве строки и столбца, верно? 
Цитата
такие k, что k-я строка матрицы совпадает с k-м столбцом

А у вас там в алгоритме выводится, что совпадение найдено, если есть хотя бы один такой элемент на позиции i,j, что симметричный ему элемент на j,i имеет то же значение... 
Код

for(i=0; i<N; i++) // в каждой строке
   {
     for (j=0; j<N; j++) // проходим по всем столбцам
     flag = (array[i][j]==array[j][i]); // нашли совпадение хоть в каком-то из симметричных элементов
      if (flag) 
       printf("V %d stroke esti sovpadenie \n", i); // равны всего два элемента => строка и столбец совпали? НЕТ НЕТ НЕТ!
        }
   printf("\n\n");

Попробуйте вот так, кажется, то, что нужно.
Код

    /* 1-ая часть. Нахожу такие k, что k-я строка матрицы совпадает с k-м столбцом */
    
    if(N==M) // имеет смысл сравнивать строку со столбцом, только если количество элементов в них равно
    {
        bool flag=false; // для того, чтобы знать, нашли хоть какие-то удовлетворяющие требованиям k, или нет
        short count; // количество совпавших элементов в k-ой строке и k-ом столбце
        for(i=0;i<N;i++)
        {
            count=0; // сначала никаких совпадений нет
            for(j=0;j<M;j++)
            {
                if(array[i][j]==array[j][i])
                    count++; // если совпала пара симметричных элементов, то на одно совпадение больше
                else
                    break; // если не совпала хотя бы пара, то уже строка и столбец не равны, можно закругляться
            }
            if(count==N) // совпало все N штук?
            {
                flag=true; // ну тогда хоть что-то мы выведем
                printf("these strings are equal: k = %d \n",i+1); // а именно: k-ый столбец и строка имеют одинаковые элементы 
            }
        }
        if(!flag) // не выводить вообще ничего плохо
            printf("there is no equality\n"); // потому, если удовлетворяющих условиям k-ых строк/столбцов нет, говорим об этом
    }
    else
    {
        printf("there can not be any equality\n"); // если размер строки не равен размеру столбца, говорим, что не будем ничего искать
    }


Это сообщение отредактировал(а) newbieone - 30.6.2011, 16:42
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Всегда выдает: there is no equality =(
PM MAIL   Вверх
baldina
Дата 30.6.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(newbieone @  30.6.2011,  16:34 Найти цитируемый пост)
симметричный ему элемент на j,i имеет то же значение... 

...на главной диагонали, i==j

Код

for(i=0; i<N; i++)
{
     flag=0;
     for (j=0; j<N; j++)
       if (i!=j && array[i][j]==array[j][i])
       {
          flag = 1;
          break;
       }
     if (flag) 
       printf("V %d stroke esti sovpadenie \n", i);         
}


Добавлено через 1 минуту и 55 секунд
это проверка совпадения хотябы одного элемента. если надо проверить все, то

Код

for(i=0; i<N; i++)
{
     flag=1;
     for (j=0; j<N; j++)
       if (array[i][j]!=array[j][i])
       {
          flag = 0;
          break;
       }
     if (flag) 
       printf("V %d stroke esti sovpadenie \n", i);         
}


Это сообщение отредактировал(а) baldina - 30.6.2011, 16:46
PM MAIL   Вверх
newbieone
Дата 30.6.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.3.2010

Репутация: 1
Всего: 1



Цитата
Всегда выдает: there is no equality =( 

а для случайно сгенерированной матрицы у вас, собственно, никогда и не будет никакой equality. вы смотрите на свою матрицу, на первую строку, потом на первый столбец. все элементы в строке и столбце одинаковые? очевидно, при использовании rand() для заполнения массива - нет.
Цитата
...на главной диагонали, i==j

это вы откуда взяли про главную диагональ? там идет прогонка по всему массиву
Код

for(i=0; i<N; i++)
   {
     for (j=0; j<N; j++)
     flag = (array[i][j]==array[j][i]);
      if (flag) 
       printf("V %d stroke esti sovpadenie \n", i);         
        }
   printf("\n\n");

Давайте для определенности N=8, i=1, j=0. Рассмотрим 4 строку:
Код

array[1][0]==array[0][1]

Отнюдь не главная диагональ.

Это сообщение отредактировал(а) newbieone - 30.6.2011, 16:56
PM MAIL   Вверх
baldina
Дата 30.6.2011, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



я имел в виду, что array[i][j] всегда ==array[j][i] при i==j

Добавлено через 53 секунды
именно поэтому у него всегда последняя строка попадает: там у последнего проверяемого элемента j==i и, соответственно, flag==1
PM MAIL   Вверх
newbieone
Дата 30.6.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.3.2010

Репутация: 1
Всего: 1



Главная диагональ там играет роль именно только в последнем элементе последней строки.
На предыдущих же строках главная диагональ алгоритму Kruger2 вообще не важна: flag затирается при переходе от элемента к элементу, первые N-1 элементов могут быть различны, а N-тый элемент строки, в случае равенства N-тому элементу столбца, выставит flag в положение true, что якобы приводит к решению о равенстве строки и столбца (по сути, для положительного ответа программы у автора должны быть равны лишь A последних элементов строки и столбца, где A>=1 и не обязательно равно размеру строки/столбца N).
Код

Вот блин, он мне и сложение не правильно дает, каждую строку после первой он начинает не с ноля, а с конечной суммы. Чорд чорд чорд)

Ну всё просто, нужно обнулять ваш аккумулятор (sum) в начале каждого прохода по строке.

Это сообщение отредактировал(а) newbieone - 30.6.2011, 17:25
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 9.1.2011

Репутация: нет
Всего: нет



Видимо я не понимаю задания. У меня получается есть допустим массив:

1 1 1 1
1 2 3 4
1 3 3 2

Вот тут первая строка совпадет с первым столбцом и только такой выдаст нужный ответ?
PM MAIL   Вверх
newbieone
Дата 30.6.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 14.3.2010

Репутация: 1
Всего: 1



Kruger2, внимательнее. В общем случае, если вы хотите, чтобы строка совпадала со столбцом, то количество элементов в них должно быть одинаковым (т.е. матрица должна быть квадратной). Иначе как вы, например, для вашего примера:
Код

1 1 1 1
1 2 3 4
1 3 3 2

скажете, равен ли элемент [0][3]=1 элементу [3][0], если у вас четвертая строка отсутствует?
Если четвертую строку всё-таки добавить как-то так:
1 1 1 1
1 2 3 4
1 3 3 2
1 6 5 3
то, безусловно, ответом будет k=1 (т.е. только 1 строка и 1 столбец содержат одинаковые элементы).

Это сообщение отредактировал(а) newbieone - 30.6.2011, 18:00
PM MAIL   Вверх
baldina
Дата 30.6.2011, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



newbieone, похоже, вы читаете невнимательно)))) долго объясняете то, что уже говорено
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.