Задача из книги. Начинающий вопрос?
От: Аноним  
Дата: 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 (); вызовет ошибку !!!
------------------------------------------------------
Поэтому лучше пользоваться циклом как написан пример повыше, мне так кажется. Так работает.
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
Re[5]: Задача из книги. Начинающий вопрос?
От: Pobeda http://cosmozo.narod.ru/
Дата: 15.01.02 06:28
Оценка:
Swop:
Я опробовал тоже scanf("%s",perem); и scanf("%c",perem);
Последний почему-то перестал работать, хотя я лично пробовал , пример последний работал ранее. Ваша правда.
Тогда остается только пользоваться вариантом scanf("%s",perem); который считывает в символьный массив строки ?
дас ист нихьт фантастиш, дас ист руссиш Ванюшка
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.