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

Первый отрицательный и минимальный эл массива - C++

Восстановить пароль Регистрация
 
Danil13
 Аватар для Danil13
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 8
30.11.2010, 05:23     Первый отрицательный и минимальный эл массива #1
Задание нужно найти первый отрицательный и минимальный элементы массива и обменять их местами. Задание то решил, но помогите решить ее с использованием указателей.
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
# include <stdio.h>
# include <conio.h>
 
void main()
{
    const int N1=100;
    int a[N1],i,p,imin,n,k;
    p=0;
    printf("\n Input n:");
    scanf("%d", &n);
    printf ("\n Input massiv:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    imin=1;
    for(i=1;i<=n;i++)
        if (a[i]<a[imin])
            imin=i;
        
    for(i=1;i<=n;i++)
        if(a[i]<0) 
        {p=i;
        break;}
 
    if (p==0)
        printf("\n otricat net");
    else
    {k=a[imin];
    a[imin]=a[p];
    a[p]=k;}
 
       printf("\n massiv:");
    for(i=1;i<=n;i++)
       printf("\t %d",a[i]);
 
    getch();
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2010, 05:23     Первый отрицательный и минимальный эл массива
Посмотрите здесь:

C++ Как удалить из одномерного массива первый отрицательный элемент
C++ Переставить местами первый минимальный и первый максимальный элементы массива из n вещественных чисел
В двухмерном массиве найти минимальный, отрицательный элемент массива C++
Поменять местами минимальный элемент и первый отрицательный элемент массива целых чисел C++
Исключить из массива А(n) первый отрицательный элемент C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
30.11.2010, 06:09     Первый отрицательный и минимальный эл массива #2
Работа с массиваму означает работу с указателями, т.к. имя массива - целочисленный указатель на начало массива. К примеру a[1] эквивалентно *(a+1). Можно конечно "модернизировать" ваш код, но это большого смысла не имеет:
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
# include <stdio.h>
# include <conio.h>
 
void main()
{
    const int N1=100;
    int a[N1],i,*p,*imin,n,k;
    p=NULL;
    imin=a;
    printf("\n Input n:");
    scanf("%d", &n);
    printf ("\n Input massiv:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    imin=1;
    for(i=1;i<=n;i++)
        if (a[i]<*imin)
            imin=a+i;
        
    for(i=1;i<=n;i++)
        if(a[i]<0) 
        {p=a+i;
        break;}
 
    if (p==NULL)
        printf("\n otricat net");
    else
    {k=*imin;
    *imin=*p;
    *p=k;}
 
       printf("\n massiv:");
    for(i=1;i<=n;i++)
       printf("\t %d",a[i]);
 
    getch();
    }
Я не стал исправлять, но уже пора смириться: в языках семейства Си счет начинают с нуля!
for(i=1;i<=n;i++) - отстой
for(i=0;i<n;i++) - круть

Добавлено через 2 минуты
И еще я бы посоветовал вам посмотреть правила табуляции в "Сях".
Danil13
 Аватар для Danil13
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 8
30.11.2010, 20:47  [ТС]     Первый отрицательный и минимальный эл массива #3
Спасибо большое за объяснение!

P.S. Не скажите где можно найти доходчиво объясняющие источники по указателям, а то у меня книги есть, но там все заумно написано и я не могу уловить главный смысл указателей

Заранее спасибо!

Добавлено через 17 минут
Массивы не давно прошли и там особых проблем не было, а тут даже не знаю туплю.

Добавлено через 3 минуты
А и здесь imin=1 не должно быть * ?
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
01.12.2010, 11:45     Первый отрицательный и минимальный эл массива #4
А и здесь imin=1 не должно быть * ?
Пардон, не доглядел
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
void main()
{   # include <stdio.h>
    # include <conio.h>
    const int N1=100;
    int a[N1],i,*p,*imin,n,k;
    p=NULL;
    printf("\n Input n:");
    scanf("%d", &n);
    printf ("\n Input massiv:\n");
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    imin=a+1;
    for(i=1;i<=n;i++)
        if (a[i]<*imin)
            imin=a+i;
        
    for(i=1;i<=n;i++)
        if(a[i]<0) 
        {p=a+i;
        break;}
 
    if (p==NULL)
        printf("\n otricat net");
    else
    {k=*imin;
    *imin=*p;
    *p=k;}
 
       printf("\n massiv:");
    for(i=1;i<=n;i++)
       printf("\t %d",a[i]);
 
    getch();
}
Добавлено через 31 минуту
P.S. Не скажите где можно найти доходчиво объясняющие источники по указателям, а то у меня книги есть, но там все заумно написано и я не могу уловить главный смысл указателей
Что бы хорошо понять указатели ,как это ни плачевно , разумнее всего читать книги.

Главный смысл -
Каждый байт памяти пронумерован.
Каждому процессу выделяется его личная память, доступ к которой имеет только он, и никто другой, эту память он и использует для размещения переменных. Указатель - переменная(!), способная хранить адрес другой переменной, или ,грубо говоря, хранящая номер байта, содержащего начало другой переменной. Причем если этот байт находится вне памяти принадлежащей процессу, то попытка что-то сделать с ним приведет к ошибке сегментации (доступа).
Указатель задается вот так:
int *p;
на данном этапе значение p не определено, и операции *p и p[i] недопустимы!
Чтобы получить адрес переменной нужно использовать оператор & ;
int *p, a=4;
если мы сделаем так:
p=&a;
То мы сможем обращаться к a через операции *p и *p[0];
printf("%d",*p);
выдаст на экран 4.
так же если мы твердо уверены, что переменные b, c и d (|a|b|c|d|) стоят в памяти по порядку за переменной a, то обращение
p[1] или *(p+1) будет соответствовать переменной b
p[2] переменной с
*(p+3) переменной d
Нужно внимательно следить за указателями, так как их неправильное использование влечет за собой самые коварные и самые сложные для поиска ошибки.

Возможность работы с указателями является одним из главных преимуществ языков семейства Си.
Danil13
 Аватар для Danil13
0 / 0 / 0
Регистрация: 20.09.2010
Сообщений: 8
01.12.2010, 16:13  [ТС]     Первый отрицательный и минимальный эл массива #5
Еще раз спасибо за объяснение!

Вроде в голове, что то проясняется
snakext
 Аватар для snakext
6 / 6 / 1
Регистрация: 08.06.2010
Сообщений: 35
01.12.2010, 16:32     Первый отрицательный и минимальный эл массива #6
Если уж с указателями, то по-моему стоило создавать динамические массивы.
C++
1
2
cin>>n;
int* a=new int[n]
Yandex
Объявления
01.12.2010, 16:32     Первый отрицательный и минимальный эл массива
Ответ Создать тему
Опции темы

Текущее время: 23:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru