Wyliczenie poszczegolnych zasad C#

0

Mam problem z zadaniem.

1.Mając tekst reprezentujący łańcuch DNA w postaci:

string s = "AGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAA";

Oblicz ile razy występują w nim poszczególne zasady tj.

A - adenina
C - cytozyna
G - guanina
T - tymina

Wynik wypisz na konsolę.

  static void Main(string[] args)
        {
            string s = "AGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAA";

            int a = 0;
            int g = 0;
            int t = 0;
            int c = 0;


            Console.WriteLine($"adenozyna={a}");

W jaki sposob moge to sprawdzic lub moglby ktos podpowiedziec co moglabym doczytac, zeby zrobic to zadanie?

0

Tu masz pokazane:
https://stackoverflow.com/questions/28826110/count-a-specific-letter-in-a-string
Możesz topornie jakąś pętlą, możesz jakieś fajne LINQ itp itd.

1

np tak:

var count=s.Where(d => d == 'A').Count() // zlicza A
9
foreach (var g in s.GroupBy(o => o))
   Console.WriteLine($"Litera {g.Key} pojawiła się {g.Count()} razy.");
0
Word = "CCTTAA";
int count_c = 0;
int count_a = 0;
  int count_t = 0;
int count_g = 0;
public static int Wyliczenie_Cytozyny{

char countableLetter_c;
    

    foreach (char c in word)
    {
        countableLetter_c = 'c';
        if(countableLetter_c == c)
           count_c++;
    }
countableLetter_c = "";
    return count_c;


}
public static int Wyliczenie_Adeniny{
char countableLetter_a;
    
    foreach (char a in word)
    {
countableLetter_a = 'a';
        if(countableLetter_a == a)
           count_a++;
    }
countableLetter_a = "";
    return count_a;


}
public static Wyliczenie_guniny{
char countableLetter_g;
    
    foreach (char g in word)
    {
countableLetter_g = 'g';
        if(countableLetter_g == g)
           count_t++;
    }
countableLetter_g = "";
    return count_g;


}
public static void Wyliczenie_Tyminy(string word){
char countableLetter_t;
  
    foreach (char t in word)
    {
countableLetter_t = 't';
        if(countableLetter_t == t)
           count++;
    }
countableLetter_t = "";
    return count_t;



}
static void Main(string[] args)
  {
Console.WriteLine("W kodzie dna wykryto {0} zasad cytozyny",count_c);
Console.WriteLine("W kodzie dna wykryto {0} jednostek adeniny",count_a);
Console.WriteLine("W kodzie dna wykryto {0} jednostek guaniny",count_g);
Console.WriteLine("W kodzie dna wykryto {0} jednostek tyminy",count_t);
 }

zmienną string Word zmień na swoją
Możesz wywoływać metody w razie potrzeby

Pozdrawiam @Mondonno:
:)

5

Widze ze koledzy w LINQ ci napisali ale jak zadajesz prosty problem do rozwiazania na forum znaczy ze jestes poczatkujacy. Ja zaproponuje rozwiazanie z forem (mozna na foreacha zamienic) i swtichem. Nie wiem czy to funkcyjnie pisac ale jak klas nie znasz i nie masz wymogu funkcji to lecimy w mainie


static void Main(string[] args)
  {
string s = "AGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAA";
            s = s.ToUpper(); //zabezpiecznie gdyby w stirngu jakas litera byla mala :) 
            int a, g, t, c;
            a = g = t = c = 0;

            for(var i = 0; i < s.Length; ++i)
            {
                switch (s[i])
                {
                    case 'A':
                        a++;
                        break;
                    case 'G':
                        g++;
                        break;
                    case 'T':
                        t++;
                        break;
                    case 'C':
                        c++;
                        break;
                }
            }
            Console.WriteLine("W kodzie dna wykryto {0} zasad cytozyny", c);
            Console.WriteLine("W kodzie dna wykryto {0} jednostek adeniny", a);
            Console.WriteLine("W kodzie dna wykryto {0} jednostek guaniny", g);
            Console.WriteLine("W kodzie dna wykryto {0} jednostek tyminy", t);
 }
```
Mozna switacha na ify zamienic ale wedlug mnie tutaj idealnie switch pasuje :D mniej kodu i czytelniejsze od  duzej ilosci ifow ;). Oczywiscie najkrotsze i chyba najszybsze roziwazanie przedstawil @kzkzg, natomiast jak dla mnie roziwazzanie od @Mondonno to przerost formy nad trescia w dodatku potrzebuje 4 iteracji po stringu.
3

Bez używania LINQ też fajnie można to zrobić za pomocą słownika:

var dna = "AGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAAAGTTCGGACTTCCAA";
var result = new Dictionary<char, int> { { 'A', 0 }, { 'C', 0 }, { 'G', 0 }, { 'T', 0 } };

foreach (var nucleobase in dna)
{
    result[nucleobase]++;
}

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