LINUX.ORG.RU

Switch - помогите осилить в C

 , , вкурить,


0

4

Читаю книгу по C. Дошел до Switch. А тут в книге такой говянный пример приведен по работе с данным циклом, что просто пипец.

Лор, пожалуйста приведите простой пример использования switch.

P.S если правильно понял, то при введеном значении, это значение прогоняется по всему листу switch case: и как только оно совпадает, то происходит действие вложенное в case n:


Ответ на: комментарий от drBatty

ну давай схему на С том же...

Вероятно имелось в виду «SICP на С»? Ну так вперед, на Питоне же переписали, чем Си хуже?

korvin_ ★★★★★
()
Ответ на: комментарий от drBatty

А то, как ты наверное понял, от этих ваших академических ЯП меня тошнит.

А то ты за деревьями леса не увидел?

korvin_ ★★★★★
()
Ответ на: комментарий от anonymous

SICP — УЧЕБНИК ПО ПРОГРАММИРОВАНИЮ

Есть мнение, что SICP — это не учебник по программированию, а учебник по управлению сложностью программ.

С другой стороны, есть мнение, что управление сложностью — это самый важный аспект программирования. =)

korvin_ ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

многие не знают про эти возможности

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

drBatty ★★
()
Ответ на: комментарий от drBatty

я не говорил что нет, я думал что анон указывает на то что «нет»

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от korvin_

Вероятно имелось в виду «SICP на С»? Ну так вперед, на Питоне же переписали, чем Си хуже?

откуда мне знать? Так нету? Даже на JavaScript'е есть, а выходит На C не нужно? Может эта ваша SICP вообще не нужна?

drBatty ★★
()
Ответ на: комментарий от korvin_

Есть мнение, что SICP — это не учебник по программированию, а учебник по управлению сложностью программ.

есть мнение, что оторванные от жизни рассуждения теоретиков не нужны. Если на BrainFuck можно написать любую программу, это совсем не говорит о том, что так и надо поступать.

drBatty ★★
()
Ответ на: комментарий от Boy_from_Jungle

уже лет 5 точно есть, так что с разморозочкой)

однако наверняка есть и компиляторы, которые не в курсе. Для встроенки так наверное все ещё такие.

drBatty ★★
()
switch(буква) { 
case 'a' :
case 'е' : printf(" %d гласная\n", буква);
case 'с' :
case 'n' : printf(" %d в \" наборе саnе \" \n", буква);
default : printf(" Прекрасный день. \n");
}
Dron ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

А я тут мимо проходил. Слышу, что-то знакомое говорят. Прислушался - а какие-то слова новые. Вот и захотел узнать, что же в мире-то произошло, пока я в криокамере отлеживался.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em
	.file	"t.c"
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	"This is a number"
.LC1:
	.string	"This is space or tabulation"
.LC2:
	.string	"Unknown charachter"
	.section	.text.startup,"ax",@progbits
	.p2align 4,,15
	.globl	main
	.type	main, @function
main:
.LFB11:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$16, %esp
	cmpl	$57, 8(%ebp)
	jg	.L2
	cmpl	$48, 8(%ebp)
	jl	.L14
	movl	$.LC0, (%esp)
	call	puts
	jmp	.L5
.L14:
	cmpl	$9, 8(%ebp)
	jne	.L15
.L3:
	movl	$.LC1, (%esp)
	call	puts
.L2:
	movl	$.LC2, (%esp)
	call	puts
.L5:
	xorl	%eax, %eax
	leave
	.cfi_remember_state
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
.L15:
	.cfi_restore_state
	cmpl	$32, 8(%ebp)
	jne	.L2
	jmp	.L3
	.cfi_endproc
.LFE11:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.7.0"
	.section	.note.GNU-stack,"",@progbits
drBatty ★★
()
Ответ на: комментарий от drBatty

Пока вы тут быдлокодерили сборная России сделала чехов 4:1 :) УРА! Теперь сборная России фаворит чемпионата Европы!!!!

anonymous
()
Ответ на: комментарий от Boy_from_Jungle

Ну, если в сях сделают хрень вроде

switch(str){
  case "хрен знает что": do_something_with(str); break;
  case "непонятная фигня":
  case "еще какая-то фигня": send_user_to_asshole(); break;
  case "some english speach": tell_user_that_he_is_too_smart_for_this_dumb_program(); break;
}
то я даже не знаю, что делать буду… Придется, наверное, на ассемблер переходить.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от drBatty

Умно. Новые ассемблерные инструкции, все-таки, поражают иногда воображение! Это вам не под z80 игрульки придумывать…

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от drBatty

case '0'..'9':

это как?

Ох да, спасибо. Конечно же нужно так:

case '0'...'9'
Знаю, диапазоны не поддерживается в ISO C. Но очень удобно и от соблазна в данном случае не удержаться :)

HerrWeigel ★★★★
()
Ответ на: комментарий от ms-dos32

Почему же? Если это целесообразно, то почему бы и нет? Возможность очень удобная и глупо от неё отказываться. Отсутствие break я обычно комментирую, чтобы потом не пропустить.

А если глаза замылены, то надо идти спать.

HerrWeigel ★★★★
()
Ответ на: комментарий от Eddy_Em

Ну, если в сях сделают хрень вроде switch(str){

ну в принципе рабочий (быдло)код. Адрес имеет смысл как целое число.

drBatty ★★
()
Ответ на: комментарий от drBatty

Только там придется strcmp вызывать. А это уже не switch. Его элементарными ассемблерными конструкциями не реализовать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Только там придется strcmp вызывать.

зачем strcmp?

const char *str1 = "string1";
const char *str2 = "string2";
const char *str = str1;
switch (str) {
case str1: //...
case str2: //...
}

ведь внутренности константной строки не могут быть изменены, а значит нужно только адреса сравнивать. Если не взлетит, то

#define STR1 "string1"

drBatty ★★
()
Ответ на: комментарий от Eddy_Em

Только там придется strcmp вызывать. А это уже не switch

«switch» легко построить по первым символам - по сути тот же бинарный поиск, а strncmp уже только для финальной проверки

wota ★★
()

Небежало помогателей в Development, 3 страницы switch осиливают и скор колотят.

anonymous
()
Ответ на: Повезло вам от tiile

А я вот вообще закончил 3 курс и как видите ничерта не знаю, а нам и не вкуривали. Сейчас как раз пока лето надо успеть учиться.

У меня знакомый уже лет 10 учится, точнее пытается учиться, на программиста, сейчас, вроде как, на 4ом курсе ну и ничего не знает и ничего ему не надо.

Всё же, от человека зависит.

Sholy
()
Ответ на: Повезло вам от tiile

А я вот вообще закончил 3 курс и как видите ничерта не знаю

Ты не осилил загуглить примеры switch на С. Тебя надо выгонять пока диплом не получил, а не вкуривать тебе что-то.

anonymous
()

Погоди, вроде можно было сделать так:
switch(x)
{ case(1 || 2): ... }

ms-dos32
()
Ответ на: комментарий от drBatty

есть мнение, что оторванные от жизни рассуждения теоретиков не нужны. Если на BrainFuck можно написать любую программу, это совсем не говорит о том, что так и надо поступать.

Я и говорю: смотришь в книгу, видишь фигу.

korvin_ ★★★★★
()
Ответ на: комментарий от drBatty

Даже на JavaScript'е есть, а выходит На C не нужно? Может эта ваша SICP вообще не нужна?

Думаю ты найдешь много общего с dmfd.

korvin_ ★★★★★
()
Ответ на: комментарий от Licwin

Так, во первых, это код написан не по стандартам ANSI C, во-вторых, getch - функция из conio.h, исключительно виндовой библиотеки.

В третьих, писать printf(«имя_месяца») каждый case непрактично. Я сделал бы так:

#include <stdio.h>
int main( void )
{
 int num, month;
 static char* months[] = 
{ "January", "February", "March",
 "April", "May", "June",
 "July", "August", "September",
 "October", "November", "December" };

 printf("Enter the month's number (from 1 to 12): ");
 scanf("%i",&num);
 
switch(num)
{
  case (1):
   month = 1;
   break;
  case (2):
   month = 2;
   break;
  case (3):
   month = 3;
  break;
  case (4):
   month = 4;
  break;
  case (5):
   month = 5;
  break;
  case (6):
   month = 6;
  break;
  case (7):
   month = 7;
  break;
  case (8):
   month = 8;
  break;
  case (9):
   month = 9;
  break;
  case (10):
   month = 10;
  break;
  case (11):
   month = 11;
  break;
  case (12):
   month = 0;
   break;
}

printf("The next month is: %s\nPress Enter to continue...",months[month]);
getchar();

return 0;
}

Еще бы загнать эту длинную цепочку case в цикл... Но этого сделать нельзя, так как case требует константу как параметр, то есть

int x=0,y=0;
switch(y)
{
 case(x): ...
 }
выдаст ошибку, хотя если объявить x как const и инициализировать при объявлении, то его вполне можно будет использовать.

ms-dos32
()
Ответ на: комментарий от ms-dos32

Код вида 'case x: y = x' заставляет меня плакать. Не нужен тут ни switch, ни циклы:

#include <stdio.h>
#include <stdlib.h>

static const char *months[] = {
    "January", "February", "March",
    "April", "May", "June",
    "July", "August", "September",
    "October", "November", "December"
};

int main(void)
{
    int num;
    int ret = EXIT_SUCCESS;
        
    printf("Enter the number of the month (from 1 to 12): ");
    fflush(stdout);

    if(scanf("%d", &num) != 1 || num < 1 || num > 12)
    {
        fputs("Error: a number from 1 to 12 expected\n", stdout);
        ret = EXIT_FAILURE;
    }
    else
        printf("%02d => %s\n", num,  months[num - 1]);
    
    exit(ret);
}
theNamelessOne ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.