Консультация № 180251
10.10.2010, 01:22
0.00 руб.
0 1 1
Здравствуйте эксперты! Помогите с прогой по Си под Юникс. Цель проги: Дана последовательность из n целых элементов. Сформировать две новых последовательности, состоящих соответственно из положительных и отрицательных элементов исходной последовательности. Элементы в результирущих последовательностях должны быть отсортированы по убыванию. Все последовательности исходную и полученные вывести на экран. Ниже приведен код но при выполнении он делает что-то не то.

Заранее Большое Спасибо!!!!!!!

Приложение:
#include <stdio.h>
#include <math.h>
int a[10],b[10],c[10];
int i,j,k,m,n,s;
// сортировка
void sort(int a[],int n){
int i,tmp,fl;
for(i=1;i<n;i++){
fl=0;
for(j=0;j<n-i;j++)
//if (a[j]>a[j+1]) //-возрастание
if (a[j]<a[j+1]) //-убывание
{ tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
fl=1;
}}}
int main(){
for (;;) {
printf("Вв кол-во эл-тов массива < 10\n");
scanf("%d",&s);
if ((s>10)||(s<=0)) break;
printf("Введите массив");
for(i=0;i<s;i++)
scanf("%d",&a[i]);
j=0; n=0; m=0; k=0;
// разбиение массива на два массива <0 и >0
for (i=0;i<s;i++)
{if (a[i]<0){
b[j]=a[i]; //** b[j]=i;
j++; m++; }
if (a[i]>=0) {
c[k]=a[i]; //** c[k]=i;
k++; n++; }}
// разбиение массива на два: четный и нечетный
for (i=0; i<s;i++)
{if (a[i]%2){
b[j]=a[i]; //** b[j]=i;
j++; m++; }
if (!(a[i]%2)) {
c[k]=a[i]; //** c[k]=i;
k++; n++; }}
sort (a,s); sort (b,m); sort (c,n);
for(i=0;i<s;i++) printf("%d ",a[i]);
printf("\n");
for(j=0;j<m;j++) printf("%d ",b[j]);
printf("\n");
for(k=0;k<n;k++) printf("%d ",c[k]);
printf("\n");
}
return 0;
}

Обсуждение

давно
Академик
320937
2216
10.10.2010, 12:09
общий
это ответ
Здравствуйте, Magma! Внес некоторые изменения в Ваш код. Code::Blocks/GCC/XP. Поскольку в вопросе речь идет о сортировке результирующих последовательностей, исходная не сортируется.
Код:
/*Вопрос № 180251*/
/* Дана последовательность из n целых элементов.
Сформировать две новых последовательности, состоящих соответственно
из положительных и отрицательных элементов исходной последовательности.
Элементы в результирущих последовательностях должны быть отсортированы
по убыванию. Все последовательности исходную и полученные вывести на экран. */

#include <stdio.h>

/* сортировка "пузырьком" */
void sort(int a[],int n)
{
int i, j, tmp;
int flag=1; /* был ли обмен на последнем проходе? */
for(i=1; i<n && flag!=0; i++)
{
flag=0;
for(j=0;j<n-i;j++)
if (a[j]<a[j+1]) /* -убывание */
{
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag=1; /* обмен был */
}
}
}

int main()
{
enum {SIZE=10}; /* размер каждого массива */
int a[SIZE],b[SIZE],c[SIZE];
int i,j;

int s=SIZE; /* количество используемых элементов в заданном массиве */
int m,n;
/* количество используемых элементов в подмассивах с отрицательными
и положительными значениями соответственно */

for (;;)
{
printf("Введите количество элементов массива <= %d\n", SIZE);
scanf("%d",&s);
if ((s>SIZE)||(s<=0))
{
printf("Количество элементов вне диапазона");
break;
}
printf("Введите массив\n");

for(i=0; i<s; i++)
scanf("%d",&a[i]);

/* разбиение массива на два массива <0 и >0 */
m=0; n=0;

for (i=0;i<s;i++)
{
if (a[i]<0)
{
b[m++]=a[i];
}
else if (a[i]>0)
{
c[n++]=a[i];
}
}

sort (b,m);
sort (c,n);

/* печать всех массивов */
for(i=0;i<s;i++)
printf("%d ",a[i]);
printf("\n");

for(i=0;i<m;i++)
printf("%d ",b[i]);
printf("\n");

for(i=0;i<n;i++)
printf("%d ",c[i]);
printf("\n");
}
return 0;
}

Пример работы
Код:
Введите количество элементов массива <= 10
5
Введите массив
1 2 3 -1 -1
-1 -1
3 2 1
Введите количество элементов массива <= 10
15
Количество элементов вне диапазона


Форма ответа