Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> индексирование массива и прямые указатели 
V
    Опции темы
Artefact
Дата 18.2.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



Доброй ночи, уважаемые форумчане. Я пару месяцев назад начал изучать программирование, поэтому могу кое-что писать некорректно. Изучаю по учебнику Брайана Оверленда "С++ без страха". На одной из тем у меня появилась проблема, а именно прямые указатели и индексирование массива. Я пытался разобраться с ней, в теории вроде понятно, а на практике ничего не получается. Например, код задачи таков:
Код

#include <iostream>
#include <string.h>
#include <ctype.h>
using namespace std;

void convert_to_upper(char *s);

int main ()
{
    char s[100];
    cout<<"Введите фразу, которая будет преобразована и нажмите Enter: "<<endl;
    cin.getline(s, 99);
    
    convert_to_upper(s);
    cout<<"Строка после преобразования: ";
    cout<<s<<endl;
    return 0;
}
void convert_to_upper(char *s)
{
    int i;
    int length = strlen(s);
    for(i=0; i<length; i++)
    s[i]=toupper(s[i]);
}



Этот код надо переписать с использованием прямых указателей. Объясните пожалуйста как это делается? Буду рад любой помощи.
PM MAIL   Вверх
source777
Дата 19.2.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Код

void convert_to_upper(char *s)
{
    int length = strlen(s);
    for(int i=0; i<length; i++, s++) *s-=32;
}
так что ль ты хочешь?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
opjox
Дата 19.2.2008, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



source777, нельзя так делать. Если в строке будет буква(ы) в верхнем регистре, то работать будет не корректно. 

Лучше будет так:
Код

void convert_to_upper(char *s)
{
  for(;*s;s++) *s = toupper(*s);
}

PM MAIL ICQ   Вверх
Artefact
Дата 19.2.2008, 01:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



opjox, спасибо, более менее понятно, но не могли бы объяснить почему именно такое условие:
Код

for(;*s;s++)

конкретнее, почему *s. 
P.S. Простите если спрашиваю элементарщину, но я очень хочу разобраться и научиться программировать на срр.
С Уважением, Artefact.
PM MAIL   Вверх
opjox
Дата 19.2.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



Как вы, должно быть, знаете, признаком окончания строки является нуль-символ. В Си любое не нулевое значение является истинным, а нулевое – ложью. 
Сложим эти две вещи и получим, что если конец строки еще не достигнут, то, проверив на истинность тот символ, с которым мы собираемся работать, мы получим истину, а когда мы наткнемся на нуль-символ, то ложь. 
Этим:
Код

*s

мы обращаемся к символу, по адресу, который записан в s. 

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

P.S. также можно работать и через индексацию:
Код

void convert_to_upper(char *s)
{
  for(int i=0; s[i]; i++) s[i]=toupper(s[i]);
}



Это сообщение отредактировал(а) opjox - 19.2.2008, 02:31
PM MAIL ICQ   Вверх
Artefact
Дата 19.2.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 18.2.2008

Репутация: нет
Всего: нет



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

P.S.Хотел поставить вам +1, но к сожалению недостаточно постов...
PM MAIL   Вверх
opjox
Дата 20.2.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 17.1.2008

Репутация: 2
Всего: 14



Цитата(Artefact @ 19.2.2008,  19:33)
Я почти разобрался, но еще конечно буду искать информация по указателям.

На мой взгляд, с ними просто нужно набить руку. Просто помните, что указатель – это простая переменная, в которую записан адрес, по которому можно писать или читать (с помощью операции «*»). А также в сами эти переменные (указатели) можно записать другой адрес или модифицировать старый. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.