Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2016, 00:35   #1
blessed
 
Регистрация: 02.08.2012
Сообщений: 4
По умолчанию Грег Перри. Покер с обменом

Извините друзья. Ни одного программиста в знакомых нет. Изучаю Си по книге Грега Перри (Программирование на Си для начинающих), ну наверно многие её читали в начале пути.
Ну не только по ней конечно, но у него в конце книги есть итоговая программа: Покер с обменом. Там много странного для меня. Но вот уже последние волосы выдрал по поводу вот такого куска кода:
Код:
//Функция, заменяющая целочисленный номер номинала карты на букву
	char getRank(int rank)
	{
		switch (rank)
		{
		case 0:
			return ('T');
		case 1:
			return ('2');
		case 2:
			return ('3');
		case 3:
			return ('4');
		case 4:
			return ('5');
		case 5:
			return ('6');
		case 6:
			return ('7');
		case 7:
			return ('8');
		case 8:
			return ('9');
		case 9:
			return ('10');
		case 10:
			return ('В');
		case 11:
			return ('Д');
		case 12:
			return ('К');
		
		}
	}
Это ерундовый свич, который числам, полученным из генератора случайных чисел, назначает обычные имена карт. Этот свич находится в функции которая возвращает тип char, и девятому кейсу он назначает символ '10'. Я целый день голову ломаю, в какой таблице он нашел символ цифры 10. Это же два символа 1 и 0. Они в один char вообще не поместятся.
Скажите, я чего-то не догоняю или в книге ошибка?
Заранее спасибо!
blessed вне форума Ответить с цитированием
Старый 04.01.2016, 00:55   #2
koljsch
Форумчанин
 
Регистрация: 26.01.2009
Сообщений: 360
По умолчанию

А в чем собственно вопрос?
Вернет символ 0. Может автор для наглядности написал 10
koljsch вне форума Ответить с цитированием
Старый 04.01.2016, 09:49   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
я чего-то не догоняю или в книге ошибка?
Ты не догоняешь. Недогоняешь тот факт, что эту книгу читать не стоит, раз автор там такое написал.
Бери другую. Нормальную, где научат как пользоваться массивами. Тогда программа сможет сократиться в такое:
Код:
string getRank(int rank){
 string cards[15]={"","","2","3","4","5","6","7","8","9","10","В","Д","К","Т"};
 if(rank>=0 && rank<15) return cards[rank];
 else return "";
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.01.2016, 11:48   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Виталий, про туза забыли.

Вопрос в другом был.
Как в функции, возвращающей char можно вернуть '10' ?!
не проверял, но, на мой взгляд, это не должно даже скопилироваться,
в C# на ... '10' будет ошибка - в один символ нельзя записать два символа.

и да, выход в использовании типа String вместо char
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.01.2016, 14:03   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Виталий, про туза забыли.
Не забыл. Он последний в массиве.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.01.2016, 11:56   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не забыл. Он последний в массиве.
хм.. а не кажется, что не будет соответствовать исходной функции?
напоминаю:
Цитата:
Код:
switch (rank)
	{
	case 0:
		return ('T');
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.01.2016, 12:28   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да я жеж просто пример дал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.01.2016, 18:45   #8
blessed
 
Регистрация: 02.08.2012
Сообщений: 4
По умолчанию

Большое спасибо, ребят за помощь. Просто не был уверен, что прав. Нашел там еще как минимум пару косяков в коде в других главах. Книгу пустил на растопку под шашлык. Написал соответствующий отзыв на Ozon, но он модерацию походу не прошел. Им же нужно этот хлам как-то людям продолжать продавать.
Продолжаю грызть науку по Стивену Прата.
Просто, человек начинающий изучать программирование, он же как слепой ребенок-инвалид. Его везде за ручку водить нужно. А тут такая подстава в красивой и дорогой книжке.

И вот еще вы указали тип string здесь:
Код:
string getRank(int rank){
 string cards[15]={"","","2","3","4","5","6","7","8","9","10","В","Д","К","Т"};
 if(rank>=0 && rank<15) return cards[rank];
 else return "";
}
А я читал, что в Си типа string нет. И все строки - это массивы типа char.
Или это из С++ ?
Извиняюсь. Я пока что в глухом лесу по этой теме.

Последний раз редактировалось blessed; 05.01.2016 в 20:21.
blessed вне форума Ответить с цитированием
Старый 05.01.2016, 21:29   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Или это из С++ ?
Да, это плюсики. Ну а чего нет? Нонче на дворе -20 и... XXI век :P
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2022, 17:00   #10
HolYPrgrMR
Новичок
Джуниор
 
Регистрация: 13.09.2022
Сообщений: 2
По умолчанию

Книгу Перри 'Программирование на Си для начинающих' может и не нужно читать, но.. раз уж две трети освоил, - таки добью..)
Такое дело: в этой книге еще и ошибки присутствуют почти во всех примерах.. но у меня возникло впечатление, что присутствуют они там намеренно..;0) И код лишний раз рассмотришь, и получишь толику уверенности после успешного "разбора" - строго имхо.
Последний пример (из главы 23) - неверно осуществляется поиск в отсортированном списке, а всё потому, что вместо выражения:
Код:
tempID = custID[inner];
custID[inner] = custID[outer];
custID[outer] = tempID;
tempBal = custBal[inner];
custBal[inner] = custBal[outer];
custBal[outer] = tempBal;
в книге прописан такой вот "огрызок":
Код:
tempID = custID[inner];
tempBal = custBal[inner];
custID[inner] = custID[outer];
custBal[outer ] = tempBal;
HolYPrgrMR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать пошаговые сортировки обменом (на Delphi) Heart* Помощь студентам 10 21.05.2013 13:32
Упорядочивание массива простым обменом A_Orlov Паскаль, Turbo Pascal, PascalABC.NET 1 09.06.2010 23:09
Сортировка простым обменом Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.10.2009 11:58
Грег Харвей Excel 2002 для чайников Natusya Microsoft Office Excel 2 24.11.2007 17:18