Знание Паскаля и основ алгоритмизации, страница 3

/* Дано предложение. Создать новое предложение,

Удалив из исходного знаки пунктуации и лишние пробелы. */

#include<string.h>

#include<stdio.h>

void main(void){

            char s[120], s2[120]="", *p, d[]=" \t.,:;!?-";

      p=strtok(gets(s),d);

      while(p!=NULL){

            strcat(strcat(s2,p)," ");

            p=strtok(NULL,d);

      }

      if(*s2)

            s2[strlen(s2)-1]=0;

      puts(s2);

}

/* Дано предложение. Создать массив из встречающихся в нем слов. */

#include <string.h>

#include <stdio.h>

void main(void) {

            char s1[120], s2[120]="",*razd=" \t,.",*d[60],*p;

            int i,k=0;

      p=strtok(gets(s1),razd);      //исходное предложение разрушается

      while(p!=NULL) {

            for(i=0;i<k;i++)

                  if(!strcmp(p,d[i]))break;

            if(i==k) d[k++]=p;

            p=strtok(NULL,razd);

      }

      for(i=0;i<k;puts(d[i++]);

}

/* Дано предложение. Реверсировать каждое его слово. */

#include <string.h>

#include <stdio.h>

void main(void) {

            char s[120], s2[120], d[]=" \t,.", *p, lenp;

      strcpy(s2,gets(s));

      p=strtok(s,d);

      while(p!=NULL){

            lenp=strlen(strrev(p));

            p[lenp]=s2[p-s+lenp];

            p=strtok(NULL,d);

      }

      puts(s);

}


/* Дано предложение. Удалить из него лидирующие и

завершающие пробелы и знаки пунктуации. */

#include<string.h>

#include<stdio.h>

void main(void){

            char s[80], *s2, d[]=" \t.,:;!?-";

      gets(s);

      s2=s+strspn(s,d);

      if(*s2)

            strrev(s2)[strlen(s2)-strspn(strrev(s2),d)]=0;

      puts(s2);

}


void swap(int *a, int *b) {

      int c=*a;

*a=*b; *b=c;

}

Вычислить max2 |a|i=1,na+ max2 |b|i=1,nb.

int max(int *x, int nx) {

}

Вычислить (max2 |a|i=1,n+ max2 |b|i=1,m)/(kmaxa+kmaxb+1).

int max(int *x, int n, int *kmaxx) {

}

Вычислить длину окружности.

float pi=4*atan(1);

float CircleLength(float r){  //контроль r в вызывающей функции

      return 2*pi*r;

}    

if(r1<=0)

      ...   //обработка ошибки

else

      cl= CircleLength(r1);

float CircleLength(float r, int *error){  //контроль r в вызываемой функции

      *error = r>0;

      return 2*pi*r;

}

int err;    // int *err;      ERROR!!!

cl= CircleLength(r1, &err);

if(err==0)

      ...   //обработка ошибки

else

      ...   //OK

int CircleLength(float r, float *res){    //контроль r в вызываемой функции

      *res= 2*pi*r;

      return r>0;

}

float cl;

if(CircleLength(r1, &cl)==0)

      ...   //обработка ошибки

else

      ...   //OK

float CircleLength(float r){  //контроль r в вызываемой функции

      return r<=0?r: 2*pi*r;

}

float cl;

if((cl=CircleLength(r1))<=0)

      ...   //обработка ошибки

else

      ...   //OK

int error;

float CircleLength(float r){  //контроль r в вызываемой функции

      error= r<=0;

      return 2*pi*r;

}

//можно как в случае 1 или

cl= CircleLength(r1);

if(error==1)

      ...   //обработка ошибки

else

      ...   //OK

Вычисление производной в точке x0 от функции, задаваемой указателем на Си–функцию

#include<stdio.h>

#include<math.h>

double fderiv(double (*f)(double),double x0, int dig) {

            double eps,fx0,dx=0.1,df1,df0;

      eps=pow(10.,-dig-1);

      fx0=f(x0);

      df1=(f(x0+dx)-fx0)/dx;

      do {

            df0=df1;

            dx*=0.5;

            df1=(f(x0+dx)-fx0)/dx;

      } while(fabs(df1-df0)>eps);

      return df1;

}

void main(void) {

//          double f1(double x);

            double x=1; int dig=4;//number of digits after decimal point

            char format[20];

//    scanf("%f%d",&x0,&dig);

      sprintf(format,"df(%c.%df)=%c.%df\n",'%',dig,'%',dig);

      printf(format,x,fderiv(exp,x,dig));

}

double f1(double x) {

      return x*x+1;

}

Функции с переменным количеством аргументов

char *supercat(char *s, ...) {

      char **ptr=&s;

*s=0;

while(**++ptr)

      strcat(s, *ptr);

}

char s[80];

supercat(s,"Fr. ", "Skaryna ", "University", "");


Динамическое распределение памяти

в модели Small

void *malloc(unsigned size);              //в противном случае NULL

void *calloc(unsigned n, unsigned size);

void *realloc(void *block, unsigned size);

void free(void *block);

unsigned coreleft(void);

в модели Large размеры типа long unsigned

int n, x[n];            //error

int *x, n;

scanf(“%d”,&n);

if((x=(int*)malloc(n*sizeof(int)))==NULL) {

      puts(“Error!”); return;

}

int **a, n, i;

if((a=(int**)malloc(n*sizeof(int*)))==NULL) {...}

for(i=0; i<n; i++)

      if((a[i]=(int*)malloc(n*sizeof(int)))==NULL) {...}

int **a, *b, n, i;

long z=(long)n*n*sizeof(int);

if(z>0xffffl) {...}

if((b=(int*)malloc(z))==NULL) {...}

if((a=(int**)malloc(n*sizeof(int*)))==NULL) {free(b);...}

for(i=0; i<n; i++)

      a[i]=b+i*n;

}


//добавление элементов в список

//условие окончания – ввод неправильного элемента или нет памяти

void (*insert)(Blist **ph, Blist *p);

void add(Blist **ph) {

      Blist *p;

while((p=input())!=NULL)

            (*insert)(ph,p);

}

void insertfirst(Blist **ph, Blist *p) {

      p->next=*ph;

      *ph=p;

}

void insertlast(Blist **ph, Blist *p) {

      Blist *q;

if(*ph==NULL)

            *ph=p;

else {

            for(q=*ph; q->next!=NULL; q=q->next);

            q->next=p;

}

}

     

void insertlast2(Blist **ph, Blist *p) {

      Blist **qq;

for(qq=ph; *qq!=NULL; qq=&((*qq)->next));

*qq=p;

}

     

//вставка с сохранением упорядоченности элементов списка

void insertsort(Blist **ph, Blist *p);    //самостоятельно

//вставка после элемента, совпадающего с ключом, или в конец списка

int Bcmp(Book *b1, Book *b2); //0 при b1==b2, <0 при b1<b2, >0 при b1>b2

void insertafter(Blist **ph, Blist *p, Book *b) {

Blist *q;

if(*ph==NULL)

      *ph=p;

else {

      for(q=*ph; q->next!=NULL; q=q->next)

            if(Bcmp(&(q->b),b)==0)

                  break;

      p->next=q->next;

      q->next=p;

}

}


//вставка перед элементом, совпадающим с ключом, или в конец списка

void insertbefore(Blist **ph, Blist *p, Book *b) {

      Blist **qq;

for(qq=ph; *qq!=NULL; qq=&((*qq)->next))

      if(!Bcmp(&((*qq)->b),b))

            break;

p->next=*qq;

*qq=p;

}

//удаление элемента, совпадающего с ключом

void remove(Blist **ph, Book *b) {

      Blist *q, *prev=NULL;

for(q=*ph; q!=NULL; prev=q, q=q->next)

            if(!Bcmp(&(q->b),b))

                  break;

if(q!=NULL) {

            if(prev==NULL)          //удаляется начальный элемент списка

                  *ph=q->next;

            else

                  prev->next=q->next;

            free(q);

}

}

     

void remove2(Blist **ph, Book *b) {

      Blist **qq, *q;

for(qq=ph; *qq!=NULL; qq=&((*qq)->next))

      if(!Bcmp(&((*qq)->b),b))

            break;

if(*qq!=NULL) {

      q=*qq;

      *qq=(*qq)->next;

      free(q);

}

}