Funkcja licząca wielkie litery, małe litery oraz spacje w tekście

0

Cześć. Mam problem, aby mój program przeszedł pomyślnie wszystkie testy maszynowe. Miałem za zadanie napisać program następującej treści:

Napisz funkcję liczącą wielkie litery, małe litery oraz spacje w tekście. Wyniki (trzy wartości typu całkowitego) powinny być zwracane przez funkcję poprzez wskaźniki do zmiennych docelowych, przekazywanych w liście parametrów wywołania funkcji. Prototyp funkcji powinien wyglądać następująco:

int marks_counter(const char* text, int* uppercase, int* lowercase, int* whitespace);

Parametry:

text - wskaźnik na tablicę typu char,

uppercase, lowercase - wskaźniki na zmienne typu int, do których ma zostać zapisana liczba znalezionych dużych i małych znaków, odnalezionych w tekście text,

whitespace - wskaźnik na zmienną typu int, do której ma zostać zapisana liczba znalezionych białych znaków.

Wartość zwrócona:

1 - gdy obliczenia zakończyły się sukcesem,

-1 - w przypadku, kiedy jest problem z parametrem text,

-2 - w przypadku, wystąpienia problemów z pozostałymi parametrami.

Napisz program, który przetestuje przygotowaną przez Ciebie funkcję na następującym tekście:

const char* t1 = "Ala Ma Kota a kot Ma AlE";

Program powinien wyświetlić w jednej linii, oddzielone spacjami, liczbę wielkich i małych liter oraz białych znaków.

Uwaga! W programie nie wolno używać operatora [].

Mój kompletny kod programu, który działa poprawnie:

#include <stdio.h>
#include <stdlib.h>

int marks_counter(const char* text, int* uppercase, int* lowercase, int* whitespace);

int main()
{
    const char* t1 = "Ala Ma Kota a kot Ma AlE";

    int uppercase = 0;
    int *p_uppercase = &uppercase;
    int lowercase = 0;
    int *p_lowercase = &lowercase;
    int whitespace = 0;
    int *p_whitespace = &whitespace;

    marks_counter(t1, p_uppercase, p_lowercase, p_whitespace);
    return 0;
}

int marks_counter(const char* text, int* uppercase, int* lowercase, int* whitespace){
    int low = 0;
    int up = 0;
    int wh = 0;

    if (text == NULL)
    {
        return -1;
    }

    if (uppercase == NULL || lowercase == NULL || whitespace == NULL)
    {
        return -2;
    }

    else{

     while (*text != '\0') {

            if (*text >= 'a' && *text <= 'z'){
                low++;
                *lowercase = low;
            }
            if (*text >= 'A' && *text <= 'Z'){
                up++;
                *uppercase = up;
            }
            if (*text == ' '){
                wh++;
                *whitespace = wh;
            }
            (text++);

    }
    printf("%d %d %d", *uppercase, *lowercase, *whitespace);
    return 1;
    }

}

I tutaj pojawia się właśnie problem, bowiem program nie przechodzi trzech ostatnich testów maszynowych. Dlaczego? Coś sknociłem z warunkami zabezpieczającymi funkcję?
Poniżej wyniki testów:

TEST [1]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(test_array, &l_odp_array[0], &l_odp_array[1], &l_odp_array[2]) == 1⏎
3 47 7Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [2]: Sprawdzanie czy funkcja zwraca poprawną ilosc duzych liter⏎
Wywołanie: test_is_equal(odp_array[0], l_odp_array[0]) == 1⏎
Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [3]: Sprawdzanie czy funkcja zwraca poprawną ilosc malych liter⏎
Wywołanie: test_is_equal(odp_array[1], l_odp_array[1]) == 1⏎
Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [4]: Sprawdzanie czy funkcja zwraca poprawną ilosc spacji⏎
Wywołanie: test_is_equal(odp_array[2], l_odp_array[2]) == 1⏎
Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [5]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(e_char_array, &l_odp_array[0], &l_odp_array[1], &l_odp_array[2]) == -1⏎
Wartość zwrócona: -1; oczekiwana: -1. Wynik: SUKCES⏎
⏎
TEST [6]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(test_array, e_array, &l_odp_array[1], &l_odp_array[2]) == -2⏎
Wartość zwrócona: -2; oczekiwana: -2. Wynik: SUKCES⏎
⏎
TEST [7]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(test_array, &l_odp_array[1], e_array, &l_odp_array[2]) == -2⏎
Wartość zwrócona: -2; oczekiwana: -2. Wynik: SUKCES⏎
⏎
TEST [8]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(test_array, &l_odp_array[1], &l_odp_array[1], e_array) == -2⏎
Wartość zwrócona: -2; oczekiwana: -2. Wynik: SUKCES⏎
⏎
TEST [9]: Sprawdzanie czy funkcja zwraca poprawną wartosc⏎
Wywołanie: marks_counter(nope, &l_odp_array[0], &l_odp_array[1], &l_odp_array[2]) == 1⏎
3 47 7Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [10]: Sprawdzanie czy funkcja zwraca poprawną ilosc duzych liter⏎
Wywołanie: test_is_equal(l_odp_array[0], 0) == 1⏎
Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎
⏎
TEST [11]: Sprawdzanie czy funkcja zwraca poprawną ilosc malych liter⏎
Wywołanie: test_is_equal(l_odp_array[1], 0) == 1⏎
Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎
⏎
TEST [12]: Sprawdzanie czy funkcja zwraca poprawną ilosc spacji⏎
Wywołanie: test_is_equal(l_odp_array[2], 0) == 1⏎
Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎
2

Przekombinowałeś trochę tę funkcję - nie potrzebujesz w niej zmiennych lokalnych, tego ogromnego else if oraz printf (po coś przecież ma te parametry, prawda?) - w takiej wersji znacznie prościej się to analizuje:

int marks_counter(const char* text, int* uppercase, int* lowercase, int* whitespace){
  if (text == NULL) {
    return -1;
  }
 
  if (uppercase == NULL || lowercase == NULL || whitespace == NULL) {
    return -2;
  }

  *uppercase = 0;
  *lowercase = 0;
  *whitespace = 0;
  
  while (*text) {
    if (*text >= 'a' && *text <= 'z') {
      *lowercase++;
    }

    if (*text >= 'A' && *text <= 'Z') {
      *uppercase++;
    }

    if (*text == ' ') {
      *whitespace++;
    }

    text++;
  }

  return 1;
}

Patrząc teraz zdaje się, że wszystko jest z nią w porządku - o co chodzi z tym, że w logach masz Wywołanie: test_is_equal(l_odp_array[0], 0) == 1? Jak to rozumieć?

0

@Patryk27: to jest funkcja z maszynowego testu jednostkowego. Nie jest to moja funkcja, dla mojej funkcji wszystkie testy jednostkowe przechodzą pozytywnie. Udało mi się dokopać do czegoś takiego:

int test_is_equal(int a, int b);

char test_array[1010];
    test_load_char_array(test_array);

    int odp_array[3];
    int l_odp_array[3] = {1};
    test_load_int_array(odp_array);

    char* e_char_array = NULL;
    int* e_array = NULL;

    char* nope = "";

    printf("\n%s\n\n", test_array);

Nie mogę tego rozpracować dlaczego taka funkcja występuję w tym teście jednostkowym i co ważniejsze dlaczego mój program jej nie przechodzi.

1

@Patryk27: rozwiązałem problem. W sumie to dzięki Tobie. Okazało się, że testy maszynowe zwracały błędy, bo...tego wynikowego printf'a miałem na końcu mojej funkcji, która zliczała znaki, a nie w funkcji głównej programu.

Tak z ciekawości. To jest faktycznie "błąd" programistyczny, że printf'uje na końcu mojej funkcji marks_counter, a nie w mainie pod linijką wywołania uprzednio funkcji?

2

Tak, to jest błąd. Czy wyobrażasz sobie, że że wywołujesz double x = sin(22.0/7) a ta funkcja wypisuje ci coś na ekran?

0

Ok, to wszystko jasne. Zapamiętam na przyszłość. Dziękuję! ;)

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