Jak z tablicy stworzyć tabelę i określoną jej część pokolorować na dany kolor??
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 5 lat
- Postów:41
kq napisał(a):
Jaką tabelę? O czym mowa? Jakie kolorowanie?
Chodzi mi o to, że w C np. można stworzyć tablicę 6 na 6 i uzupełnić wartościami losowymi. A ja się pytam jak do tej tablicy dodać w C jeszcze obramowania wewnętrzne i zewnętrzne, żeby wyglądało to jak klasyczna tabela (taka jak np. w programie Word czy Excel).
Co do kolorowania - pytanie brzmi raczej, czy w C wykonalne jest, aby np. górną część tabeli pokolorować na niebiesko a dolną na zielono. Albo.. Jak do kolejnych komórek (w pierwszej części polecenia idąc po wierszach, w drugiej po kolumnach) wpisać dane (nieważne, czy liczby, czy słowa), które wprowadzi użytkownik?
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 5 lat
- Postów:41
kq napisał(a):
Musisz nauczyć się odróżniać dane od ich reprezentacji w konsoli lub gdzie indziej. To, w jaki sposób wyświetlasz tablicę nie jest bezpośrednio powiązane z nią samą.
Znaczy? Może jakiś przykład i/lub przydatne strony?
- Rejestracja:ponad 6 lat
- Ostatnio:około 2 miesiące
- Postów:242
To zależy też od terminala na którym będzie wyświetlana tabelka.
- najprościej to ramki rysować stosując jedynie znak
-
,+
i|
- wersja piękniejsza to używać specjalne znaki, których jest kilka w górnej połówce bajta, czyli gdzieś pomiędzy 128 a 255. Jeżeli da się użyć unicode to tu masz listę http://www.alanwood.net/unicode/box_drawing.html jednak bądź świadom, że to zależy od terminala i fontów
- do kolorów i w ogóle okienek w terminalu jest biblioteka
ncurses
- pod terminalami
xterm
,vt100
, można używaćansi codes escape
https://en.wikipedia.org/wiki/ANSI_escape_code czyli sekwencje znaków które modyfikują działanie terminala (czyszczenie ekranu, ustawianie koloru, przemieszczanie kursora/etc). przykład:
// sekwencja \033[31;1;4m ustawia kolor czerwony, pogrubiony i podkreślony
// Hello wyświetlany napis
// \033[0m przywraca domyślne ustawienia terminala
printf("\033[31;1;4mHello\033[0m");
- jedna z opcji to na wyjście wypluwać kod
html
z twoimi danymi opatrzonymi w odpowiednie znaczniki. Tak możesz generować ładnie wyglądające w oknie przeglądarki raporty
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 5 lat
- Postów:41
jvoytech napisał(a):
To zależy też od terminala na którym będzie wyświetlana tabelka.
- najprościej to ramki rysować stosując jedynie znak
-
,+
i|
- wersja piękniejsza to używać specjalne znaki, których jest kilka w górnej połówce bajta, czyli gdzieś pomiędzy 128 a 255. Jeżeli da się użyć unicode to tu masz listę http://www.alanwood.net/unicode/box_drawing.html jednak bądź świadom, że to zależy od terminala i fontów
- do kolorów i w ogóle okienek w terminalu jest biblioteka
ncurses
- pod terminalami
xterm
,vt100
, można używaćansi codes escape
https://en.wikipedia.org/wiki/ANSI_escape_code czyli sekwencje znaków które modyfikują działanie terminala (czyszczenie ekranu, ustawianie koloru, przemieszczanie kursora/etc). przykład:// sekwencja \033[31;1;4m ustawia kolor czerwony, pogrubiony i podkreślony // Hello wyświetlany napis // \033[0m przywraca domyślne ustawienia terminala printf("\033[31;1;4mHello\033[0m");
- jedna z opcji to na wyjście wypluwać kod
html
z twoimi danymi opatrzonymi w odpowiednie znaczniki. Tak możesz generować ładnie wyglądające w oknie przeglądarki raporty
Dobra, średnio to rozumiem, więc pozostaje mi liczyć na to, że na matematyce na egzaminie z programowania nie każą nam tego używać...
- Rejestracja:ponad 6 lat
- Ostatnio:około 2 miesiące
- Postów:242
no to może mała prezentacja:
#include <stdio.h>
#define NROWS 2
#define NCOLS 3
const char* const ANSI_RED = "\033[31m";
const char* const ANSI_GREEN = "\033[32m";
const char* const ANSI_YELLOW = "\033[33m";
const char* const ANSI_RESET = "\033[0m";
void print_sep() { printf("+-----------+-----------+-----------+\n"); }
void print_head() { printf("| Ocena 1 | Ocena 2 | Ocena 3 |\n"); }
void print_ocena(float ocena) {
const char* color = NULL;
if (ocena < 3.0) {
color = ANSI_RED;
} else if (ocena < 5.0) {
color = ANSI_YELLOW;
} else {
color = ANSI_GREEN;
}
printf("%s%10f%s |", color, ocena, ANSI_RESET);
}
int main() {
float tab[NROWS][NCOLS] = {{3.1, 4.2, 3.3}, {5.2, 2.5, 3}};
print_sep();
print_head();
print_sep();
for (size_t r = 0; r < NROWS; ++r) {
printf("|");
for (size_t c = 0; c < NCOLS; ++c) {
print_ocena(tab[r][c]);
}
putchar('\n');
}
print_sep();
}
wynik:
po lewej program uruchomiony w PowerShell, a po prawej terminalu Msys2(czyli mintty). Różnica w kolorach wynika z tego, że na nie wpływa też zastosowanie motywu w terminalu, w którym można niektóre kolory modyfikować.
- screenshot-20200610170255.png (17 KB) - ściągnięć: 30
- Rejestracja:ponad 5 lat
- Ostatnio:prawie 5 lat
- Postów:41
jvoytech napisał(a):
no to może mała prezentacja:
#include <stdio.h> #define NROWS 2 #define NCOLS 3 const char* const ANSI_RED = "\033[31m"; const char* const ANSI_GREEN = "\033[32m"; const char* const ANSI_YELLOW = "\033[33m"; const char* const ANSI_RESET = "\033[0m"; void print_sep() { printf("+-----------+-----------+-----------+\n"); } void print_head() { printf("| Ocena 1 | Ocena 2 | Ocena 3 |\n"); } void print_ocena(float ocena) { const char* color = NULL; if (ocena < 3.0) { color = ANSI_RED; } else if (ocena < 5.0) { color = ANSI_YELLOW; } else { color = ANSI_GREEN; } printf("%s%10f%s |", color, ocena, ANSI_RESET); } int main() { float tab[NROWS][NCOLS] = {{3.1, 4.2, 3.3}, {5.2, 2.5, 3}}; print_sep(); print_head(); print_sep(); for (size_t r = 0; r < NROWS; ++r) { printf("|"); for (size_t c = 0; c < NCOLS; ++c) { print_ocena(tab[r][c]); } putchar('\n'); } print_sep(); }
wynik:
po lewej program uruchomiony w PowerShell, a po prawej terminalu Msys2(czyli mintty). Różnica w kolorach wynika z tego, że na nie wpływa też zastosowanie motywu w terminalu, w którym można niektóre kolory modyfikować.
Okej. Bardziej chodziło mi o wypełnienie komórki kolorem a nie tekstu, ale już nieważne.
- Rejestracja:ponad 6 lat
- Ostatnio:około 2 miesiące
- Postów:242
na stronie którą wcześniej podałem masz kody ansi do ustawiania koloru tła:
const char* const ANSI_BG_RED = "\033[48;5;1m"; // bialy tekst na czerwonym tle
printf("%s%10f %s|", ANSI_BG_RED, ocena, ANSI_RESET);
- screenshot-20200610172551.png (4 KB) - ściągnięć: 20