Такое было условие.
Напишите программу, которая считывает строку входных данных и затем распечатывает эту строку в обратном порядке. Напомним, что для чтения из потока ввода одного символа за один раз вы можете воспользоваться функцией scanf() со спецификатором %c и что символ новой строки (\n)
генерируется,когда вы нажимаете клавишу enter.
Пользоваться можно только циклами, scanf,printf, другие операторы на момоетн изучения пока неизвестны.
Вот мой вариант-
#include <stdio.h>
#include <string.h>
int main(){char as[40],b[40];
int k,i;
scanf("%c",as);
for(i=strlen(as),k=0;i>=0;i--,k++){
b[k]=as[i];
printf("%c",b[k]);
} return 0;
}
А в конце книги была подсказка. Честно сказать я не понял к чему она.
Написано- Здесь следует объявить возвращаемый тип как long и включить оператор return, который бы возвращал величину типа long.
В общем такие навороты. Заранее спасибо!
Здравствуйте --, Вы писали:
-->А в конце книги была подсказка. Честно сказать я не понял к чему она. -->Написано- Здесь следует объявить возвращаемый тип как long и включить оператор return, который бы возвращал величину типа long. -->В общем такие навороты. Заранее спасибо! --> :shuffle:
Честно, сказать, я тоже. Тем более, что я читаю ее, оторванной от контекста. Но тем не менее, могу предположить, что речь идет о возвращаемом количестве обработанных символов, но в таком случае, Вам лучше вынести код в отдельную процедуру, так как главная процедура обычно возвращает коды завершения прогаммы (типа 0, 1, -1 ), хотя это и не закон.
Далее, строка
scanf("%c",as);
неправильная. Таким образом Вы вычитаете только 1 символ вместо строки. Если уж Вы затеяли чтение по одному символу, необходимо организовать цикл типа
char c;
do
scanf("%c",&c);
while (c!=10); // 10- перевод строки
В этом случае в переменной с будет на каждой итерации будет появляться новое значение из входного потока.
Далее организовываете строку, счетчик, наращиваете его на каждой итерации и передаете scanf смещенную строку. Примерно так
char szLine[255];
char * szLineCur=szLine;
do
scanf("%c",szLineCur);
while (*szLineCur++!=10);
*szLineCur=0;
В таком варианте вы получете указатель на последний символ в строке. Теперь начинайте его декрементировать в цикле и печатайте себе по одному сиволу наздоровье. Условие в цикле: пока szLineCur!=szLine, а печатаете *(szLineCur-1)
За синтаксическую правильность кода не ручаюсь, не проверял, но, по идее, должно компилироватья и работать
>Далее, строка
scanf("%c",as);
неправильная. Таким образом Вы вычитаете только 1 символ вместо строки. Если уж Вы затеяли чтение по одному символу, необходимо организовать цикл типа .
--------------------------------------------------------------------------------------
Но так в принципе в условии сказано, воспользоваться %c, к тому же для чтения строки и перевертывания в обратном виде.?
Я извиняюсь, , но я не знаю что это за символ *, для чего он здесь ?
Re[2]: Задача из книги. Начинающий вопрос?
От:
Аноним
Дата:
12.01.02 14:53
Оценка:
Здравствуйте roman_fadeyev, Вы писали:
RF>Здравствуйте --, Вы писали:
-->>А в конце книги была подсказка. Честно сказать я не понял к чему она. -->>Написано- Здесь следует объявить возвращаемый тип как long и включить оператор return, который бы возвращал величину типа long. -->>В общем такие навороты. Заранее спасибо! -->>
RF>Честно, сказать, я тоже. Тем более, что я читаю ее, оторванной от контекста. Но тем не менее, могу предположить, что речь идет о возвращаемом количестве обработанных символов, но в таком случае, Вам лучше вынести код в отдельную процедуру, так как главная процедура обычно возвращает коды завершения прогаммы (типа 0, 1, -1 ), хотя это и не закон.
RF>Далее, строка RF>scanf("%c",as); RF>неправильная. Таким образом Вы вычитаете только 1 символ вместо строки. Если уж Вы затеяли чтение по одному символу, необходимо организовать цикл типа
RF>
RF>В этом случае в переменной с будет на каждой итерации будет появляться новое значение из входного потока. RF>Далее организовываете строку, счетчик, наращиваете его на каждой итерации и передаете scanf смещенную строку. Примерно так
RF>
ДА Ваша программа оказалась рабочая действительно, я ее доделал следующим образом.
#include <stdio.h>
int main(){ int i=10;
char szLine[255];
char * szLineCur=szLine;
do
scanf("%c",szLineCur);
while (*szLineCur++!=10);
*szLineCur=0;
while(i-->=0){
printf("%c",szLine[i]);
}
} RF>В таком варианте вы получете указатель на последний символ в строке. Теперь начинайте его декрементировать в цикле и печатайте себе по одному сиволу наздоровье. Условие в цикле: пока szLineCur!=szLine, а печатаете *(szLineCur-1)
RF>За синтаксическую правильность кода не ручаюсь, не проверял, но, по идее, должно компилироватья и работать
Здравствуйте --, Вы писали:
-->ДА Ваша программа оказалась рабочая действительно, я ее доделал следующим образом. -->#include <stdio.h> -->int main(){ int i=10; -->char szLine[255]; -->char * szLineCur=szLine; -->do --> scanf("%c",szLineCur); -->while (*szLineCur++!=10); -->*szLineCur=0;
while(i-->>=0){ -->printf("%c",szLine[i]); -->} -->}
Ну зачем же вы так. Тем более что инициализация счетчика i,мягко говоря, удивляет. Можно ведь и посиматичнее:
for (; szLineCur!=szLine; szLineCur--)
printf("%c",*(szLineCur-1))
Строку *szLineCur=0; можете выкинуть в целях оптимизации. Она смысла здесь не несет, но с ней правильнее, тем более если Вы решите померять длину строки с помощью strlen или что-нибудь подобное.
Операция * обозначает разыменование указателя. Так как наш szLineCur — указатель на строку, у которой начало все время меняется, то *szLineCur даст нам первый символ в ней. Если Вам не нравится, пишите szLineCur[0], но это некрасиво.
И еще, смените, пож-ста, имя в аккаунте, а то форматировщик текста Вас не понимает, в ответах ничего не разберешь
Здравствуйте roman_fadeyev, Вы писали:
RF>И еще, смените, пож-ста, имя в аккаунте, а то форматировщик текста Вас не понимает, в ответах ничего не разберешь
Да-да! Как вы яхту назовете, так она и поплывет! Даешь ++
К>Да-да! Как вы яхту назовете, так она и поплывет! Даешь ++
Все вроде Ник сменил.
while (*szLineCur++!=10);
А это получается так или нет-Эквивалент ?
szLineCur[0],szLineCur[1],szLineCur[2]
и так до 10.
И не поумк что происходит в этой строке
char * szLineCur=szLine;
Если можно не могли бы Вы поподробней рассказать об этом.
Я хоть и сам придумал дописать
printf("%c",szLine[i]);
в конце программы, которую Вы мне написали. Но не поуму почему к szLine в обратном порядке присвоились элементы масива. Ведь в начале рпограммы было написано
char * szLineCur=szLine;
И насколько я понимаю элементы находящиеся справа от знака равно должны были присвоиться элементу слева от знака?
И что делает вообще строка -->*szLineCur=0; , для чего она, если Вы говорите можно без нее. то какому элементу массива присваивается 0.
Здравствуйте swop, Вы писали:
S>по поводу "*" вам надо читать далее это уже указатели и арифметика с ними . S>всё можно сделать и без них
Понятно. Ну пока я до этого не дошел. Читаю книгу дальше.
Спасибо Всем!
Вот что я понял согласно вышеуказанному, только без *
#include <stdio.h>
int main(void)
{
char ch[255],cc;int i=0;
do {
scanf("%c",&cc);
ch[i]=cc;
i++;}
while( cc!='\n');
for(i--;i>=0;i--)
printf("%c",ch[i]);
return 0;
}
Правильно, или грубый код для начала ?
Здравствуйте Pobeda, Вы писали:
P>Вот что я понял согласно вышеуказанному, только без * P>#include <stdio.h> P>int main(void) P>{ P> char ch[255],cc;int i=0; P> do { P> scanf("%c",&cc); P> ch[i]=cc; P> i++;} P> while( cc!='\n'); P> for(i--;i>=0;i--) P> printf("%c",ch[i]); P> return 0; P>} P>Правильно, или грубый код для начала ?
IMHO много лишнего я тоже типа новичок вот моя версия
#include <stdio.h>
int main (void) {
int i = 0;
char buf[256];
while (buf[i - 1] != '\n')
scanf ("%c" ,&buf[i++]);
while (i >= 0)
printf ("%c" ,buf[--i]);
return 0;
}
было бы хорошо если ты и код бы форматировал .!
Re: Задача из книги. Начинающий вопрос?
От:
Аноним
Дата:
14.01.02 00:23
Оценка:
Здравствуйте --, Вы писали:
-->Такое было условие. -->Напишите программу
#include <stdio.h>
#include <string.h>
int main()
{
char as[40];
int k,i;
scanf("%c",as);
strrev(as);// зачем мучиться!
printf(as);
return 0;
}
А лонг — это маразм какой то, float бы еще придумали.
А если прикинуться кирпичём, то можно типа такого тоже
//да, strlen мы тоже не знаем, забыли, понимеЩь
for(int i=39;i>=0;i--)
{if(as[i]!=0)printf("%c",as[i]);}
Здравствуйте Аноним, Вы писали:
А>Здравствуйте --, Вы писали:
-->>Такое было условие. -->>Напишите программу
А>#include <stdio.h> А>#include <string.h> А> int main() А>{ А> char as[40]; А> int k,i; А> scanf("%c",as); А> strrev(as);// зачем мучиться! А> printf(as); А> return 0; А>}
А>А лонг — это маразм какой то, float бы еще придумали. А>А если прикинуться кирпичём, то можно типа такого тоже А>//да, strlen мы тоже не знаем, забыли, понимеЩь А>for(int i=39;i>=0;i--) А>{if(as[i]!=0)printf("%c",as[i]);}
ммм я чегото не догнал
scanf("%c",as);
тут должно быть считать символ а получается строку
то биш эквивалентно scanf ("%s" ,as) разница тогда в чем ????
а еще это printf(as) везде прокатит просто я впервые вижу что-бы ток выводили ???
Знаю я strlen(),только я не воспользовался ею в этом случае. К тому же все и без нее обошлось.
S>ммм я чегото не догнал
S>
S>scanf("%c",as);
S>
S>тут должно быть считать символ а получается строку S>то биш эквивалентно scanf ("%s" ,as) разница тогда в чем ????
На сколько я знаю если не использовать в scanf() &, то это для того чтобы читать строку в символьный массив.
А в компиляторе scanf ("%c" ,as) вполне удачно работает.
S>а еще это printf(as) везде прокатит просто я впервые вижу что-бы ток выводили ???
Ну я до такого вывода еще не доучился. Хотя согласно вашему примеру я его уже понял.
#include <stdio.h>
#include <string.h>
int main()
{
char as[40];
int k,i;
scanf("%c",as);
strrev(as);// зачем мучиться!
printf(as);
return 0;
}
не работает !!!
вот здесь scanf ("%c" ,as); есть один ньюанс
дело в том что так в массив as не будет добавлен символ '\0'
и в массиве будет только один символ ,
и функция strrev (); вызовет ошибку !!!
S>не работает !!! S>вот здесь scanf ("%c" ,as); есть один ньюанс S>дело в том что так в массив as не будет добавлен символ '\0' S>и в массиве будет только один символ , S>и функция strrev (); вызовет ошибку !!!
------------------------------------------------------
Поэтому лучше пользоваться циклом как написан пример повыше, мне так кажется. Так работает.