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:
#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ć.
2.Kolejne zadanie, z którym mam problem. Nie wiem jak napisać to mnożenie.
#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;
}
- 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;
}