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:ponad 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:około rok
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:ponad 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:około rok
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:około rok
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

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.