Wyliczenie poszczegolnych zasad C#

Odpowiedz Nowy wątek
2019-08-07 14:15
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?

edytowany 1x, ostatnio: Ktos, 2019-08-07 16:49
Jeszcze żaden wątek tutaj nie miał tak zaskakującego tytułu. :D - somekind 2019-08-08 01:39

Pozostało 580 znaków

2019-08-07 14:21
0

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

Pozostało 580 znaków

2019-08-07 14:21
1

np tak:

var count=s.Where(d => d == 'A').Count() // zlicza A
edytowany 1x, ostatnio: szydlak, 2019-08-07 14:22
Trochę krótszy zapis: var count = s.Count(d => d == 'A') - Burmistrz 2019-08-11 16:51

Pozostało 580 znaków

2019-08-07 15:37
9
foreach (var g in s.GroupBy(o => o))
   Console.WriteLine($"Litera {g.Key} pojawiła się {g.Count()} razy.");

Pozostało 580 znaków

2019-08-11 10:45
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:
:)


Często jestem w biegu więc nie liczcie że kod będzie idealny...
edytowany 6x, ostatnio: Mondonno, 2019-08-12 11:44
Pokaż pozostałe 20 komentarzy
@Akihito: Zdublowałęm ponieważ może se te metody wywoływać - Mondonno 2019-08-13 13:40
@Burmistrz: Niestety nie umiem już tego edytować, tak to bym poprawił... - Mondonno 2019-08-13 13:41
@Burmistrz: Wtedy gdy pisałem pisałem na szybko... - Mondonno 2019-08-13 13:43
@Akihito, @Burmistrz, @somekind eee tam narzekacie, na forum się kompiluje :-) - Aryman1983 2019-08-13 13:59
@Aryman1983: Jedyny który powiedział że kod powyżej się kompiluje... :) - Mondonno 2019-08-13 14:04

Pozostało 580 znaków

2019-08-12 13:10
4

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.

edytowany 2x, ostatnio: Akihito, 2019-08-12 13:16

Pozostało 580 znaków

2019-08-12 13:59
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]++;
}
Przynajmniej dopóki ktoś nie wstawi X do środka. ;) - somekind 2019-08-12 16:20
To wtedy np. coś takiego (jeśli trzeba zliczać różne śmieci): result[nucleobase] = result.ContainsKey(nucleobase) ? result[nucleobase] + 1 : 1;. - Burmistrz 2019-08-12 16:56

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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