Задача из книги. Начинающий вопрос?
От: Аноним  
Дата: 12.01.02 12:41
Оценка:
Такое было условие.
Напишите программу, которая считывает строку входных данных и затем распечатывает эту строку в обратном порядке. Напомним, что для чтения из потока ввода одного символа за один раз вы можете воспользоваться функцией 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.
В общем такие навороты. Заранее спасибо!
Re: Задача из книги. Начинающий вопрос?
От: roman_fadeyev  
Дата: 12.01.02 14:01
Оценка:
Здравствуйте --, Вы писали:

-->А в конце книги была подсказка. Честно сказать я не понял к чему она.

-->Написано- Здесь следует объявить возвращаемый тип как 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)

За синтаксическую правильность кода не ручаюсь, не проверял, но, по идее, должно компилироватья и работать
Re[2]: Задача из книги. Начинающий вопрос?
От: Аноним  
Дата: 12.01.02 14:40
Оценка:
RF>
RF>char szLine[255];
RF>char * szLineCur=szLine; 
RF>do
RF>  scanf("%c",szLineCur);
RF>while  (*szLineCur++!=10);
RF>*szLineCur=0;
RF>


Я извиняюсь, , но я не знаю что это за символ *, для чего он здесь ?
Re[3]: Задача из книги. Начинающий вопрос?
От: Аноним  
Дата: 12.01.02 14:46
Оценка:
Здравствуйте --, Вы писали:

RF>>
RF>>char szLine[255];
RF>>char * szLineCur=szLine; 
RF>>do
RF>>  scanf("%c",szLineCur);
RF>>while  (*szLineCur++!=10);
RF>>*szLineCur=0;
RF>>


>Далее, строка

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>char c;
RF>do
RF>  scanf("%c",&c);
RF>while  (c!=10); // 10- перевод строки
RF>


RF>В этом случае в переменной с будет на каждой итерации будет появляться новое значение из входного потока.

RF>Далее организовываете строку, счетчик, наращиваете его на каждой итерации и передаете scanf смещенную строку. Примерно так

RF>
RF>char szLine[255];
RF>char * szLineCur=szLine; 
RF>do
RF>  scanf("%c",szLineCur);
RF>while  (*szLineCur++!=10);
RF>*szLineCur=0;
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>За синтаксическую правильность кода не ручаюсь, не проверял, но, по идее, должно компилироватья и работать
Re[3]: Задача из книги. Начинающий вопрос?
От: roman_fadeyev  
Дата: 12.01.02 15:07
Оценка:
Здравствуйте --, Вы писали:

-->ДА Ваша программа оказалась рабочая действительно, я ее доделал следующим образом.

-->#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], но это некрасиво.

И еще, смените, пож-ста, имя в аккаунте, а то форматировщик текста Вас не понимает, в ответах ничего не разберешь
Re[4]: Задача из книги. Начинающий вопрос?
От: Кодт Россия  
Дата: 12.01.02 16:38
Оценка:
Здравствуйте roman_fadeyev, Вы писали:

RF>И еще, смените, пож-ста, имя в аккаунте, а то форматировщик текста Вас не понимает, в ответах ничего не разберешь


Да-да! Как вы яхту назовете, так она и поплывет! Даешь ++
Перекуём баги на фичи!
Re[5]: Задача из книги. Начинающий вопрос?
От: -- http://cosmozo.narod.ru/
Дата: 12.01.02 18:29
Оценка:
К>Да-да! Как вы яхту назовете, так она и поплывет! Даешь ++
Все вроде Ник сменил.
while (*szLineCur++!=10);

А это получается так или нет-Эквивалент ?
szLineCur[0],szLineCur[1],szLineCur[2]
и так до 10.
И не поумк что происходит в этой строке
char * szLineCur=szLine;

Если можно не могли бы Вы поподробней рассказать об этом.
Я хоть и сам придумал дописать
 printf("%c",szLine[i]);
в конце программы, которую Вы мне написали. Но не поуму почему к szLine в обратном порядке присвоились элементы масива. Ведь в начале рпограммы было написано
  char * szLineCur=szLine;

И насколько я понимаю элементы находящиеся справа от знака равно должны были присвоиться элементу слева от знака?
И что делает вообще строка -->*szLineCur=0; , для чего она, если Вы говорите можно без нее. то какому элементу массива присваивается 0.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[6]: Задача из книги. Начинающий вопрос?
От: -- http://cosmozo.narod.ru/
Дата: 12.01.02 18:33
Оценка:
Все Это мой новый ник Pobeda!
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[7]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 12.01.02 18:36
Оценка:
Я извиняюсь что несколько раз писал, Ник сменил, я думал что по нику в форуме пишется, а оказалось по Псевдониму.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[8]: Задача из книги. Начинающий вопрос?
От: swop Россия  
Дата: 13.01.02 17:51
Оценка:
по поводу "*" вам надо читать далее это уже указатели и арифметика с ними .
всё можно сделать и без них
Re[9]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 13.01.02 18:51
Оценка:
Здравствуйте swop, Вы писали:

S>по поводу "*" вам надо читать далее это уже указатели и арифметика с ними .

S>всё можно сделать и без них
Понятно. Ну пока я до этого не дошел. Читаю книгу дальше.
Спасибо Всем!
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[10]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 13.01.02 19:30
Оценка:
Вот что я понял согласно вышеуказанному, только без *
#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;
}
Правильно, или грубый код для начала ?
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[11]: Задача из книги. Начинающий вопрос?
От: swop Россия  
Дата: 13.01.02 23:03
Оценка:
Здравствуйте 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]);}
Re[2]: Задача из книги. Начинающий вопрос?
От: swop Россия  
Дата: 14.01.02 01:00
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте --, Вы писали:


-->>Такое было условие.

-->>Напишите программу

А>#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) везде прокатит просто я впервые вижу что-бы ток выводили ???
Re[12]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 14.01.02 06:39
Оценка:
Здравствуйте swop, Вы писали:

S>#include <stdio.h>
S>int main (void) {
S>    int i = 0;
S>    char buf[256];
S>    
S>    while (buf[i - 1] != '\n') 
S>        scanf ("%c" ,&buf[i++]);
S>    
S>    while (i >= 0) 
S>        printf ("%c" ,buf[--i]);

S>    return 0;
S>}
S>

Да, действительно, Ваш код смотриться лучше.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[3]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 14.01.02 07:16
Оценка:
Знаю я strlen(),только я не воспользовался ею в этом случае. К тому же все и без нее обошлось.

S>ммм я чегото не догнал


S>

S>scanf("%c",as);

S>


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

S>то биш эквивалентно scanf ("%s" ,as) разница тогда в чем ????
На сколько я знаю если не использовать в scanf() &, то это для того чтобы читать строку в символьный массив.
А в компиляторе scanf ("%c" ,as) вполне удачно работает.


S>а еще это printf(as) везде прокатит просто я впервые вижу что-бы ток выводили ???


Ну я до такого вывода еще не доучился. Хотя согласно вашему примеру я его уже понял.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[4]: Задача из книги. Начинающий вопрос?
От: swop Россия  
Дата: 14.01.02 20:20
Оценка:
мож только у меня но это


#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 (); вызовет ошибку !!!
Re[5]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 14.01.02 21:02
Оценка:
Здравствуйте swop, Вы писали:

S>мож только у меня но это


S>

S>#include <stdio.h> 
S>#include <string.h> 
S>int main() 
S>{ 
S>char as[40]; 
S>int k,i; 
S>scanf("%c",as); 
S>strrev(as);// зачем мучиться! 
S>printf(as); 
S>return 0; 
S>} 

S>


S>не работает !!!

S>вот здесь scanf ("%c" ,as); есть один ньюанс
S>дело в том что так в массив as не будет добавлен символ '\0'
S>и в массиве будет только один символ ,
S>и функция strrev (); вызовет ошибку !!!
------------------------------------------------------
Поэтому лучше пользоваться циклом как написан пример повыше, мне так кажется. Так работает.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.