Zliczanie znaków w stringu

Zliczanie znaków w stringu
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Witam, chciałbym napisać funkcję która pozwala mi zliczyć powtarzalność znaków w danym stringu, nie mam jednak pomysłu jakiej komendy użyć przykładowo chciałbym aby po wpisaniu łańcucha wyświetlało mi np. Ala ma kota
A 1
l 1
a 3
m 1
a 3
k 1
o 1
t 1
a 3
Nie proszę o gotowe napisanie tylko o wskazówki z czego mam skorzystać. Pozdrawiam :)

stasinek
Z właściwości reprezentacji znaków jako tablica kodów - liczb. 256 kodów ASCII np. A to liczba 65. Zatem potrzebna jest jedna tablica 256 bajtów indeksowana znakami. Zerujesz tablice np __int16[256]. Pierwsze pelne przejście petli for (i=0; i<znaki.length();i++) inkrementuje liczebnosc[(unsigned char)znak[i]]++; kolejne przejście podobnej petli drukuje cout << (char)znak[i] << liczebnosc[(unsigned char)znak[i]] << endl;
WO
Wydaje mi się to najbardziej adkewatny sposób do mojego poziomu, nie rozuzmiem jednak tej części po pierwszej pętli.
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
3

skorzystaj z std::map
jako Key daj literke
jako value ile razy wystepuje w stringu

bogdans
Za co ten plus? :)
fasadin
a czemu nie mialoby byc? miala byc podpowiedz a nie rozwiazanie calkowite tematu ;) jezeli ma problem z kolejnoscia wyswietlania wtedy bedzie kolejna podpowiedz lub rozwiazanie jezeli bedzie tego chcial. std::map powinno go nakierowac jak zrobic wypisywanie pokolei ;)
WO
Obawiam się właśnie że będzie potrzebne rozwiązanie bo nie bardzo rozumiem jak to ma wyglądać...
fasadin
@wojtaaz odpisuj w postach i pokaz co zrobiles i czego nie rozumiesz to pomozemy
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Skorzystaj z tego samego co masz w tytule wątku -> ze zliczania. Popatrz np. na algorytm sortowania przez zliczanie, bo masz zastosować bardzo podobny schemat.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Zwróciliście uwagę na przykładowe wyjście? Jeśli literka a wystąpiła trzy razy, to ma zostać trzy razy wypisana i do tego we właściwych wierszach.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Shalom
To akurat nie jest problem, wystarczy najpierw wczytać wejscie do listy, potem zliczać a na koniec wypisywać lista[j] zliczanie[lista[i]] ;]
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 9 godzin
1
Kopiuj
#include <map>
#include <string>
#include <iterator>
#include <iostream>
#include <boost/range/algorithm/copy.hpp>
#include <boost/function_output_iterator.hpp>
using namespace std;
int main(){
    string str{
        istream_iterator<char>(cin), 
        istream_iterator<char>()
    };

    map<char, size_t> occurs;
    boost::copy(str, boost::make_function_output_iterator([&](char c){ occurs[c] += 1; }));
    
    for(char c : str){
        cout << c << ": " << occurs[c] << "\n";
    }
}

http://melpon.org/wandbox/permlink/d0FmsSyWNBuoLR8g

Nie proszę o gotowe napisanie

To dobrze, bo byś nie dostał :P

edytowany 3x, ostatnio: spartanPAGE
WO
Nie ma jakiegoś prostrzego sposobu na napisanie tego, bo wydaje mi się zbyt zaawansowany jak na poziom który jest ode mnie wymagany :)
spartanPAGE
@wojtaaz to co widzisz możesz potraktować jako koncept: zachowaj z tego twój ciąg znaków, mapę ze zliczeniami i wypisywanie tałatajstwa. Sformatowany ciąg znaków jesteś w stanie wczytać po swojemu, w pętli możesz zwiększać wystąpienia znaczków w mapie; voila!
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Znaczy powiem wprost no jest to zadanie na studia, i widzę że te funkcje i konstrukcje wybiegają daleko poza zakres mojej wiedzy więc wydaje mi się że powinien być jakiś prostszy sposób.

MO
Jest prostszy sposób, nawet kilka: 0. Siadasz i orasz ... 1. Umieszczasz swoje próby w postaci kodu na forum i naprowadzamy a problem rozwiązujesz TY z POMOCĄ. 2. Wystawiasz ofertę z prośbą o rozwiązanie a ktoś Ci to wyceni i wykona. Zrozum, rozwiązanie zaproponowane teraz jest przez praktyka. Zaraz będziesz grymasił że "nie mieliśmy tego na zajęciach" (co już robisz) a skąd do jasnej anielki odpowiadający ma wiedzieć "coście mieli"? To można wykonać na X sposobów! Począwszy od pracy na wskaźnikach/tablicach poprzez vector z parami do map a nawet i jeszcze inaczej :-)
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
2

dobrze, nie chcesz gotowych funkcji to podam Ci liste krokow ktore musisz zrobic. Zajmie Ci pisanie pewnie z pare godzin zamiast napisanie tego w ciagu godziny i zrozumieniu tego. Ale jezeli lubisz wymyslac kolo na nowo to nikt Ci nie bedzie tego zabranial

  1. Robisz tablice z kazdym znakiem ktory chcesz by byl zliczany
    0.1 Robisz druga tablice pusta o typie int (w sensie ma wszystko na zero) o wielkosci tablicy pierwszej
  2. Wczytujesz linie tekstu (szukaj pod getline)
  3. Iterujesz po tym slowie jako kazdy znak
    2.1. szukasz w tablicy znakow obecnego znaku
    2.2 zapisujesz indeks w tablicy
    2.3 w drugiej tablicy o tym samym indeksie zwiekszasz liczbe o 1
  4. Wpisujesz tablice pierwsza i druga w tym samym momencie
stasinek
Ale po co dwie tablice skoro wystarczy jedna. Jeżeli tekst ma mieć max 256 znaków i być ASCII do zliczania wystarczy jedna tablica __int8 o rozmiarze 256 bajtów. "Szukasz" - po co szukać?
fasadin
to jak bedziesz zliczac ile razy cos wystepowalo?
WO
Zgubiłem się na punkcie 2.1 jak dokładnie mam to zrobić?
fasadin
pisalem Ci juz. Odpisuj w postach nie w komentarzach
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Stworzyłem więc tablice z każdym znakiem który chce żeby był wczytywany, czyli praktycznie każdy z klawiatury. Stworzyłem tą tablice int i co dalej krok 1 i 2 również, jednak nie wiem jak mam "wyszukać" czy dany znak wystąpił.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

A poświęciłeś 2 minuty na przeczytanie jak działa sortowanie przez zliczanie? Nie? To poświęć.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
stasinek
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:17
1

Tablica kodów dla znaków ASCII to od 127 do 256 liczb, stąd mieszczą się w char(8 bit) w zasadzie niezależnie od kodowania pozostałych znaków normalne litery i liczby to zakres od ok 48 do 127, przykładowo spacja to liczba 32, cyfra 0 to kod 48, litera "A" to liczba 65, "B" to 66 itd. małe "a" to 97 bo 65 + 32 = 97 (analogicznie dla wszystkich liter)

Zatem potrzebna jest zaledwie jedna dodatkowa tablica o rozmiarze 256 bajtów indeksowana znakami.
Rodzaj zmiennej użytej w tablicy trzeba dobrać do długości tekstu więc dla długości 256 znaków wystarczy unsigned __int8 dla tekstów o rozmiarze 4GB unsigned __int32 więc zaledwie od 256 do 1024 bajtów RAM. Zerujesz tablice liczebnosci[256] (przejście od 0 do 255). W przejściu petli for (i=0; i<znaki.length();i++) dla tekstu inkrementujesz liczebnosc[(unsigned char)znak[i]]++; i już masz liczebności. Dla wydrukowania potrzebne jest kolejne przejście podobnej petli (znowu od zera do znaki.length()): cout << (char)znak[i] << liczebnosc[(unsigned char)znak[i]] << endl;
Koniec.

Nie wiem co jest trudnego do zrozumienia, wystarczy zakodować poprzez kopiuj wklej dwóch petli, wczytać znaki z klawiatury poprzez getch() albo scanf i już.
Jak słusznie zauważył Shalom można to uznać za fragment algorytmu sortowanie przez zliczanie.

@fasadin - dokładnie tak jak napisałem potrzebna jest jedna tablica bo tej która zawiera tekst nie wliczam.
@spartanPAGE podał uniwersalną wersję algortymu która zadziała jesli będzie musiala zliczać np. sylaby, wyrazy, frazy większe elementy którym nie kody ASCII ale map przyporządkuje unikatowe liczby.

edytowany 2x, ostatnio: stasinek
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@wojtaaz to jest taki trik w zliczaniu, że indeksujemy tablicę znakami które zliczamy. Np. litera a ma numer 48 w ascii. Więc tablica['a'] to jest po prostu tablica[48]. Jeśli teraz cała tablica jest wyzerowana i zrobimy tablica['a']++ to 48 indeks w tablicy będzie miał 1.
Więc teraz jeśli iterujemy sobie po literkach w ciągu wejściowym np. alamakota gdzie literki[i] to jest kolejna literka z ciągu i wykonujemy tablica[literki[i]]++ to w rzeczywistości robimy:
i=0: tablica[literki[i]]++ -> tablica['a']++ -> tablica[48]++
i=1: tablica[literki[i]]++ -> tablica['l']++ -> ...

Więc w tablicy dla indeksu odpowiadającego danej literce będziesz miał informacje o tym ile razy literka wystąpiła.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MO
  • Rejestracja:prawie 10 lat
  • Ostatnio:dzień
  • Lokalizacja:Tam gdzie jest (centy)metro...
1

No, to żeby nie proponować tego co zaproponowali koledzy... a rzecz jasna zaproponowali optymalne obliczeniowo rozwiązanie, to podam inne które oszczędza RAM ale kosztem złożoności obliczeniowej.
Podkreślam jeszcze raz, obliczeniowo gorsze, pamięciowo o lepsze bo wymaga jedynie pamięci RAM o długości string'a. A pytający nie zdradził "co mieli a co nie na zajęciach", więc bez użycia jakichkolwiek bardziej zaawansowanych struktur i w C (żeby zaraz nie było "chcę bez <algorithm>").

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

/*
 * Zlicza wystąpienia znaków w całym napisie pod indeksem danego znaku występującego jako pierwszy
 * z lewej strony.
 */
void count_chars_cons(const char * str, size_t * table) {
    size_t i;
    const char * start_str = str;

    while(*str != '\0') {
        i = 0;
        while(*str != start_str[i]) {
            ++i;
        }
        ++table[i];
        ++str;
    }
}

/*
 * Wyświetla ilość wystąpnień dla danej litery.
 */
void show_chars_count(const char * str, size_t * table) {
    char c;
    size_t count;

    while((count = *(table++), c = *(str++)) != '\0') {
        if(count > 0) {
            printf("%c: %zu\n", c, count);
        }
    }
}

int main(void) {
    const char str[] = "Ala ma kota i chomika. Nic z tego nie wynika.";
    const size_t str_len = sizeof(str) - 1;
    size_t count[sizeof(str) - 1];

    bzero(count, str_len * sizeof(size_t));
    count_chars_cons(str, count);
    show_chars_count(str, count);

    return EXIT_SUCCESS;
}

Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler
WO
na dobrą sprawe tylko typy zmiennych, tablice i pętle for, oraz podstawowe rzeczy typu printf, fgets.
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

liczebnosc [256] = 0;
for (int i=0; i<sizeof(znaki); i++)
liczebnosc[(const char)znaki[i]]++;
for(int i=0; i<sizeof(znaki); i++)
cout << (char)znak[i] << liczebnosc[(const char)znaki[i]] << endl;

Milion warnów

|In function 'void CountChar(const char*, int*)':|
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
warning: array subscript has type 'char' [-Wchar-subscripts]|
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]|
warning: array subscript has type 'char' [-Wchar-subscripts]|

Wiem że prawdopodobnie to są banały, jednak nie mogę pojąć tego co robie źle.

stasinek
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:17
0

W więc od dziś zdanie:

Nie proszę o gotowe napisanie tylko o wskazówki z czego mam skorzystać. Pozdrawiam :)

Będę odczytywać: "Wiem że regulamin zabrania ogłoszeń z prośbą rozwiazania zadania domowego, dlatego sformułowałem inaczej :)"

Wiem że prawdopodobnie to są banały, jednak nie mogę pojąć tego co robie źle.

  1. Zmiast unsigned char przepisałeś const char!? Rozumiesz co oznacza unsigned?
    Dla polskich znaków, przy ustawieniu strony kodowej setlocale(LC_CTYPE, ".1250"); np. dla liter ąę jako char da wynik ujemny słusznie kompilator ostrzega przed ryzykiem zaindeksowania tablicy ujemnymi liczbami.
  2. Masz char* jako parametr funkcji i rzecz jasna sizeof(char) zamiast np. strlen(znaki) odpowiednik podanego przeze mnie C++ string.length() - na co wyraźnie wskazuje tytuł tematu! Notabene optymalną formą pętli jest konstrukcja for (int i = 0, max = strlen(znaki); i < max; i++); bo strlen wystarczy by został wywołany raz, aby sprawdził pozycje znak kończącego tekst! tj. o wartości liczbowej zero '\0'. Natomiast dla char* znaki; sizeof(znaki) zwróci rozmiar wskaźnika: 4 albo 8 bajtów. Nawet gdyby był to char znaki[100]; sizeof(znaki) nie zwróci rozmiaru tekstu, ale rozmiar kontenera.
  3. Zerujesz jeden element listy w dodatku wykraczający poza jej rozmiar... rozumiesz w ogóle co piszesz?
    Zerowanie można uzyskać tworząc ją przy pomocy __int8 liczebnosc = (__int8)calloc(256, sizeof(__int8)); lub jesli jest na stosie __int8 liczebnosc[256]; poprzez: for(int i = 0; i < 256; i++) liczebnosc[i] = 0;

Zacznij od przeczytania dobrej "fabularyzowanej" książki na temat C będzie i Tobie i innym znacznie lżej.
Zacznij od BASIC'a albo innego języka, znacznie przyjemniej mniejsze problemy.

edytowany 7x, ostatnio: stasinek
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Rozumiem że pytania są dość hmm banalne i problemy tak samo. Wiem przepraszam za pomyłke w samym tytule. Na prawdę starałem się to zrobić jakoś zamodzielnie i zrozumieć najlepiej jak moge natomiast po prostu mam z tym problem, i nie ukrywam że sprawa nagli.

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

to jak sprawa nagli to zaplac komus zeby to za Ciebie zrobil

WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Nie chodziło mi o zrobienie tego za mnie, tylko po prostu wytłumaczenie jak kretynowi jak to powinno wyglądać, co zamiast czego... Mam ewidentny problem z tym, co rzecz jasna nie sposób nie zauważyć, jednak na chwile obecną nie mam aż tyle czasu aby to zrobić, bo widze że przedmną sporo pracy. Po prostu zabierając siędo pisania tego myślałem że to bęzie prostrze tj. do rozwiązania jakąś konkretną funkcją jednak widze że konstrukcje takich funkcji wykraczają poza mój materiał.

fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

nikt nie bedzie Ci tlumaczyl to co jest w setkach ksiazkach i kursach w internecie. Po prostu wez ksiazke i sie poucz troche

WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Rozumiem że "liczebnosc" ma być zapisana jako parametr funkcji w postacii unsigned char tak?

WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

W każdym razie został mi jeden błąd do wykluczenia symbol gwiazdki ma związek coś ze wskaźnikami którymi jeszcze nie operuje i pytanie jak mam to rozwiazac.

void CountChar(string symbols, int SizeOfS [256])
{
for(int i = 0; i < 256; i++) SizeOfS[i]=0;
for(int i = 0; i< symbols.length(); i++)
SizeOfS[(unsigned char)symbols[i]];
for (int i = 0; i<symbols.length(); i++);
int main()
{ char myString[256]; int myStrLen;
CountChar(myString, myStrLen);
error: invalid conversion from 'int' to 'int*' [-fpermissive]|

edytowany 1x, ostatnio: wojtaaz
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
2

To co napisałeś nie ma sensu. Najpierw masz char myString[256] a w funkcji próbujesz go upychać jako string symbols a potem jeszcze lepiej masz int myStrLen a w funkcji chcesz z tego zrobić int SizeOfS[256]. Cudowne rozmnożenie? Czy może po prostu nie rozumiesz ani linijki z tego kodu który wkleiłeś?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
spartanPAGE
AD1. http://ideone.com/pgyjvd implicit conversion constructor
Shalom
Ale ja wiem że to działa, niemniej jest to bardzo brzydko napisane ;]
WO
No ale jeżeli zamienie tego stringa na char to też nie będzie działać.
Shalom
Bo programowanie opiera sie na MYŚLENIU a nie na wprowadzaniu losowych zmian w kodzie którego sie nie rozumie. Jak przywalisz głową w ścianę z rozbiegu to ten kod nadal nie zadziała, ale możesz spróbować...
WO
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:23
0

Stringa zasugerowano mi wyzej, chcialem wiedziec wlasnie jakiego typu argumenty mam uzyc jako parametry funkcji, pytalem o to zasugerowano mi ze przeciez nie mam stringa tylko chara, no to zmienilem. Chcialbym wiedziec jakiego typu parametry powinienem zadeklarowac.

edytowany 1x, ostatnio: wojtaaz
Shalom
Zamiast pytać POMYŚL i spróbuj ZROZUMIEĆ co robisz.
stasinek
  • Rejestracja:ponad 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:17
0

Mam dość tematu ale lubie sprawy zamykać do końca.
Podaje rozwiazanie które działa o funkcjonalność która nie była oczekiwana tj. brak powtórzeń w drukowaniu listy. Może jesteś prowokatorem który robi sobie żarty z ludzi a może jedynie skutecznym w uzyskiwaniu odpowiedzi bez wkładu własnego. Kodowanie na chybił trafil przechodzi ludzkie pojecie.. Alphabet testuje algorytm AI? Tłumaczysz znaki na symbols okej masz prawo, zamiast zastosować strlen zmieniasz char* na string, zamiast liczebność SizeOfS jak w czeskim filmie.

Kopiuj
#include <iostream>
#include <cstring>
#include <cstdio>
#include <conio>
//#include <windows>
using namespace std;

 int EnterChars(char*, const int);
void CountChars(const char*, const int, unsigned int[]);
void PrintCharsAndCounts(const char*, const int, const unsigned int[]);

#define MAX_LENGTH 256
int main()
{
printf("Program do obliczania statystyk wystepowania znaków w tekście v1.0\n");
//SetConsoleCP(1251); 
setlocale(LC_ALL,"pl_PL.ISO-8859-2");
system("chcp 1250");
char Chars[MAX_LENGTH];
 unsigned int CharsCounts[256];
 int CharsLen = EnterChars(Chars,MAX_LENGTH);
CountChars(Chars,CharsLen, CharsCounts);
PrintCharsAndCounts(Chars,CharsLen, CharsCounts);
printf("Wciśnij klawisz aby kontynuować . . .\n");
getch();
//system("pause");
return 0;
}

//--------------------------------------------------
// Wprowadzenie tekstu
//--------------------------------------------------

int EnterChars(char *a_chars, const int a_max_len)
{
printf("Wprowadź tekst do analizy i naciśnij ENTER\n");

/*int i;
   for (i = 0; i < MAX_LENGTH) 
    {
    a_chars[i] = getch();
    if (a_chars[i]=='\r') break; 
    }
   a_chars[i]='\0'; return i;
*/
std::scanf("%s",a_chars);
return std::strlen(a_chars);
}
//--------------------------------------------------
// Zliczanie liczebności znaków
//--------------------------------------------------

void CountChars(const char *a_chars, const int a_chars_len, unsigned int a_chars_counts[])
{
    for(int i = 0; i < 256; i++)
		{
		a_chars_counts[i] = 0;
		}
    for(int i = 0; i < a_chars_len; i++)
    	{
		a_chars_counts[(unsigned char)a_chars[i]]++;
    	}
}

//--------------------------------------------------
// Drukowanie znaków i liczebności
//--------------------------------------------------

void PrintCharsAndCounts(const char *a_chars, const int a_chars_len, const unsigned int a_chars_counts[])
{
std::printf("Liczebność znakow w tekście:\n");
 int l_unique_chars_count = 0;
bool l_char_printed[256];
for (int i = 0; i < 256; i++)
	{
    l_char_printed[i] = false;
    }
for (int i = 0; i < a_chars_len; i++)
	{
     if (l_char_printed[(unsigned char)a_chars[i]]==false)
        {
        std::printf("%c - %d\n", a_chars[i], a_chars_counts[(unsigned char)a_chars[i]]);
        l_char_printed[(unsigned char)a_chars[i]] = true;
        l_unique_chars_count++;
        }
	}
std::printf("Ilość wszystkich znakow: %d\n",a_chars_len);
std::printf("Ilość różnych znakow: %d\n", l_unique_chars_count);
std::printf("Koniec!\n");
}

Przy okazji zauważylem że setlocale nie działa jak powinno niezaleznie od wybranego kodowania.
Możliwe że to rozbieżność w edytorze i wprowadzanych z klawiatury.

edytowany 5x, ostatnio: stasinek
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)