c wyk+éad 8, Studia, Rok I, Informatyka, informatyka


Jeszcze raz: Wskaźniki

0x08 graphic
Istnieje ścisłe powiązanie pomiędzy wskaźnikami i tablicami.

Przykład:

double *ws, Tt[4]={3.15, 5.64, 7.67, 9.11} ;

0x08 graphic
ws=Tt

.........................

W przykładzie wskaźnik ws otrzymuje adres pierwszego elementu tablicy Tt.

Aby przykładowo odwołać się do 3 elementu tablicy Tt, można albo napisać:

Tt[2]

albo

*(ws+2) - obie instrukcje zwracają 3 element.

tzn. Tt[2]=7.67, ale również *(ws+1)= 7.67

Natomiast nie używając nawiasów w powyższym zapisie otrzymamy:

*ws+1= 4.15 /* bo jest to 3.15 +1*/

0x08 graphic
Wykorzystanie wskaźników przy odwoływaniu się do elementów tablicy daje szybszy kod!

#include <stdio.h>

void main()

{

char *te, tab[14]="Programowanie";

te=tab;

for (int i=0;i<14;i++)

printf ("%c",tab[i]); // wydruk tablicy znakowej tab

printf ("\n\n");

while (*te) printf("%c",*te++); // wydruk tablicy znakowej tab przy

// wykorzystaniu wskaźnika te

printf ("\n\n");

}


Przykład błędnej i

int main()

{

int x,*p;

x=10;

*p=x

}

poprawnej inicjalizacji wskaźnika:

int main()

{

int x,*p;

x=10;

p=&x

}


Dynamiczne alokowanie tablic - dc. Przykład

#include <stdio.h>

#include <stdlib.h>

int potega(int,int);

void main()

{

int (*p)[10];

int i,j;

p=(int(*)[10]) malloc(40*sizeof(int));

if (!p)

{

printf("Pobranie pamieci nie udalo sie\n");

exit(1);

}

for(j=1;j<11;j++)

for(i=1;i<5;i++)

0x08 graphic
p[i-1][j-1]=potega(j,i);

for(j=1;j<11;j++)

{

for(i=1;i<5;i++)

printf("%10d ",p[i-1][j-1]);

printf("\n");

}

printf ("\n\n");

}

potega(int a, int b)

{

int k=1;

for ( ; b ; b-- ) k=k*a;

return k;

}

Napisać program wyznaczający krzywą rozpoczynająca się w początku układu współrzędnych dla której kąt pomiędzy styczną do krzywej a osią x równy jest:

0x08 graphic
wartości współrzędnej x

#include<stdio.h>

#include<math.h>

double Runge_Kutta(double,double,double);

double f(double,double);

void main()

{

double x,y,h;

FILE *f;

int n,i;

f=fopen("rkx.dat","w");

h=0.05;

x=0;y=0;n=80;

fprintf(f,"%6.2f %8.2f\n",x,y);

for (x=h,i=1;i<n;x+=h,i++)

{

y=Runge_Kutta(x,y,h);

fprintf(f,"%6.2f %8.2f\n",x,y);

printf("%6.2f %8.2f\n",x,y);

}

}

double Runge_Kutta(double x,double y,double h)

0x08 graphic
{

double k0,k1,k2,k3;

k0=h*f(x,y);

k1=h*f(x+0.5*h,y+0.5*k0);

k2=h*f(x+0.5*h,y+0.5*k1);

k3=h*f(x+h,y+k2);

return y+(k0+2*k1+2*k2+k3)/6;

}

double f(double x,double y)

{

return tan(x);

}

Procedura Newtona - rozwiązywanie równań różniczkowych 1 rzędu

y'=f(x,y)

czyli (numerycznie ): 0x01 graphic

ponieważ : 0x01 graphic

więc: 0x01 graphic

Napisać program obliczający zachowanie się masy połączonej sprężyną z podłożem i równolegle tłumikiem hydraulicznym. Należy w kolejnych chwilach czasu określić położenie i prędkość masy.

0x08 graphic
Równanie opisujące ruch masy:

0x01 graphic

w stanie równowagi:

0x01 graphic

0x01 graphic

podstawiając: 0x01 graphic

Otrzymuje się układ równań: 0x01 graphic

Wczytywane dane:

m, g, k, c1, c2, ypocz, Δt i tkoń

#include <stdio.h>

#include <math.h>

double f1(double);

double f2(double,double, double);

double g=9.81,m=2,k=0.4;

double c1=0.5, c2=0.2;

double ypocz=0.5;

double dt=0.5,tk=100;

void main()

{

FILE *f;

f=fopen("masa.dat","w");

double yr,y,u=0,t=0;

0x08 graphic
yr=m*g/k;

y=ypocz;

while (t<tk)

{

fprintf(f,"%4.1f %6.2f %6.2f\n",t,y,u);

printf("%4.1f %6.2f %6.2f\n",t,y,u);

y=y+f1(u)*dt;

u=u+f2(y,yr,u)*dt;

t=t+dt;

}

}

double f1(double u)

{

return u;

}

double f2(double y,double yr, double u)

{

double c;

if (u>0) c=c1; else c=c2;

return -g-k/m*(y-yr)-c*u*fabs(u);

}

Wykorzystać metodę Newtona do obliczenia wartości funkcji uwikłanej: F(x,y)=0. Tzn. napisać program, który umożliwia dla każdego x z dziedziny funkcji obliczenie wartości y.. Obliczenia prowadzić następująco:

gdzie F'y(x,y) jest cząstkową pochodną funkcji po y.

Program wykorzystać do obliczenia wartości funkcji:

x*exp(y)-x*y-3=0 dla x=2

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

double pochodna(double,double,double);

double fun(double,double);

0x08 graphic
void main()

{

double h,p=1,x,y=1,eps=1e-8;

printf("Podaj wartosc x\n");

scanf("%lg",&x);

h=1e-6*x;

while (fabs(p)>eps)

{

p=fun(x,y)/pochodna(h,x,y);

y=y-p;

}

printf("dla x=%7.3f y=%7.3f\n",x,y);

return;

}

double pochodna(double h,double x, double y)

{

return (fun(x,y+h)-fun(x,y))/h;

}

double fun(double x, double y)

{

return x*exp(y)-x*y-3;

}

0x08 graphic

INFORMATYKA WYKŁAD 8 Temat: Język C 6

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

0x01 graphic

Przypomnienie: wskaźnik musi

przed jego użyciem zostać

zainicjowany tzn. musi zacząć

wskazywać na jakiś adres w

pamięci

To jest Tt[0] - pierwszy element

Trzeci element

tablicy czyli Tt[2]



Wyszukiwarka