Język C/ maksimum możliwości

Język C/ maksimum możliwości
AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

Witam,
zwracam się do Was z prośbą o pomoc w napisaniu programu w języku C. Nie jestem za bardzo obeznany w jego składni, dodatkowo piszę do dla koleżanki która nie za dokładnie wyjaśniła co w zasadzie ma ten program robić. Nie mogę się z nią skntaktować, więc liczę na Waszą dobrą wole i poświęcenie chwili czasu na pomoc :) (sami chyba rozumiecie że to "koleżanka").

Program ma za zadanie wyświetlić wszystkie 512 możliwości ułożenia praw dostępu/ bądź braku w systemie Unix.

Na razie domyśliłem się że chodzi zapewne o kombinację ułożenia liter drwx oraz symbolu myślnika "-" w maksymalnej ilości kombinacji. Jednak obliczając to, wyszło mi że maksymalna liczba "ustawień" tych 5 symboli jest mniejsza niż 512. I tu proszę o pomoc, o co dokladnie mogło chodzić autorowi zadania, tzn. o jakie kombinacje ? Nie pisał bym tego wątku gdyby nie to że zapewne większość z Was studentów informatyki spotkała się prawdopodobnie z takim zadaniem/ uprzedzam że skorzystałem już z pomocy wujka Google.

Jeśli ktoś już do tego dojdzie, chętnie zapoznałbym bym się z jakimiś wskazówkami którego pomogą mi napisać program wyświetlający wszystkie 512 możliwości. Na razie kombinuję coś z pętlą while, ale nie za bardzo mogę ruszyć z programem skoro nie znam dokładnie tych "kombinacji".

Za wszelką pomoc z góry dziękuję !

rafal-prog
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 10 lat
  • Postów:106
0

prawa dostępu w linuxie to ciąg dziewięciu znaków

rwx rwx rwx - na każdym miejscu może być odpowiednia litera albo myślnik. Więc 2^9=512


H4
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
  • Postów:107
0

sprobuj napisac ten program na cyfrach a potem na literach. Na telefonie niestety nie moge Ci napisac pomocniczego kodu

AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

rafal-prog- coś niesamowitego ;) Prawdziwy entuzjasta z Ciebie, dzięki wielkie.

Jako że nie jestem za dobry w C, chciałbym prosić o pomoc w napisaniu tego programu. Żeby nie było że czekam na gotowca, spróbowałem już coś naskrobać samodzielnie.

Wiem że sposobów na dotarcie do celu jest wiele, ale chciałbym obrać jak naprostszą drogę, chociaż jeśli ktoś ma jakiś bardziej zaawansowany pomysł na to zadanie to nie pogardzę.

Najpierw stworzył bym tablicę, z wszystkimi możliwymi kombinacjami (poprzedzielanymi myślnikiem) np. char[]= {rw-; r-x; itd}. Wydaje mi się że już gdzieś widziałem podobny program i tam w tablicy wrzucona była kombinacja 3 liter z myślnikami. A następnie wszystko było wrzucony w pętle while. Ale za bardzo nie wiem jak to ma wyglądać, wiem że to nie duży wkład własny, ale program chyba nie jest zbyt skomplikowany, a moja wiedza jest mniejsza niż chęć "zaimponowania koleżance" ;)

Jeśli ktoś podsunął by pomysł byłbym wdzięczny.

edytowany 1x, ostatnio: albundycoco
AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

Ciągle próbuje coś wymyślić z tą petlą while i nie daje rady, oferuję pieniężną gratyfikację (równowartość 2 piw- możemy negocjować (-: ), za napisanie tego programu. Nie znalazłem nigdzie punktu w regulaminie który by tego zabraniał, więc... Niestety program potrzebuję na dziś, do godz. 21, ale jestem w stanie wysłać screen z potwierdzenia nadania pieniędzy na koncie internetowym dla uwierzytelnienia ;). Dalsze wiadomości na PW.

0

2 piwa - 6-7 zł, nie wiem czy komuś się ze chce odpalic kompilator za taką kasę ;)

2

:) pamiętajmy, że robi to dla jakiejś milusiej pupci - myśli że popipcy za 2 piwa xD

rincewind
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
0
Kopiuj
#include <iostream>
#include <sstream>
#include <algorithm>

std::string print(unsigned int num)
{
	std::ostringstream os;
	for (int i = 0; i < 9; i += 3)
	{
		os << (num & 1 ? "x" : "-");
		num >>= 1;
		os << (num & 1 ? "w" : "-");
		num >>= 1;
		os << (num & 1 ? "r" : "-");
		num >>= 1;
		os << " ";
	}
	std::string str(os.str());
	std::reverse(str.begin(), str.end());
	return str;
}

int main(int argc, char* argv[])
{
	for (unsigned int num = 0; num < 512; ++num)
		std::cout << print(num) << "\n";

	std::cin.get();
	return 0;
}

Masz za darmo, może Ci to wynagrodzi. :P


edytowany 1x, ostatnio: rincewind
H4
to C++, a nie C :P
rincewind
Oj tam, oj tam. :P
0

Serio? Czemu tuszujecie prawdę? Przecież będzie tak jak napisałem, chcecie chłopaka pocieszyć? Na programowanie się nie wyrywa...

H4
Może da radę, chociaż kompilator na ten pomysł wywalił by error
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
1

Jeżeli ktoś miał matematykę w szkole to to się nazywa "wariacja z powtórzeniami". Teraz wystarczy wklepać nazwę algorytmu + "in C" w Google.

H4
a ja tam spróbuję napisać taki algorytm na własną rękę, całkiem fajne zadanie :D
CK
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 13 lat
0

Ja też miałem takie samo zadanie na zajęciach środowiska Linux i pozwolono programować w czymkolwiek dostępnym na systemie. Poniżej jest moje rozwiązanie w pythonie:

Kopiuj
with open( 'result.txt', 'w' ) as file:
    modes = ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx']

    for user_mode in modes:
        for group_mode in modes:
            for other_mode in modes:
                file.write( '%s %s %s\n' % ( user_mode, group_mode, other_mode ) )

Python jest bliski pseudokodowi, zatem przełożenie na C nie powinno Ci zająć wiele czasu.

edytowany 2x, ostatnio: code_killer
AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0
rincewind napisał(a)
Kopiuj
#include <iostream>
#include <sstream>
#include <algorithm>

std::string print(unsigned int num)
{
	std::ostringstream os;
	for (int i = 0; i < 9; i += 3)
	{
		os << (num & 1 ? "x" : "-");
		num >>= 1;
		os << (num & 1 ? "w" : "-");
		num >>= 1;
		os << (num & 1 ? "r" : "-");
		num >>= 1;
		os << " ";
	}
	std::string str(os.str());
	std::reverse(str.begin(), str.end());
	return str;
}

int main(int argc, char* argv[])
{
	for (unsigned int num = 0; num < 512; ++num)
		std::cout << print(num) << "\n";

	std::cin.get();
	return 0;
}

Masz za darmo, może Ci to wynagrodzi. :P

Dzieki wielkie, ale tak jak kolega wspomniał miałem to napisać w C.
Co trzeba zmienić żeby odpalić to w C (pytanie laika, który pisze od wielkiego dzownu w Pascal'u) ?

rincewind
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 8 lat
1

Pobawię się dziś w Mikołaja, niech Ci będzie:

Kopiuj
#include <stdio.h>

char* print(char* str, unsigned int num)
{
	unsigned int i = 0;
	for (i = 0; i < 9; i += 3)
	{
		str[8 - i] = num & 1 ? 'x' : '-';
		num >>= 1;
		str[7 - i] = num & 1 ? 'w' : '-';
		num >>= 1;
		str[6 - i] = num & 1 ? 'r' : '-';
		num >>= 1;
	}
	str[i] = '\0';
	return str;
}

int main()
{
	char str[10];
	for (unsigned int num = 0; num < 512; ++num)
		printf("%s\n", print(str, num));

	getchar();
	return 0;
}

Ale wyjaśniać nie mam siły, sam sobie rozkmiń.


edytowany 1x, ostatnio: rincewind
AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

Dziadek Mróz jednak istnieje ! :D Wielkie dzięki, nie jestem gołosłowny. Jeśli interesuje Cię gratyfikacja, proszę kontaktuj się na PW !

AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

Jeszcze takie jedno pytanko. W kompilacji, wyskakuje mi błąd, tj. w linii for (unsigned int num = 0; num < 512; ++num) pojawia się komunikat

'for' loop initial declarations are only allowed in C99 mode
use option -std=c99 or -std=gnu99 to compile your code

jak mam użyć tej opcji w DEV c++ ?

rincewind
W C89 deklaracja zmiennej nie może być w sekcji inicjalizacji pętli. Zadeklaruj num przed pętlą (podobnie jak zmienna i w funkcji print()).
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
1

Dodaj/usuń programy -> dev c++ -> tak -> dalej -> dalej

AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

Rev> czyli lepiej w gcc ? Zaraz spróbuje.

RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:12 miesięcy
0

To było tak na marginesie, ale błąd generalnie dostałbyś również na nowszej wersji mingw (port gcc na windows). Potrzebujesz pomocy w jego przetłumaczeniu?

AL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 13 lat
  • Postów:8
0

angielski znam, jednak nie nadrobi nim braków wiedzy z programowania. czytałem o tym błędzie na wikipedii, z tego co udało mi się ustalić to musze zadeklarować zmienną przed funkcją , czyż nie ?

Dobra, a oto i funkcja w pełni działająca !

Kopiuj
 
#include <stdio.h>
 
char* print(char* str, unsigned int num)
{
        unsigned int i = 0;
        for (i = 0; i < 9; i += 3)
        {
                str[8 - i] = num & 1 ? 'x' : '-';
                num >>= 1;
                str[7 - i] = num & 1 ? 'w' : '-';
                num >>= 1;
                str[6 - i] = num & 1 ? 'r' : '-';
                num >>= 1;
        }
        str[i] = '\0';
        return str;
}
 
int main()
{
unsigned int num;
        char str[10];
        for (num = 0 ; num < 512; ++num)
                printf("%s\n", print(str, num));
 
        getchar();
        return 0; 
        


Wystarczyło tylko zadeklarować zmienną num i pozbyć się tego typu zmiennej w pętli for ;)

Dziękuję z góry wszystkim którzy mieli dzień dobroci dla dummies ;)

edytowany 3x, ostatnio: albundycoco
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)