Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

Потребителска функция за сравнение на стрингове

Featured Replies

Здравейте, от известно време се мъча с написването на функция която да сравнява два стринга, символ по символ. В случай, че първите символи са еднакви се преминава към вторите, ако и те са еднакви към третите и т. н. Целта е да се използва тази функция за сортиране на масив от стрингове в case-sensitive order.

bool Comp(string s1, string s2)
{
	for (int i = 0; i < s1.length() && i < s2.length(); i++)
    	{
		if (s1[i] != s2[i])
      		{
       			if (s1[i] < s2[i])
            		return true;
     		}
  	}
  	return false;
}

static void main()
{ 
	string a[] = { "eggs", "Apple", "apple", "spaghetti" };
 	string temp;
   	for (int i=0; i<sizeof(a)-1; i++)
  	{
    		for (int j=i+1; j<sizeof(a); j++)
        	{
       			if (Comp(a[i], a[j]))
            		{
            			temp = a[i];
               			a[i] = a[j];
              			a[j] = temp;
           		}
         	}
    	}
    	for (int i = 0; i < sizeof(a); i++)
   			cout << a[i] << endl;
}
// извежда [ spaghetti apple Apple eggs ]
// трябва [Apple apple eggs spaghetti]

Търсих в google доста, но безуспешно, така че всякаква помощ би ми била от полза. Благодаря предварително! 

Редактирано от notorious19 (преглед на промените)

Защо функцията ти сравнява 2 стринга, а в main-а имаш масив от стрингове, а после правиш мешаница за достъп?

  • Автор
преди 25 минути, simtech написа:

Защо функцията ти сравнява 2 стринга, а в main-а имаш масив от стрингове, а после правиш мешаница за достъп?

Идеята е да се сортира този масив от стрингове в case-sensitive order, като за целта се използва тази функция, която ги сравнява символ по символ.

Ти за сортиращи алгоритми, например Метода на Мехурчето чувал ли си?
Можеш ли да ми обясниш как адресираш стринга(елементите му), който го разглеждаш като масив от знаци в самият стринг масив?

Редактирано от Гост (преглед на промените)

  • Автор
преди 16 минути, simtech написа:

Ти за сортиращи алгоритми, например Метода на Мехурчето чувал ли си?

Да, но задачата ми е да напиша такава функция която да сравнява стрингове символ по символ.

Така... Как достъпваш индекса на всеки елемент(буква от думата) на всяка дума(елемент от масива стринг)
Аз ли нещо или не виждам...

  • Автор
преди 13 минути, simtech написа:

Така... Как достъпваш индекса на всеки елемент(буква от думата) на всяка дума(елемент от масива стринг)
Аз ли нещо или не виждам...

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

String Масивът е масив. А самият string отново е масив от знаци.
Това става вече двумерен масив.
Трябва да направиш следното...
a[1][1] например ще означава първият елемент(дума), първият знак от нея.
Проблемът е, че начинът ти на достъп не е правилен.
Така че..трябва да сравняваш..
a[1][1] с а[2][1] Аз лично това бих го направил с CHAR.
За това те питах как правиш достъп.
Ти го правиш все едно е едномерен масив, а то не е.

Редактирано от Гост (преглед на промените)

A защо  го правим това? Като може просто да се използва функцията sort или без нея просто да се използват операторите за сравнение. Класът string поддържа сравнение и то е case-sensitive. Изискване от някой университет ли?

  • Автор

Да, от университета го изискват това да се напише тази функция, която ще сравнява два стринга символ по символ ( да се предефинира strcmp един вид). По този начин който съм дал пак работи и подрежда масива от стрингове, но не в правилния ред, защото явно някъде бъркам в кода.

Идеята ми е да се поддават по два стринга от масива към функцията и в нея да се прави посимволното сравнение на думите. В зависимост от резултата, който връща да се сортират тези думи в масива по ASCII код.

		static int comp(string s1, string s2)
        {
            int i1 = 0, i2 = 0;
            while ( (i1 < s1.Length) && (i2 < s2.Length) ) {
                if(Char.ToUpper(s1[i1]) != Char.ToUpper(s2[i2])) 
                    return (Char.ToUpper(s1[i1]) < Char.ToUpper(s2[i2])) ? -1 : 1;
                ++i1;
                ++i2;
            }
            int size1 = s1.Length, size2 = s2.Length;
            if (size1==size2)
                return 0;
            return (size1<size2) ? -1 : 1;
        }
        static void Main(string[] args)
        { 
            string[] a = { "eggs", "Apple", "apple", "Eggs", "spaghetti" };
            string temp;
            int n = a.Length;
            for (int j = 0; j < n - 1; j++)
            {
                for (int i = j + 1; i < n; i++)
                {
                    if (comp(a[j], a[i]) < 0)
                    {
                        temp = a[j];
                        a[j] = a[i];
                        a[i] = temp;
                    }
                }
            }
            for (int i = 0; i < a.Length; i++)
                Console.WriteLine(a[i]);
            Console.Read();
        }
        // трябва да извежда [Apple Eggs apple eggs spaghetti]
    }

 

  • Автор

На C# ми трябва по принцип, просто първоначално сметнах, че би било по-добре на C++ да споделя кода.

Оф. Винаги измислят някакви глупави задачи.

 static int Compare(string a, string b) {
        int length1 = a.Length;
        int length2 = b.Length;
        int minlength = length1 < length2 ? length1 : length2;
        
        for (int i = 0; i < minlength; i++)
        {
            int diff = a[i] - b[i];
            if (diff != 0) return diff;
        }
        return length1 - length2;
    }

    static void Bubblesort(string[] a)
    {
        int last = 0;
        int n = a.Length;
        while (n > 0) 
        {
            last = 0;
            for (int i = 0; i < n - 1; i++)
            {
                if (Compare(a[i], a[i + 1]) > 0)
                {
                    string t = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = t;
                    last = i + 1;
                }
            }
            n = last;
        }
    }

 

Редактирано от plamenbm86 (преглед на промените)

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

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

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    25%
    Дарени 252.69 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.