Orar semigroup #2

Orar semigroup #2

Laborator 3 - Liste circulare simplu inlantuite (11 martie)

De la tastatură se citeşte numărul n şi numele a n copii. Să se simuleze următorul joc: cei n copii stau într-un cerc. Începând cu un anumit copil, se numără copiii în sensul acelor de ceasornic. Fiecare al n-lea copil iese din cerc. Câştigă ultimul copil rămas în joc.

#include <stdio.h>
#include <stdlib.h>
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;
void adaugare(nod **prim, nod **ultim, char nume[])
{
    nod*p;
    p=(nod*)malloc(sizeof(nod));
    strcpy(p->nume,nume);
    if((*prim)==NULL)
    {
        *prim=p;
        *ultim=p;
        (*prim)->urm=p;
        (*ultim)->urm=p;
    }
    else
    {
        p->urm=(*ultim)->urm;
        (*ultim)->urm=p;
        *ultim=p;
    }
}
void afisare(nod *prim, nod *ultim)
{
    nod *p;
    p=prim;
    do
    {
         printf("%s | ",p->nume);
         p=p->urm;
    }
    while(p!=prim);
    printf("\n\n");
}
void joc(nod **prim, nod **ultim, int n)
{
    int i=1;
    nod *q=*prim,*p;
    while(*prim!=*ultim)
        {
            for(i=1;i<=n-1;i++)
            {
                q=q->urm;
            }
            p=q->urm;
         //   if(p!=*prim && p!=*ultim)
                q->urm=p->urm;
            if(p==*prim)
            {
              //  (*ultim)->urm=p->urm;
                *prim=p->urm;
            }
            if(p==*ultim)
            {
                *ultim=q;
               // (*ultim)->urm=prim;
            }
        afisare(*prim,*ultim);
        }
}
int main()
{
    nod *prim=NULL, *ultim=NULL, *p;
    int i,n;
    printf("n=");
    scanf("%d",&n);
    char nume[20];
    printf("Cititi cele %d nume\n",n);
    for(i=1;i<=n;i++)
    {
        printf("%d. ",i);
        scanf("%s",nume);
        adaugare(&prim,&ultim,nume);
    }
    afisare(prim,ultim);
    joc(&prim,&ultim,n);
    printf("\nTastati o tasta pentru terminare");
    getch();
    return 0;
}
Varianta 2
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;
typedef struct
{nod *prim;
nod *ultim;
int lungime;
}lista;
void adaugare(lista *l);
void afisare(lista *l);
void joc(lista *l, int n);
----------------------------------
#include <stdio.h>
#include <stdlib.h>
typedef struct n
{
    char nume[20];
    struct n *urm;
} nod;

typedef struct l
{
    nod *prim;
    nod *ultim;
    int lungime;
} lista;

void adaugare(lista *l,char nume[])
{
    nod*p;
    p=(nod*)malloc(sizeof(nod));
    strcpy(p->nume,nume);
    if((*prim)==NULL)
    {
        *prim=p;
        *ultim=p;
        (*prim)->urm=p;
        (*ultim)->urm=p;
    }
    else
    {
        p->urm=(*ultim)->urm;
        (*ultim)->urm=p;
        *ultim=p;
    }
}

void afisare(lista *l)
{
    nod *p;
    p=prim;
    do
    {
        printf("%s | ",p->nume);
        p=p->urm;
    }
    while(p!=prim);
    printf("\n\n");
}

void joc(lista *l, int n)
{
    int i=1;
    nod *q=*prim,*p;
    while(*prim!=*ultim)
    {
        for(i=1; i<=n-1; i++)
        {
            q=q->urm;
        }
        p=q->urm;
        //   if(p!=*prim && p!=*ultim)
        q->urm=p->urm;
        if(p==*prim)
        {
            //  (*ultim)->urm=p->urm;
            *prim=p->urm;
        }
        if(p==*ultim)
        {
            *ultim=q;
            // (*ultim)->urm=prim;
        }
        afisare(*prim,*ultim);
    }
}

int main()
{
    nod *prim=NULL, *ultim=NULL, *p;
    int i,n;
    lista *l;
    printf("n=");
    scanf("%d",&n);
    char nume[20];
    printf("Cititi cele %d nume\n",n);
    for(i=1; i<=n; i++)
    {
        printf("%d. ",i);
        scanf("%s",nume);
        adaugare(&l,nume);
    }
    afisare(l);
    joc(&l,n);
    printf("\nTastati o tasta pentru terminare");
    getch();
    return 0;
}
TEMA
Să se conceapă o stuctură dinamică eficientă pentru reprezentarea matricelor rare. Să se scrie operaţii de calcul a sumei a două matrice rare. Afisarea se va face in forma naturală.
#include <stdio.h>
#include <stdlib.h>
typedef struct nod
{
    int i,j,val;
    struct nod *urm;
}nod;

typedef struct
{
    int nrl;
    int nrc;
    nod *prim;
    nod *ultim;
    int nrelem;
}matrice;

void citire(nod **p)
{
    (*p)=NULL;
    nod *x;
    int i,n;
    int linie,coloana,valoare;
    printf("Nr. de valori diferite de 0: ");
    scanf("%d",&n);
    printf("Cititi linie, coloana, valoare:\n");
    for(i=1;i<=n;i++)
    {
        scanf("%d",&linie);
        scanf("%d",&coloana);
        scanf("%d",&valoare);
        x=(nod*)malloc(sizeof(nod));
        x->i=linie;;
        x->j=coloana;
        x->val=valoare;
        x->urm=(*p);
        (*p)=x;
    }
}

void maxim(nod *a, nod *b, int *imax, int *jmax)
{
    *imax=*jmax=0;
    int i;
    while(a)
    {
        if(a->i > *imax)
            *imax=a->i;
        if(a->j > *jmax)
            *jmax=a->j;
        a=a->urm;
    }
    while(b)
    {
        if(b->i > *imax)
            *imax=b->i;
        if(b->j > *jmax)
            *jmax=b->j;
        b=b->urm;
    }
}

void afisare(nod*p)
{
    printf("\n");
    if(p==NULL)
    {
        printf("Lista goala");
        exit(1);
    }

    while(p!=0)
    {
        printf("%d ",p->i);
        printf("%d ",p->j);
        printf("%d\n",p->val);
        p=p->urm;
    }
    printf("\n");
}

nod* cautare(nod *s,int i,int j)
{
    while(s)
    {
        if(s->i==i && s->j==j)
            return s;
        else s=s->urm;
    }
    return 0;
}

void suma(nod *a, nod *b, nod **s)
{
    nod *x;
    *s=NULL;
    while(a)
    {
        if(cautare(b,a->i,a->j))
        {   x=(nod*)malloc(sizeof(nod));
            x->i=a->i;
            x->j=a->i;
            x->val=a->val+b->val;
            x->urm=(*s);
            (*s)=x;
        }
        else
        {
            x=(nod*)malloc(sizeof(nod));
            x->i=a->i;
            x->j=a->i;
            x->val=a->val;
            x->urm=(*s);
            (*s)=x;
        }
    a=a->urm;
    }

    while(b)
    {
        if(cautare(a,b->i,b->j)==0 && cautare(*s,b->i,b->j)==0)
        {
            x=(nod*)malloc(sizeof(nod));
            x->i=b->i;
            x->j=b->i;
            x->val=b->val;
            x->urm=(*s);
            (*s)=x;
        }
        b=b->urm;
    }

}

void afisare_matrice(nod *s,int imax, int jmax)
{
    int i,j;
    nod *p;
    for(i=1;i<=imax;i++)
    {
        for(j=1;j<=jmax;j++)
    {
        p=cautare(s,i,j);
        if(p)
            printf("%d ",p->val);
        else printf("%d ",0);
    }
    printf("\n");
    }
}

int main()
{
    int n;
    int imax,jmax;
    int i,j;
    nod *a,*b,*s,*p;
    printf("Prima matrice\n");
    citire(&a);
    printf("A doua matrice\n");
    citire(&b);
    suma(a,b,&s);
    printf("Lista a\n");
    afisare(a);
    printf("Lista b\n");
    afisare(b);
    printf("Lista suma\n");
    afisare(s);
    maxim(a,b,&imax,&jmax);
    printf("Nr de linii: %d\nNr de coloane: %d\n\n",imax,jmax);
    afisare_matrice(s,imax,jmax);

    printf("\n\nTastati o tasta pentru terminarea programului");
    getch();
    return 0;
}
Varianta 2 (cam nefunctional)

#include <stdio.h>
#include <stdlib.h>
typedef struct nod
{
    int i,j,val;
    struct nod *urm;
}nod;

typedef struct
{
    int nrl;
    int nrc;
    nod *prim;
    nod *ultim;
    int nrelem;
}matrice;

void adaug(matrice *m,int l,int c,int v)
{
    nod *p;
    p=(nod *)malloc(sizeof(nod));
    p->i=l;
    p->j=c;
    p->val=v;
    if(m->prim==0)
    {
        m->prim=m->ultim=p;
    }
    else
    {
        m->ultim->urm=p;
        m->ultim=p;
    }
    p->urm=0;
}

int val(matrice *m,int i, int j)
{
    while(m->prim)
    {
        if(m->prim->i==i && m->prim->j==j)
            return m->prim->val;
        else m->prim=m->prim->urm;
    }
    return 0;
}

void adun(matrice *d,matrice *m1, matrice *m2)
{
    int i,j,suma;
    for(i=1;i<=m1->nrl;i++)
    {
        for(j=1;j<=m1->nrc;j++)
        {
            suma=val(m1,i,j)+val(m2,i,j);
            if(suma!=0)
                adaug(d,i,j,suma);
        }
            //printf("\n");
    }
}

void afisare_matrice(matrice *d)
{
    int i,j,suma;
    for(i=1;i<=d->nrl;i++)
    {
        for(j=1;j<=d->nrc;j++)
            printf(" %d",val(d,i,j));
        printf("\n");
    }
}

int main()
{
    matrice m1,m2,m3;
    int n,i,v,l,c;
    m1.prim=m1.ultim=m2.prim=m2.ultim=NULL;
    printf("Matricea 1\nNr. linii:");
    scanf("%d",&m1.nrl);
    printf("Nr. coloane: ");
    scanf("%d",&m1.nrc);
    printf("Nr. de elemente diferite de 0: ");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        printf("Linia: ");
        scanf("%d",&l);
        printf("Coloana: ");
        scanf("%d",&c);
        printf("Valoare: ");
        scanf("%d",&v);
        adaug(&m1,l,c,v);
    }
    printf("\nMatricea 2\nNr. linii:");
    scanf("%d",&m2.nrl);
    printf("Nr. coloane: ");
    scanf("%d",&m2.nrc);
    printf("Nr. de elemente diferite de 0: ");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        printf("Linia: ");
        scanf("%d",&l);
        printf("Coloana: ");
        scanf("%d",&c);
        printf("Valoare: ");
        scanf("%d",&v);
        adaug(&m2,l,c,v);
    }
    printf("DDDDDD");
    adun(&m3,&m2,&m1);
    printf("DDDDDD");
    printf("%d %d\n",m3->nrl,m3->nrc);
    getch();
    afisare_matrice(&m3);

    printf("\n\nTastati o tasta pentru terminarea programului");
    getch();
    return 0;
}

marți, 11 martie 2014 by DlMuresan
Categories: , , | Leave a comment

Problema broaştei pentru C

Se oferă un lac de mxn "bălţi" care posedă sau nu obiecte plutitoare care pot susţine o broască de masă m'. Broasca este paraşutată pe un astfel de obiect plutitor căruia îi vom atribui în continuare denumirea de "nufăr". Se citeşte dintr-un fişier cu denumire fortuită m, n, poziţia iniţială a amfibianului, un număr întreg mm şi mm perechi de coordonate pe care se găsesc nuferi. Să se genereze într-o ordine fortuită toate traseele pe care le poate parcurge amfibianul pentru a ajunge la malul lacului.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int L[10][10],sol[10][10],n,m,mm,nrsol,is,js;
int dx[]= {-1,1,0,0},dy[]= {0,0,-1,1};

void citire(FILE *f)
{
    int a,b,i;
    fscanf(f,"%d %d %d %d %d",&m,&n,&is,&js,&mm);
    sol[is][js]=1;
    for(i=1; i<=mm; i++)
    {
        fscanf(f,"%d%d",&a,&b);
        L[a][b]=1;
    }
}

void afisare()
{
    int i,j;
    nrsol++;
    printf("Solutia nr %d\n",nrsol);
    for(i=1; i<=m; i++)
    {
        for(j=1; j<=n; j++)
            printf("%d ",sol[i][j]);
        printf("\n");
    }
    printf("\n");
}

void traseu(int i, int j, int pas)
{
    int inou,jnou,k;
    for(k=0; k<4; k++)
    {
        inou=i+dx[k];
        jnou=j+dy[k];
        if(inou>=1 && inou<=m && jnou>=1 && jnou<=n)
            if(sol[inou][jnou]==0 && L[inou][jnou]==1)
            {
                sol[inou][jnou]=pas;
                if(inou==1 || inou==m || jnou==1 || jnou==n)
                    afisare();
                traseu(inou,jnou,pas+1);
                sol[inou][jnou]=0;
            }
    }
}

int main()
{
    FILE *f;
    f=fopen("date.txt","r");
    citire(f);
    //printf("%d %d",m,n);
    traseu(is,js,2);
    printf("%d solutii",nrsol);
    printf("\nApasati o tasta pentru iesire");
    getch();
}
Fisier
7 7
4 3
11
4 2
1 2
1 4
4 5
4 4
3 4
3 5
4 1
5 2
4 7
4 6

joi, 9 ianuarie 2014 by DlMuresan
Categories: | Leave a comment

Laborator 5 - Probleme recursivitate (30 octombrie)

3.4.Să se scrie un program recursiv care citeşte n cuvinte şi le afişează în ordinea inversă a introducerii lor. 

#include <stdio.h>
#include <stdlib.h>

void citire_afisare(int n)
{
    int i;
    char a[10];
    if(n>=1)
{
    scanf("%s",&a);
    citire_afisare(n-1);
}
if(n)
    printf("%s\n",a);

}

int main()
{
    int n;
    printf("Cititi numarul de cuvinte: ");
    scanf("%d",&n);
    citire_afisare(n);
    getch();
}
 
3.5.Să se scrie un program recursiv de generare a produsului cartezian a n mulţimi.
#include<stdio.h>  //  CU ŞIRURI DE CARACTERE

int n,nr=0;
char a[10][10],x[10];

void backt(int i)
{
    int j;
    for(j=0;j<strlen(a[i]);j++)
    {
        x[i]=a[i][j];
        if(i==n)
        {
            printf("%s \n",x+1);
            nr++;
        }
        else
            backt(i+1);
    }
}

int main()
{
    int i;
    scanf("%d",&n);
    for(i=0;i<=n;i++)
    {
        gets(a[i]);
    }

    x[n+1]='\0';
    backt(1);
    printf("%d solutii",nr);
    getch();
    return 0;
}

3.6.Să se scrie un program de generare recursivă a submulţimilor de k elemente ale mulţimii A cu n elemente (combinaţiile de n elemente luate câte k). 

3.7. Să se scrie un program de rezolvare a problemei celor 8 regine (determinarea tuturor aşezărilor pe tabla de şah a celor 8 regine astfel încât să nu se atace). 

3.8.Să se genereze recursiv permutările mulţimii A de n elemente. 

3.9.Se consideră o bară de lungime m şi n repere de lungimi l1, l2, .... , ln. Din bară trebuie tăiate bucăţi de lungimea reperelor date, astfel încât să rezulte din fiecare reper cel puţin o bucată şi pierderile să fie minime. 

3.10. Funcţia lui Ackermann. Să se scrie programul recursiv care calculează funcţia lui Ackermann definită astfel: 
Ack(0,n)=n+1 pentru n ε N 
Ack(m,0)=Ack(m-1,1) pentru m ε N* 
Ack(m,n)=Ack(m-1,Ack(m,n-1)) pentru m,n ε N

marți, 5 noiembrie 2013 by DlMuresan
Categories: , , , , , , , , , , , | Leave a comment

Temă curs PC (6 noiembrie)

Se citeste într-un şir de caractere un număr hexazecimal, iar mai apoi un număr roman. Care e valoarea în zecimal?

#include <stdio.h>  //  Problema tema Ignat 6.11.13
#include <stdlib.h>  //  Se citeste intr-un sir de caractere un număr hexazecimal, iar mai apoi un număr roman. Care e valoarea în zecimal?
void roman_arab(char a[100])        //  M D C L X V I
{
int n=0,i,j;

for(i=0;i<strlen(a);i++)
{
    if(a[i]=='C' && a[i+1]=='M')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+900;
    }
    if(a[i]=='C' && a[i+1]=='D')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+400;
    }
    if(a[i]=='X' && a[i+1]=='C')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+90;
    }
    if(a[i]=='X' && a[i+1]=='L')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+40;
    }
    if(a[i]=='I' && a[i+1]=='X')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+9;
    }
    if(a[i]=='I' && a[i+1]=='V')
    {
        strcpy(a+i,a+i+2);
        i--;
        n=n+4;
    }
}

for(i=0;i<strlen(a);i++)
{
    switch(a[i])
    {
        case 'M':n=n+1000;break;
        case 'D':n=n+500;break;
        case 'C':n=n+100;break;
        case 'L':n=n+50;break;
        case 'X':n=n+10;break;
        case 'V':n=n+5;break;
        case 'I':n=n+1;break;
    }
}

printf("%d",n);
}

int pow(int n,int p)
{
    if(p==0)
        return 1;
    int i,k=1;
    for(i=1;i<=p;i++)
        k=k*n;
    return k;
}

void hexazecimal_zecimal(char a[100])
{
int n=0,nr,i,j,val;
nr=strlen(a);
for(i=0;i<nr;i++)
{
    switch(a[i])
    {
        case 'A':val=10;break;
        case 'B':val=11;break;
        case 'C':val=12;break;
        case 'D':val=13;break;
        case 'E':val=14;break;
        case 'F':val=15;break;
        default :val=(int)a[i];break;
    }
    n=n+val*pow(16,nr-i-1);
}
printf("%d",n);
}

int main()
{
    char a[100];
    printf("Cititi un numar hexazecimal sau un numar roman\n");
    gets(a);
    int ok;
    printf("Ati citit un numar hexazecimal (1) sau un numar roman (0)?\n");
    scanf("%d",&ok);
    printf("Numarul in zecimal este\n");
    if (ok==1)
    {
        hexazecimal_zecimal(a);
    }
    else
    {
        roman_arab(a);
    }
    getch();
}

by DlMuresan
Categories: , , , , , , , , | Leave a comment