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

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

25.06.2012, 14:30. Показов 4599. Ответов 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
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 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
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 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
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru