Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.02.2012, 23:21   #1
blain
Пользователь
 
Регистрация: 26.01.2012
Сообщений: 19
Вопрос Матрицы

Удалить из матриц G (10х11) и D (11х10) строки, содержащие нулевой элемент

почему не выполняется:?:: :conf used:

Код:
#include <stdio.h>
#include <conio.h>
# define M 3
# define N 4
void in_mas(int*, int);
void out_mas(int*, int);
void fun(int*,int, int);
int main (void)
{ int a[M][N], b[N][M], s;
printf("vvedi mas a [%d][%d]", M,N);
in_mas(&a[0][0], M*N);
fun(&a[0][0], M, N);
out_mas(&a[0][0], M*N);
printf("vvedi mas b [%d][%d]\n ", N,M);
in_mas(&b[0][0], N*M);
fun(&b[0][0], N, M);
out_mas(&b[0][0], N*M);
getch();
return 0;
}
 void in_mas(int *p, int x)
{
int i;
for (i=0; i<x; i++)
scanf (" %d\n ", p+i);
}

void fun(int *p , int n, int m)
{
     int i, sk=0, j, k;
     for (i=0; i<n*m; i++)
     if (*(p+i)==0) sk++;
     while (sk!=0)
      { sk==0;
        for (i=0; i<n*m; i+m-1)
         for  (j=0; j<m; j++)
          if (*(p+i+j)==0) 
            for (k=i; k<n*m-m; k++)
             *(p+k)=*(p+k+m); 
             
       for (i=0; i<n*m; i++)
       if (*(p+i)==0) sk++; }     
                  
      
}      
     
     
         
void out_mas(int *p, int b)
{
int i;
for (i=0; i<b; i++)
 printf ("  %d\t   ", *(p+i));
  
}
blain вне форума Ответить с цитированием
Старый 09.02.2012, 00:09   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

У вас в задании написано, что даны матрицы размером 10 х 11 и 11 х 10, а в программе вы пишите размерность 3 х 4 и 4 х 3. Непорядок!
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 09.02.2012 в 00:19.
Сыроежка вне форума Ответить с цитированием
Старый 09.02.2012, 00:17   #3
blain
Пользователь
 
Регистрация: 26.01.2012
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
У вас в задании написано, что даны матрицы размером 10 х 11 и 11 х 100, а в программе вы пишите размерность 3 х 4 и 4 х 3. Непорядок!
просто так удобнее))
blain вне форума Ответить с цитированием
Старый 09.02.2012, 00:20   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Не вижу никакого удобства, так как все равно размерности заданы с помощью символических имен M и N.

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

Код:
void out_mas(int *p, int b)
{
int i;
for (i=0; i<b; i++)
 printf ("  %d\t   ", *(p+i));
  
}
лучше написать

Код:
void out_mas( const int *a, int m, int n )
{
   int i, j;

   for ( i=0; i < m; i++)
   {
      for ( j = 0; j < n; j++ )
      {
         printf( "%d ", a[i][j] );
      }
      printf( "\n" );
   }
}
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Stilet; 09.02.2012 в 08:40.
Сыроежка вне форума Ответить с цитированием
Старый 09.02.2012, 10:09   #5
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Не вижу никакого удобства, так как все равно размерности заданы с помощью символических имен M и N.
И каждый раз на этапе отладки вручную вбивать по 110 значений в каждую матрицу? да вы мазохист, однако)

void fun(int *p , int n, int m) - вот в этой функции отсутствует обработка последней строки. т.е. если там содержится 0 то выхода из цикла не получается.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.02.2012, 11:00   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
void fun(int *p , int n, int m) - вот в этой функции отсутствует обработка последней строки. т.е. если там содержится 0 то выхода из цикла не получается.
О какой обработке "последней строки" вы говорите и о каком "нуле". И откуда вы взяли, что выхода из цикла не получится?!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 09.02.2012, 11:26   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
О какой обработке "последней строки" вы говорите и о каком "нуле". И откуда вы взяли, что выхода из цикла не получится?!
Например, в последней строке находится 0, т.е. её необходимо удалять. И наступает резонный вопрос - какими значениями её заполнять. Если теми, которые расположены дальше в памяти (а что же там хранится?) то шансы на попадание нуля снова в последнюю строку довольно велики. и финальная проверка цикла
Код:
for (i=0; i<n*m; i++)
if (*(p+i)==0) sk++;
запустит проверку заново, которая при очередном проходе поместит те же самые значения в последнюю строку...
и ещё есть косяк здесь:
Код:
for (i=0; i<n*m; i+m-1)
для организации цикла по строкам нужно прибавлять m, а не m-1.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.02.2012, 11:34   #8
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Например, в последней строке находится 0, т.е. её необходимо удалять. И наступает резонный вопрос - какими значениями её заполнять. Если теми, которые расположены дальше в памяти (а что же там хранится?) то шансы на попадание нуля снова в последнюю строку довольно велики. и финальная проверка цикла
Код:
for (i=0; i<n*m; i++)
if (*(p+i)==0) sk++;
запустит проверку заново, которая при очередном проходе поместит те же самые значения в последнюю строку...
и ещё есть косяк здесь:
Код:
for (i=0; i<n*m; i+m-1)
для организации цикла по строкам нужно прибавлять m, а не m-1.
Совершенно не понял, какое отношение все, что вы написали, имеет к предлагаемой мной корректной функции?!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 09.02.2012, 11:43   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Сообщение от Сыроежка Посмотреть сообщение
Совершенно не понял, какое отношение все, что вы написали, имеет к предлагаемой мной корректной функции?!
К Вашим функциям никаких претензий нет.Просто объяснил, почему используются другие размеры матриц)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 09.02.2012, 12:09   #10
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от blain Посмотреть сообщение
Удалить из матриц G (10х11) и D (11х10) строки, содержащие нулевой элемент
Вам сначала надо четко определиться, что имеется в виду под удалением строки из матрицы? Фактически, из матрицы ничего удалять невозможно. Можно лишь переписать одну матрицу в другую матрицу меньшего размера, исключив из операции копирования те строки, которые вы собираетесь "удалить".
Либо в исходной матрице под удалением можно понимать перестановку элементов "удаляемой" строки с элементами последней строки матрицы и присвоении им каких-нибудь заранее оговоренных значений, которые будут означать удаленный элемент.
От этого, какое понятие удаления строки вы примете, зависит результирующий код.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Язык СИ! Динамическое выделение памяти под массивы и матрицы, передача матрицы в функции Андрей! Общие вопросы C/C++ 33 31.01.2012 22:07
С++.три матрицы, упорядочить строки той матрицы у которой больше нулевых строк Ирина1992 Помощь студентам 12 20.11.2011 13:01
Для матрицы 8x8 найти такие k, что k-я строка матрицы совпадает с k-м столбцом. (Задание на Си) Ислам Помощь студентам 8 20.05.2011 20:56
Ф-ия, определяющая сумму строк матрицы, если на главной диагонали матрицы имеется отрицательный эл-т. Volk_xD Помощь студентам 6 05.01.2011 13:39
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19