2014 dxdy logo

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

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




 
 Перевернуть строку
Сообщение24.09.2013, 22:28 
Здравствуйте, уважаемые посетители форума! Это снова я (стаж изучения С - три недели и три дня), и я снова застрял на элементарной программе. На этот раз задача перевернуть небольшую введенную строку, т.е. вывести ее наоборот. Например на введенное: "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 
Жаль, что прошлый опыт общения ничего вам не дал. Нет желания объяснять впустую.

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 00:06 
Аватара пользователя
Хотя Ваш код и не верен, мой компилятор его принимает.

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


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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 12:58 
Почему tempint? Этой переменной присваивается выражение типа char и её значение присваивается только выражению типа char. Зачем делать её более широкого типа?

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

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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 14:48 
Аватара пользователя
arseniiv
Оставьте хоть что-нибудь для ТС.
Ему, наверно, тоже хочется поучаствовать в исправлении своего кода :-)

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 19:18 
Всё-всё, больше не буду. :lol: Он что-то подозрительно молчит.

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

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

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

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

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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:01 
Ура, ТС пришёл!

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

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

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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:27 

(Оффтоп)

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

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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 21:30 

(Оффтоп)

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

 
 
 
 Re: Перевернуть строку
Сообщение25.09.2013, 22:29 

(Оффтоп)

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

 
 
 
 Re: Перевернуть строку
Сообщение26.09.2013, 08:00 
Аватара пользователя
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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group