Социальная сеть FreeStudents | Галерея

Правила  •  Поиск  •  Войти  •  Зарегистрироваться!
Помогите с Турбо СИ, 1ый курс!!
На страницу Пред.  1, 2  
Начать новую тему   Ответить на тему    Список форумов -> Помоги студенту!
 
Автор Сообщение
Sovie



Репутация: +20/–1   
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
[] Сообщение04.03.2007 1:35 Ответить с цитатой

Угу! Все видели? Меня поцеловала прекрасная принцесса Круто!!! Завидуйте мне.

Цитата:
Да блин вы не думаете что я тупая!))


И в мыслях не было. Если что, пиши.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kabal
Инноватор-самоучка


Репутация: +19/–1   
Возраст: 26
Гороскоп: Козерог Год Петуха
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 3252
Стаж: 2 года 9 месяцев
[] Сообщение04.03.2007 1:43 Ответить с цитатой

Похоже я третий лишний ... гордо удаляюсь Гы-гы-гы!

_________________

Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Skype Name
Beatrice



Репутация: 0   
Возраст: 19
Гороскоп: Близнецы Год Змеи
Пол: <br />Пол:Жен
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
[] Сообщение04.03.2007 2:00 Ответить с цитатой

Sovie


ты прикольный...хы
Хорошо Подмигивает


_________________
_____Люди часто одиноки, потому что они строят стены вместо мостов_____
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Sovie



Репутация: +20/–1   
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
[] Сообщение04.03.2007 12:27 Ответить с цитатой

Для теста прикольно вводить что-то типа
Sovie + Beatrice = LOVE
Смайлик Забавно получается

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Beatrice



Репутация: 0   
Возраст: 19
Гороскоп: Близнецы Год Змеи
Пол: <br />Пол:Жен
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
[] Сообщение04.03.2007 13:46 Ответить с цитатой

Подмигивает я обязательно введу такое и проверю, а ты с какого факультета? Смайлик

_________________
_____Люди часто одиноки, потому что они строят стены вместо мостов_____
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xpol



Репутация: 0   
Возраст: 20
Гороскоп: Телец Год Дракона
Пол: <br />Пол:Муж
Сообщения: 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
Гороскоп: Весы Год Кошки
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 1123
Стаж: 3 года 10 месяцев
[] Сообщение04.03.2007 17:12 Ответить с цитатой

xpol
молодца сразу впихнул указатели! а про длину строки Кабал имелл ввиду, чтобы обратиться к последнему элементу, нужно писать не str[1024], а str[1023], и скажем кабал сразу написал, что это прога ни на каком языке програмирования не реализована, а просто как пример...


_________________
Может показаться, что я ничего не делаю, но на клеточном уровне я очень занят!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail М-Агент
Sovie



Репутация: +20/–1   
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
[] Сообщение04.03.2007 17:47 Ответить с цитатой

xpol, я же сделал оговорку, что мои варианты совсем не рентабельны с точки зрения скорости выполнения и страховки от ошибок.

Однако, преподаватель от первокурсника ждёт в первую очередь некоторого определённого мышления, а не умения оптимизировать и страховать.

Считаю, что в данной конкретной ситуации варианты с использованием таким недопустимых в реальной работе приёмов, как условие в цикле, имеют права на жизнь. Они чётко показывают логику программы. Считаю, что это важнее.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kabal
Инноватор-самоучка


Репутация: +19/–1   
Возраст: 26
Гороскоп: Козерог Год Петуха
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 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 написал намного лучше тебя.


_________________

Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Skype Name
Sovie



Репутация: +20/–1   
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
[] Сообщение04.03.2007 18:16 Ответить с цитатой

Я бы даже сказал, что при попытке записать больше, чем n-1 символ, мы получим неопределённость, т.к. затрём терминатор и вывод будет продолжаться, пока в памяти не встретится \0.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
xpol



Репутация: 0   
Возраст: 20
Гороскоп: Телец Год Дракона
Пол: <br />Пол:Муж
Сообщения: 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   
Пол: <br />Пол:Муж
Откуда: Санкт-Петербург
Сообщения: 787
Стаж: 2 года 7 месяцев
[] Сообщение04.03.2007 21:06 Ответить с цитатой

xpol писал(а):
Насчет строки - Признаю, был неправ.

Уметь признавать ошибки - это хорошее умение. Уважаю.

Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Beatrice



Репутация: 0   
Возраст: 19
Гороскоп: Близнецы Год Змеи
Пол: <br />Пол:Жен
Откуда: Орехово-Зуево
Сообщения: 59
Стаж: 1 год 10 месяцев
[] Сообщение04.03.2007 22:31 Ответить с цитатой

0_o Гы-гы-гы! Гы-гы-гы! Гы-гы-гы!
спасибо вам ребята я каждый вариант попробую, всё разберу


_________________
_____Люди часто одиноки, потому что они строят стены вместо мостов_____
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов -> Помоги студенту! Часовой пояс: GMT + 3
На страницу Пред.  1, 2
Страница 2 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы
© 2004—2008 «Сайт Свободных Студентов»