Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
1

Указатели, массивы. Не могу разобраться

07.11.2009, 14:11. Показов 2091. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Перелопатил весь инет, так не смог разобраться (((

Вот общее задание, ято бы было понятно:
Объявить массив целых чисел и заполнить его случайными значениями. Диапазон значений его элементов заданы в Вашем варианте индивидуального задания. В индивидуальных заданиях указано также, какую обработку массива следует произвести.
Дополнительные условия:
• размер массива определяется в начале выполнения программы как случайное число в диапазоне 50 - 200;
• в тексте программы запрещается применять операцию индексации.

Мой вариант:
Разместить все элементы с положительными значениями в левой части массива, элементы с отрицательными значениями - в правой, а нули - между ними.
Диапазон значений: -100 - 100

Я понял, что все сводится к тому что надо отсортировать массив. Но как это сделать в моей ситуации Я не понимаю.

Вот что Я смог написать пока что.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar;       /* указатель на начало массива */
 int *Cr;            /* текущие указатели */
 
char temp; /*для сортировки */
int i,j; /* для сортировки */
  randomize();  /* инициализация rand */
  size=random(151)+50;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(201)-100;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
  
/* Обработка масива*/
 
// Вот тут Я не понимаю, что и как мне надо сортировать//
//БЕЗ этого куска кода "псевдо сортировки" все работает//
 
for (i=0; i<*Ar+size; i++)
for (j=0; j<*Ar+size; j++)
if (strcmp(Ar[i],Ar[j]) < 0)
{
temp = Ar[i];
Ar[i] = Ir[j];
Ir[j] = temp;
}
}
  free(Ar); 
  getch();
  return(0);
 
}
Буду благодарен за Вашу помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2009, 14:11
Ответы с готовыми решениями:

Не могу разобраться с кодом (Указатели)
Всем салют! Решил освоить С++. Обучение прохожу сам по книге Лафоре &quot;ООП в С++&quot;. Разобрал полкниги,...

массивы.не могу разобраться
1. В массиве X из N элементов (N не больше 30) определить максимальный элемент и его номер. Число N...

Массивы/списки, не могу разобраться как их создавать
Ребят, помогите, я не могу понять как мне сделать систему боёвки, у меня была идея, то что игроку...

Задали работу, не могу разобраться. Используется делфи 10, не могу разобраться, как это сделать
В одномерном массиве, состоящем из n вещественных элементов, вычислить: минимальный элемент массива...

18
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
07.11.2009, 14:28 2
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
07.11.2009, 14:33 3
Цитата Сообщение от Sekt Посмотреть сообщение
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
правильно подмечено.
Сравниваешь число, например на принадлежность к отрицанию - если да - записываешь в массив с отрицательными числами, если нет - сравниваешь на принадлежность к положительным - если да - записываешь в массив с положительными числами, если нет - в массив с нулями, а потом по очереди выводищь эти 3 массива.
1
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 15:27  [ТС] 4
Цитата Сообщение от Sekt Посмотреть сообщение
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
Не знаю как разбить массив на 3 маленьких Через указатель, можешь пример дать.

З.Ы. Как сделаю, всем кто помог, спасибо будет!

Добавлено через 42 минуты
И Я вообще не могу понять как в динамическом массиве это делается...

Принцип Iworb понял.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
07.11.2009, 17:32 5
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(i=0,n=0,d=0,o=0; i<m; i++)
{
if(*(*Ar + i)<0)
   {
   *(*Otr+n)=*(*Ar + i)
   n++
   }
if(*(*Ar + i)>0)
  {
   *(*Pol+d)=*(*Ar + i)
   d++
   }
if(!*(*Ar + i))
   {
   *(*Nol+o)=*(*Ar + i)
   o++
   }
}
Не уверен сработает ли, но попробуй. Pol, Otr и Nol - это массивы с соответствующими элементами. Тока не забудь их объявить и выделить для них память, ну и освободить потом. После цикла просто выведи по очереди эти массивы.

Добавлено через 40 секунд
P.S. в данном случае m - это size

Добавлено через 2 минуты
З.Ы. писал не в лучшем состояние, так что если не работает - тапками не кидаться.

Добавлено через 1 минуту
попробую укоротить код

Добавлено через 1 минуту
C
1
2
3
4
5
6
for(i=0,n=0,d=0,o=0; i<m; i++)
{
if(*(*Ar + i)<0) *(*Otr+n++)=*(*Ar + i)
if(*(*Ar + i)>0) *(*Pol+d++)=*(*Ar + i)
if(!*(*Ar + i)) *(*Nol+o++)=*(*Ar + i)
}
вот)) всего останется 3 массивом соотв. размеров n, d и о.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 17:33 6
michaelk,
Разместить все элементы с положительными значениями в левой части массива, элементы с отрицательными значениями - в правой, а нули - между ними.
Не надо ничего разбивать. Делаете два прохода с сортировкой. В первом проходе элементы с отрицательными значениями - в правую сторону массива, во втором проходе элементы с положительными значениями в левую часть массива. (вообще-то можно сделать даже за один проход). После этого у Вас получится что нули тоже находятся там где нужно.
0
8 / 8 / 5
Регистрация: 30.05.2009
Сообщений: 47
07.11.2009, 17:43 7
C++
1
2
3
4
5
6
7
8
#include <algorithm>
#include <functional>
 
int _tmain( int argc, _TCHAR* argv[] )
{
    int coll_arr[] = { 12, 89, 0, -5, 1, 0, 9, 0 };
    std::nth_element( coll_arr, std::find( coll_arr, coll_arr + 8, 0 ), coll_arr + 8, std::less<int>() );
}
0
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 18:10  [ТС] 8
Iworb

Я конечно не понял как твой код работает... но вставил его. И последний вопрос как правильно вывести массив, а как я написал, оно выводит какието странные числа и больше чем нужно...

Вот весь код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar,*Otr,*Nol,*Pol;       /* указатель на начало массива */
 int *Cr,*Ir;            /* текущие указатели */
 
int *i;
int *d;
int *n;
int *o;
  randomize();  /* инициализация rand */
  size=random(2)+5;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  Pol=(int far *)malloc(size*sizeof(int));
  Nol=(int far *)malloc(size*sizeof(int));
  Otr=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(151)-50;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
for(i=0,n=0,d=0,o=0; i<Ar+size; i++)
{
if(*(*Ar + i)<0) *(*Otr+n++)=*(*Ar + i);
if(*(*Ar + i)>0) *(*Pol+d++)=*(*Ar + i);
if(!*(*Ar + i)) *(*Nol+o++)=*(*Ar + i) ;
}
/*  и  ниже бред, так как не понимаю как работает код Iworbа*/
for (n=Cr; n<Ar+size; n++)
printf("%3d ",*Pol);
for (d=Ar; d<Ar+size; d++)
printf("%3d ",*Nol);
for (o=Ar; o<Ar+size; o++)
printf("%3d ",*Otr);
 
  free(Ar);
  free(Pol);
  free(Nol);        
  free(Otr);
  
getch();
  return(0);
 
}
Valeriikozlov, Я изначально так думал, но не знаю, как делать сортировку с динамическом массивом. Можешь показать как мне надо было сделать?

SONNY Вообще ничего не понял.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
07.11.2009, 18:31 9
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar,*Otr,*Nol,*Pol;       /* указатель на начало массива */
 int *Cr,*Ir;            /* текущие указатели */
 
int i,d,n,o;
  randomize();  /* инициализация rand */
  size=random(2)+5;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  Pol=(int far *)malloc(size*sizeof(int));
  Nol=(int far *)malloc(size*sizeof(int));
  Otr=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(151)-50;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
for(i=0,n=0,d=0,o=0; i<size; i++)
{
if(*(*Ar + i)<0) *(*Otr+n++)=*(*Ar + i);
if(*(*Ar + i)>0) *(*Pol+d++)=*(*Ar + i);
if(!*(*Ar + i)) *(*Nol+o++)=*(*Ar + i) ;
}
//посмотрим как это сработает
for (i=0; i<n; n++)
printf("%3d ",*(*Pol+i));
for (i=0; i<d; d++)
printf("%3d ",*(*Nol+i));
for (i=0; i<o; o++)
printf("%3d ",*(*Otr+i));
 
  free(Ar);
  free(Pol);
  free(Nol);            
  free(Otr);
  
getch();
  return(0);
 
}
а вот так???

Добавлено через 5 минут
З.Ы. просто исправил код, чтобы ты понял мою идею. На работоспособность не проверял ибо у меня стоит Turbo C, а там нет смысла о чем то подобном говорить - он консольный...

Добавлено через 5 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar,*Otr,*Nol,*Pol;       /* указатель на начало массива */
 int *Cr,*Ir;            /* текущие указатели */
 
int i,d,n,o;
  randomize();  /* инициализация rand */
  size=random(2)+5;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  Pol=(int far *)malloc(size*sizeof(int));
  Nol=(int far *)malloc(size*sizeof(int));
  Otr=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(151)-50;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
for(i=0,n=0,d=0,o=0; i<size; i++)
{
if(*(Ar + i)<0) (*(Otr+n++))=(*(Ar + i));
if(*(Ar + i)>0) (*(Pol+d++))=(*(Ar + i));
if(!*(Ar + i)) (*(Nol+o++))=(*(Ar + i)) ;
}
//посмотрим как это сработает
for (i=0; i<n; n++)
printf("%3d ",*(Pol+i));
for (i=0; i<d; d++)
printf("%3d ",*(Nol+i));
for (i=0; i<o; o++)
printf("%3d ",*(Otr+i));
 
  free(Ar);
  free(Pol);
  free(Nol);
  free(Otr);
 
getch();
  return(0);
 
}
а попробуй-ка так

Добавлено через 1 минуту
хотя не уверен что это то. с указателями лично мне внутри mainа работать неудобно, обычно через функции работу с указателями делаю.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 18:43 10
Я изначально так думал, но не знаю, как делать сортировку с динамическом массивом. Можешь показать как мне надо было сделать?
Вот кусок кода самой сортировки. После написания увидел, что индексацию применять нельзя. Сможешь сам переделать или помощь нужна?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int min0=-1, max0=-1;
for (i=size-1; i>=0 && min0==-1; i--)
    if(Ar[i]>=0)
        min0=i;
for (i=0; i<size && max0==-1; i++)
    if(Ar[i]<=0)
        max0=i;
 
for (i=0; i<min0; i++)
        if(Ar[i]<0)
        {
            temp = Ar[min0];
            Ar[min0]=Ar[i];
            Ar[i]=temp;
            min0--;
        }
for (i=size-1; i>max0; i--)
        if(Ar[i]>0)
        {
            temp = Ar[max0];
            Ar[max0]=Ar[i];
            Ar[i]=temp;
            max0++;
        }
0
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 19:05  [ТС] 11
Iworb
Первый Твой вариант вообще повисло, второй подход выдает 2000 непонятных чисел((((
Я работаю в Borland C++ for DOS

Valeriikozlov
Нужна помощь.

Сделал с Твоим кодом, частично работает, но не всегда правильно, почему проскакивают положительные числа между открицательными.

Вот полный "рабочий" код, то есть компилятор никаких ошибок не дает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar;       /* указатель на начало массива */
 int *Cr;            /* текущие указатели */
 
char temp; /*для сортировки */
int i,j; /* для сортировки */
  randomize();  /* инициализация rand */
  size=random(10)+50;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(201)-100;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
int min0=-1, max0=-1;
for (i=size-1; i>=0 && min0==-1; i--)
    if(Ar[i]>=0)
        min0=i;
for (i=0; i<size && max0==-1; i++)
    if(Ar[i]<=0)
        max0=i;
 
for (i=0; i<min0; i++)
        if(Ar[i]<0)
        {
            temp = Ar[min0];
            Ar[min0]=Ar[i];
            Ar[i]=temp;
            min0--;
        }
for (i=size-1; i>max0; i--)
        if(Ar[i]>0)
        {
            temp = Ar[max0];
            Ar[max0]=Ar[i];
            Ar[i]=temp;
            max0++;
        }
 
 
    for (Cr=Ar; Cr<Ar+size; Cr++) 
 
    printf("%3d ",*Cr);
 
free(Ar);
getch();
  return(0);
 
}
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 19:20 12
без индексации тот жу кусок кода:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Cr=Ar;  
int min0=-1, max0=-1;
for (i=size-1; i>=0 && min0==-1; i--)
    if(*(Cr+i)>=0)
        min0=i;
for (i=0; i<size && max0==-1; i++)
    if(*(Cr+i)<=0)
        max0=i;
for (i=0; i<min0; i++)
        if(*(Cr+i)<0)
        {
            temp = *(Cr+min0);
            *(Cr+min0)=*(Cr+i);
            *(Cr+i)=temp;
            min0--;
        }
for (i=size-1; i>max0; i--)
        if(*(Cr+i)>0)
        {
            temp = *(Cr+max0);
            *(Cr+max0)=*(Cr+i);
            *(Cr+i)=temp;
            max0++;
        }
0
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 19:27  [ТС] 13
Valeriikozlov
Все-равно проскакивают положительные числа(((

[IMG]http://i.***********/i4/80/bf/4e34a7c24fe8063ad4f3abd5b0ee.jpeg[/IMG]
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 19:42 14
да действительно была ошибочка, вот так попробуй:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Cr=Ar;  
int min0=-1, max0=-1;
for (i=size-1; i>=0 && min0==-1; i--)
    if(*(Cr+i)>=0)
        min0=i;
for (i=0; i<size && max0==-1; i++)
    if(*(Cr+i)<=0)
        max0=i;
for (i=0; i<min0; i++)
        if(*(Cr+i)<0)
        {
            temp = *(Cr+min0);
            *(Cr+min0)=*(Cr+i);
            *(Cr+i)=temp;
            min0--;
            while(*(Cr+min0)<0)
                min0--;
        }
for (i=size-1; i>max0; i--)
        if(*(Cr+i)>0)
        {
            temp = *(Cr+max0);
            *(Cr+max0)=*(Cr+i);
            *(Cr+i)=temp;
            max0++;
            while(*(Cr+max0)>0)
                max0++;
        }
1
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 20:01  [ТС] 15
Подправил немного -работает в режиме положительные и отрицательные числа. когда есть ноль, то он не между пол. и отр. Пример : 4 45 65 2 45 0 34 -5 -45 -9 -45 -8.

Самый последний код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar;       /* указатель на начало массива */
 int *Cr;            /* текущие указатели */
int min0=-1, max0=-1;
char temp; /*для сортировки */
int i,j; /* для сортировки */
  randomize();  /* инициализация rand */
  size=random(10)+50;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(201)-100;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
Cr=Ar;
 
for (i=size-1; i>=0 && min0==-1; i--)
    if(*(Cr+i)>=0)
        min0=i;
for (i=0; i<size && max0==-1; i++)
    if(*(Cr+i)<=0)
        max0=i;
for (i=0; i<min0; i++)
        if(*(Cr+i)<0)
        {
            temp = *(Cr+min0);
            *(Cr+min0)=*(Cr+i);
            *(Cr+i)=temp;
            min0--;
            while(*(Cr+min0)<0)
                min0--;
        }
for (i=size-1; i>max0; i--)
        if(*(Cr+i)>0)
        {
            temp = *(Cr+max0);
            *(Cr+max0)=*(Cr+i);
            *(Cr+i)=temp;
            max0++;
            while(*(Cr+max0)>0)
                max0++;
        }
  printf("konez massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++)
 
    printf("%3d ",*Cr);
 
free(Ar);
getch();
  return(0);
 
}
Причем очень странно, когда есть 0 он, стоит всегда на одном месте- перед одним положительным числом, потом все отрицательные...
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 20:25 16
Заключительный вариант:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
int main(void) {
 int size;                   /* размер массива */
 int *Ar;       /* указатель на начало массива */
 int *Cr;            /* текущие указатели */
int min0=-1, max0=-1;
char temp; /*для сортировки */
int i,j; /* для сортировки */
  randomize();  /* инициализация rand */
  size=random(10)+50;
  printf("size=%d\n",size);
  /* выделения памяти */
  Ar=(int far *)malloc(size*sizeof(int));
  /* заполнение массива случайными числами и
     вывод начального массива */
  printf("Nachalnuy massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++) {
    *Cr=random(201)-100;
    printf("%3d ",*Cr);
    }
  putchar('\n');
 
Cr=Ar;
 
for (i=size-1; i>=0 && min0==-1; i--)
        if(*(Cr+i)>=0)
                min0=i;
for (i=0; i<min0; i++)
                if(*(Cr+i)<0)
                {
                        temp = *(Cr+min0);
                        *(Cr+min0)=*(Cr+i);
                        *(Cr+i)=temp;
                        min0--;
                        while(*(Cr+min0)<0)
                                min0--;
                }
for (i=0; i<size && max0==-1; i++)
        if(*(Cr+i)<=0)
                max0=i;
for (i=size-1; i>max0; i--)
                if(*(Cr+i)>0)
                {
                        temp = *(Cr+max0);
                        *(Cr+max0)=*(Cr+i);
                        *(Cr+i)=temp;
                        max0++;
                        while(*(Cr+max0)>0)
                                max0++;
                }
  printf("konez massiv:\n");
  for (Cr=Ar; Cr<Ar+size; Cr++)
 
    printf("%3d ",*Cr);
 
free(Ar);
getch();
  return(0);
 
}
1
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 20:33  [ТС] 17
Valeriikozlov
Все работает, спасибо!!!
И Я еще немного понаглею... Ты бы не мог словами написать как работает твой кусок кода, а то я смотрю, что-то понимаю что-то нет.

Буду благодарен.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
07.11.2009, 20:47 18
C
1
Cr=Ar;
присваиваем указателю Cr адрес начала массива (точнее 1-го элемента)

C
1
2
3
for (i=size-1; i>=0 && min0==-1; i--)
        if(*(Cr+i)>=0)
                min0=i;
в этой части кода, начиная с права, ищем первое неотрицательное число (отрицательные если есть справой стороны, то они уже стоят на своем месте) и записываем номер индекса в переменную min0

C
1
2
3
4
5
6
7
8
9
10
for (i=0; i<min0; i++)
                if(*(Cr+i)<0)
                {
                        temp = *(Cr+min0);
                        *(Cr+min0)=*(Cr+i);
                        *(Cr+i)=temp;
                        min0--;
                        while(*(Cr+min0)<0)
                                min0--;
                }
здесь перебираем, начиная с лева, все числа попорядку, если нашли отрицательное, то меняем его местами с элементом, индекс которого записан в min0, после каждого обмена min0 уменьшаем на единицу (и сразу же проверяем не является ли этот элемент отрицательным, если да то еще уменьшаем min0 до тех пор пока не элемент с индексом min0 не будет 0 или положительным)

f
C
1
2
3
or (i=0; i<size && max0==-1; i++)
        if(*(Cr+i)<=0)
                max0=i;
начиная с лева, ищем первое не положительное число (положительные если есть с левой стороны, то они уже стоят на своем месте) и записываем номер индекса в переменную max0


C
1
2
3
4
5
6
7
8
9
10
for (i=size-1; i>max0; i--)
                if(*(Cr+i)>0)
                {
                        temp = *(Cr+max0);
                        *(Cr+max0)=*(Cr+i);
                        *(Cr+i)=temp;
                        max0++;
                        while(*(Cr+max0)>0)
                                max0++;
                }
аналогично как и для отрицательных чисел
1
8 / 8 / 5
Регистрация: 30.05.2009
Сообщений: 47
07.11.2009, 21:08 19
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int* partition( int* first, int* last, int (*pred)( int ) )
    {
        for( ; ; ++first )
        {
            for( ; first != last && pred( *first ); ++first )
                ;
            if( first == last )
                break;
            for( ; first != --last && !pred( *last ); )
                ;
            if( first == last )
                break;
 
            int tmp = *first;
            *first = *last;
            *last = tmp;
        }
 
        return first;
    }
 
int less( int v_ ) { return v_ < 0 ? 1 : 0; }
int equal_to( int v_ ) { return v_ == 0 ? 1 : 0; }
 
int _tmain( int argc, _TCHAR* argv[] )
{
    int coll[] = { 12, 96, 0, 8, 0, -7, -5, 0, 12, -1 };
    partition( partition( coll, coll + 10, &less ), coll + 10, &equal_to );
}
так не проще?
0
07.11.2009, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2009, 21:08
Помогаю со студенческими работами здесь

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц)
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник...

Указатели на массивы. Указатели и функции
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно...

Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru