2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Перевернуть строку
Сообщение24.09.2013, 22:28 


20/10/12
235
Здравствуйте, уважаемые посетители форума! Это снова я (стаж изучения С - три недели и три дня), и я снова застрял на элементарной программе. На этот раз задача перевернуть небольшую введенную строку, т.е. вывести ее наоборот. Например на введенное: "Hello, world!" компьютер должен немедленно отвечать "!dlrow ,olleH". Попытки были, компилятор ругается на меня, как будто я сделал что-то плохое.
Теперь о попытках:
Код:
#include <stdio.h>
#include <math.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h> //здесь ничего интересного
int main (void)
{
   int i=0,len=0,temp=0;
   int j;   
   char str[255];
   setlocale(LC_ALL, "rus");
   printf("Обработчик строк 2.0 \n");
   printf("Введите фразу \n");
   gets(str);
       while (str[i]!=0)
      {
         len=len+1;    //в этом цикле узнаем длину строки
         i++;
      }
      
      for (i=0, j=len-1; i<=j; i++, j--)
   {
      temp=str[i];
      str[i]=str[j];                    //здесь суть - меняем местами элементы на одинаковом расстоянии от концов
      str[j]=temp;
   }
       printf("len=%i \n",len);
       printf("Перевернули строку: \n");
        for(i=0;i<len;i++)
      {
         printf("%s",str[i]);
      }
   return 0;

}

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение24.09.2013, 22:50 


05/09/12
2587
Жаль, что прошлый опыт общения ничего вам не дал. Нет желания объяснять впустую.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 00:06 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Хотя Ваш код и не верен, мой компилятор его принимает.

А исправить надо так:
заменить
Используется синтаксис C
printf("%s",str[i]);
на
Используется синтаксис C
printf("%с",str[i]);


P.S. Подумайте над упрощением кода.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 12:58 
Заслуженный участник


27/04/09
28128
Почему tempint? Этой переменной присваивается выражение типа char и её значение присваивается только выражению типа char. Зачем делать её более широкого типа?

whitefox в сообщении #767564 писал(а):
А исправить надо так:
заменить
Используется синтаксис C
printf("%s",str[i]);
на
Используется синтаксис C
printf("%с",str[i]);
Или убрать цикл и индексирование.

Конечно, ошибки этим не исчерпываются.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 14:48 
Заслуженный участник
Аватара пользователя


19/12/10
1546
arseniiv
Оставьте хоть что-нибудь для ТС.
Ему, наверно, тоже хочется поучаствовать в исправлении своего кода :-)

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 19:18 
Заслуженный участник


27/04/09
28128
Всё-всё, больше не буду. :lol: Он что-то подозрительно молчит.

…но всё-таки непонятно, зачем включать math.h — неужели из-за того что версия обработчика строк — 2.0? :roll:

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 19:44 
Заслуженный участник
Аватара пользователя


19/12/10
1546
arseniiv в сообщении #767764 писал(а):
…но всё-таки непонятно, зачем включать math.h — неужели из-за того что версия обработчика строк — 2.0? :roll:

По его коду, строка
Используется синтаксис C
#include <string.h> //здесь ничего интересного
тоже лишняя :-)

P.S. да и строка
Используется синтаксис C
#include <stdlib.h>
в этом коде ни к чему.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 20:53 


20/10/12
235
Спасибо всем кто откликнулся, все правки содержательные - хотя для работы программы хватило уже первого сообщения whitefox. Что-то наводит меня на мысль, что нужно лучше разобраться с синтаксисом и типами. _Ivana, вас я тоже услышал и ваши советы из предыдущей темы для меня очень актуальны. :roll:

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:01 
Заслуженный участник


27/04/09
28128
Ура, ТС пришёл!

shukshin в сообщении #767798 писал(а):
Что-то наводит меня на мысль, что нужно лучше разобраться с синтаксисом и типами.
И смыслом. Зачем менять средний символ строки сам с собой?

-- Чт сен 26, 2013 00:03:45 --

И ещё это не паскаль, определения можно ставить именно там, где они используются, а не в самом начале. Если писать комментарии как получилось выше, такие определения-в-месте-использования хотя бы ускоряют парсинг кода другим человеком. Людям труднее угодить, чем компилятору. :wink:

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:27 
Заслуженный участник


11/05/08
32166

(Оффтоп)

arseniiv в сообщении #767802 писал(а):
Зачем менять средний символ строки сам с собой?

В этом как раз смысл есть: лучше на всякий случай переборщить, чем недоборщить; накладные же расходы ничтожны.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:30 
Заслуженный участник


27/04/09
28128

(Оффтоп)

Тогда можно остановиться на первом исправлении whitefox. :wink: Всё работает, чего ещё желать?

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение25.09.2013, 22:29 
Заслуженный участник


09/09/10
3729

(Оффтоп)

ewert
Ну-ну. Про проблемы у неустойчивых методов сортировки слышали? К тому же тут чуть-чуть зазеваешься — и буквы по бокам от центральной обменяются местами два раза.

 Профиль  
                  
 
 Re: Перевернуть строку
Сообщение26.09.2013, 08:00 
Заслуженный участник
Аватара пользователя


19/12/10
1546
arseniiv в сообщении #767802 писал(а):
И смыслом. Зачем менять средний символ строки сам с собой?

И, вообще, зачем переставлять символы?
Ведь можно выводить массив с заду наперёд.
Например так:
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
//#include <math.h>
#include <locale.h>
//#include <stdlib.h>
//#include <string.h> //здесь ничего интересного

int main (void)
{
   int i=0,len=0;//,temp=0;
   //int j;  
   char str[255];
   setlocale(LC_ALL, "rus");
   printf("Обработчик строк 2.0 \n");
   printf("Введите фразу \n");
   gets(str);
       while (str[i]!=0)
      {
         len=len+1;    //в этом цикле узнаем длину строки
         i++;
      }
      /*
      for (i=0, j=len-1; i<=j; i++, j--)
   {
      temp=str[i];
      str[i]=str[j];                    //здесь суть - меняем местами элементы на одинаковом расстоянии от концов
      str[j]=temp;
   }*/

       printf("len=%i \n",len);
       printf("Перевернули строку: \n");
        //for(i=0;i<len;i++)
        for(i=len-1;i>=0;i--)
      {
         printf("%c",str[i]);
      }
        return 0;
}


-- 26 сен 2013, 09:18 --

А ещё можно в Вашем коде повыбрасывать лишние "букафки".
Например, цикл
Используется синтаксис C
        while (str[i]!=0)
      {
         len=len+1;    //в этом цикле узнаем длину строки
         i++;
      }

Можно записать так
Используется синтаксис C
while (str[i++])len++; //в этом цикле узнаем длину строки

Или так
Используется синтаксис C
len=strlen(str); //узнаем длину строки

В последнем случае, правда, придётся вернуть строку
Используется синтаксис C
#include <string.h> //здесь ничего интересного

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group