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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2009, 22:53   #1
Nina+
Пользователь
 
Регистрация: 19.11.2008
Сообщений: 39
По умолчанию Массивы С++

Нужно поменять местами min и max элементы в строках массива.
Не могу понять почему элементы меняются только в первой строке... Помогите пожалуйста найти ошибку.

Код:
#include<stdio.h>
#include<stdlib.h>
#define N 100
int vivodmas(const int*px,int n,int m);
int* maxmin(int*px,int x[N][N],int n,int m);
main(){
  int n,m,*px,x[N][N],i,k;
  printf("Vvedite rasmern. massiva ");
  scanf("%d %d",&n,&m);
  i=0;
  px=(int*)x;
  while(i<n*m){
    scanf("%d",&(*px++));
    i++;
    }
  px=(int*)x;
  vivodmas(px,n,m);
  maxmin(px,x,n,m);
  vivodmas(px,n,m);
  system("PAUSE");
  }
int vivodmas(const int*px,int n,int m){
  int i=0;
  while(i<n*m){
   printf("%4d",*px++);
   if ((i+1)%m==0) printf ("\n");
   i++;
   }
   printf("\n");
  return 0;
  }
int* maxmin(int*px,int x[N][N], int n, int m){
     int i,j,k,maxj,minj,max,min;
     for (i=0;i<n;i++){
      maxj=0;minj=0;max=x[i][0];min=max;
      for (j=1;j<m;j++){
       if (x[i][j]>max) {maxj=j;max=x[i][j];}
       else if (x[i][j]<min) {minj=j;min=x[i][j];}  
       }
       k=x[i][maxj];
       x[i][maxj]=x[i][minj];
       x[i][minj]=k;   
       }
       px=(int*)x;
       return px;
}
Nina+ вне форума Ответить с цитированием
Старый 19.03.2009, 06:11   #2
Nomlpppp
Пользователь
 
Регистрация: 26.02.2009
Сообщений: 51
По умолчанию

С указателями не так все просто. У тебя двумерный массив 100X100. Ты нацеливаешь одномерный указатель на нулевой элемент этого массива. В этом и ошибка. Тогда работай с ним как с одномерным или делай заполняй двумернеый массив полностью.

Ты запоняешь массив:
Код:
  px=(int*)x;
  while(i<n*m){
    scanf("%d",&(*px++));
    i++;
    }
Но заполнение происходит по типу одномерного указателя, получается в один ряд
Затем передаешь функции
Код:
int* maxmin(int*px,int x[N][N], int n, int m){
     int i,j,k,maxj,minj,max,min;
     for (i=0;i<n;i++){
      maxj=0;minj=0;max=x[i][0];min=max;
      for (j=1;j<m;j++){
       if (x[i][j]>max) {maxj=j;max=x[i][j];}
       else if (x[i][j]<min) {minj=j;min=x[i][j];}  
       }
       k=x[i][maxj];
       x[i][maxj]=x[i][minj];
       x[i][minj]=k;   
       }
       px=(int*)x;
       return px;
}
и пытаешься совершить обход именно двумерного массива x[N][N]
поэтому идя по нулевому ряду функция делает все как надо, но при переходе на следующий ряд фунция обнаруживает там нули,так как не был заполнен, а заполнение продолжалось на предыдушем(нулевом ряду) далее чем n( точнее n*m нулевого ряда ).


Например двухмерный массив 2x10 заполненый не полность но именно ка двухмерный:
Код:
 for( k=0, i=0; i<2; i++, k++ )
  {
  for( k=k-1, j=0; j<3; j++, k++ )
   {
   x[ i ][ j ] = k+1;
   printf( "%d ",  x[ i ][ j ] );
   }
  printf( "\n" );
  }
выглядит в памяти так:
Цитата:
12300000004560000000
а не так:
Цитата:
12345600000000000000
Поэтому нацелив указатель на нулевой элемент и заполнив его как одномерный у тебя получается второй вариант

Нулевой элемент любого массива явл. указателем на его первый(нулевой) элемент, но так же где-то содержится информация о его размерности и в памяти массивы храняться соответственно.


Для того чтоб твой пример заработал правильно надо:
1) Заполнять так:
Код:
  i=0;
  j=0;
  px=(int*)x;
  while(i<n*m)
   {
   if( j==m )
    {
    px += (N-j); 
    j = 0;
    }
   scanf("%d",&(*px++));
   i++;
   j++;
   }
2) функцию vivodmas изменить во-так
Код:
int vivodmas(const int*px,int n,int m){
  int i=0;
  while(i<n*m){
   printf("%4d",*px++);
   if ((i+1)%m==0)
    {
    px += (N-m); // добавлено
    printf ("\n");
    }
   i++;
   }
   printf("\n");
  return 0;
  }
Т.е перепрыгивать остаток N-m

Последний раз редактировалось Nomlpppp; 19.03.2009 в 09:20.
Nomlpppp вне форума Ответить с цитированием
Старый 19.03.2009, 11:44   #3
Nina+
Пользователь
 
Регистрация: 19.11.2008
Сообщений: 39
По умолчанию

Спасибо большое!!!
Nina+ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
массивы -ushёl- Помощь студентам 6 01.03.2009 17:49
Массивы в С\С++ Zahar11 Помощь студентам 4 31.05.2008 00:35