Премини към съдържанието

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

frozener

Проблемче със switch

Препоръчан отговор


Извинявам се за глупавия въпрос, но никъде нищо не намерих в нета и в книгата ми. Защо като сложа това

case "\t": t++;
ми дава следната грешка:

case label doesn't reduce to an integer constant
но като сложа единични кавички всичко върви ?

case '\t': t++;

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами съобщението си е съвсем ясно. switch работи само с типове, които могат да се превърнат директно към цяло число. Единичните кавички означават константа от тип char - който си е цяло число, а двойните константа от тип char[], тоест низ. Очевидно второто не може да се превърне директно в int.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ами съобщението си е съвсем ясно. switch работи само с типове, които могат да се превърнат директно към цяло число. Единичните кавички означават константа от тип char - който си е цяло число, а двойните константа от тип char[], тоест низ. Очевидно второто не може да се превърне директно в int.

не го знаех, мерси. Но видях преимуществото на шел скриптовете в този случай :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

не го знаех, мерси. Но видях преимуществото на шел скриптовете в този случай :)

Всеки с вкуса си. Едно нещо работи ли с 50 типа, значи може 50 пъти да го сбъркаш. В т'ва отношение, евала на Haskell - там ако една функция иска float, даже int не можеш да и дадеш :D .

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Всеки с вкуса си. Едно нещо работи ли с 50 типа, значи може 50 пъти да го сбъркаш. В т'ва отношение, евала на Haskell - там ако една функция иска float, даже int не можеш да и дадеш :D .

то явно за това в корн шел има само един тип променливи и конверсията се прави в движение, макар че аз предпочитам да си ги разделям и да си ги проверявам :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хъм, само малко допълнение - за цвят! В .NET switch стеймънта работи върху всякакви типове с условието case константата да е от същия тип като променливата която сравняваме (допуска се и промотване). Удобство. Също така всеки case/default или група case-ове прябва да имат brake стейтмънт. И да искаш не може да се оакаш с такава конструкция :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хъм, само малко допълнение - за цвят! В .NET switch стеймънта работи върху всякакви типове с условието case константата да е от същия тип като променливата която сравняваме (допуска се и промотване). Удобство. Също така всеки case/default или група case-ове прябва да имат brake стейтмънт. И да искаш не може да се оакаш с такава конструкция :)

То C# съдържа C в името си само за реклама...

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хахаха. Това е приказка от кораджия. Но, лошо няма. Ако C++ e хубост, то C# е красота :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Хахаха. Това е приказка от кораджия. Но, лошо няма. Ако C++ e хубост, то C# е красота :)

:wink12: Е, не съм казал аз, че много на хубаво, не е на хубаво :tongue2:

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Недей така, не всяка красавица е невярна жена :) Един рефлекшън само какво струва а? :)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

А как ще стане подобна програмка на C++ ? getline(); и cin не ми вършат работа.

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char str[100];
    int s,t;
    s = 0;
    t = 0;
    cout << "Enter a string: " << endl;
    cin >> str;
    for(int i=0;i<strlen(str);i++)
    {
	    switch(str[i])
	    {
		    case ' ': s++;
		    break;
		    case '\t': t++;
		    break;
	    }
    }
    cout << "Spaces: "<< s << "" << t << endl;

    return 0;
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

А защо не може да ползваш getline?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Защото ми трябва стринг и ми дава грешка.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Разбрах сега. Ти опитваш да ползваш функцията getline, която е част от библиoteката string. Това, което аз предлагах е метода getline от класа istream, в частност cin. т.е:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
	char str[100];
	int s,t;
	s = 0;
	t = 0;
	cout << "Enter a string: " << endl;
	cin.getline(str, 100);
	for(int i=0;i<strlen(str);i++)
	{
			switch(str[i])
			{
					case ' ': s++;
					break;
					case '\t': t++;
					break;
			}
	}
	cout << "String"<<str<<"Spaces: "<< s << " " << t << endl;
	return 0;
}

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Много благодаря !!!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.