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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Mort
0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
#1

Задача с указателями - C++

10.01.2009, 23:15. Просмотров 1788. Ответов 21
Метки нет (Все метки)

Здравствуйте. У меня проблема: никак не могу понять эти указатели. Есть задача: пользователь вводит слово. затем, если число букв чётное - удаляем 2 центральных символа; если не чётное - то, соответственно, 1 центральный символ. Затем просто выводим результат. Если брать слово как буквенный массив, то проблемы никакой (просто двигаем индекс букв). НО нужно двигать именно указатель. Помогите пожалуйста, а то сам никак не могу =(
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2009, 23:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача с указателями (C++):

задача с Указателями - C++
помогите!!как этот код написать с указателями?? #include "stdafx.h" #include "conio.h" #include "locale.h" #include...

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

работа с указателями - C++
#include <iostream> using namespace std; int main() { char *res=""; res="1"; res="2"; ...

Непонятки с указателями - C++
#include <iostream> using namespace std; int is_order(const int* array) { for(const int* z = array; z < array +...

Ошибка с указателями - C++
Рад снова всех приветствовать. У меня появилась небольшая проблема. Изучаю C++ по книге Р. Лафоре "ООП в C++". Так вот, в принципе, книга...

Ошибка с указателями - C++
Похоже у меня проблема с указателями, но что то я жутко торможу и не соображу как правильно сделать. Как минимум в 44 строке ошибка. ...

21
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
10.01.2009, 23:34 #2
char a[n];
a[i] == *(a+i)
0
Mort
0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
11.01.2009, 00:19  [ТС] #3
а если чуть-чуть конкретней пожалуйста?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 00:39 #4
нужно двигать именно указатель
указатель двигается с помощью прибавления или отнимания от него числа (количества шагов), отсчёт шагов начинается с нуля, размер шага вычисляется сам (он зависит от типа данных с которыми объявлен указатель), т.е. если объявляешь указатель char *p шаг будет равен размеру типа char (1 байт), если же int *ip; шаг будует равен размеру типа int (2 или 4 в зависимости от реализации языка C в компиляторе), если же struct list *Nodeptr; шаг будует равен размеру типа struct list (сколько там наберётся элементов суммарный размер плюс дыры после выравнивания)
в памяти ячейки идут подряд одна за другой равны одному байту, поэтому и адресы их отличаются на еденицу, если у тебя тип int (и равен 4) то и два рядом стоящих int'а будут отличаться на 4 байта (шаг будет равен 1 а адресы отличаются на 4, шаг будет 2 а адресы отличаются на 8 )
0
Mort
0 / 0 / 0
Регистрация: 10.01.2009
Сообщений: 4
11.01.2009, 10:04  [ТС] #5
Это ясно. Дело в том, что я не могу понять сам алгоритм: как убрать два(или один) центральных символа двигая сам указатель, а не индекс отдельных букв.
0
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
11.01.2009, 10:20 #6
чего тут понимать двигаешь указатель к первому элементу, который нужно убрать и записываешь в него i+2 элемент
char *p = &c[0];
p = p + strlen(c)>>1 - 1 - strlen(c)&1;
p тогда будет указывать на первый удаляемый элемент. ну а дальше по четности
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 12:07 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
#include <stdio.h>
#include <string.h>
 
#define MAXLINE  1000   /* максимальная длина строки */
 
/* удаляет центральные символы (если длина чётная)
   или символ (если длина нечётная) строки */
main()
{
    char line[MAXLINE], *p;
    int n;
    
    sprintf(line, "one two");
    p = line + strlen(line)/2 - ((strlen(line) % 2) ? 0 : 1);
    for (n = (strlen(line) % 2) ? 1 : 2; (*p = *(p+n)) != '\0'; p++);
        ;
    printf("%s\n", line);
    return 0;
}
побитовые операции имеют очень низкий приоритет
0
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
11.01.2009, 13:08 #8
при чем тут приоритет?
они работают быстро
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 13:39 #9
притом что ты с ошибкой написал из-за этого
0
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
11.01.2009, 13:54 #10
Цитата Сообщение от Ensase Посмотреть сообщение
чего тут понимать двигаешь указатель к первому элементу, который нужно убрать и записываешь в него i+2 элемент
char *p = &c[0];
p = p + strlen(c)>>1 - (1 - strlen(c)&1);
p тогда будет указывать на первый удаляемый элемент. ну а дальше по четности
да пока на телефоне тыкал скобки потерял
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 14:00 #11
ещё одна осталась

я б даже сказал не переходя ко второй ошибке, ты неправильно исправил ошибку
0
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
11.01.2009, 15:45 #12
см. вложение
0
Вложения
Тип файла: txt mian.txt (174 байт, 44 просмотров)
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 16:24 #13
Код
    (1-strlen(c)&1);
ты не понимаешь как тут выполняются операции ?

сначала strlen возвращает значение, потом оно из еденицы вычитается, а потом побитовое умножение происходит, потому что сдвиги идут после + -, а & | вообще после сравнений == != идут

Код
    p = p + (strlen(c)>>1)-(1-strlen(c)&1);
надо

Код
    p = p + (strlen(c) >> 1) - 1 - (strlen(c) & 1);
0
Ensase
Флудер
191 / 29 / 5
Регистрация: 23.03.2007
Сообщений: 335
11.01.2009, 16:45 #14
в файле который прикреплен все нормально работает

зы: честно говоря мне уже надоело. те чего надо?
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
11.01.2009, 16:49 #15
Код
    p = p + (strlen(c) >> 1) - 1 + (strlen(c) & 1);
вообще правильно вот так будет
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2009, 16:49
Привет! Вот еще темы с ответами:

путаница с указателями - C++
Люди, помогите, пожалуйста! Имеется двумерный динамический массив, объявленный и проинициализированный следующим образом: int i, j, n =...

ошибка с указателями - C++
программа должна менять буквы местами в каждом слове введенной строки через указатели я все написал все работает, но есть большое НО,...

Работа с указателями - C++
Расскажите как работает каждая строка в коде char *A = &quot;123456789&quot;; unsigned B = 1; char *X = A + B; char *Y = A - (-...

Проблема с указателями! - C++
Создать программу для решения задачи построения слова из некоторого множества букв (игра Scrabble) используя алгоритмы поиска в глубину и в...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
11.01.2009, 16:49
Ответ Создать тему
Опции темы

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