Problem z zadaniami – prośba o podpowiedź co do poprawnienia kodów

0

Witam. Chciałem poprosić o pomoc przy zadaniach. Próbowałem dość długi czas rozwiązać je samemu, ale niestety nie potrafię.Chciałbym również poprosić o wyrozumiałość

1.Mam napisać program w oparciu o podany algorytm:

screenshot-20180515223924.png

#include <stdio.h>
#include <stdlib.h>
void wypisz(int a[],int k)
{
    int i;
     for (i = 0; i < k; i++)
     {
       printf("%d", a[i]);
 }
	printf("\n");
}
void podzbiory(int n, int k,int tab[])
{   
    int i=0,j=0;
        while(tab[i]+1<=tab[k-1])i=i+1;
        if(tab[i]==n)
        {
        return;
        }
        if(tab[i]<n)
        {
            tab[i]=tab[i]+1;
            wypisz(tab,k);
            i=i-1;
            while(i>=0) 
            {
            tab[i]=tab[i]+1;
            wypisz(tab,k);
            i=i-1;
            podzbiory(n,k,tab);
            }
        }
        
 }
        
 int main(int argc, char *argv[])
{
    int i,n,k;
    printf("Podaj n\n");
    scanf("%d", &n);
    printf("Podaj k\n");
    scanf("%d", &k);
    int tab[n];
    for(i=0;i<n;i++)tab[i]=i+1;
    wypisz(tab,k);
    podzbiory(n,k,tab);
}

Jak widać, nie są wypisywane wszystkie podzbiory i nie potrafię tego poprawić.

screenshot-20180515224136.png

2.Kolejne zadanie, z którym mam problem. Nie wiem jak napisać to mnożenie.

screenshot-20180515224516.png

#include <stdio.h>
#include <stdlib.h>


/* dynamiczny przydzial pamieci na tablice */
double **macierzDouble(int iloscWierszy, int iloscKolumn){
 double **tab;
 int i;
 /* dynamiczne przydzielenie pamieci dla iloscWierszy wskaznikow do typu int */
 tab=(double **) malloc( iloscWierszy*sizeof(double *) );
 /* tab jest wskaznikiem do tablicy zawierajacej iloscWierszy wskaznikow do int */
 if(tab==NULL) { /* nie przydzielono pamieci */
 fprintf(stderr,"Brak pamieci !\n");
 exit(1); }
 /* przydziel pamiec na iloscWierszy*iloscKolumn liczb typu integer */
 tab[0]=(double *) malloc( iloscWierszy*iloscKolumn*sizeof(double) );
 if(tab[0]==NULL) { /* nie przydzielono pamieci */
 fprintf(stderr,"Brak pamieci !\n");
 free(tab); /* zwolnij pamiec przydzielona dynamicznie */
 exit(1); }
 for(i=1; i<iloscWierszy; i++)
 tab[i]=tab[i-1]+iloscKolumn; /* tab[i] jest wskaznikiem do i-tego wiersza tablicy */
 return tab;
}
/* zwalnianie pamieci przydzielonej dynamicznie */
void zwolnijMacierzDouble(double **tablica){
 free(tablica[0]); /* tablica[0] zawiera wskaznik do pamieci przydziel. dynamicznie */
 free(tablica); } /* tablica wskazników do wierszy przydzielona dynamicznie */
void wyswietlMacierzDouble(double **t, double w_Max, double k_Max){
 
 int wiersz, kolumna;
 for(wiersz=0; wiersz<w_Max; wiersz++)
 for(kolumna=0; kolumna<k_Max; kolumna++)
 printf("t[%d][%d]=%f%c \n", wiersz, kolumna, t[wiersz][kolumna],
 kolumna==k_Max-1 ? '\n' : '\t');
} /*** naturalny dostep do elementów tablicy: ^^^^^^^^^^^^^^^^^^ ******/



int main(int argc, char *argv[]) {
 
 /* dynamiczny przydzial pamieci dla 13 liczb int na stercie: */
 double *tab1Dyn;
 tab1Dyn = (double *) malloc( 13 * sizeof(double) ); 
 if( tab1Dyn == NULL ){
 fprintf(stderr,"Brak pamieci !\n");
 exit(1); }



 free(tab1Dyn); 
 tab1Dyn = NULL; /* aby nie uzyc ponownie zwolnionego wskaznika */

 
 double tab[10]; /* 10 elementow, indeksy 0..9 */
 double *tab_zakres;
 int i;
 tab_zakres = tab - 2; /* tablica od 2 do 11 (9+2) */
 for(i = 2; i < 10 + 2; i++)
 tab_zakres[i] = i;


 double **tabDyn;
 int wier=5, kol=7;
 tabDyn=macierzDouble(wier,kol); /* przydzielenie pamieci na stercie */
 /* uzycie przydzielonej tablicy */
 for(i=0;i<wier;i++)
 for(int j=0;j<kol;j++)
 tabDyn[i][j]=10*i+j;
 wyswietlMacierzDouble(tabDyn,wier,kol);
 /* zwolnienie pamieci przydzielonej dynamicznie */
 zwolnijMacierzDouble(tabDyn);
 tabDyn = NULL; /* aby nie uzyc ponownie zwolnionego wskaznika */

 printf("Tablica z indeksami 2..11\n");
 for(i = 0; i < 10 ; i++)
 printf("%f ", tab[i]);
 tab_zakres = tab + 5; /* tablica od -5 do 4 (9-5) */
 for(i = -5; i < 10 - 5; i++)
 tab_zakres[i] = i;
 printf("\n\nWydruk tablicy -5..4\n");
 for(i = 0; i < 10 ; i++)
 printf("%f ", tab[i]);

 return 0;
}

screenshot-20180515225211.png

  1. Problem z ostatnim zadaniem jest taki, że nie wiem jak zapisać dane z pliku studenci.txt do tablicy, aby potem móc wyświetlić wszystkich studentów korzystając z pierwszej funkcji.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_STUDENTOW 15
#define PLIK "studenci.txt"


enum oceny { ndst=2, dst, db, bdb };
struct student {
 char imie[12];
 char nazwisko[16];
 enum oceny ocena;
};

void odczytaj(struct student Studenci[]){
FILE *open;
 char bufor[512];
 // otwarcie pliku tekstowego do odczytu: r
 if ((open = fopen("studenci.txt", "r"))== NULL)
 {
 fprintf(stderr, "\nBlad otwarcia pliku!!!\n");
return 1;
 }
 printf("\n--------- zawartosc pliku studenci.txt-------------\n");
 // odczyt z pliku
 while (feof(open)==0) // feof - end of file (koniec pliku)
 {
 fgets(bufor, 512, open); // odczyt jednej linii tekstu
 printf("%s",bufor);
 
 }
 printf("\n-------------------------------------------------\n");
 // zamkniecie pliku
 fclose(open);

}	

void wyswietl(struct student Studenci[], int iloscStudentow ){
	for(int i=0; i<iloscStudentow; i++){
		printf("%s %s %d\n", Studenci[i].imie, Studenci[i].nazwisko, Studenci[i].ocena);
		
	}
}
void zapisz(int k, int iloscStudentow ){
	iloscStudentow=0;
	struct student Kowalski={"Jan", "Kowalski", db };
	struct student Studenci[MAX_STUDENTOW];
	FILE *plik;
 const char * const struktury1="studenci.txt";
 
 Studenci[0]=Kowalski; 
 iloscStudentow++;

 strncpy(Studenci[1].imie, "Adam", 12);
 Studenci[1].imie[11]='\0'; /* poprawne zakończenie napisu ! */
 strncpy(Studenci[1].nazwisko, "Wisniewski", 16);
 Studenci[1].nazwisko[15]='\0';
 Studenci[1].ocena=dst;
 iloscStudentow++;
 Studenci[1].ocena=4;
 
 if((plik=fopen(struktury1,"w"))==NULL){
 fprintf(stderr,"Nie moge otworzyc pliku %s\n",struktury1);
 exit(2); }
 
 for(k=0; k<iloscStudentow; k++)
 fprintf(plik,"%s %s %d\n", Studenci[k].imie,Studenci[k].nazwisko, Studenci[k].ocena);

if(fclose(plik)!=0){
 fprintf(stderr,"Nie moge zamknac pliku %s\n",struktury1);
 exit(3); }
}
int main(){
 int k, iloscStudentow=0;
 struct student Kowalski={"Jan", "Kowalski", db };
 struct student Studenci[MAX_STUDENTOW];
 
  Studenci[0]=Kowalski; 
 iloscStudentow++;
 strncpy(Studenci[1].imie, "Adam", 12);
 Studenci[1].imie[11]='\0'; /* poprawne zakończenie napisu ! */
 strncpy(Studenci[1].nazwisko, "Wisniewski", 16);
 Studenci[1].nazwisko[15]='\0';
 Studenci[1].ocena=dst;
 iloscStudentow++;
 Studenci[1].ocena=4;
  
  
  
  
   int a;
 printf("\n");
 printf("Co chcesz zrobic?\n");
 printf("1 - Wysietlic studentow\n");
 printf("2 - Zapisac studentow do pliku .txt\n");
 printf("3 - Odczytac dane(spis studentow) z pliku .txt\n");
 scanf("%d", &a);
 switch(a){
 	case 1: printf("\n");
 			wyswietl(Studenci, iloscStudentow);
 		 		break;
 	case 2: 
	  zapisz(k, iloscStudentow);
	 printf("Zapisano\n");
 		break;
 	case 3: 
		 odczytaj(Studenci);
	  		break;
 		 	default: 
	 printf("Wybierz funkcje od 1-3\n");
 	break;
 
 }
  return 0;
}
0
  1. kod jest nieczytelny. Nikt nie bedzie sie wglebial w kod ktory nie ma wciec oraz ma nazwy typu i j k
  2. Debugowales?
0
bool nextSubsetIndex(std::vector<int> &a, int n) {
    for (int i = a.size() - 1; i >=0; --i) {
        n--;
        if (a[i] < n) {
            int x = ++a[i];
            for (int j = i + 1; j < a.size(); ++j) {
                a[j] = ++x;
            }
            return true;
        }
    }

    return false;
}

void generateSubset(int n, int k, std::function<void(const std::vector<int> &)> f) {
    std::vector<int> a(k);

    for (size_t i=0; i<k; ++i) {
        a[i] = i;
    }

    do {
          f(a);
    } while (nextSubsetIndex(a, n));
}

https://ideone.com/EyVBbQ

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