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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 22:10   #1
flexin
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 15
По умолчанию Несколько операций с одномерным массивом (Си)

Доброго времени суток.
Очень прошу помочь отыскать ошибку в коде программы.

Исходное условие следующее:
В одномерном массиве, который состоит из n элементов:
1. Рассчитать количесвто элементов больших с (т.е. пользователем задается некое произвольное число)
2. Найти произведение элементов массива, расположенных после минимального элемента.
3. Отсортировать элементы массива по возрастанию модулей.

В написанной мной программе:
Пункт 1 условия выполняется (void kol).
Пункт 2 (void proiz) выполняется как-то криво: Если начинать вводить элементы с минимального числа, произведение НЕ считается правильно
Пункт 3 (void sort) не выполняется. Элементы массива переставляются местами, но никак не сортируются по модулям.

Если возможно, подскажите пожалуйста, что не так в пунктах 2 и 3

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int a[1000],i,n;

void kol()
{
int c,b=0;
printf("Vvedite chislo c\n");
scanf("%d",&c);
  for(i=0;i<n;i++)
   if(a[i]>c) b++;
printf("Kolichestvo %d\n",b);
}

void proiz()
{
int min,f=1,k;
min=a[0];
 for(i=1;i<n;i++)
  if(a[i]<min)
  {
   min=a[i];
   k=i;
  }
 for(i=k+1;i<n;i++)
  f=f*a[i];
printf("Proizvedenie %d\n",f);
}

void sort()          
{
 int j,p;
 for(j=0; j<n-1; j++)
  {
   if(abs(a[j+1])>=abs(a[j]))
    j++;
    else  {
       p=a[j];
       a[j]=a[j+1];
       a[j+1]=p;
      }
    }
  }

void print()
{
 int z;
 for(z=0;z<n;z++)
  {
   printf("%d ",a[z]);
  }
   printf("\n");
}

void main(){
clrscr();
printf("Vvedite koli4estvo chisel\n");
scanf("%d",&n);
printf("Vvedite chisla\n");
for(i=0;i<n;i++)
  scanf("%d",&a[i]);
print();
kol();
proiz();
sort();
print();
getch();
}

Последний раз редактировалось flexin; 15.01.2010 в 22:32.
flexin вне форума Ответить с цитированием
Старый 15.01.2010, 23:24   #2
Valentine
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 14
По умолчанию

Пункт 2 Если min=a[0], то и k=0.
Пункт 3 Сортировку нужно делать в двух циклах
Код:
for (i=0;i<n-1;i++)
  for (j=0;j<n-1;j++)
    {
     if (abs(a[j]>abs(a[j+1])
        {
         p=a[j];
         a[j]=a[j+1];
         a[j+1]=p;
         }
     }
Valentine вне форума Ответить с цитированием
Старый 15.01.2010, 23:26   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от flexin Посмотреть сообщение
Пункт 2 (void proiz) выполняется как-то криво: Если начинать вводить элементы с минимального числа, произведение НЕ считается правильно
Это потому что индекс минимального элемента ( k ) оказывается в этом случае неопределённым. Написать k = 0 в декларации.

Цитата:
Сообщение от flexin Посмотреть сообщение
Пункт 3 (void sort) не выполняется. Элементы массива переставляются местами, но никак не сортируются по модулям.
Во-первых, там ошибка. Переменную цикла со счётчиком нельзя менять нигде больше в цикле, кроме заголовка цикла. А во-вторых, в пузырьковой сортировке (а тут, вроде бы, её собираемся применять) за один проход цикла максимум, что удаётся сделать, это поставить на своё место один (самый большой или самый маленький) элемент. Чтобы весь массив отсортировать, нужно этот цикл n-1 раз выполнить.
Код:
void sort() {
 
   int j, k, p;

   for ( k = n-1; k > 0; k-- ) {
      for ( j = 0; j < k; j++ ) {
         if ( abs(a[j+1]) >= abs(a[j]) ) {
            ; 
         } else  {
            p = a[j];
            a[j] = a[j+1];
            a[j+1] = p;
         }
      }
   }

}
Vago вне форума Ответить с цитированием
Старый 15.01.2010, 23:35   #4
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int a[1000],i,n;

void kol()
{
int c,b=0;
printf("Vvedite chislo c: ");
scanf("%d",&c);
  for(i=0;i<n;i++)
   if(a[i]>c) b++;
printf("Kolichestvo %d\n",b);
}

void proiz()
{
int min,f=1,k = 0;
min=a[0];
 for(i=1;i<n;i++)
  if(a[i]<min)
  {
   min=a[i];
   k=i;
  }
 for(i=k+1;i<n;i++)
  f*=a[i];
printf("Proizvedenie %d\n",f);
}

void sort()          
{
 int tmp;
 for (int i = 0; i < n; i++)
	 for(int j = 0; j < n; j++)
		 if(abs(a[j]) > abs(a[i]))
		 {
			 tmp = a[j];
			 a[j] = a[i];
			 a[i] = tmp;
		 }
}

void print()
{
 int z;
 for(z=0;z<n;z++)
  {
   printf("%d ",a[z]);
  }
   printf("\n");
}

void main()
{
	//clrscr();
	printf("Vvedite koli4estvo chisel: ");
	scanf("%d",&n);
	printf("Vvedite chisla: ");
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	print();
	kol();
	proiz();
	sort();
	print();
	getch();
}
Кстати, вот Вам пища для размышлений (оптимизированный вариант предыдущего метода сортировки)
Код:
void sort()          
{
 int tmp;
 for(int j = 0; j < n; j++)
	 if(abs(a[j]) > abs(a[0]))
	 {
		 tmp = a[j];
		 a[j] = a[0];
		 a[0] = tmp;
	 }

 tmp = a[0];
 for (int i = 0; i < (n - 1); i++)
	 a[i] = a[i+1];
 a[n - 1] = tmp;
}

Последний раз редактировалось psycho-coder; 15.01.2010 в 23:40.
psycho-coder вне форума Ответить с цитированием
Старый 15.01.2010, 23:54   #5
flexin
Пользователь
 
Регистрация: 13.12.2009
Сообщений: 15
Хорошо

psycho-coder
Vago
Valentine

спасибо огромное!!!
flexin вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с одномерным массивом и сортирокой Nitriyc Помощь студентам 0 22.11.2009 14:24
работа с одномерным массивом _Solomon_ Помощь студентам 1 07.06.2007 12:06