Język C/ maksimum możliwości

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ę !

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

0

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

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.

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

0
#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

0

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

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.

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:

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.

0
rincewind napisał(a)
#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) ?

1

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

#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ń.

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 !

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++ ?

1

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

0

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

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?

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 !

 
#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 ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.