Перейти к содержимому

Фото
- - - - -

Массив на Си


  • Закрытая тема Тема закрыта
4 ответов в этой теме

#1 Akhenaton

Akhenaton
  • Постоялец
  • 8 038 сообщений

Отправлено 16 Октябрь 2009 - 14:35

Объясняю задачу. Задаётся длина (N) для массива A. Соотвественно этой длине массив заполняется различными цифрами, т.е, например A[0] = > 1, A[1] => 3 и так далее. И, наконец, задаётся значение K, обозначающее сколько наибольших цифр из массива А нужно вывести. Моя проблема заключается в том, что помимо цифр ( ну это просто сортировка ), нужно вывести их индексы. Вопрос, как это сделать ? Это не является проблемой, если указанные в массиве цифры не повторяются.

Например, задаю массив A[5] = {1,3,3,2,7}. Задаю вывести весь массив ( тоесть все 5 элементов ). На выходе получаю:

число - индекс
7 - 4
3 - 2 ( неверно!, должна быть 1 )
3 - 2
2 - 3
1 - 0

Помогите пожалуйста. Не пойму, как это сделать. Заранее благодарю :(

P.S Мой код:


#include <stdio.h>

int main() {
  int N, K, i, s, index;
  int X, Y;
  double A[20], B, C[20];
  
  do {
	  printf("Input array length N[1...20]: ");
	  scanf("%d", &N);
  } while( N < 1 || N > 20 );
  
  printf("\n");

  for(i = 0; i < N; i++) {
	  printf("Input A[%d] element: ", i);
	  scanf("%lf", &A[i]);
	  C[i] = A[i];
  }
  
  printf("\n");
  
  do {
	  printf("Input K[1...20]: ");
	  scanf("%d", &K);   
  } while ( K < 1 || K > 20 );

  if( K > N ) K = N;
  
  printf("\n");
  
  for(X=0; X < N; X++) {
	for(Y=0; Y < N-1; Y++) {
	  if(A[Y] < A[Y+1]) {
		B = A[Y+1];
		A[Y+1] = A[Y];
		A[Y] = B;
	  }
	}
  }
  
  printf("Array A[%d] %d MAX elements:\n\n", N, K);
  
  for(i=0; i < K; i++ ) {
	   printf("%lf - ", A[i]);
	   for(s=0; s < N; s++) {
		 if(C[s] == A[i]) {
			index = s;
		 }
	   }
	   printf(" %d\n", index);
  }	 
  
  printf("\n");
  
  system("pause");
  return 0;
}


  • 0

#2 Cryptoboy

Cryptoboy
  • Пользователь
  • 280 сообщений

Отправлено 16 Октябрь 2009 - 17:45

засунь исходные элементы в структуру, где храни оригинальный индекс :

struct blah {
int old_index, value;
};

тогда после сортировки (когда индексы поменяются) ты все равно знаешь прежний индекс каждого элемента

Сообщение изменено: Cryptoboy (16 Октябрь 2009 - 17:46 )

  • 0

#3 Akhenaton

Akhenaton
  • Постоялец
  • 8 038 сообщений

Отправлено 16 Октябрь 2009 - 20:09

А без всяких struct-ов можно ? Я в Си новичёк вообще, пока не понимаю всего этого. Может есть более простой солюшен : )
  • 0

#4 Vitalts

Vitalts
  • Постоялец
  • 1 842 сообщений

Отправлено 16 Октябрь 2009 - 22:29

1. Задейстовать второй массив, хранящий индексы
2. Отказаться от сортировки
  • 0

#5 Akhenaton

Akhenaton
  • Постоялец
  • 8 038 сообщений

Отправлено 16 Октябрь 2009 - 23:31

Vitalts, Спасибо за идею! Кажется получилось.

int D[20];  // Создаём банк индексов

....

for(i = 0; i < N; i++) {
	  printf("Input A[%d] element: ", i);
	  scanf("%lf", &A[i]);
	  C[i] = A[i];
	  D[i] = 0;  // Пока все индексы "свободны"
  }

......

for(i=0; i < K; i++ ) {
	   printf("%lf - ", A[i]);
	   m = 0; // Ещё ничего не вывели
	   for(s=0; s < N; s++) {
		  if(!m) {
			  if((C[s] == A[i]) && D[s]!=1) {
				 m++;  // сообращем, что вывели 1 индекс к 1 цифре
				 D[s] = 1; // помечаем, что данный индекс мы забрали
				 printf("%d\n", s);
			  }
		  }
	   }

  }   


Сообщение изменено: Akhenaton (16 Октябрь 2009 - 23:32 )

  • 0