Перейти к содержимому

Фотография

Работа программиста?Кто где работает? на чем пишет


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 198

#1
w@lter

w@lter
  • Гость
  • 48 сообщений
Народ расскажите кто где работает программистом, сколько получат(если не секрет) и на чем пишите программы(или что вообще делаете).
  • 0

#2
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Народ расскажите кто где работает программистом, сколько получат(если не секрет) и на чем пишите программы(или что вообще делаете).

Ну и вопрос. :)
Если ты программист, то у меня для тебя есть вопрос поинтересней. Как думаешь, что не так в этой программе:
#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);
}
Удачи! :-)
  • 0

#3
Propovednik

Propovednik
  • Частый гость
  • 78 сообщений
int ch = getchar(); - я на си не пишу, но могу предположить, что сравнение числа с символом впоследствии ни к чему дельному не приведет.
А вообще - это был оффтопик.
Я работаю в компании IT Services. Пишу на PHP, Basic'e, SQL'e, от Delphi закодировался - больше не тянет.
  • 0

#4
Коляныч

Коляныч
  • В доску свой
  • 2 773 сообщений
Visual1
Если виндовозный код, то вроде бы всё верно, а вот в досовской кодировке русские символы шли не подряд, разрывались где-то в районе буквы П, если не ошибаюсь.
  • 0

#5
w@lter

w@lter
  • Гость
  • 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);
}
Удачи! :-)



Мдямс, я конечно понимаю вопрос интересный :-/ но по теме
  • 0

#6
Need A Light

Need A Light
  • В доску свой
  • 1 760 сообщений
На сях не пишу, но исходя из общих понятий о логике и алгоритмах, мне думается, что условия в парах
ch =='А'
ch >= 'А' && ch <= 'Я'
и
ch =='Я'
ch >= 'А' && ch <= 'Я'
взаимно перекрываются в значениях 'А' и 'Я' соответственно.
Поэтому в этих значениях выполнится только проверка на первость и последнесть. Проверка на буквость будет пропущена.
---
урра! неужели я программист
  • 0

#7
San_k

San_k
  • В доску свой
  • 1 509 сообщений
if(ch >= 'А' && ch <= 'Я')
ну здесь вроде каждое условие должно быть в скобках?
if((ch >= 'А') && (ch <= 'Я'))

насчет перекрытий. знак "=" можно опустить, но программа все равно будет выдавать правильный ответ, т.к. А и Я проверены раньше

зы. я вообще-то тоже на Си не пишу ;)
  • 0

#8
megadeath

megadeath

    Фиона - не спать... )))

  • Читатель
  • 19 226 сообщений
Автору. А где же собственная инициатива? Вопрос задали вот и сами ответьте. Похоже на ветку "Секс": А скоко у вас длина члена. И тишина. В одиночестве наверное сравнивает с представленными экземплярами. Так что огласите свои ответы на заданные вопросы. Хотя по зарплате существует обычно договор о неразглашении.

#9
Need A Light

Need A Light
  • В доску свой
  • 1 760 сообщений
San_k
Оператор сравнения всегда имееет более высокий приоритет, чем оператор логического умножения. Так что - скобки там необязательны.

А вот перекрытие есть.
ch >= 'А' && ch <= 'Я'
я бы заменил на
ch > 'А' && ch < 'Я'
Раз уж проверка на граничные значения уже произведена. Это будет логически более верная реализация.
  • 0

#10
San_k

San_k
  • В доску свой
  • 1 509 сообщений
2 Need A Light
ок. понял ;)

а насчет проверки уже писали ;)
  • 0

#11
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
w@lter

Мдямс, я конечно понимаю вопрос интересный но по теме

По теме - для таких тем, как твоя, на этом форуме имеется другой раздел, называется "Вакансии". Там постоянно обсуждается, кто, где, с чем и как работает. И насчет уровня зарплат, в этом же разделе "Вакансии" есть даже отдельная тема "Зарплаты" на много страниц, которая постоянно находится на самом видном месте и обсуждается уже много месяцев подряд.

Propovednik

int ch = getchar(); - я на си не пишу, но могу предположить, что сравнение числа с символом впоследствии ни к чему дельному не приведет.

Да, хорошая идея - обратить внимание на библиотечную функцию getchar(). Согласно описанию, эта функция считывает одиночный символ из стандартного потока ввода (с клавиатуры) и возвращает его в форме численного значения типа int. Каждому буквенному символу всегда однозначно соответствует определенный численный код в таблице ASCII/ANSI, так что от сравнения числа с символом все равно никуда не уйти, даже предполагая, что "ни к чему дельному это не приведет". ;)
  • 0

#12
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений
Никто не гарантирует, что русский алфавит непрерывен. Надо пользовать isalpha для проверки (при правильно настроенной локали).
  • 0

#13
Византиец

Византиец
  • Постоялец
  • 355 сообщений

Если ты программист, то у меня для тебя есть вопрос поинтересней. Как думаешь, что не так в этой программе:

#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);
}
Удачи! ;)


В программе проверяются только прописные буквы (А,Б,В...), а маленькие (а,б,в...) за буквы не считают, и назовут их неизвесными символами....
  • 0

#14
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Коляныч

Visual1
Если виндовозный код, то вроде бы всё верно, а вот в досовской кодировке русские символы шли не подряд, разрывались где-то в районе буквы П, если не ошибаюсь.

Насчет DOS тоже не помню, и возможности проверить нет (как нет и необходимости) ;) А в Windows программа в таком виде все равно правильно работать не будет, и дело не в кодировке. Кстати, используемая в программе функция стандартной библиотеки getchar(), так же как и printf(), полностью соответствует стандарту ANSI.

Need A Light

На сях не пишу, но исходя из общих понятий о логике и алгоритмах, мне думается, что условия в парах
ch =='А'
ch >= 'А' && ch <= 'Я'
и
ch =='Я'
ch >= 'А' && ch <= 'Я'
взаимно перекрываются в значениях 'А' и 'Я' соответственно.
Поэтому в этих значениях выполнится только проверка на первость и последнесть. Проверка на буквость будет пропущена.
---
урра! неужели я программист

Кричать "урра!" в честь себя, любимого, ты несколько поспешил. ;) И перекрытие интервалов (нестрогие неравенства) в данном случае не имеет значения - насчет них тебе San_k правильно сказал, что А и Я отдельно проверяются еще раньше.

v04bvs

Никто не гарантирует, что русский алфавит непрерывен. Надо пользовать isalpha для проверки (при правильно настроенной локали).

А что даст isalpha? Только ответ на вопрос, является ли ch буквой или нет. Но и без ее помощи это уже делает последняя строка, которая выдает "неизвестный символ".

ALL
Подсказка: на самом деле при вводе символов 'А' и 'Я' из командной строки Windows (причем Windows с правильно настроенной поддержкой русского языка) программа всегда будет выдавать "неизвестный символ". Предлагаю подумать, а что она будет выдавать при вводе каких-либо других символов? В том числе и английских символов? Почему?
  • 0

#15
Византиец

Византиец
  • Постоялец
  • 355 сообщений
Вот более рабочий вариант

#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);
}

  • 0

#16
San_k

San_k
  • В доску свой
  • 1 509 сообщений
блин. вот туплю ;)
ведь, как было сказано, ch - int.
т.е. сравниваем целые числа (int) с символами(char).

вообще прога по идее даже компилироваться не должна. "type mismatch"?

ну, в общем, не работает она ;)

Сообщение отредактировал San_k: 07.06.2006, 13:08:58

  • 0

#17
Niter

Niter
  • Случайный прохожий
  • 1 сообщений
Проблема может быть в кодировке (кодировка исходника должна быть dos-866, т.к. читает с консоли).
Или такой код:

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

  • 0

#18
Византиец

Византиец
  • Постоялец
  • 355 сообщений

блин. вот туплю ;)
ведь, как было сказано, 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

  • 0

#19
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Последний ответ (Византиец) наиболее близок к истине. Действительно, если сделать проверки с явным приведением к типу unsigned char, то есть
...
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

  • 0

#20
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
Так выглядит реальная работа программы с первоначальным листингом (для наглядности добавлено лишь приглашение "Введите символ") - но только после явного приведения к типу в операторах проверки (if ch == (unsigned char)'А' или (unsigned char)'Я').

Изображение


Сообщение отредактировал Visual1: 07.06.2006, 23:07:38

  • 0


Количество пользователей, читающих эту тему: 1

пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.