Работа программиста?Кто где работает? на чем пишет
#2
Отправлено 05.06.2006, 23:39:44
Ну и вопрос.Народ расскажите кто где работает программистом, сколько получат(если не секрет) и на чем пишите программы(или что вообще делаете).
Если ты программист, то у меня для тебя есть вопрос поинтересней. Как думаешь, что не так в этой программе:
#include <stdio.h> void main(void){ int ch = getchar(); if(ch == 'А') printf("%c - первая буква русского алфавита", ch); else if(ch == 'Я') printf("%c - последняя буква русского алфавита", ch); else if(ch >= 'А' && ch <= 'Я') printf("%c - буква русского алфавита", ch); else printf("%c - неизвестный символ", ch); }Удачи!
#3
Отправлено 06.06.2006, 01:17:51
А вообще - это был оффтопик.
Я работаю в компании IT Services. Пишу на PHP, Basic'e, SQL'e, от Delphi закодировался - больше не тянет.
#5
Отправлено 06.06.2006, 09:37:22
Ну и вопрос.
Народ расскажите кто где работает программистом, сколько получат(если не секрет) и на чем пишите программы(или что вообще делаете).
Если ты программист, то у меня для тебя есть вопрос поинтересней. Как думаешь, что не так в этой программе:#include <stdio.h> void main(void){ int ch = getchar(); if(ch == 'А') printf("%c - первая буква русского алфавита", ch); else if(ch == 'Я') printf("%c - последняя буква русского алфавита", ch); else if(ch >= 'А' && ch <= 'Я') printf("%c - буква русского алфавита", ch); else printf("%c - неизвестный символ", ch); }Удачи!
Мдямс, я конечно понимаю вопрос интересный но по теме
#6
Отправлено 06.06.2006, 10:09:31
ch =='А'
ch >= 'А' && ch <= 'Я'
и
ch =='Я'
ch >= 'А' && ch <= 'Я'
взаимно перекрываются в значениях 'А' и 'Я' соответственно.
Поэтому в этих значениях выполнится только проверка на первость и последнесть. Проверка на буквость будет пропущена.
---
урра! неужели я программист
#7
Отправлено 06.06.2006, 14:57:38
ну здесь вроде каждое условие должно быть в скобках?
if((ch >= 'А') && (ch <= 'Я'))
насчет перекрытий. знак "=" можно опустить, но программа все равно будет выдавать правильный ответ, т.к. А и Я проверены раньше
зы. я вообще-то тоже на Си не пишу
#8
Отправлено 06.06.2006, 15:31:54
#9
Отправлено 06.06.2006, 16:13:24
Оператор сравнения всегда имееет более высокий приоритет, чем оператор логического умножения. Так что - скобки там необязательны.
А вот перекрытие есть.
ch >= 'А' && ch <= 'Я'
я бы заменил на
ch > 'А' && ch < 'Я'
Раз уж проверка на граничные значения уже произведена. Это будет логически более верная реализация.
#11
Отправлено 06.06.2006, 22:33:55
По теме - для таких тем, как твоя, на этом форуме имеется другой раздел, называется "Вакансии". Там постоянно обсуждается, кто, где, с чем и как работает. И насчет уровня зарплат, в этом же разделе "Вакансии" есть даже отдельная тема "Зарплаты" на много страниц, которая постоянно находится на самом видном месте и обсуждается уже много месяцев подряд.Мдямс, я конечно понимаю вопрос интересный но по теме
Propovednik
Да, хорошая идея - обратить внимание на библиотечную функцию getchar(). Согласно описанию, эта функция считывает одиночный символ из стандартного потока ввода (с клавиатуры) и возвращает его в форме численного значения типа int. Каждому буквенному символу всегда однозначно соответствует определенный численный код в таблице ASCII/ANSI, так что от сравнения числа с символом все равно никуда не уйти, даже предполагая, что "ни к чему дельному это не приведет".int ch = getchar(); - я на си не пишу, но могу предположить, что сравнение числа с символом впоследствии ни к чему дельному не приведет.
#13
Отправлено 07.06.2006, 00:00:48
Если ты программист, то у меня для тебя есть вопрос поинтересней. Как думаешь, что не так в этой программе:
#include <stdio.h> void main(void){ int ch = getchar(); if(ch == 'А') printf("%c - первая буква русского алфавита", ch); else if(ch == 'Я') printf("%c - последняя буква русского алфавита", ch); else if(ch >= 'А' && ch <= 'Я') printf("%c - буква русского алфавита", ch); else printf("%c - неизвестный символ", ch); }Удачи!
В программе проверяются только прописные буквы (А,Б,В...), а маленькие (а,б,в...) за буквы не считают, и назовут их неизвесными символами....
#14
Отправлено 07.06.2006, 00:19:24
Насчет DOS тоже не помню, и возможности проверить нет (как нет и необходимости) А в Windows программа в таком виде все равно правильно работать не будет, и дело не в кодировке. Кстати, используемая в программе функция стандартной библиотеки getchar(), так же как и printf(), полностью соответствует стандарту ANSI.Visual1
Если виндовозный код, то вроде бы всё верно, а вот в досовской кодировке русские символы шли не подряд, разрывались где-то в районе буквы П, если не ошибаюсь.
Need A Light
Кричать "урра!" в честь себя, любимого, ты несколько поспешил. И перекрытие интервалов (нестрогие неравенства) в данном случае не имеет значения - насчет них тебе San_k правильно сказал, что А и Я отдельно проверяются еще раньше.На сях не пишу, но исходя из общих понятий о логике и алгоритмах, мне думается, что условия в парах
ch =='А'
ch >= 'А' && ch <= 'Я'
и
ch =='Я'
ch >= 'А' && ch <= 'Я'
взаимно перекрываются в значениях 'А' и 'Я' соответственно.
Поэтому в этих значениях выполнится только проверка на первость и последнесть. Проверка на буквость будет пропущена.
---
урра! неужели я программист
v04bvs
А что даст isalpha? Только ответ на вопрос, является ли ch буквой или нет. Но и без ее помощи это уже делает последняя строка, которая выдает "неизвестный символ".Никто не гарантирует, что русский алфавит непрерывен. Надо пользовать isalpha для проверки (при правильно настроенной локали).
ALL
Подсказка: на самом деле при вводе символов 'А' и 'Я' из командной строки Windows (причем Windows с правильно настроенной поддержкой русского языка) программа всегда будет выдавать "неизвестный символ". Предлагаю подумать, а что она будет выдавать при вводе каких-либо других символов? В том числе и английских символов? Почему?
#15
Отправлено 07.06.2006, 11:31:34
#include <stdio.h> void main(void) { int ch = getchar(); if(ch == 'А' || ch =='а') printf("%c - первая буква русского алфавита", ch); else if(ch == 'Я' || ch == 'я') printf("%c - последняя буква русского алфавита", ch); else if(ch >= 'А' && ch <= 'я') printf("%c - буква русского алфавита", ch); else printf("%c - неизвестный символ", ch); }
#17
Отправлено 07.06.2006, 13:14:22
Или такой код:
int ch = getchar();
if(ch == 128)
printf("%c - first", ch);
else if(ch == 159)
printf("%c - last", ch);
else if(ch >= 128 && ch <= 159)
printf("%c - letter", ch);
else
printf("%c - unknown", ch);
блин. вот туплю
ведь, как было сказано, ch - int.
т.е. сравниваем целые числа (int) с символами(char).
вообще прога по идее даже компилироваться не должна. "type mismatch"?
ну, в общем, не работает она
Не будет никакого "type mismatch", т.к. кастуется char к int, т.е. нет потерь.
Сообщение отредактировал Niter: 07.06.2006, 13:16:11
#18
Отправлено 07.06.2006, 14:56:08
блин. вот туплю
ведь, как было сказано, ch - int.
т.е. сравниваем целые числа (int) с символами(char).
вообще прога по идее даже компилироваться не должна. "type mismatch"?
В Си тип char это не символы, а данные размером в 1 байт. Всё будет компилироваться с автоматическим приведением типов.
P.S. Кстати на счет приведения типов.
если в ДОС-вом компиляторе указать что char это unsigned char, то всё будет работать.
или в операторах сравнения надо написать типа
if (ch == (unsigned char)'Я')
.....
а для винды как указал Niter нужна ещё OEM конвертация
Сообщение отредактировал Византиец: 07.06.2006, 16:50:36
#19
Отправлено 07.06.2006, 22:39:55
... if (ch == (unsigned char)'А') ... if (ch == (unsigned char)'Я') ...то программа будет работать в командной строке Windows в полном соответствии с замыслом программиста (предполагается, что поддержка русского языка установлена). То есть, в полном соответствии с замыслом программа будет сообщать, что 'А' - первая буква, 'Я' - последняя буква, 'П' - буква русского алфавита, а буквы 'а', 'я', 'п', 'S', 's', 'W' и 'w' - это неизвестные символы. (И кстати, нет никаких причин беспокоиться о разрывах в кодировке символов).
Итак, теперь все работает правильно. Хотя объяснение этому так и не было найдено. Ведь в правой части проверки выполнено явное преобразование к типу unsigned char, а слева от оператора сравнения == находится переменная ch, по прежнему с типом int (точнее, signed int, используемый компилятором по умолчанию), который был возвращен функцией getchar().
Сообщение отредактировал Visual1: 07.06.2006, 23:12:36
#20
Отправлено 07.06.2006, 22:57:24
Сообщение отредактировал Visual1: 07.06.2006, 23:07:38
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0