Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
michaelk
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
#1

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

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

Перелопатил весь инет, так не смог разобраться (((

Вот общее задание, ято бы было понятно:
Объявить массив целых чисел и заполнить его случайными значениями. Диапазон значений его элементов заданы в Вашем варианте индивидуального задания. В индивидуальных заданиях указано также, какую обработку массива следует произвести.
Дополнительные условия:
• размер массива определяется в начале выполнения программы как случайное число в диапазоне 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);
 
}
Буду благодарен за Вашу помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2009, 14:11     Указатели, массивы. Не могу разобраться
Посмотрите здесь:

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

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

Указатели,нужно разобраться в программе - C++
Всем добро времени суток. Учился работать с базами данных по этому видеоуроку: https://www.youtube.com/watch?v=F8aciqcO_Cg вот...

Указатели и ссылки. Помогите разобраться с синтаксисом - C++
Всем добрый вечер. Знаю, что тема поднималась не раз, много здесь уже таких нашел и перечитал, но ни как че та до меня не дойдет. В трех...

Как разобраться с тем, что такое указатели, стеки, деревья? - C++
Почему-то не могу осилить все эти стэки, указатели на массивы, бинарные деревья, но ведь без этого никак? Есть ли максимально подробные...

Указатели и массивы - C++
Привет всем. Объясните пожалуйста int* v; int**v; Чем они эквивалентны?

Массивы и указатели - C++
Создать функцию, подсчитывающую количество отрицательных элементов одномерного массива, порядковый номер которых меньше номера минимального...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
07.11.2009, 14:28     Указатели, массивы. Не могу разобраться #2
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
07.11.2009, 14:33     Указатели, массивы. Не могу разобраться #3
Цитата Сообщение от Sekt Посмотреть сообщение
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
правильно подмечено.
Сравниваешь число, например на принадлежность к отрицанию - если да - записываешь в массив с отрицательными числами, если нет - сравниваешь на принадлежность к положительным - если да - записываешь в массив с положительными числами, если нет - в массив с нулями, а потом по очереди выводищь эти 3 массива.
michaelk
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 15:27  [ТС]     Указатели, массивы. Не могу разобраться #4
Цитата Сообщение от Sekt Посмотреть сообщение
Разбиваешь массив на 3 маленьких.Через указатель.
Потом Сначало заганяешь в исходный 1 маленький с пол.числами,потом нули и т.д.
Не знаю как разбить массив на 3 маленьких Через указатель, можешь пример дать.

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

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

Принцип Iworb понял.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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 и о.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
07.11.2009, 17:33     Указатели, массивы. Не могу разобраться #6
michaelk,
Разместить все элементы с положительными значениями в левой части массива, элементы с отрицательными значениями - в правой, а нули - между ними.
Не надо ничего разбивать. Делаете два прохода с сортировкой. В первом проходе элементы с отрицательными значениями - в правую сторону массива, во втором проходе элементы с положительными значениями в левую часть массива. (вообще-то можно сделать даже за один проход). После этого у Вас получится что нули тоже находятся там где нужно.
SONNY
8 / 8 / 0
Регистрация: 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>() );
}
michaelk
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 Вообще ничего не понял.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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а работать неудобно, обычно через функции работу с указателями делаю.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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++;
        }
michaelk
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);
 
}
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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++;
        }
michaelk
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 19:27  [ТС]     Указатели, массивы. Не могу разобраться #13
Valeriikozlov
Все-равно проскакивают положительные числа(((

[IMG]http://i.***********/i4/80/bf/4e34a7c24fe8063ad4f3abd5b0ee.jpeg[/IMG]
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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++;
        }
michaelk
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 он, стоит всегда на одном месте- перед одним положительным числом, потом все отрицательные...
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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);
 
}
michaelk
0 / 0 / 0
Регистрация: 04.10.2009
Сообщений: 10
07.11.2009, 20:33  [ТС]     Указатели, массивы. Не могу разобраться #17
Valeriikozlov
Все работает, спасибо!!!
И Я еще немного понаглею... Ты бы не мог словами написать как работает твой кусок кода, а то я смотрю, что-то понимаю что-то нет.

Буду благодарен.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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++;
                }
аналогично как и для отрицательных чисел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2009, 21:08     Указатели, массивы. Не могу разобраться
Еще ссылки по теме:

Массивы и указатели. - C++
Объясните как работает код, что он будет выводить на экран и почему : #include &lt;stdio.h&gt; #define PRD(a) printf(&quot;%d&quot;, (a) ) //...

Указатели и массивы - C++
Помогите переделать через указатель int *x. #include&lt;iostream.h&gt; #include&lt;string.h&gt; #include&lt;conio.h&gt; main() { clrscr(); ...

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

Указатели и массивы - C++
Программа должна заменить все элементы массива с отрицательными значениями средним арифметическим значением всех положительных элементов....

Указатели и массивы - C++
Если у меня есть две функции, в одной из которых объявлен динамический массив и указатель на него.А во второй функции входным параметром...


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

Или воспользуйтесь поиском по форуму:
SONNY
8 / 8 / 0
Регистрация: 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 );
}
так не проще?
Yandex
Объявления
07.11.2009, 21:08     Указатели, массивы. Не могу разобраться
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru