Автор |
Сообщение |
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.03.2007 1:35 |
|
|
Угу! Все видели? Меня поцеловала прекрасная принцесса Завидуйте мне.
Цитата: Да блин вы не думаете что я тупая!))
И в мыслях не было. Если что, пиши.
|
|
Вернуться к началу |
|
|
Kabal
Инноватор-самоучка
Репутация: +19/–1
Возраст: 26
Гороскоп:
Пол:
Откуда: Санкт-Петербург
Сообщения: 3252
Стаж: 2 года 9 месяцев
|
[] 04.03.2007 1:43 |
|
|
Похоже я третий лишний ... гордо удаляюсь
_________________
|
|
Вернуться к началу |
|
|
Beatrice
Репутация: 0
Возраст: 19
Гороскоп:
Пол:
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
|
[] 04.03.2007 2:00 |
|
|
Sovie
ты прикольный...хы
_________________ _____Люди часто одиноки, потому что они строят стены вместо мостов_____
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.03.2007 12:27 |
|
|
Для теста прикольно вводить что-то типа
Sovie + Beatrice = LOVE
Забавно получается
|
|
Вернуться к началу |
|
|
Beatrice
Репутация: 0
Возраст: 19
Гороскоп:
Пол:
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
|
[] 04.03.2007 13:46 |
|
|
я обязательно введу такое и проверю, а ты с какого факультета?
_________________ _____Люди часто одиноки, потому что они строят стены вместо мостов_____
|
|
Вернуться к началу |
|
|
xpol
Репутация: 0
Возраст: 20
Гороскоп:
Пол:
Сообщения: 20
Стаж: 1 год 7 месяцев
|
[] 04.03.2007 16:37 |
|
|
Н-да. Чему вы учите детей?
Ну, поехали:
1.
unsigned int i = 0; // Счётчик
char sInput[1024] = ""; /* Тут будет храниться строка, длина максимум 1024*/
Kabal, счетчик с нуля начинается, поэтому именно 1024 символа!
Или вы как преподаватель просто решили обратить на это внимание?!
2.
Kabal, во первых то что вы написали просто не пашет, т.к. вместо проверки на равенство == у вас просто присваивание =. Во-вторых вы используете string.h и идете циклом по всем элементам?! По меньшей мере странно. Кстати в коде sovie также естьнерациональные зерна, зато все понятно как день, этого не отнять.
Вот мой вариант c использованием string.h:
Код:
#include<stdio.h>
#include<string.h>
#define MAXLINE 20//длина массива
void main()
{
char str[MAXLINE];
char* ptr;
printf("Please, input a line:");
fgets(str, MAXLINE+1, stdin);
if(!(ptr=strchr(str, '+'))) printf("Line doesn't have a '+' char: ");
else
for(ptr++;*ptr!=str[strlen(str)-1];*(ptr++)='*');
printf("%s", str);
}
Плюсы:
1.Программа работает и работает правильно, т.к. все перечисленные выше варианты этому требованию неудовлетворяют, т.к. было сказано заменять '*' только симолы, СЛЕДУЮЩИЕ ЗА '+' Пускай исправить очень просто, но факт есть факт.))
2. устойчивый к переполнению вариант, т.к. из буфера ввода берется количество символов не больше количества, которое можно забить в массив.
3. Программа проверяет вообще есть ли символ '0' - от этого и "танцует".
4. Программа короткая .
5. Используются библиотечные функции - их нужно использовать, но не нужно злоупотреблять.
6. Программа получилась "почти" линейная - всего один оператор if, который как известно сильно тормозит работу.
7. Один проход цикла по всем элементам. Как работает strchr? Ищет в заданной строке - заданный символ, как только находит его - возвращает на него указатель, или нуль если ничего не нашла. Таким образом внутри неё находится цикл по строке до заданного элемента.
8.Минимальное использование переменных.
В итоге при любых раскладах у нас всего 1-н проход по строке, что впринципе хорошо.
Минусы:
1. массив можно сделать динамическим, я посчитал что этого тут не нужно.
2. Возможно не очень читабельный вариант для первокурсника.
3. Ваши предложения?
В варианте с посимвольным вводом нам требуется 2-а условных оператора внутри основного цикла+ еще 1-н для защиты от переполнения, что не есть хорошо. При посимвольном вводе задача сводится к анализу отдельных символов(не стоит нашего внимания ), а в случве обычного ввода, т.е. взятие из буфера ввода строки за раз целиком, - к задаче обработки строки, что встречается гораздо чаще.
Посимвольный ввод можно реализовать с помощью getch(), но в этом случае мы лишены эхо-печати(если она требуется - ее нужно будет организовывать отдельно), что не есть хорошо, но зато мы можем контролировать количество введенных символов без засорения буфера ввода(чего мы впринципе лишены в двух других вариантах). Таким образом, что мы имеем? Задача простейшая - куча мыслей в голове:
1. Обычный ввод - строка берется целиком из буфера, защита от переполнения - fgets с stdin, использование string.h, 1-y if(который можно и опустить - он проверяет условие, которое в остальных примерах отсутствует) + цикл for (1-н проход по всем элементам).
2. (getchar)Посимвольно берем элементы из буфера ввода до встечи символа конца строки, далее цикл с условием(впринципе любой) + 2 условия на использование символа '+' "как отправной точки" и еще одно условие на проверку от переполнения. Используем только stdio.h для ввода-вывода.
3. (getch) - все тоже самое что и во 2-м пункте, только мы лишены эхо-печати(ее если нужно придется делать отдельно - пусть это фигня, но тем не менее), но зато мы имеем девственно чистый буфер ввода(тоже впринципе фигня). Зачем нам это? не знаю, но факт есть факт.
Вообщем вариант с обычным вводом мне кажется гораздо лучше.
P.S. Не нужно пренебрегать ни одним тактом процессора и ни одним битом информации.
|
|
Вернуться к началу |
|
|
Snoop
Репутация: +2
Возраст: 20
Гороскоп:
Пол:
Откуда: Санкт-Петербург
Сообщения: 1123
Стаж: 3 года 10 месяцев
|
[] 04.03.2007 17:12 |
|
|
xpol
молодца сразу впихнул указатели! а про длину строки Кабал имелл ввиду, чтобы обратиться к последнему элементу, нужно писать не str[1024], а str[1023], и скажем кабал сразу написал, что это прога ни на каком языке програмирования не реализована, а просто как пример...
_________________ Может показаться, что я ничего не делаю, но на клеточном уровне я очень занят!
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.03.2007 17:47 |
|
|
xpol, я же сделал оговорку, что мои варианты совсем не рентабельны с точки зрения скорости выполнения и страховки от ошибок.
Однако, преподаватель от первокурсника ждёт в первую очередь некоторого определённого мышления, а не умения оптимизировать и страховать.
Считаю, что в данной конкретной ситуации варианты с использованием таким недопустимых в реальной работе приёмов, как условие в цикле, имеют права на жизнь. Они чётко показывают логику программы. Считаю, что это важнее.
|
|
Вернуться к началу |
|
|
Kabal
Инноватор-самоучка
Репутация: +19/–1
Возраст: 26
Гороскоп:
Пол:
Откуда: Санкт-Петербург
Сообщения: 3252
Стаж: 2 года 9 месяцев
|
[] 04.03.2007 18:08 |
|
|
xpol писал(а): Kabal, во первых то что вы написали просто не пашет, т.к. вместо проверки на равенство == у вас просто присваивание =. Во-вторых вы используете string.h и идете циклом по всем элементам?! По меньшей мере странно.
Kabal писал(а): Можно решить оооочень простым способом через поиск в строке символа командой, но я уж через циклы . Основной цикл будет таким (за синтаксис не отвечаю):
Учись читать. Иногда это помогает.
xpol писал(а): char sInput[1024] = ""; /* Тут будет храниться строка, длина максимум 1024*/
Kabal, счетчик с нуля начинается, поэтому именно 1024 символа!
Или вы как преподаватель просто решили обратить на это внимание?!
Во-первых длина строки максимум будет 1023 символа. Хотя записать можно 1024 символа.
Добавлено спустя 3 минуты 28 секунд:
xpol
Сразу дать указатели, это ты молодец. С точки зрения простоты написания программы - Sovie написал намного лучше тебя.
_________________
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.03.2007 18:16 |
|
|
Я бы даже сказал, что при попытке записать больше, чем n-1 символ, мы получим неопределённость, т.к. затрём терминатор и вывод будет продолжаться, пока в памяти не встретится \0.
|
|
Вернуться к началу |
|
|
xpol
Репутация: 0
Возраст: 20
Гороскоп:
Пол:
Сообщения: 20
Стаж: 1 год 7 месяцев
|
[] 04.03.2007 20:01 |
|
|
Насчет строки - Признаю, был неправ.
Исправленный вариант(исправление в одной строчке, но тем не менее):
Код:
#include<stdio.h>
#include<string.h>
#define MAXLINE 20//длина массива
void main()
{
char str[MAXLINE];
char* ptr;
printf("Please, input a line:");
fgets(str, MAXLINE, stdin); //-исправлено здесь
if(!(ptr=strchr(str, '+'))) printf("Line doesn't have a '+' char: ");
else
for(ptr++;*ptr!=str[strlen(str)-1];*(ptr++)='*');
printf("%s", str);
}
_________________ MESS WITH THE BEST -
DIE LIKE THE REST
|
|
Вернуться к началу |
|
|
Sovie
Репутация: +20/–1
Пол:
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
|
[] 04.03.2007 21:06 |
|
|
xpol писал(а): Насчет строки - Признаю, был неправ.
Уметь признавать ошибки - это хорошее умение. Уважаю.
|
|
Вернуться к началу |
|
|
Beatrice
Репутация: 0
Возраст: 19
Гороскоп:
Пол:
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
|
[] 04.03.2007 22:31 |
|
|
спасибо вам ребята я каждый вариант попробую, всё разберу
_________________ _____Люди часто одиноки, потому что они строят стены вместо мостов_____
|
|
Вернуться к началу |
|
|
|
|