Wyszukiwanie średniej w wyrazie

Wyszukiwanie średniej w wyrazie
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
0

Aby obliczyć średnią trzeba podzielić ilość znaków przez słowa. By odzielic słowa od wyrazu trzeba zliczyć spacje. Gdy zaliczam spacje pokazuje mi jedna tylko a nie wszystkie. Jak napisać by w wyrazie znaleźć ilość słów a później policzyć ta średnia? Kod poniżej. Czy można bez strtok? A jeśli trzeba z strtok jak to zrobić nie korzystając z tablic?

Kopiuj
#include <stdio.h>
int main (void)
{
  int a=0;
  char ilosc_liter=0;
  float wynik=0,b=0;
  printf("Wpisz zdanie: ");
  do{
  scanf("%c", &ilosc_liter);
  }while(ilosc_liter!='\n');
  do{
  b++;
  printf("Srednia dlugosc wyrazu wynosi:%.2f",b);
  }while(' '<ilosc_liter);
  
  return 0;
}
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
0
Kopiuj
#include <stdio.h>
int main ()
{
char znak= ' ';
int ilosc=0;
printf("Wpisz komunikat: ");
while(znak!= '\n')
do{
scanf("%c", &znak);
ilosc++;
}while(znak!='\n');
printf("liczba liter w zdaniu: %d\n", ilosc);
return 0;
}

Na razie mam ilość liter w zdaniu teraz chce ilość słów zliczyć?
I później podzielę ilość liter przez ilość słów.

RU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 552
1
Kopiuj
#include <stdio.h>

int main(void) {
    int a = 0;
    char ilosc_liter = 0;
    float wynik = 0, b = 0;

    printf("Wpisz zdanie: ");

    do {
        scanf("%c", &ilosc_liter);
        if (ilosc_liter == ' ') {
            a++;
        } else if (ilosc_liter != '\n') {
            b++;
        }
    } while (ilosc_liter != '\n');

    wynik = b / (a + 1);
    printf("Srednia dlugosc wyrazu wynosi: %.2f\n", wynik);

    return 0;
}
M9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 54
0

Zrobiłem na caseach też działa. Temat do zamknięcia. Dziekuje

lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5068
0

Nie ma problemu, jak napis zaczyna się, albo kończy spacją?

kaczus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Łódź
  • Postów: 1405
0
ruskaonuca napisał(a):
Kopiuj
#include <stdio.h>

int main(void) {
    int a = 0;
    char ilosc_liter = 0;
    float wynik = 0, b = 0;

    printf("Wpisz zdanie: ");

    do {
        scanf("%c", &ilosc_liter);
        if (ilosc_liter == ' ') {
            a++;
        } else if (ilosc_liter != '\n') {
            b++;
        }
    } while (ilosc_liter != '\n');

    wynik = b / (a + 1);
    printf("Srednia dlugosc wyrazu wynosi: %.2f\n", wynik);

    return 0;
}

Proste rozwiązanie działa w prostych przypadkach, problem pojawi się, gdy ktoś wpisze np 2 spacje jedna za drugą :) Ale to faktycznie warto zostawić pytającemu do rozważenia.

lion137 napisał(a):

Nie ma problemu, jak napis zaczyna się, albo kończy spacją?

albo jak ktoś wstawi 2 spacje pomiędzy wyrazami....

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
#include <stdio.h>
#include <string.h>

int main() {
    char s[256];
    size_t wordLenSum = 0;
    size_t wordCount = 0;
    while (scanf("%255s", s) == 1) {
        ++wordCount;
        wordLenSum += strlen(s);
    }
    printf("Average word length: %lg", wordLenSum / (double)wordCount);
}

https://godbolt.org/z/zc7qnr7r1

scanf, fscanf, sscanf, scanf_s, fscanf_s, sscanf_s - cppreference.com

Conversion specifier Explanation
s Matches a sequence of non-whitespace characters (a string).
- If width specifier is used, matches up to width or until the first whitespace character, whichever appears first.
- Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters).

.....

All conversion specifiers other than [, c, and n consume and discard all leading whitespace characters (determined as if by calling isspace) before attempting to parse the input. These consumed characters do not count towards the specified maximum field width.

brokenelevator
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 60
0
MarekR22 napisał(a):
Kopiuj
#include <stdio.h>
#include <string.h>

int main() {
    char s[256];
    size_t wordLenSum = 0;
    size_t wordCount = 0;
    while (scanf("%255s", s) == 1) {
        ++wordCount;
        wordLenSum += strlen(s);
    }
    printf("Average word length: %lg", wordLenSum / (double)wordCount);
}

Podoba mi się ten kod. Powinienem sam na to wpaść. Może być jednak kłopotliwy. Z pętli wyjdzie dopiero jak dostanie EOF. Poza tym jeśli na wejściu nie będzie słowa to będzie dzielić przez zero. Chyba że coś mi umyka.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0
brokenelevator napisał(a):

Podoba mi się ten kod. Powinienem sam na to wpaść. Może być jednak kłopotliwy. Z pętli wyjdzie dopiero jak dostanie EOF. Poza tym jeśli na wejściu nie będzie słowa to będzie dzielić przez zero. Chyba że coś mi umyka.

Wszystko racja.
Jednak zauważ, szczątkowy opis problemu. Właściwie trzeba się domyślać co autor miał na myśli.
Puste wejście (bez wyrazów) produkuje -nan https://godbolt.org/z/ThGPr9K6K

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.