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

Odpowiedz Nowy wątek
2018-05-15 23:03

Rejestracja: 1 rok temu

Ostatnio: 1 rok temu

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;
}
edytowany 1x, ostatnio: furious programming, 2018-05-16 00:00
Może rozbij to na osobne tematy, po jednym na każde zadanie? Dodatkowo spróbuj zawęzić obszar poszukiwań błędu w kodzie samemu wstępnie badając gdzie ten problem ewentualnie może się znajdować. - Bartosz36 2018-05-16 09:43
To prawda, trochę dużo jak na jeden temat. No i zrób wcięcia, bo ciężko się to czyta. - Czitels 2018-05-16 12:06

Pozostało 580 znaków

2018-05-16 10:47

Rejestracja: 8 lat temu

Ostatnio: 2 dni temu

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?

edytowany 3x, ostatnio: fasadin, 2018-05-16 10:48

Pozostało 580 znaków

2018-05-17 16:02

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0

Zadanie 1 dokładnie o tej treści było już przerabiane tutaj: https://4programmers.net/Forum/C_i_C++/307699-problem_z_wyswietleniem_wszystkich_podzbiorow?p=1471104#id1471104

Pozostało 580 znaków

2018-05-17 17:50

Rejestracja: 12 lat temu

Ostatnio: 2 minuty temu

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-05-17 17:50

Pozostało 580 znaków

Odpowiedz

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