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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2009, 15:14   #1
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
Вопрос Оптимизация кода в си

Как то громоздко выходит.... как-нить можно запись сократить?
Код:
#include <stdio.h>

main()
{
int a;
int sum;
int k;
sum=1;
printf("%s\n","Введите число от 1 до 36");
scanf("%d",&a);

if (a==1)
{printf("%s\n","Шестерка черви");
k=6;}
if (a==2)
{printf("%s\n","Семерка черви");
k=7;}
if (a==3)
{printf("%s\n","Восмерка черви");
k=8;}
if (a==4)
{printf("%s\n","Девятка черви");
k=9;}
if (a==5)
{printf("%s\n","Десятка черви");
k=10;}
if (a==6)
{printf("%s\n","Валет черви");
k=2;}
if (a==7)
{printf("%s\n","Дама черви");
k=3;}
if (a==8)
{printf("%s\n","Король черви");
k=4;}
if (a==9)
{
printf("%s\n","Туз черви");
if (sum>11)
k=1;
else
k=11;
}
if (a==10)
{printf("%s\n","Шестерка пики");
k=6;}
if (a==11)
{printf("%s\n","Семерка пики");
k=7;}
if (a==12)
{printf("%s\n","Восмерка пики");
k=8;}
if (a==13)
{printf("%s\n","Девятка пики");4)                                                                                       
k=9;}
if (a==14)
{printf("%s\n","Десятка пики"););
k=10;}
if (a==15)
{printf("%s\n","Валет пики");
k=2;}
if (a==16)
{printf("%s\n","Дама пики");
k=3;}
if (a==17)
{printf("%s\n","Король пики");
k=4;}
if (a==18)
{
printf("%s\n","Туз пики");
if (sum>11)
k=1;
else
k=11;
}
if (a==19)
{printf("%s\n","Шестерка крести");
k=6;}
if (a==20)
{printf("%s\n","Семерка крести");
k=7;}
if (a==21)
{printf("%s\n","Восмерка крести");
k=8;}
if (a==22)
{printf("%s\n","Девятка крести");
k=9;}
if (a==23)
{printf("%s\n","Десятка крести");
k=10;}
if (a==24)
{printf("%s\n","Валет крести");
k=2;}
if (a==25)
{printf("%s\n","Дама крести");
k=3;}
if (a==26)
{printf("%s\n","Король крести");
k=4;}
if (a==27)
{
printf("%s\n","Туз крести");
if (sum>11)
k=1;
else
k=11;
}
if(a==28)
{printf("%s\n","Шестерка буби");
k=6;}
if (a==29)
{printf("%s\n","Семерка буби");
k=7;}
if (a==30)
{printf("%s\n","Восмерка буби");
k=8;}
if (a==31)
{printf("%s\n","Девятка буби");
k=9;}
if (a==32)
{printf("%s\n","Десятка буби");
k=10;}
if (a==33)
{printf("%s\n","Валет буби");
k=2;}
if (a==34)
{printf("%s\n","Дама буби");
k=3;}
if (a==35)
{printf("%s\n","Король буби");
k=4;}
if (a==36)
{
printf("%s\n","Туз буби");
if (sum>11)
k=1;
else
k=11;
}
printf("%s%d\n","k=",k);
}

Последний раз редактировалось dampirik; 04.07.2009 в 15:28.
dampirik вне форума Ответить с цитированием
Старый 05.07.2009, 03:52   #2
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Если надо выводить какие-то символы, то их можно вписывать в саму строку формата. Вместо
Код:
printf("%s%d\n","k=",k);
можно написать
Код:
printf("k=%d\n", k);
Переменную sum я убрал, т.к. она нигде не изменяется кроме строки
Код:
sum=1;
Если надо - вернешь(как я понял, программа не доделана).
Вот сам код:
Код:
#include <stdio.h>
#include <math.h>
char strs1[9][9] = {
   "Шестерка",
   "Семерка",
   "Восмерка",
   "Девятка",
   "Десятка",
   "Валет",
   "Дама",
   "Король",
   "Туз"
};
char strs2[4][9] = {
   "черви",
   "пики",
   "крести",
   "буби"
};
int a, k;
int delta[9] = { 6, 7, 8, 9, 10, 2, 3, 4, 11 };
int main() {
   printf("Введите число от 1 до 36\n");
   scanf("%d", &a);
   printf("%s %s\n", strs1[(a - 1) % 9], strs2[(int)floor((double)a / 9)]);
   k = delta[(a - 1) % 9];
   printf("k=%d\n", k);
   return 0;
}

Последний раз редактировалось megachuhancer; 05.07.2009 в 04:01.
megachuhancer вне форума Ответить с цитированием
Старый 05.07.2009, 09:10   #3
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Спасибо, пошел анализировать)

Хм .. вот только это вот не понял...
[CODE]strs2[(int)floor((double)a / 9)]); и ошибки идут от floor...пойду разбираться)
спасибо за идею
вроде так работает
printf("%s %s\n", strs1[(a - 1) % 9], strs2[(a - 1) % 4]); спасибо)

Последний раз редактировалось Stilet; 06.07.2009 в 10:51.
dampirik вне форума Ответить с цитированием
Старый 06.07.2009, 09:42   #4
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

По ходу strs2[(a - 1) % 4] не будет правильно работать, т.к. например, при a == 12 должна быть "восьмерка пики", а у тебя получается "восьмерка буби".

Я же перепутал floor с ceil.

Если сохранить нумерацию исходной программы, то тогда карты одной масти расположены компактно подряд. Можно было бы написать strs2[a / 9], но тогда некорректно бы обрабатывались случаи, когда (a % 9) == 0. А так должно быть нормально. ceil(7 / 9) == 1. Отнимаем 1, получаем 0("черви"). ceil(9 / 9) == 1. Отнимаем 1, получаем 0("черви"). ceil(10 / 9) == 2. Отнимаем 1, получаем 1("пики").

Как вариант, можно не отнимать 1, а добавить в качестве первого элемента strs2 пустую строку.

А лучше вообще не париться и написать (a - 1) / 9.

Таким образом, сейчас у меня 3 варианта:
1) (int)ceil((double)a / 9) - 1
2) (int)ceil((double)a / 9) (надо добавить пустую строку в начале strs2)
3) (a - 1) / 9

Последний раз редактировалось megachuhancer; 06.07.2009 в 11:25.
megachuhancer вне форума Ответить с цитированием
Старый 07.07.2009, 11:30   #5
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Благодарственную)
dampirik вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
ошибка!!! Fylhtq Паскаль, Turbo Pascal, PascalABC.NET 3 01.06.2009 16:04
Ошибка в Аfor i:=1 to SI do. Пишит что ошибка в SI Алексей_xXx Помощь студентам 2 29.05.2009 00:09
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44
ошибка ben95 Общие вопросы Delphi 5 06.02.2008 23:25