Zmiana sposobu wprowadzenia tekstu źródłowego

0

Witam, mam do napisania program sortujący linie tekstu wzgledem malejacej wartosci kodu( max 80 znakow , max 50 wierszy ). Początkowo zrobilem go w sposob wczytujący plik tekstowy lecz wykladowca zażyczył sobie na ręczne wprowadzenie tekstu. Mam z tym lekki problem gdyż za każdym razem albo wyskakują błędy lub program przestaje działać. Poniżej jest jedna funkcja programu którą musze zmodyfikować, jestem początkującym więc prosze o wyrozumialość. Podobno sam początek wymaga zmiany a reszta funkcji może pozostać. Prosze o pomoc :(

#include <stdio.h>
#include <string.h>
FILE *wczytaj; //dla funkcji wczytujacych
typedef struct wiersz //zadefiniowanie struktury
{
    char slowo[81];
    int dlugosc;
    double wartosc_srednia;

};
struct wiersz tablica[50];
struct wiersz tymczasowa; // pomocnicza w sortowaniu


//Odczytywanie z pliku
int odczyt_z_pliku()
{

    int i,j=0, ile=0;
    char bufor[81];
    double suma;
    wczytaj = fopen("text.txt", "r");
    if (wczytaj == NULL)
        printf("Blad otwarcia pliku\n\n");
    else
    {
        while (fgets (bufor, 81, wczytaj))//obliczenie sredniej wartosci kodu dla każdego wiersza.
        {
            suma=0;
            ile++; // ilosc wierszu
            strcpy(tablica[j].slowo, bufor); //przypisanie znakow z bufora do struktury
            tablica[j].dlugosc=strlen(bufor); // przypisanie ilosci znakow strukturze
            for(i=0; i< tablica[j].dlugosc; i++)
            {
                if(bufor[i]!='\n' && bufor[i]!='\0') //dla prawidłowej ilosci znakow
                    suma+=(int) bufor[i];
            }
            tablica[j].wartosc_srednia=(suma/(tablica[j].dlugosc-1)); // przypisanie strukturze wartscoi sredniej kodu w wierszu
            j++;
        }
        printf("Plik zostal wczytany\n\n");
    }
    fclose(wczytaj);
    return ile;
}
 
0
 
#include <stdio.h>
#include <string.h>
typedef struct wiersz //zadefiniowanie struktury
{
    char slowo[81];
    int dlugosc;
    double wartosc_srednia;
 
} Wiersz; //teraz użycie typedef ma jakikolwiek sens, u ciebie było niepotrzebne
Wiersz tablica[50];
Wiersz tymczasowa; // pomocnicza w sortowaniu
 
 
//Odczytywanie z pliku
int odczyt_z_stdin()
{
 
    int i,j=0, ile=0;
    char bufor[81];
    double suma;
        while (gets (bufor))//obliczenie sredniej wartosci kodu dla każdego wiersza.
        {
            suma=0;
            ile++; // ilosc wierszu
            strcpy(tablica[j].slowo, bufor); //przypisanie znakow z bufora do struktury
            tablica[j].dlugosc=strlen(bufor); // przypisanie ilosci znakow strukturze
            for(i=0; i< tablica[j].dlugosc; i++)
            {
                if(bufor[i]!='\n' && bufor[i]!='\0') //dla prawidłowej ilosci znakow
                    suma+=(int) bufor[i];
            }
            tablica[j].wartosc_srednia=(suma/(tablica[j].dlugosc-1)); // przypisanie strukturze wartscoi sredniej kodu w wierszu
            j++;
        }
    return ile;
}


0

tylko teraz moge wprowadzać tekst w nieskończoność a po przekroczeniu 81 znaków wywala mi program ;/ , i czy gets rozróżni wystąpienie nowego wiersza?

0

W sumie racja, nie zwróciłem na to uwagi. To w takim razie użyj fgets tylko zamiast wskaźnika na plik, wpisz stdin i bedzie dobrze. Btw. zmienna ile też nie jest potrzebna. Wystarczy zwrócić zmienną j po skończeniu pętli.

0

ok dziękuje działa :) a mam ostatnie pytanie , teraz żeby przerwać pętle musze wcisnąć ctrl+z . Istnieje możliwość przerwania jej po wystąpieniu określonego znaku?

0

Tak, musisz tylko na początku pętli dodać coś w tym stylu:

 
if(strcmp(bufor, "koniec") == 0) //możesz sobie jakie chcesz słowo ustawić, jeden znak też
{
    break;
}

0

pomysł dobry ale nie działa mi to :( nic sie nie zmieniło

0

http://ideone.com/H8pu48 u mnie działa :P

0

przerób swoją funkcję w ten sposób:

int wczytajDaneZ(FILE *plik) {

i jedną funkcją załatwiasz zaróno plik i ręczne wprowadzanie:

File *plik = fopen("text.txt", "r");
if (plik == NULL) {
    printf("Blad otwarcia pliku\n\n");
} else {
    wynik = wczytajDaneZ(plik);
    fclose(wczytaj);
}

// albo z konsoli:
wynik = wczytajDaneZ(stdin);

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