С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 99

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

25.06.2012, 14:30. Показов 4608. Ответов 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
//------------------------------------------------------- 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. я не студентка )
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.06.2012, 14:30
Ответы с готовыми решениями:

Работа с указателями
Здравствуйте Не понимаю, почему в следующем коде #include <iostream> using namespace std; int * max (int *p, int...

Работа с указателями
1. Написать функцию, принимающую в качестве параметра указатель на первый символ строки и возвращающую адрес первого символа этой же...

работа с указателями
Как ПРАВИЛЬНО передать в функцию, массив, используя адресацию? Программа находит в массиве слово и перед ним вставляет какое то слово, то...

13
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
25.06.2012, 15:17
Указатель это указатель На массив-это на первый элемент. На переменную, это просто на переменную.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.06.2012, 15:21
Цитата Сообщение от струна Посмотреть сообщение
Определите, используется ли указатель для доступа к отдельной переменной или к массиву.
Из вашего кода (F2) - похоже, что доступ к массиву.

Вообще, смысл вопроса непонятен: что нужно сделать? Напишите внятно.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.06.2012, 15:23
Подозреваю, что корректной возможности нету. Для чего это вам?
0
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 99
25.06.2012, 15:32  [ТС]
Цитата Сообщение от 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; }
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.06.2012, 15:49
струна, Нету нормального переносимого способа узнать это.
Если по смещению только смотреть - но это абсолютно не надежно.
Хотя нет. По смещению тоже не узнаешь.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.06.2012, 15:53
Цитата Сообщение от струна Посмотреть сообщение
Определите, используется ли указатель для доступа к отдельной переменной или к массиву
Определить нельзя. Можно только предположить при условии, что автор программы не является идиотом.

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 конец нормально нарисован
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.06.2012, 15:53
Цитата Сообщение от Evg Посмотреть сообщение
постановка задачи просто шикарная
- Вы серьезно?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.06.2012, 15:55
Цитата Сообщение от Catstail Посмотреть сообщение
- Вы серьезно?
Да. Один из тех случаев, когда очень хочется содрать вопросы с чужого собеседования
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
25.06.2012, 16:03
Если не затруднит, объясните, в чем методический смысл этого задания?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.06.2012, 16:10
Цитата Сообщение от Catstail Посмотреть сообщение
Если не затруднит, объясните, в чем методический смысл этого задания?
Чтобы отсеять идиотов.

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

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

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

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);}
0
0 / 0 / 0
Регистрация: 15.06.2012
Сообщений: 5
25.06.2012, 23: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
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, отсортированы.
0
4 / 4 / 1
Регистрация: 10.03.2011
Сообщений: 99
26.06.2012, 08:45  [ТС]
Всем спасибо большое, очень помогли.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.06.2012, 08:45
Помогаю со студенческими работами здесь

Работа с указателями
#include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;iomanip&gt; using namespace std; int main() { int i;float f;long int l;double d;...

Работа с указателями
Доброго времени суток, нужна помощь. Данный две задачи, обе работают правильно: Дан целочисленный массив размера N. Преобразовать...

Работа с указателями
Здравствуйте! Есть массив созданный ГСС. Надо написать функция которая вычисляет сколько в нем четных чисел, выделяет память под них и...

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

Работа с указателями
Доброго времени суток! Прошу помощи в решении очень интересной задачи. Перепробовал все свои знания., не получается( Чаще всего...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru