Sortowanie przez wybieranie - błąd kompilacji.

0

Witam, dostałem na zadanie napisać program który po wczytaniu z konsoli 'n' wczyta 'n' linijek wyrazów do 30 znaków, posortuje je przez 'wybieranie' i wypisze posortowane.

O to mój kod:

#include <string.h>
#include <stdlib.h>


int main ()
{
    int z=0,n=0,i=0,j=0,o=0,k=0,l=0;
    char t[20000][31];
    char v[31];
    char s[31];
    

    scanf ("%d",&z);
    
    for (l=1;l<=z;l++)
    {
    
        scanf ("%d\n",&n);
        
        for (j=0;j<=n-1;j++)
        {
            scanf ("%s",t[j]);
            strlwr(t[j]);
        }
        
        

        
    for (j=0;j<=n-1;j++)
    {
        k=0;
        strcpy(v,t[j]);
        for (i=j+1;i<=n-1;i++)
        {
          if (strcmp (t[i],v)<0)
          {
          strcpy(v,t[i]);
          k=i;
          }
        }
        if (k>0)
        {
        strcpy (s,t[j]);
        strcpy (t[j],v);
        strcpy (t[k],s);
        }
    }
        
           


        for (j=0;j<=n-1;j++)
        {
            printf ("%s ",t[j]); 
        }        
printf ("\n");
}   
return 0;
}
         

Problem polega na tym, że ten program u mnie na komputerze działa, kompilator (Dev -C++ 5.2.0.3) nie wyrzuca żadnych błędów, a gdy wyślę go na serwer na którym sprawdza go testerka, wywala od razu błąd:

CME - błąd kompilacji (compile error). Często w takiej sytuacji można zobaczyć compile log, czyli komunikat, który wyprodukował kompilator. W C++ częstą przyczyną jest nazwanie zmiennej globalnej tak, że koliduje z definicją w którymś pliku nagłówkowym (szczególnie odradzamy nazwy time i index).

Proszę o pomoc w pozbyciu się tego błędu.
Pozdrawiam

0

A gdzie masz stdio.h? Co to jest za funkcja strlwr?

Tutaj możesz zobaczyć sobie błędy: http://ideone.com/7mNwmy

0

Strlwr zmniejszała wszystkie litery w wyrazie na małe, ale wychodzi na to, że w ANSI C jej nie ma, znalazłem inną: tolower w bibliotece <ctype.h>, ale ona trochę inaczej działa, bo zmienia znak, a nie cały string na mały, i w sumie nie wiem za bardzo jak za pomocą tej funkcji zmieniać po kolei wczytywane wyrazy do macierzy.

0

aby zamienic dużą literę na małą wystarczy do jej kodu ASCII dodać 'a' - 'A'. czyli 32
char duza = 'C';
char mala = duza+32;

0

ale pozostaje kwestia tego, że raz to będzie STEFAN, raz Stefan, a innym razem StEfAn, więc samodzielne zamienianie dużej na małą jest trochę skomplikowane bo nie wiem jak sprawdzać czy to duża czy mała. Jak wypisze za dużo warunków to możliwe, że mój program nie zmieści się w limicie czasowym. Więc lepiej skorzystać z gotowej funkcji tylko znowuż ona działa tylko na intach, a ja mam char.

0

Skoro masz funkcję, która zmienia pojedyncze znaki to wystarczy zastosować ją dla całego napisu:

char *strtolower(char *str) {
  char *ptr = str;
  
  while(*ptr != '\0') {
    *ptr = tolower(*ptr);
    ++ptr;
  }    
 
  return str;
}

http://ideone.com/PO39Oy
(Wersja super rozwleczona, bo można to napisać w 3 linijkach)

0

No tak, dziękuję bardzo, ale pojawia się problem, bo nie chodzi mi o wypisanie wyrazu z małych czy dużych liter, tylko o przerobienie wszystkich wczytywanych wyrazów do tablicy na małą literę, po to, żebym mógł je później porównywać funkcją strcmp, a tutaj wyskakuje mi,

[Error] incompatible types in assignment

kiedy próbuję to zrobić.

1

Wtf? Podałem Ci funkcję, którą masz zastąpić nieistniejącą strlwr, przecież się kompiluje: http://ideone.com/08N4xT

0

No tak, musiałem coś poknocić, dziękuję bardzo, już działa!

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