Zliczanie samogłosek w stringu.

0

Witam, od kilku dni próbuję usilnie napisać program zliczający samogłoski w stringu. Dostałem takie zadanie na kolokwium z programowania, i totalnie nie wiedziałem co robić. Treść zadania:

|Napisz program, który wczyta podany przez użytkownika ciąg znaków, a następnie zaimplementuj metodę, która zliczy liczbę znajdujących się w nim samogłosek. Wczytany ciąg znaków należy przekazać przez referencję do metody jako argument. Liczbę samogłosek należy zwrócić do funkcji main, gdzie zostanie ona wyświetlona na ekranie."

A to mój kod, który... nie działa :P Pomoże ktoś z tym? Jestem pewien, że będę miał takie zadanie na poprawce, więc chcę się przygotować :) dzięki!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Wpisz tekst: ");
            string tekst = Console.ReadLine();
            int licznik = liczsamo(ref tekst);
            Console.WriteLine("ilosc samoglosek w {0} wynosi {1}", tekst, licznik);
            Console.ReadLine();
        }
        public static int liczsamo(ref string tekst)
        {
            string[] samo1;
            samo1 = new string[] {"a", "e", "u", "y", "o", "i"};
            int licznik = 0;
            for (int i = 0; i < samo1.Length; i++)
            { 
               licznik++;
            }
            return licznik;                  
        }
            
    }
}
0

Funkcja liczsamo(ref string tekst) zawsze zwróci u Ciebie 6(ilość samogłosek z tablicy samo1), dlatego że po tej tablicy puszczasz pętle. Zauważ, że w ogóle nie uwzględniasz w definicji funkcji jej argumentu.

0

Tak, racja... Zastanawiam się tylko jak puścić pętle po wpisanym tekście przez użytkownika i to porównać do tablicy.... Jakieś pomysły?

Jeśli chodzi o przyjmowanie referencji, to też powodu nie widzę, ale gdy wywalę ref pojawia się błąd "The best overloaded method for ... has some invalid arguments"

Nie zrozumcie mnie źle... to początki z C# a do tego wykładowca tłumaczy tak, że nic wytłumaczy.... do wszystkiego trzeba samemu dochodzić ;/

0

Spróbuj napisać funkcję sprawdzającą, czy znak jest samogłoską, a potem dla każdego znaku wprowadzonego tekstu (czyt. w pętli) wywołać tą funkcję.

1
using System;
using System.Linq;

public class Test
{
	public static void Main()
	{
		string vovels = "aeuyoi";
		string input = Console.ReadLine();
		int vovelsCount = 
		   (from ch in input.ToLowerInvariant() 
			where vovels.Contains(ch)
			select ch).Count();
		
		Console.Write(vovelsCount);
	}
}

http://ideone.com/SijUww

2

Jeśli chcemy coś policzyć, nie musimy tego najpierw wyciągać. W zupełności wystarczy:

int vovelsCount = input.ToLowerInvariant().Count(c => vovels.Contains(c));
0

Dzięki za podpowiedzi, ale tego wykładowca raczej by nie uznał :) Koniecznie chciał przez referencję....

1
public static int liczSamo(string tekst)
{
    string[] samo1; = new string[] {"a", "e", "u", "y", "o", "i"};
    int licznik = 0;
    for (int i = 0; i < tekst.Length; ++i)
    { 
        if(jestSamo(tekst[i])) ++licznik;
    }
    return licznik;                  
}
 

Funkcję bool jestSamo(char znak) zostawiam dla Ciebie.

0

Dzięki, pomyślę jutro na świeżo nad tym.

0

Zamiast string vowels lepiej użyć HashSet<char> vowels będzie szybciej :)

0
lukashid napisał(a):
public static int liczSamo(string tekst)
{
    string[] samo1; = new string[] {"a", "e", "u", "y", "o", "i"};
    int licznik = 0;
    for (int i = 0; i < tekst.Length; ++i)
    { 
        if(jestSamo(tekst[i])) ++licznik;
    }
    return licznik;                  
}
 

Funkcję bool jestSamo(char znak) zostawiam dla Ciebie.

Wybacz, ale nie potrafię nic tutaj wykombinować - nigdy nie widziałem bool użytego w takiej składni, nie mogę też na ten temat nic znaleźć...

Zależy mi po prostu na tym, żeby wiedzieć jak wygląda poprawny kod dla tego zadania, co bym mógł sobie go przeanalizować i przyszłe zadania w tym typie rozwiązać bez problemów takich jak teraz. W sobotę piszę poprawkę, jeśli tego nie ogarnę do tego czasu, to może być ciężko :P

0

Zacząłem, próbowałeś ... to tym razem dokończę... Ale polecam poczytać nieco o funkcjach bo daleko tak nie pociągniesz. Ewidentne braki w teorii.

Próbując bazować na tym co napisałeś na początku :

bool jestSamo(char znak) {
   string samo1 = "aeuyoi"; //tutaj korzystam z tego, że string to tablica charów

   for(int i = 0; i < samo1.Length; i++)
   {
        if(samo1[i] == znak) return true;
   }
   return false;
}
0

Dzięki za pomoc!

Ja natomiast poszedłem trochę w innym kierunku i oto co wyszło :) (i działa!!!)

namespace Samogloski
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Podaj ciag znakow: ");
            string s1 = Console.ReadLine();
            int count = Samogloski(s1);
            Console.WriteLine("Ilosc samoglosek w ciagu '" + s1 + "' wynosi : " + count);
            Console.ReadKey();


        }


        private static int Samogloski(string str)
        {
            int count = 0;
            for (int i = 0; i < str.Length - 1; i++)
            {
                switch (str[i])
                {
                    case 'a':
                        count++;
                        break;


                    case 'A':
                        count++;
                        break;


                    case 'e':
                        count++;
                        break;


                    case 'E':
                        count++;
                        break;


                    case 'i':
                        count++;
                        break;


                    case 'I':
                        count++;
                        break;


                    case 'o':
                        count++;
                        break;


                    case 'O':
                        count++;
                        break;


                    case 'u':
                        count++;
                        break;


                    case 'U':
                        count++;
                        break;
                }  

            }  


            return count;
        }


    }
}
2

@markuspoland, no i generalnie zrobiłeś najlepiej, a na pewno najwydajniej ze wszystkich przedstawionych tutaj propozycji. Popracuj jeszcze nad nazewnictwem zmiennych, tak aby mówiły do czego służą, i metod, tak aby były wyrażeniami czasownikowymi, np. "LiczSamogloski", a nie rzeczownikami.
No i skoro we wszystkich case masz to samo, to nie potrzebujesz powielać tego kodu, wystarczy:

switch (str[i])
{
    case 'a':
    case 'A':
    case 'e':
    case 'E':
    case 'i':
    case 'I':
    case 'o':
    case 'O':
    case 'u':
    case 'U':
        count++;
        break;
}

No, a skoro tak, to i switch nie potrzebujesz, wystarczyłby if.

1 użytkowników online, w tym zalogowanych: 0, gości: 1