Diskuze: úkol
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 33 zpráv z 33.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
a)nepřesně zadané, není tam, jestli musí jít po sobě, pokud ano, použij něco na způsob
int i;
for(i = 0; i < velikost_pole; i++)
{
pole[i] = 2 * i + 1;
}
b)nechápu zadání
c)něco jako
FILE *f = fopen("data.txt", "w");
int i;
for(i = 0; i < velikost_pole; i++)
{
fprintf(f, "%d ", pole[i]);
}
fclose(f);
d)
FILE *f = fopen("data.txt", "r");
int i;
for(i = 0; i < velikost_pole; i++)
{
fscanf(f, "%d", &pole[i]);
}
fclose(f);
e)jen stručné poznámky, nemůžu všechno vyřešit za tebe
int * pole, i;
//alokace paměti
pole = (int*)malloc(sizeof(int)*pocet_prvku);
//výpis
for(i = 0; i < velikost_pole; i++)
{
printf("%d ", pole[i]);
}
//uvolnění paměti
free(pole);
zbytek je v předchozích úkolech.
cau vím že asi otravuju ale nenapsal by jsi mi prosím jak by to vypadalo s tím dvojrozměrným polem ? nějak se přes to nemůžu dostat
int matice[8][6], i, j, c = 1;
for(i = 0;i < 8;i++)
for(j = 0;j < 6;j++)
{
matice[i][j] =c;
c++;
}
Něco na tenhle způsob.
Výsledek uvedeného kódu je matice:
1 13 25 37 49 61 73 85
3 15 27 39 51 63 75 87
5 17 29 41 53 65 77 89
7 19 31 43 55 67 79 91
9 21 33 45 57 69 81 93
11 23 35 47 59 71 83 95
tak jestli teda můžu otravovat
a)naplnit dvojrozměrné pole lichými čísly tak... [i][j] aby se i=j
b)aby se pomocí ukazatelů provedl součet na hlavní diagonále např. [0][0]
+ [1][1] + [2][2] .....a aby výstup součtu byl float
c)aby se celé pole uložilo na disk v textové formě
d)aby se pole načetlo
e)Hlavní funkci která načte z klávesnice rozměr pole tedy "i" "j" a podle
toho alokuje pamět......a pak vypíše na obrazovku to pole,vytvoří a
vypíše součet prvků na hlavní diagonále,uloží upravené pole do souboru
na disk a pak ho načte a na konci to uvolní pamět
jestli to uděláš tak mockrát děkuju
No potřebuju to do Vánoc takže ještě je docela dost času.....
No to pole jak jsi ukazoval to je naplněný dobře ale musí to být jako
čtvercová matice takže když máš..... matice [i][j] aby tam byla podmínka
že i=j tím to bude ta čtvercová matice.....
a pak u tý druhý funkce aby se pomocí těch ukazatelů sečetly všechny
prvky který jsou na hlavní diagonále z toho naplněnýho pole takže prvky na
pozicích [0][0] + [1][1] + [2][2] + .....a tak to jde až po to kolik zadám
že je "i" a "j"
už to je srozumitelnější ?
A nevíš, jak se má ta matice allokovat? Způsob, co používám já mi nesedí s těmi ukazareli.
int **Pole;
int ** Nacti_matici(int n)
{ int i,j;
int **Pole;
if((Pole=(int**)malloc(n*sizeof(int*)))==NULL)
{printf("Nedostatek pameti!\n");exit(0);}
for (i=0;i<n;i++)
if((Pole[i]=(int*)malloc(n*sizeof(int)))==NULL)
{printf("Nedostatek pameti!\n");exit(0);}
for (i=0;i<n;i++)
for (j=0;j<n;j++)
{ printf("a[%d,%d]=",i,j);
scanf("%d",(*(Pole+i))+j);
}
return Pole;
}
no tohle nám ukazoval on jak by naplnil to pole....nevím jestli ti to nějak pomůže já se v tom moc nevyznám
Řeším to stejně, ale nesedí mi tam ten výpočet přes ukazatele.
Co ti na tom nesedí?
(*(Pole+i))+j == (Pole[i])+j == &Pole[i][j]
Btw, tohle je přesně důvod, proč se má programování vyučovat v Pascalu a nikoliv v C.
Nesedí mi následné posunutí ukazatele z pole[i][j] na pole[i+1][j+1]. A Pascal nesnášim. Já začal s C++ jako samouk.
Máš pole polí intů, ukazatele jsou správně. Pascal je hezká věc pro vyučování, protože se v něm podobné zlovolnosti nedají dělat.
Dobře jinak, nevím, jak posunout ukazatel z pole[i][j] na pole[i+1][j+1].
Tady to máš:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
main(int argc, char **argv)
{
/*deklarace proměnných*/
FILE *f;
int **matice, i, j, c, w = 0;
float vysledek = 0;
char adress[200];
int **pointer;
/*adresa souboru*/
if(argc > 1)
{
strcpy(adress, argv[1]);
}
else
strcpy(adress, "data.txt");
/*otevření souboru*/
f = fopen(adress, "w");
/*načtení rozměrů*/
printf("Zadejte sirku matice: ");
scanf("%d", &w);
/*alokace paměti*/
matice = (int**)calloc(w, sizeof(int));
for(i = 0; i < w; i++)
matice[i] = (int*)calloc(w, sizeof(int));
for(i = 0; i < w; i++)
for(j = 0; j < w; j++)
matice[i][j] = (rand()%20 + 1) * 2 - 1;
/*výpis matice*/
for(i = 0; i < w; i++)
{
for(j = 0; j < w; j++)
if(matice[i][j] < 10)
printf(" %d ", matice[i][j]);
else
printf("%d ", matice[i][j]);
printf("\n");
}
/*výpočet a výpis součtu čísel na hlavní diagonále*/
pointer = matice;
for(i = 0; i < w; i++)
{
vysledek += *((*(pointer+i))+i);
}
printf("Soucet cisel na hlavni diagonale pres ukazatel: %f\n", vysledek);
/*psaní do souboru*/
for(i = 0; i < w; i++)
{
for(j = 0; j < w; j++)
fprintf(f, "%d ", matice[i][j]);
fprintf(f, "\n");
}
/*"přepnutí" do režimu čtení*/
fclose(f);
f = fopen(adress, "r");
/*čtení ze souboru*/
for(i = 0; i < w; i++)
{
for(j = 0; j < w; j++)
fscanf(f, "%d", &matice[i][j]);
}
/*uvolnění paměti, zavření souboru*/
for(i = 0; i < w; i++)
free(matice[i]);
free(matice);
fclose(f);
/*čekání na stisk libovolné klávesy*/
_getch();
/*ukončení pogramu*/
return 0;
}
Můžeš si to jakkoli upravit, místo ukazatele pointer lze použít přímo ukazatel matice.
Možno by to bolo vhodnejšie takto:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// a) Funkce, která naplní pole lichými čísly
void napln_pole(int **matica, int strana_matice);
// b) Funkci, vypočte součet prvků na hlavní diagonále. Výstupním parametrem bude float.
// Operace ve funkci provádějte pomocí ukazatelů.
float sucet_prvkov_diagonaly(int **matica, int strana_matice);
// c) Funkci, která uloží pole do souboru na disk v textové formě
void uloz_pole_do_suboru(FILE *fw, char *nazov_suboru, int **matica, int strana_matice);
// d) Funkci, která načte toto pole z tohoto souboru
void nacitaj_pole_zo_suboru(FILE *fr, char *nazov_suboru, int **matica, int strana_matice);
// e) Hlavní funkce (main) :
// · Název souboru na disketě se zadává jako parametr při spouštění programu*/
int main(int argc, char *argv[])
{
FILE *f;
char nazov_suboru[30];
int **matica, i, j, strana_matice;
/* nazov suboru zoberie z parametra funkcie main() alebo ho nazve "data.txt" */
if(argc > 1)
strcpy(nazov_suboru, argv[1]);
else
strcpy(nazov_suboru, "data.txt");
//· načte požadovaný rozměr z klávesnice a alokuje paměť podle tohoto požadavku.
printf("Zadajte pocet riadkov matice: ");
scanf("%d", &strana_matice);
matica = (int **) malloc(strana_matice * sizeof(int *));
for (i = 0; i < strana_matice; i++)
matica[i] = (int *) malloc(strana_matice * sizeof(int));
// · Vypíše pole na obrazovku
napln_pole(matica, strana_matice); // naplni maticu neparnymi cislami
putchar('\n');
printf("Vypis matice na obrazovku:\n");
for (i = 0; i < strana_matice; i++) {
for (j = 0; j < strana_matice; j++)
printf("%4d, ", matica[i][j]);
putchar('\n');
}
// · Vytvoří a vypíše součet prvků na diagonále
printf("\nSucet prvkov hlavnej diagonaly je %.2f\n",
sucet_prvkov_diagonaly(matica, strana_matice));
// · Uloží upravené pole do souboru na disk
uloz_pole_do_suboru(f, nazov_suboru, matica, strana_matice);
// · Načte toto pole a znovu jej vypíše
nacitaj_pole_zo_suboru(f, nazov_suboru, matica, strana_matice);
putchar('\n');
printf("Vypis matice stiahnutej zo suboru na obrazovku:\n");
for (i = 0; i < strana_matice; i++) {
for (j = 0; j < strana_matice; j++)
printf("%4d, ", matica[i][j]);
putchar('\n');
}
// · Před ukončením programu uvolní všechnu alokovanou paměť
for (i = 0; i < strana_matice; i++)
free((void *) matica[i]);
free((void *) matica);
return 0;
}
// a) Funkce, která naplní pole lichými čísly
void napln_pole(int **matica, int strana_matice)
{
int i, j, k = 1;
for (i = 0; i < strana_matice; i++) {
for (j = 0; j < strana_matice; j++) {
matica[i][j] = k;
k += 2;
}
}
}
// b) Funkci, vypočte součet prvků na hlavní diagonále. Výstupním parametrem bude float.
// Operace ve funkci provádějte pomocí ukazatelů.
float sucet_prvkov_diagonaly(int **matica, int strana_matice)
{
int i;
float sucet = 0.0;
for(i = 0; i < strana_matice; i++) {
sucet += *((*(matica+i))+i);
}
return sucet;
}
// c) Funkci, která uloží pole do souboru na disk v textové formě
void uloz_pole_do_suboru(FILE *fw, char *nazov_suboru, int **matica, int strana_matice)
{
int i, j;
char cislo_text[strana_matice * strana_matice][20];
fw = fopen(nazov_suboru, "w");
for (i = 0; i < strana_matice; i++) {
for (j = 0; j < strana_matice; j++) {
sprintf(cislo_text[i], "%d", matica[i][j]); // prevod cisla na retazec (text)
fprintf(fw, "%s ", cislo_text[i]);
}
fprintf(fw, "\n");
}
fclose(fw);
}
// d) Funkci, která načte toto pole z tohoto souboru
void nacitaj_pole_zo_suboru(FILE *fr, char *nazov_suboru, int **matica, int strana_matice)
{
int i, j;
char cislo_text[strana_matice * strana_matice][20];
if ((fr = fopen(nazov_suboru, "r")) == NULL)
printf("Subor %s sa nepodarilo otvorit.\n", nazov_suboru);
putchar('\n');
for(i = 0; i < strana_matice; i++) {
for(j = 0; j < strana_matice; j++) {
fscanf(fr, "%s", &cislo_text[i]); // precitanie retazcov zo suboru
matica[i][j] = atoi(cislo_text[i]); // prevod retazcov na cisla a vlozenie do pola
}
}
fclose(fr);
}
strašne moc děkuju funguje to bezvadně jediný co ještě nevím kde ? a nebo jak ? zadat ten název souboru
Ak chceš zadať názov súboru, musíš spustiť program v konzole (Command
Prompt - príkazový riadok).
Robí sa to takto:
Spustíš príkazový riadok - je v príslušenstve.
Tam nalistuješ zložku, v ktorej sa nachádza program.
Príkaz: dir ti vypíše obsah zložky, v ktorej sa práve nachádzaš.
Príkaz: cd názov_zložky ťa presunie do zložky.
Zase dir na výpis atď. Nakoniec sa dostaneš do zložky, kde máš uložený
program.
Tam zadáš príkaz: nazov_programu.exe (samozrejme, že tam musí byť), za
ním medzeru a názov súboru, ktorý chceš predať ako argument.
Napr.: test.exe subor.txt
Po ukončení programu nájdeš v zložke vytvorený subor.txt a skontroluješ
si ho.
Viac obrázkov mi to nevzalo, tak dávam sem:
Sice jsi to pěkně rozdělil do funkcí, ale kód je delší, ošklivější a méně přehledný . Funkce se hodí hlavně na věci, které se často opakují.
Ja som len splnil presne požiadavky zadania. Tam sa tie funkcie priamo
vyžadujú.
Navyše si myslím, že som neprehľadnosť kódu trochu nahradil popiskami.
Ne ale jsem zvyklý řešit vše co nejjednodušeji, šetřit pamětí a nepsát komentáře
Ja som tie komentáre písal hlavne kvôli nemu, aby mal aspoň predstavu vo co go.
Já taky, jinak bych tam neměl ani jeden...
Ja si komentáre píšem aj pre seba. Predsa len je rozdiel keď si svoj program bez komentárov pozrie za rok, dva 55 ročný alebo 16 ročný chlap. Čo ty na to?
Jojo. Já se ve svých kódech vyznám
Zobrazeno 33 zpráv z 33.