Ciag binarny

0

Witam.
Mam za zadanie napisać funkcję rekurencyjną, która wypisze n-wyrazowe ciągi binarne. Program kompiluje sie, ale wyświetla nie to co trzeba. Byłbym wdzieczny za udzielenie mi pomocy.

#include <stdio.h>

int ciagbinarny()
{
int n,k,z,l,i,j;
char c[100];

z=1<<n;  /* przesuniecie bitow o "n" miejsc w lewo -> 2^n */

for(l=0;l<z;l++)
  {
   i=l;

        for(j=0;j<n;j++) c[j] = '0'; /* zerowanie tablicy bez ostatniego miejsca */

        for(j=n-1;j>=0;j--) /* zamienianie na postac binarna */
        {
          k=i%2;
          c[j]='0'+k;
          i=i/2;
        }
   c[n]='\0'; /* zakonczenie tablicy */
   printf("%s\n",c);  /* wydrukowanie tablicy */
  }
return 0;
}


int main()
{
int n;
printf("Podaj dlugosc ciagu binarnego: ");
scanf("%d", n);
printf("Ciagi binarne dla n= %d", n);
printf(ciagbinarny(n));
}
0

może coś w tym stylu:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
void ciagbinarny(int n)
  {
   static char *tb;
   if(n<0)
     {
      n=-n;
      tb=(char*)malloc(n+1);
      memset(tb,'0',n);
      tb[n]=0;
      ciagbinarny(n);
      free(tb);
     }
   else if(n--)
     {
      for(tb[n]='0';tb[n]<='1';++tb[n]) ciagbinarny(n);
     }
   else printf("%s\n",tb);
  }

int main()
  {
   int n;
   for(;;)
     {
      printf("Podaj dlugosc ciagu binarnego: ");
      n=0;
      scanf("%d",&n);
      if(n<=0) break; 
      printf("Ciagi binarne dla n=%d\n",n);
      ciagbinarny(-n);
     }
   return 0;
  }
0

_13th_Dragon Widze funkcje, ktore nie mam pojecia jak stosowac jak malloc czy memset :( Mam do ciebie 2 pytania.

  1. Czy da sie jakos poprawic moj program, zeby dzialal bez tych funkcji malloc, memset itd?
  2. Moglbys poprawic swoj program tak, zeby program np: dla n=3 podawal po kolei od 0 do 7? Bo z tego co widze to kolejna liczba po 000 jest liczba z 1 w najstarszym bicie czyli 100 zamiast 001.
0

Ad1. Jak dasz oryginalne źródło przed obfuskacją to można by spróbować.
Ad2. Nie da się bez ograniczeń o których nić nie powiedziałeś.

0
  1. Na poczatku zrobilem tak, zeby program dzialal. Nastepnie probowalem przeksztalcic tak, zeby pytal jaki n-wyrazowy ciag wypisac i zeby to bylo w postaci funkcji rekurencyjnej
#include <stdio.h>

int main()
{
int n,k,z,l,i,j;
char c[100];

n=3; // przykladowo dla 3-wyrazowych ciagow binarnych
z=1<<n;  // przesuniecie bitow o "n" miejsc w lewo -> 2^n
for(l=0;l<z;l++)
{
   i=l;
   for(j=0;j<n;j++) c[j]='0'; // wpisywanie do tablicy "0"
        for(j=n-1;j>=0;j--)  // zamienianie do postaci binarnej
        {
          k=i%2;
          c[j]='0'+k;
          i=i/2;
        }
   c[n]='\0';
   printf("%s\n",c); //wypisanie zawartosci tablicy
}
return 0;
}
  1. Moge korzystac z bibliotek stdlib, stdio, string, ze wskaznikami i w postaci rekurencyjnej tak jak zrobiles. Mialem na mysli, zeby twoj program podawal od najmniejszego do najwiekszego ciagu binarnego dla dowolnego n.

Przykladowo dla 3-wyrazowych ciagow.
Moj program wyswietla tak:
000
001
010
011
100
101
110
111

a twoj program wyswietla tak:
000
100
010
110
001
101
011
111

0

Ad1. Nadal nie podałeś kodu z przed obfuskacji.
Ad2. Jeszcze raz powtarzam bez malloc'a nie da się dla dowolnego n.

Jak nie rozumiesz jakiegoś słowa to spytaj lub sprawdź w google lub sprawdź w słowniku.

0

Ad.1 Podalem kod bez stosowania obfuskacji(zaciemniania kodu). Zreszta pierwszy raz slysze o czyms takim - jestem poczatkujacym i daleko mi do stosowania takich rzeczy.
Ad.2 Ok rozumiem.

Mam jeszcze pytania co do struktury twojego programu, bo nie do konca rozumiem pare rzeczy.
W main()

  1. petla for(;;) -> jak mam odczytywac wyrazenia zawarte w nawiasach (), skoro nie sa w niej podane? Mam na mysli te dwa sredniki.
  2. ciagbinarny(-n); -> dlaczego trzeba wywolac funkcje od -n, a nastepnie we funkcji ciagbinarny() zamieniamy na n? Nie rozumiem dlaczego trzeba tak zrobic.

We funkcji ciagbinarny()
3. tb=(char*)malloc(n+1); -> pod tb przypisujemy wskaznik na znaki, ktoremu przydzielamy pamiec o rozmiarze n+1. Dobrze to rozumiem?
4. Wywolywanie funkcji we funkcji -> mam na mysli to, czy najpierw w instrukcji if() program cofnie sie do poczatku funkcji i bedzie sie wykonywala od poczatku czy dokonczy instrukcje if() i wtedy sie cofnie do poczatku? Mam na mysli linijke zaznaczona w komentarzu jako //TUTAJ

if(n<0)
     {
      n=-n;
      tb=(char*)malloc(n+1);
      memset(tb,'0',n); 
      tb[n]=0;
      ciagbinarny(n); //TUTAJ
      free(tb);
     }
  1. else if(n--) -> mam to odczytac jako "w przeciwnym wypadku jezeli wartosc n przed zmiana"? Nie za bardzo rozumiem te zapis
    Z gory przepraszam za glupie pytania. Po prostu chce wiedziec co sie dzieje w programie.
0

Właśnie jak najbardziej stosujesz obfuskacje. Przestań ją stosować a zaczniesz znajdywać błędy w swoim kodzie z jednego spojrzenia. Każda zmienna musi swoją nazwą mówić do czego jest zastosowana.

Ad1. Zwykła pętla bez końca.
Ad2. Bo trzeba przekazać informacje że teraz przydzielamy pamięć, owszem można przekazać dodatkową zmienną ale dla funkcji rekurencyjnej to "rozrzutność".
Ad3. Tak
Ad4. Wywołanie funkcji to nie goto. Działanie tego możesz to sobie wyobrazić jako wywołanie zupełnie innej funkcji.
Ad5. konstrukcje else if są bardzo pospolite, może zacznij od jakiegoś podstawowego kursu C/C++

0

Teraz juz rozumiem jak to dziala. Wielkie dzieki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1