logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program w C: zamiana małych liter na duże bez funkcji bibliotecznych

Orzech21 22 Lis 2005 23:27 2004 12
REKLAMA
  • #1 2017039
    Orzech21
    Poziom 11  
    Posty: 7
    Witam...

    Potzrebuje napisac program wczytujacy lancuch znakow, zamieniajacy wszystkie litery male w lancuchu na litery duze i wypisujacy lancuch wynikowy. program zrealizuj jako funkcje niekorzystajaca z funkcji bibliotecznych.

    mam juz cos takiego :

    #include<stdio.h>
    #include<string.h>
    int main()
    {
    char c1[100];
    char ch;
    int s,i;
    printf("Podaj ciag znakow:\n");
    gets(c1);
    s=strlen(c1);
    for (i = 0; i < s; i++) {
    ch = c1[i];
    if (((ch >= 'a') && (ch<= 'z')) || ((ch >= 'A') && (ch <='Z')) || ((ch>='0') && (ch<='9')))
    putch(ch);
    }
    return 0;
    }


    ale ona korzysta z funkcji bibiotecznych, nie mam pojecia jak to zrobic zeby nie korzystalo.

    czy ktos moze zna odpowiedz??

    Z gory bardzo dziekuje, prosze o szybka odpowiedz.

    pozdrawiam.

    orzech
  • REKLAMA
  • #2 2017140
    Caladan
    Poziom 19  
    Posty: 242
    Pomógł: 33
    Ocena: 3
    W jaki sposob nie chcesz korzystac z fkcji z bibliotek? Chcesz napisac wlasne wejscie/wyjscie? Co jest dokladnie potrzebne?

    Dodano po 3 [minuty]:

    W jaki sposob nie chcesz korzystac z fkcji z bibliotek? Chcesz napisac wlasne wejscie/wyjscie? Co jest dokladnie potrzebne? stlena chcesz zamienic?

    Bo w zasadzie tylko to mozna... wlasnego getca nei dasz rady napisac. A znow gets jest niebezpieczny :D Zaleca sie uzywanie fgetsa.
  • #3 2017162
    Orzech21
    Poziom 11  
    Posty: 7
    Ten program musi chyba korzystac z wej/wyj dowiedzialem sie ze cała filozofia programu:

    lwe - litera wejściowa (mała)
    lwy - litera wyjściowa (duża)

    lwy = lwe + ('A' - 'a');

    ale nie mam pojecia jak to zastosowac w tym programie.

    Jakies pomysly?
  • #4 2018205
    GrzesGrz71
    Poziom 19  
    Posty: 197
    Pomógł: 32
    Ocena: 4
    Witaj

    Być może źle zinterpretowałem intencje autora zadania - ale sądzę że chodziło mu o to żeby nie używać standardowych funkcji bibliotecznych np. tolower() , toupper() , isalpha() itd.
    Jeżeli faktycznie o to chodzi to po małej modyfikacji tego co podałeś w pierwszym poście powinno zaśmigać (przy dość ryzykownym założeniu że nie wystąpią błędy - bo program tego nie sprawdza! ) :

    #include<stdio.h>
    #include<string.h>

    void wypisz_duzymi_literami(char *s)
    {
    char ch;
    while(*s)
    {
    ch=*s;
    if((ch >= 'a') && (ch <= 'z') ) ch-=32;
    putchar(ch);
    s++;
    }
    }

    int main()
    {
    char c1[100];
    char ch;
    int s,i;

    printf("Podaj ciag znakow:\n");
    fgets(c1,100,stdin);
    wypisz_duzymi_literami(c1);
    return 0;
    }
  • REKLAMA
  • #5 2018565
    Orzech21
    Poziom 11  
    Posty: 7
    Wlasnie chyba o to chodzilo :) Dzieki sliczne. :)

    Pozdrawiam.
  • #6 2018985
    Sam Sung
    Poziom 33  
    Posty: 2025
    Pomógł: 227
    Ocena: 604
    Dodam tylko, że ten zapis, który podałeś:
    lwy = lwe + ('A' - 'a');
    można bezpośrednio zastosować w C, np. tak:
    if((ch >= 'a') && (ch <= 'z'))
    ch += ('A' - 'a');
    Tak jest zresztą bardziej elegancko, bo nie ma stałej wziętej z kosmosu ;)
  • REKLAMA
  • #7 2046449
    aivin
    Poziom 11  
    Posty: 11
    Witam
    Mam problem z napisaniem programu wyświetlającemu zawartość pliku od końca. Z tym że nazwa pliku padana ma być jako parametr.
    W linux'ie po kompilacji mialoby to wyglądać następująco:
    ./prog plik.txt
    Gdzie prog to program po skompilowaniu, a plik.txt to wiadomo....
    Ma ktoś może jakieś propozycje do tego problemu?
  • REKLAMA
  • #8 2046714
    Bielsky
    Poziom 21  
    Posty: 333
    Pomógł: 30
    Ocena: 19
    Aivin: To ma być wyświetlanie znak po znaku, czy plik tekstowy linia po linii bez zmiany kolejności znaków w linii?

    W każdym razie poczytaj sobie o instrukcjach typu seekg, tellg np.tu: http://www.cplusplus.com/ref/#libs
    (to są instrukcje c++ nie c, jeżeli program ma być napisany w czystym c - nie wiem, czy możesz ich używać)
  • #9 2046755
    aivin
    Poziom 11  
    Posty: 11
    .. tak znak po znaku ale od końca pliku
  • #10 2048230
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    Otwierasz plik.
    Sprawdzasz jego długość w bajtach (fseek, ftell).
    Alokujesz pamiec (malloc, free).
    Wczytujesz plik do tablicy.
    I indeksując tablice od konca wypluwasz całą zawartość tablicy na ekran.
  • #11 2048942
    Sam Sung
    Poziom 33  
    Posty: 2025
    Pomógł: 227
    Ocena: 604
    Faust napisał:
    Otwierasz plik.
    Sprawdzasz jego długość w bajtach (fseek, ftell).
    Alokujesz pamiec (malloc, free).

    A jak plik będzie miał np. 5 GB ?

    Można czytać po 1 znaku i przewijać do tyłu:
    int c, x;
    x = fseek(f, -1L, SEEK_END);
    while (!x)
    {
      putchar(getc(f));
      x = fseek(f, -2L, SEEK_CUR);
    }

    Zamiast pojedynczych znaków można wczytywać od końca całe bloki o ustalonym rozmiarze.
  • #12 2050152
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    Pamieci wirtualnej zazwyczaj jest pod dostatkiem ;>
    A jak plik bedzie miał 5Gb to odczytujac go znak po znaku prędzej dysk zajeździsz ;>. To będzie strasznie długo trwało. Zawsze też można ustawić ograniczenie i napisać np: "Plik jest za duzy", czy cos takiego.
  • #13 2050439
    Sam Sung
    Poziom 33  
    Posty: 2025
    Pomógł: 227
    Ocena: 604
    Faust napisał:
    Pamieci wirtualnej zazwyczaj jest pod dostatkiem ;>
    A jak plik bedzie miał 5Gb to odczytujac go znak po znaku prędzej dysk zajeździsz ;>. To będzie strasznie długo trwało.

    Pod windowsem czy linuxem system będzie cache'ował odczyt i tak czy siak operował blokami. A można to też zrealizować we własnym zakresie. Operacja będzie więc trwała nie dłużej niż nagranie płyty DVD o analogicznym rozmiarze. To też strasznie długo trwa, a jednak są śmiałkowie, którzy to robią ;)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy napisania programu w języku C, który wczytuje łańcuch znaków i zamienia wszystkie małe litery na duże bez użycia funkcji bibliotecznych takich jak tolower(), toupper() czy isalpha(). Autor programu chciał uniknąć korzystania z funkcji standardowych, zwłaszcza tych do obsługi wejścia/wyjścia i manipulacji znakami. Zaproponowano rozwiązanie polegające na ręcznym sprawdzaniu zakresu znaków ASCII i konwersji małych liter na duże poprzez odejmowanie różnicy między kodami 'a' i 'A' (np. ch -= 32). Przykładowa funkcja iteruje po znakach łańcucha, zamieniając małe litery na duże i wypisując wynik bez użycia funkcji bibliotecznych do konwersji znaków. W dyskusji poruszono także kwestie bezpieczeństwa funkcji gets() i zalecenie stosowania fgets(). Dodatkowo pojawiły się wątki dotyczące czytania plików od końca, z wykorzystaniem funkcji fseek() i ftell(), jednak nie są one powiązane bezpośrednio z głównym problemem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA