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

Поиск:

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


Шустрый
*


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

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



Код

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

#define N 8
#define M 8

main ()
{      
       int i, j, sum=0, flag=0;
           
          int  array[N][M] = {
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 1, 2, 7, 6, 0, -8, 3, 5 },
                           { 2, 2, 1, 8, 1, 4, 9, 3 },
                           { 9, 2, 8, 5, 2, 0, 0, 6 },
                           { 7, 2, 1, 3, 9, 3, 9, 1 },
                           { 8, 2, 4, 9, 1, -6, 4, 9 },
                           { 0, 2, 9, 0, 9, 4, 8, 8 },
                           { 1, 2, 3, 2, 8, 2, 8, 0 }
                           }; 
  
        for(i=0; i<N; i++) 
        {
                 for(j=0; j<M; j++)
         printf("%2d ", array[i][j]);
         printf("\n");
         }
          printf("\n\n");
    
    
    if(N==M) 
    {
      bool flag=false; 
        short count; 
        
        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) 
            {
                flag=true; 
                printf("these strings are equal: k = %d \n", i+1); 
            }
         }
        if(!flag) 
            printf("there is no equality\n"); 
    }
    else
    {
        printf("there can not be any equality\n"); 
    }
printf("\n\n");

system("pause");
return 0;     
}



Ответ, зер из но иквилти. Что не так?)
PM MAIL   Вверх
newbieone
Дата 30.6.2011, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina, возможно, между нами имело место быть недопонимание.
Kruger2, укажите номер k, для которого k-ая строка вашей матрицы содержит те же элементы (слева направо), что k-ый её столбец (сверху вниз). Я такого не вижу.
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Шустрый
*


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

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



Да здесь укажите, в виде ответа в теме  smile 
Код

 int  array[N][M] = {
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 1, 2, 7, 6, 0, -8, 3, 5 },
                           { 2, 2, 1, 8, 1, 4, 9, 3 },
                           { 9, 2, 8, 5, 2, 0, 0, 6 },
                           { 7, 2, 1, 3, 9, 3, 9, 1 },
                           { 8, 2, 4, 9, 1, -6, 4, 9 },
                           { 0, 2, 9, 0, 9, 4, 8, 8 },
                           { 1, 2, 3, 2, 8, 2, 8, 0 }
                           }; 

У вас первая строка матрицы содержит те же элементы, что и второй её столбец. Это замечательно, но ваша формулировка задания требует:
Код

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

То есть, номер строки и номер столбца должны быть одинаковыми. Вы можете сравнить 1 строку с 1 столбцом, 2ую строку со 2ым столбцом, но не можете сравнивать 1ю строку со 2 столбцом. Ферштейн?
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ферштейн. убился об стену:(
PM MAIL   Вверх
triclosan
Дата 30.6.2011, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Kruger2, так это же реализацию значительно упрощает.
PM MAIL   Вверх
Kruger2
Дата 30.6.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Последний вопросsmile



Код

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

#define N 8
#define M 8

m   
       int i, j, sum=0, flag=0;
           
          int  array[N][M] = {
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 2, 2, -1, 8, 1, 4, 9, 3 },
                           { 9, 2, 8, 5, 2, 0, 0, 6 },
                           { 7, 2, 1, 3, 9, 3, 9, 1 },
                           { 8, 2, 4, 9, 1, -6, 4, 9 },
                           { 0, 2, 9, 0, 9, 4, 8, 8 },
                           { 1, 2, -3, 2, 8, 2, 8, 0 }
                           }; 
  
        for(i=0; i<N; i++) 
        {
                 for(j=0; j<M; j++)
         printf("%2d ", array[i][j]);
         printf("\n");
         }
          printf("\n\n");
    
    
    
    if(N==M) 
    {
      bool flag=false; 
        short count; 
        
        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) 
            {
                flag=true; 
                printf("these strings are equal: k = %d \n", i+1); 
            }
        }
        if(!flag) 
            printf("there is no equality\n"); 
   
}
printf("\n\n");
   
  
   for(i=0; i<N-1; i++) 
    {
     sum=0;  
        for (j=0; j<N; j++) 
          if(array[i][j] < 0) 
        {
          for(j=0; j<N; j++) 
                     sum += array[i][j];
                printf("summa otricatel stroki %d ravna %d \n", i+1, sum);
        } 
    }
    printf("\n");
system("pause");
return 0;     
}ain ()
{   



Вот тут обнуляю сум. Всё стало работать норм кроме одного. Не считает последнюю строку, хотя там есть отрицательное число. Почему же он его не видит?:( Думал, может в последнем цикле фор должно <= но нет)
Код

for(i=0; i<N-1; i++) 
    {
     sum=0;  
        for (j=0; j<N; j++) 
          if(array[i][j] < 0) 
        {
          for(j=0; j<N; j++) 
         
            sum += array[i][j]; /*íàõîæó ñóììó ýëåìåíòîâ*/
        
        printf("summa otricatel stroki %d ravna %d \n", i+1, sum);
        } 
    }


Добавлено через 1 минуту и 15 секунд
triclosan 
Конечно упрощает. Трудно решать задачу не понимая, чего от тебя хотятsmile

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


Шустрый
*


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

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



Попробуйте, ответ должен быть: k=1, k=3.
Код

int  array[N][M] = {
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 2, 2, 2, 6, 0, -8, 3, 5 },
                           { 2, 2, 1, 8, 1, 4, 9, 3 },
                           { 2, 2, 8, 5, 2, 0, 0, 6 },
                           { 2, 2, 1, 3, 9, 3, 9, 1 },
                           { 2, 2, 4, 9, 1, -6, 4, 9 },
                           { 2, 2, 9, 0, 9, 4, 8, 8 },
                           { 2, 2, 3, 2, 8, 2, 8, 0 }
                           }; 

По поводу второго задания: у вас в первой же строчке приведенного кода i должно меняться от 0 до N, а меняется до N-1, потому и нет последней строки.
Код

for(i=0; i<N-1; i++) // НЕТ НЕТ НЕТ! нужно так: for (i=0; i<N ; i++)
    {
     sum=0;  
        for (j=0; j<N; j++) 


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Код

#include <stdio.h>
#include <stdlib.h>
#define SIZE 8

int A[SIZE][SIZE]= {
                           { 2, 2, 2, 2, 2, 2, 2, 2 },
                           { 2, 2, 2, 6, 0, -8, 3, 5 },
                           { 2, 2, 1, 8, 1, 4, 9, 3 },
                           { 2, 2, 8, 5, 2, 0, 0, 6 },
                           { 2, 2, 1, 3, 9, 3, 9, 1 },
                           { 2, 2, 4, 9, 1, -6, 4, 9 },
                           { 2, 2, 9, 0, 9, 4, 8, 8 },
                           { 2, 2, 3, 2, 8, 2, 8, 0 }
                           };;

void compareLine(int i)
{
    int j;
    for (j=0;j<SIZE;++j)
        if (A[i][j]!=A[j][i])
            return;
    printf("K=%d\n",i+1);
}

void sum(int i)
{
    int j, result=0, fexists=0;
    for (j=0;j<SIZE;++j)
    {
        result+=A[i][j];
        if (A[i][j]<0) fexists=1;
    }
    if (fexists==1) printf("sum line %d: %d\n",i+1,result);
}

int main()
{
    int i;
    for (i=0;i<SIZE;++i)
    {
        compareLine(i);
        sum(i);
    }
    
}


Это сообщение отредактировал(а) voral - 30.6.2011, 18:50
PM MAIL WWW   Вверх
Kruger2
Дата 30.6.2011, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



newbieone 
Большой спасибо за помощь, разобрался и всё заработало. Плюсище от меня в репутацию поставьте человеку! =)
За код с подробными комментариями я бы вообще пивом угостил, если б мог. как правило приходиться голову ломать, что для чегоsmile) Реально большое спасибо.


voral 
Элегантно. Тоже спасибо, плюс в репу от меня!smile

baldina
Тоже спасибо, тоже плюсикsmile
PM MAIL   Вверх
borisbn
Дата 30.6.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(voral @  30.6.2011,  18:40 Найти цитируемый пост)
if (A[i][j]<0) fexists=1;

Код
if ( fexists == 0 && A[ i ][ j ] < 0 ) fexists = 1;

 smile 

Kruger2, тебе до сотни постов немного осталось. сам и наплюсуешь smile

Это сообщение отредактировал(а) borisbn - 30.6.2011, 19:13


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
newbieone
Дата 30.6.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



borisbn, а это критично? Результаты будут верными и для вашего варианта, и для кода voral, а вот алгоритм - оптимальней ли?
Код

if ( fexists == 0 && A[ i ][ j ] < 0 ) fexists = 1;

Вне зависимости от знака элементов строки будут произведены N сравнений на равенство нулю, N обращений к элементу массива и проверок на отрицательность элемента, 1 присваивание. 2N+1 операция (или даже 3N+1, если обращение к элементу массива и сравнение считать двумя различными), если я нигде не наврал.
Теперь здесь:
Код

if (A[i][j]<0) fexists=1;

В худшем случае, когда все элементы отрицательны, имеем N присваиваний и N сравнений. 2N операций (ну или 3N, при тех же условиях, что и выше). Всё, конечно, поменяется, если вы скажете, что операция присваивания требует больше ресурсов, чем операция сравнения, но намного ли? Надо еще учесть, что далеко не всегда будет худший вариант, возможно, только один из элементов будет отрицательным, тогда будем иметь всего N+1 (2N+1) операций против 2N+1 (или 3N+1 соответственно). Тогда исходный алгоритм будет требовать аж на N операций меньше, чем предложенный вами. smile

UPD.: Хотя, если еще чуть подумать, можно вспомнить о short-circuiting, когда первое сравнение даст false и ничего больше вычисляться не будет...
Код

if ( fexists == 0 && A[ i ][ j ] < 0 ) fexists = 1;

В общем, всё это очень спорно  smile 

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 16.3.2008
Где: Иваново

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



Цитата(newbieone @  30.6.2011,  19:26 Найти цитируемый пост)
В общем, всё это очень спорно

Да нет. Тут все бесспорно. Поправка правильная. В любом случае если вызывает сомнение можно разложить этот if на два - и это будет шустрее чем мой вариант smile
PM MAIL WWW   Вверх
newbieone
Дата 30.6.2011, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <stdio.h>
#include <stdlib.h>
#include <ctime>
#include <iostream>
#define SIZE 15000
int **A;
void compareLine(int i)
{
    int j;
    for (j=0;j<SIZE;++j)
        if (A[i][j]!=A[j][i])
            return;
    //printf("K=%d\n",i+1);
}
void sum(int i)
{
    int j, result=0, fexists=0;
    for (j=0;j<SIZE;++j)
    {
        result+=A[i][j];
        if (A[i][j]<0) fexists=1;
        //if ( fexists == 0 && A[ i ][ j ] < 0 ) fexists = 1;
    }
    if (fexists==1) return; //printf("sum line %d: %d\n",i+1,result);
}
void print()
{
    for(int i=0; i<SIZE; i++)
    {
        for(int j=0; j<SIZE; j++)
            printf("%2d ", A[i][j]);
        printf("\n");  
    }
    printf("\n");
}
void fillArray()
{
    A=new int*[SIZE];
    for(int i=0;i<SIZE;i++)
        A[i]=new int [SIZE];
    srand(time(NULL)); 

    for(int i=0; i<SIZE; i++) 
        for(int j=0; j<SIZE; j++)
            A[i][j] = -1+ rand () % 9;  
}
void main()
{
    

    fillArray();
    //print();

    for (int i=0;i<SIZE;++i)
    {
        compareLine(i);
        sum(i);
    }

    for(int i=0; i<SIZE;i++)
        delete A[i];
    delete []A;

    std::cout << "It took: " << double(clock()) / CLOCKS_PER_SEC << " seconds" << std::endl;
    
}

Тестировал для SIZE=15000, заполнение массива случайными числами.
Код
if ( fexists == 0 && A[ i ][ j ] < 0 ) fexists = 1;

It took: 15.312 seconds
Код
if (A[i][j]<0) fexists=1;

It took: 16 seconds

Даже не знаю.

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



>It took: 15.312 seconds код
>It took: 16 seconds
IMHO всего на 15000 7%  выиграша уже не плохо

Если это кому-нить нужно smile, ессно


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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