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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.94
igor001
8 / 3 / 1
Регистрация: 12.02.2013
Сообщений: 68
#1

ф-ция реверса строки - C++

14.05.2013, 10:51. Просмотров 4436. Ответов 110
Метки нет (Все метки)

был вчера на собеседовании, попросили написать ф-цию реверса строки (поменять местами 1й и последний символы, 2й и предпоследний и т.д.), но ф-ция должна принимать параметром указатель на char т.е. на начало строки и все. я там немного тупанул но написал, вот хочу узнать есть ли решение получше моего.
вот код (писал в Embarcadero RAD Studio (Borland)):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//ф-ция принимает указатель на массив char с символом окончания строки '\0'
//и производит реверс полученного массива
void TForm1::reverce(char *str)
{
    char* end_str = &str[0];
 
    while (*end_str != '\0') ++end_str;
    
    char  buf;
    while (end_str > str)
    {
        --end_str;
        buf      = *str;
        *str     = *end_str;
        *end_str = buf;
        ++str;  
    }
}
кто захочет проверить, выносим кнопку, лабел и эдит на форму и в ивент на клик кнопки пишем:
C++
1
2
3
4
5
AnsiString str = Edit1->Text.c_str();
 
    reverce(str.c_str());
 
    Label1->Caption = str;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2013, 10:51     ф-ция реверса строки
Посмотрите здесь:

Функция реверса строки - C++
На собеседовании в одну компанию меня попросили на бумажке написать функцию реверса строки. Буквально парой дней раньше я услышал о том...

Написание программы реверса строки - C++
Не могу понять в чем ошибка выдаёт (2 3 3 3 3 3 3 3 3 3) Прошу помощи в нахождении ошибки. #include "stdafx.h" #include <stdio.h> ...

Программа реверса строки: почему на экран выводится мусор, вместо нужного текста? - C++
Пишу программу реверса строки (меняет местами первый символ и последний, второй и предпоследний и т.д.). На экран выводится мусор, вместо...

Какая ф-ция в VC++ определяет длину строки??? - C++
Здравствуйте ... не могу разобраться со строками в VC++ помогите пожалуйста

Реализация реверса массива - C++
Первый и последний элемент массива трогать не надо. Как его толком перевернуть? По-разному пробовал уже, не хотят циферки по серединке...

ф-ция - C++
Написать программу, проверяющую делимость целого числа на числа от 2 до 10. Проверка делимости на конкретное число должна быть реализована...

ф-ция с throw - C++
Встретил такую мне незнакомую запись: тип имя_функции( параметры ) throw(что-то) { тело_ф-ции } Что дает такая запись с...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
16.05.2013, 20:03     ф-ция реверса строки #101
Поучаствую)
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
30
31
32
33
#include <iostream>
#include <cassert>
 
 
char *reverse(char * const str) {
   assert(str != 0);
 
   char * last = str;
   for ( ; *last != '\0'; ++last);
 
   for (char * first = str; first < --last; ++first) {
      char const tmp = *first;
      *first = *last;
      *last = tmp;
   }
        
   return str;
}
 
 
int main() {
   char empty[] = "";
   char one[]   = "a";
   char two[]   = "ab";
   char three[] = "abc";
   char many[]  = "abcdefghijklmnopqrstuvwxyz";
   
   std::cout << reverse(empty) << std::endl;
   std::cout << reverse(one)   << std::endl;
   std::cout << reverse(two)   << std::endl;
   std::cout << reverse(three) << std::endl;
   std::cout << reverse(many)  << std::endl;
}
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
17.05.2013, 09:30     ф-ция реверса строки #102
Цитата Сообщение от gray_fox Посмотреть сообщение
Поучаствую)
обращаю и ваше внимание на то что если str указывает на начало сегмента и строка пустая вы войдете в цикл перестановки по причине префиксного декримента при проверке условия и изговняете целиком весь сегмент
gray_fox
What a waste!
1443 / 1172 / 61
Регистрация: 21.04.2012
Сообщений: 2,449
Завершенные тесты: 3
17.05.2013, 09:51     ф-ция реверса строки #103
Ок. Попробуем так.
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
30
31
32
33
34
35
#include <iostream>
#include <cassert>
 
 
char *reverse(char * const str) {
   assert(str != 0);
 
   if (*str != '\0') {
      char * last = str;
      while (*++last != '\0');
 
      for (char * first = str; first < --last; ++first) {
         char const tmp = *first;
         *first = *last;
         *last = tmp;
      }
   }
        
   return str;
}
 
 
int main() {
   char empty[] = "";
   char one[]   = "a";
   char two[]   = "ab";
   char three[] = "abc";
   char many[]  = "abcdefghijklmnopqrstuvwxyz";
   
   std::cout << reverse(empty) << std::endl;
   std::cout << reverse(one)   << std::endl;
   std::cout << reverse(two)   << std::endl;
   std::cout << reverse(three) << std::endl;
   std::cout << reverse(many)  << std::endl;
}
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
17.05.2013, 10:18     ф-ция реверса строки #104
Цитата Сообщение от gray_fox Посмотреть сообщение
так
вместо сравнений с нулем можно было бы просто использовать само выражение в качестве условия
C++
1
2
3
4
5
   assert(str);
 
   if (*str) {
      char * last = str;
      while (*++last); ...
gray_fox
17.05.2013, 10:27
  #105

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
вместо сравнений с нулем можно было бы просто использовать само выражение в качестве условия
Мне явное указание больше по нраву.

vxg
17.05.2013, 10:32
  #106

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Мне явное указание больше по нраву.
так никто не делает. это признак того что человек не знает языка

gray_fox
17.05.2013, 10:34
  #107

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
так никто не делает.
Я так делаю)
Цитата Сообщение от vxg Посмотреть сообщение
это признак того что человек не знает языка
Странный признак) Но ваше дело, да и я не профи.

Убежденный
Системный программист
Эксперт С++
15295 / 6927 / 1096
Регистрация: 02.05.2013
Сообщений: 11,334
Завершенные тесты: 1
17.05.2013, 10:48     ф-ция реверса строки #108
Цитата Сообщение от vxg Посмотреть сообщение
так никто не делает. это признак того что человек не знает языка
Полная запись условий - это своего рода страховка.
Если однажды в условии встретится класс с перегруженным "operator bool", - а такое
частенько делается, чтобы можно было возвращать объекты из функций с сохранением
семантики проверки ошибок, - условие выполнялось бы также, как и раньше.
Так что между "никто не делает" и "незнание языка" корреляции нет.
vxg
Модератор
3140 / 1942 / 214
Регистрация: 13.01.2012
Сообщений: 7,429
17.05.2013, 11:05     ф-ция реверса строки #109
Цитата Сообщение от Убежденный Посмотреть сообщение
Если однажды в условии встретится класс с перегруженным "operator bool"
вы здесь такое видите? char * является описанным вами типом? нет? тогда к чему этот сферический конь в вакууме?
Цитата Сообщение от Убежденный Посмотреть сообщение
Так что между "никто не делает" и "незнание языка" корреляции нет
согласен. однако все буквари которые я читал приводили проверки вида
C++
1
2
int x;
if (x == 0) ...
в качестве примера графомании и детского сада
Tulosba
17.05.2013, 11:26
  #110

Не по теме:

Цитата Сообщение от vxg Посмотреть сообщение
if (x == 0) ...
А тут еще можно поговорить и про йода-кондишн:
C++
1
if (0 == x) ...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2013, 14:12     ф-ция реверса строки
Еще ссылки по теме:

Операторная ф-ция - C++
Добрый вечер, вот есть код: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;vector&gt; #include...

Глобальная ф-ция getline - C++
Всем добрый вечер :) Вообщем есть кусок кода: // read for name vector while (std::getline(std::cin, name)) { ...

Рандомная ф-ция rand() - C++
Всем привет,объясните пожалуйста как работает рандомная ф-ция,например: rand()%10 == 5 rand()%15+2 rand()%5 == 1 rand()%5 ...

Параметризованная ф-ция класса - C++
Пытаюсь заменить списки (используя структуры) на списки используя параметризованную функцию класса Компилятор ругается на строчку где я...

ф-ция getche() не выполняется - C++
В MVS 2015 не выполняется ф-ция getche() (в коде строка 52) по этому цикл выполняется всего один раз. Как это исправить? Проверял код в...


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

Или воспользуйтесь поиском по форуму:
The_Immortal
1551 / 487 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
17.05.2013, 14:12     ф-ция реверса строки #111
Друзья, прекращаем оффтопить.
Yandex
Объявления
17.05.2013, 14:12     ф-ция реверса строки
Ответ Создать тему
Опции темы

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