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

Работа с указателями - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
струна
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 92
25.06.2012, 14:30     Работа с указателями #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
//------------------------------------------------------- 2
 
void F2(int *p, int *q, int n){
 
for (*q = *p; n > 0; n--, p++)
 
     if (*p > *q) *q = *p; }
 
//------------------------------------------------------ 10
 
void F10(char *p)
 
{ char *q; int cm;
 
     for (q=p,cm=0; *p !='\0'; p++) {
 
          if (p[0]=='*' && p[1]=='/') { cm--, p++; continue; }
 
          if (p[0]=='/' && p[1]=='*') { cm++, p++; continue; }
 
     if (cm==0) *q++ = *p;
 
     }
Заранее спасибо.
P.s. я не студентка )
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.06.2012, 14:30     Работа с указателями
Посмотрите здесь:

C++ Работа с указателями
Работа с указателями C++
C++ Работа с указателями
работа с указателями C++
работа с указателями C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
25.06.2012, 15:17     Работа с указателями #2
Указатель это указатель На массив-это на первый элемент. На переменную, это просто на переменную.
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,095
25.06.2012, 15:21     Работа с указателями #3
Цитата Сообщение от струна Посмотреть сообщение
Определите, используется ли указатель для доступа к отдельной переменной или к массиву.
Из вашего кода (F2) - похоже, что доступ к массиву.

Вообще, смысл вопроса непонятен: что нужно сделать? Напишите внятно.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2012, 15:23     Работа с указателями #4
Подозреваю, что корректной возможности нету. Для чего это вам?
струна
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 92
25.06.2012, 15:32  [ТС]     Работа с указателями #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Подозреваю, что корректной возможности нету. Для чего это вам?
да не поверите, мой работодатель развлекается, это у него типа семинары такие, проверяет профпригодность, хотя не понимаю взаимосвязи между аналитикой и программированием (
Сейчас выложу полный текст задания, если честно сама не совсем понимаю что от меня хотят :

Семинар № 5 (для инженеров - аналитиков КрасДО)
Определите, используется ли указатель для доступа к отдельной переменной или к массиву. Напишите вызов функции с соответствующими фактическими параметрами адресамипеременных или именами массивов.
Пример оформления тестового задания:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//------------------------------------------------------26-11.cpp
 
//-------------------------------------------------------
 
void F(int *p, int *q, int n){
 
for (*q = 0; n > 0; n--)
 
     * q = *q + *p++; }
 
void main(){
 
     int x,A[5]={1,3,7,1,2};
 
F(A,&x,5); printf("x=%d\n",x); }                          // Выведет 13

Формальный параметр p используется в контексте *p++ , что означает работу с последовательностью переменных, то есть с массивом. Число повторений цикла определяется параметром n , соответствующим размерности массива. Указатель q используется для косвенного обращения через него к отдельной переменной. Поэтому при вызове функции фактическими параметрами являются : имя массива указатель на начало, адрес переменной указатель на нее и константа размерность массива, передаваемая по значению.

C++
1
2
3
4
5
6
7
//------------------------------------------------------- 2
 
void F2(int *p, int *q, int n){
 
for (*q = *p; n > 0; n--, p++)
 
     if (*p > *q) *q = *p; }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//------------------------------------------------------ 10
 
void F10(char *p)
 
{ char *q; int cm;
 
     for (q=p,cm=0; *p !='\0'; p++) {
 
          if (p[0]=='*' && p[1]=='/') { cm--, p++; continue; }
 
          if (p[0]=='/' && p[1]=='*') { cm++, p++; continue; }
 
     if (cm==0) *q++ = *p;
 
     }
 
*q=0; }
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.06.2012, 15:49     Работа с указателями #6
струна, Нету нормального переносимого способа узнать это.
Если по смещению только смотреть - но это абсолютно не надежно.
Хотя нет. По смещению тоже не узнаешь.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
25.06.2012, 15:53     Работа с указателями #7
Цитата Сообщение от струна Посмотреть сообщение
Определите, используется ли указатель для доступа к отдельной переменной или к массиву
Определить нельзя. Можно только предположить при условии, что автор программы не является идиотом.

F2:
p - указатель на массив, q - указатель на переменную

Вызов:
C
int arr[10] = { 5, 6, 7, 8, 1, 2, 3, 4, 9, 10 };
int max;
F2 (arr, &max, sizeof (arr) / sizeof (arr[0]));
F10:
p - указатель на массив. q - тоже, но это локал, а потому для него такой вопрос смысла не имеет

Вызов:
C
char str[256] = "int x = 0; /* комментарий */ int y = 0;";
F10 (str);
printf ("%s\n", str);
При этом есть подозрение, что функция F10 немного не до конца написана

Что касается заданий - то постановка задачи просто шикарная. Составитель этих задач явно хочет найти хорошего сотрудника, а не бестолкового кодера. И я, показывая ответы на вопросы, чувствую себя соучастником преступления.

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
При этом есть подозрение, что функция F10 немного не до конца написана
В посте N5 конец нормально нарисован
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,095
25.06.2012, 15:53     Работа с указателями #8
Цитата Сообщение от Evg Посмотреть сообщение
постановка задачи просто шикарная
- Вы серьезно?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
25.06.2012, 15:55     Работа с указателями #9
Цитата Сообщение от Catstail Посмотреть сообщение
- Вы серьезно?
Да. Один из тех случаев, когда очень хочется содрать вопросы с чужого собеседования
Catstail
Модератор
 Аватар для Catstail
21436 / 10221 / 1666
Регистрация: 12.02.2012
Сообщений: 17,095
25.06.2012, 16:03     Работа с указателями #10
Если не затруднит, объясните, в чем методический смысл этого задания?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 319
Регистрация: 30.03.2009
Сообщений: 14,123
Записей в блоге: 26
25.06.2012, 16:10     Работа с указателями #11
Цитата Сообщение от Catstail Посмотреть сообщение
Если не затруднит, объясните, в чем методический смысл этого задания?
Чтобы отсеять идиотов.

Любая постановка задачи, на которую невозможно дать точный ответ, всегда хороша тем, что помимо тупого решения ты видишь, как человек размышляет и аргументирует свою точку зрения. Мне в институте препод по физике много раз долбил, что отрицательный результат - это тоже результат, который надо объяснить. Без объяснения отрицательный результат не принимается. Конкретно в данном случае задача сводится к тому, что надо понять, для чего написаны указанные фрагменты кода (т.е задача наоборот). При этом ты видишь нижний уровень решения, и должен к нему написать верхний уровень. Дополнительно формулировка вопроса расширяет задачу и требует понимания того, что указатель на объект и указатель на массив неразличимы.

Разумеется, всё это справедливо только в том случае, если работодатель целенаправленно делал такую постановку задачи. Ведь бывает и такое, что тупой человек иногда попадает в яблочко и выглядит умны. Но хочется верить, что данный случай к подобному не относится
струна
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 92
25.06.2012, 18:07  [ТС]     Работа с указателями #12
ребят, не сочтите за наглость, но выполняя остальное задание, опять появились указатели...

Содержательно сформулируйте действие, производимое функцией над массивом указателей. Напишите вызов функции для статических данных.
Пример выполнения тестового задания.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//------------------------------------------------------305-08.cpp
 
double * F(double *p[], int k) {
 
for ( int i=0; p[i]!=0; i++) ;  // Текущая размерность массива указателей
 
if (k>=i) return NULL;          // Больше текущей размерности - неудача
 
double *q=p[k];                            // Запомнить k- ый указатель
 
for (; k < i; k++)p[k] = p[k+1];  // Сдвинуть " хвост" на 1 к началу - удалить
 
return q;}                                        // k-ый и вернуть его
 
double a1=4,a2=7,a3=5,a4=1,*pp[]={&a1,&a2,&a3,&a4,NULL};
 
void main() { printf("\nУдален по n=2 ...%2.0lf\n",*F(pp,2));
 
for (int i=0; pp[i]!=NULL;i++) printf(" %2.0lf",*pp[i]);
 
}                                               // Выведет 5 ... 4,7,1.


Функция возвращает указатель на double. Поскольку она получает массив указателей, можно предположить, что он берется оттуда. Действительно, из массива копируется указатель, номер которого задан формальным параметром. То есть функция возвращает указатель по заданному логическому номеру. Первоначально подсчитывается текущая размерность структуры данных количество указателей в массиве. Если логический номер его превышает, возвращается NULL. И последнее. После запоминания k-го указателя все последующие указатели сдвигаются на 1 к началу, таким образом, выделенный указатель " затирается" . То есть функция исключает указатель по логическому номеру и возвращает его в качестве результата. Для задания статической структуры данных сначала определяются указуемые переменные типа double, а замет массив указателей инициализируется их адресами.


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
//------------------------------------------------------305-09.cpp
 
 
//------------------------------------------------------- 2
 
void F2(double *p[])
 
{ int i,k;
 
     do {
 
     k=0;
 
     for (i=1; p[i]!=NULL; i++)
 
          if (*p[i-1] > *p[i])
 
          { double *dd;
 
          dd=p[i]; p[i]=p[i-1]; p[i-1]=dd; k++;
 
          }
 
     } while (k);}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//----------------------------------------------------- 12
 
char *F12(char **p[], int n)
 
{ int k,i,j;
 
for (k=i=0; p[i]!=NULL; i++)
 
     for (j=0; p[i][j] !=NULL; j++, k++)
 
          if (k==n) return(p[i][j]);
 
return(NULL);}
LittleGirl
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 5
25.06.2012, 23:16     Работа с указателями #13
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
void F2(double *p[])
 
{ int i,k;
 
     do {
 
     k=0;
 
     for (i=1; p[i]!=NULL; i++)
 
          if (*p[i-1] > *p[i])
 
          { double *dd;
 
          dd=p[i]; p[i]=p[i-1]; p[i-1]=dd; k++;
 
          }
 
     } while (k);}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    double a1=1, a2=9, a3=7, a4=3;
    double *p[]={&a1, &a2, &a3, &a4,NULL};
    F2(p);
    for(int i=0;i<sizeof(p)/sizeof(p[0])-1;i++) printf("%f  ",*p[i] ); // выведет 1 3 7 9
    return 0;
}
Функция F2 выполняет сортировку по возрастанию значений, на которые указывают элементы массива указателей p. В цикле for последовательно между собой сравниваются числа, на которые указывает p[i-1] и p[i]. Если число, на которое указывает p[i-1] больше,чем число, на которое указывает p[i], то мы меняем числа местами (то есть по адресу p[i-1] будет лежать теперь меньшее число), и увеличиваем значение k. Цикл while будет выполняться до тех пор, пока k не останется равным нулю после очередного прохода по массиву. Это будет означать что числа, на которые указывают элементы массива p, отсортированы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.06.2012, 08:45     Работа с указателями
Еще ссылки по теме:

C++ Работа с указателями
Работа с указателями C++
Работа с указателями C++

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

Или воспользуйтесь поиском по форуму:
струна
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 92
26.06.2012, 08:45  [ТС]     Работа с указателями #14
Всем спасибо большое, очень помогли.
Yandex
Объявления
26.06.2012, 08:45     Работа с указателями
Ответ Создать тему
Опции темы

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