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

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

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


Здравейте, от известно време се мъча с написването на функция която да сравнява два стринга, символ по символ. В случай, че първите символи са еднакви се преминава към вторите, ако и те са еднакви към третите и т. н. Целта е да се използва тази функция за сортиране на масив от стрингове в 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, като за целта се използва тази функция, която ги сравнява символ по символ.

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


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

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

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

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


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

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

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


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


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

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

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


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

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

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

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


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

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

Редактирано от simtech (преглед на промените)
  • Харесва ми 1

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


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

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]
    }

 

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


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

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

 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 (преглед на промените)
  • Харесва ми 1

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


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

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход


×

Информация

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