#1 2010-10-31 23:10:13

januszs

Użytkownik

Zarejestrowany: 2010-10-20
Posty: 121
Punktów :   11 

Laboratorium 2

Zadanie 3 (tzw. ŁOPATOLOGIA :P):

#include "stdafx.h"

struct Data { short d,m,r,dt;};
char *Dni[] = {"Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziela"};
const short D0=5; //Punkt odniesienia - Piatek, 01.01.2010
short Tab[]={31,28,31,30,31,30,31,31,30,31,30,31}; //liczba dni w kolejnych miesiącach
struct Data D;

int przestepny(int rok)
{
    if (rok%400==0 || (rok%4==0 && rok%100!=0)) return 1;
    else return 0;
}


int dzienroku() //funkcja oblicza jaki jest dzien roku np. 02.03 (dla roku zwyklego) = 31+28+2=61
{
    int i,l;
    l=D.d;
    if (D.m>1)
        for (i=0; i<D.m-1; i++) l+=Tab[i];
    if (D.m>2) l+=przestepny(D.r);
    return l;
}

int baza() //funkcja oblicza bazowy dzien tygodnia (dla 01.01.rrrr) dla roku podanego przez uzytkownika
{
    int i,b,x;
    b=D0; //jesli D.r=2010 to zwraca stala bazowa D0
    x=0;
    if (D.r>2010) //oblicza do przodu
        for (i=2010; i<D.r; i++)
            b=(b+1+przestepny(i-1))%7; //jezeli b=8 to automatycznie zrobi z tego b=1;
    if (D.r<2010) //oblicza do tylu
        for (i=D.r; i<2010; i++)
        {
            x=(x+1+przestepny(i))%7;
        }
    b-=x;
    if (b<1) b+=7;
    return b;
}

void dzientygodnia()
{
    D.dt=baza()+((dzienroku()-1)%7);
//dzienroku-1 w celu unikniecia przesuniecia o jeden dzien (np. dla 01.01 byloby przesuniecie o 1 dzien wzgledem bazy, a przeciez to jest baza :p
//(dzienroku-1)%7 jezeli wynik rozny od zera to oznacza ze jest przesuniecie o "x" dni
    if (D.dt>7) D.dt-=7;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    fprintf(stderr,"Podaj date w formacie dd.mm.rrrr: ");
    scanf_s("%hd%*c%hd%*c%hd",&D.d,&D.m,&D.r);
    dzientygodnia();
    printf("%s, %d.%d.%d\n",Dni[D.dt-1],D.d,D.m,D.r);
    return 0;
}


program działa zarówno dla dat przyszłych jak i przeszłych :D


Czekam na komentarze i uwagi.

Zadanie 4 (propozycja)


#include "stdafx.h"
#include "string.h"


char *Jed[] = {"","jeden","dwa","trzy","cztery","piec","szesc","siedem","osiem","dziewiec","dziesiec","jedenascie","dwanascie","trzynascie",
             "czternascie","pietnascie","szesnascie","siedemnascie","osiemnascie","dziewietnascie"};
char *Dzi[] = {"","","dwadziescia ","trzydziesci ","czterdziesci ","piecdziesiat ","szescdziesiat ","siedemdziesiat","osiemdziesiat", "dziewiecdziesiat "};
char *Set[] = {"","sto ","dwiescie ","trzysta ","czterysta ","piecset ","szescset ","siedemset","osiemset ","dziewiecset "};
char *Tys[] = {""," tysiac "," tysiace ",  " tysiecy "};
char *Mln[] = {""," milion "," miliony ",  " milionow "};
char *Mld[] = {""," miliard "," miliardy "," miliardow "};

int Tekst(int l)
{
    char T[40]={""};
    int a=l;
    strcat(T,Set[a/100]);
    a%=100;
    if (a>19)
    {
        strcat(T,Dzi[a/10]);
        a%=10;
    }
    strcat(T,Jed[a]);
    printf("%s",T);
    if (l==1) return 1;
    if (l==0) return 0;
    if (a<2 || a>4) return 3;
    else return 2;
}

void Zamien(unsigned long l)
{
    int k;
    unsigned long a=l;
    k=Tekst(a/1000000000);
    printf("%s",Mld[k]);
    a%=1000000000;
    k=Tekst(a/1000000);
    printf("%s",Mln[k]);
    a%=1000000;
    k=Tekst(a/1000);
    printf("%s",Tys[k]);
    a%=1000;
    Tekst(a);
    printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
    unsigned long a;
    a=0;
    char T[40]={""};
    fprintf(stderr,"Podaj liczbe a(>0): ");
    scanf_s("%d",&a);
    if (a>=1)
    {
        fprintf(stderr,"Podana liczba slownie:\n");
        Zamien(a);
    }
    return 0;
}

Ostatnio edytowany przez januszs (2010-11-01 09:36:47)


Nie pytajcie po co to robię http://images.chomikuj.pl/button/jsszczytna.gif

Offline

 

#2 2010-11-02 11:52:18

 celudor

Użytkownik

Skąd: Wrocław
Zarejestrowany: 2010-10-20
Posty: 53
Punktów :   

Re: Laboratorium 2

To jest napisany na szybko program wypisujący słownie liczby mieszczące się w zakresie unsigned int (pisane na szybko po gcc na ubuntu, po niewielkich zmianach powinien działać pod MS VS2008)

Kod:

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

static char *jednostki[] = {
        "zero", "jeden", "dwa", "trzy", "cztery", "pięć", "sześć", "siedem", "osiem", "dziewięć",
        "dziesięć", "jedenaście", "dwanaście", "trzynaście", "czternaście", "piętnaście", "szesnaście",
        "siedemnaście", "osiemnaście", "dziewiętnaści"
};

static char *dziesiatki[] = {
        "", "", "dwadzieścia", "trzydzieści", "czterdzieści", "pięćdziesiąt", "sześćdziesiąt", "siedemdziesiąt",
        "osiemdziesiąt", "dziewiędziesiąt"
};

static char *setki[] = {
        "", "sto", "dwieście", "trzysta", "czterysta", "pięćset", "sześciset", "siedemset", "osiemset", "dziewięćset"
};

void slownie(int liczba) {



    if(liczba>999) {

        if(liczba/1000 == 1)
            printf("tysiąc ");
        else
            slownie(liczba/1000);
            printf("tysiące ");
        if(liczba%1000 != 0)
            slownie(liczba%1000);
    }
    else
        if(liczba>99) {
            printf("%s ", setki[liczba/100]);
            if(liczba%100 != 0)
                slownie(liczba%100);
        }
        else
            if(liczba>19) {
                printf("%s ", dziesiatki[liczba/10]);
                if(liczba%10 != 0)
                    slownie(liczba%10);
            }
            else
                printf("%s ", jednostki[liczba]);
}

int main() {

    unsigned int i = 65535;

    for(i=0;i<=65535;i++)
    {
        printf("%d - ", i);
        slownie(i);
        printf("\n");
    }
    return 0;
}

Offline

 

#3 2010-11-05 12:45:21

kemot

Użytkownik

Zarejestrowany: 2010-11-03
Posty: 94
Punktów :   

Re: Laboratorium 2

Co do 3 to jest taki sprytny wzor Zellera http://pl.wikipedia.org/wiki/Kalendarz_wieczny
Sa przyklady :

Kod:

char* week[7]={"Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziela"};
int zeller(int d,int m,int y,int s){
int Y,C,M,N,D;
M=1+(9+m)%12;
Y=y-(M>10);
C=Y/100;
D=Y%100;
if (s!=0) N=((13*M-1)/5+D+D/4+C/4+5*C+d)%7;
else N=((13*M-1)/5+D+D/4+6*C+d+5)%7;
return (7+N)%7;
}

funkcja napisana na podstawie analizy tablic zamieszczonych w Małej Encyklopedii Powszechnej PWN z 1959 r.:

Kod:

char* week[7]={"Poniedzialek","Wtorek","Sroda","Czwartek","Piatek","Sobota","Niedziela"};
 
int dow(int m, int d, int y, int s)
{
  int mon[12]={0,1,1,2,5,6,2,3,4,0,1,4};
  int leap;
  int a,b,c;
  leap=(s==0&&y%4==0||s!=0&&(y%4==0&&y%100!=0||y%400==0));
  a=(y%100)%28;
  b=(s==0)*(4+(y%700)/100+2*(a/4)+6*((!leap)*(1+(a%4))+(leap)*((9+m)/12)))%7+
    (s!=0)*(2*(1+(y%400)/100+(a/4))+6*((!leap)*(1+(a%4))+(leap)*((9+m)/12)))%7;
  c=(3*mon[m-1]+d)%7;
  return (c+6*b)%7;
}

Offline

 

#4 2010-11-05 22:06:40

januszs

Użytkownik

Zarejestrowany: 2010-10-20
Posty: 121
Punktów :   11 

Re: Laboratorium 2

w zadaniu 3 chciałem pokazać, że można coś takiego napisać bez dodatkowych pomocy naukowych :P dzięki za ciekawe sugestie.

@celudor: są 3 formy tysiąca w liczbie mnogiej 1 tysiąc, xx2,xx3,xx4 tysiące xx5-> tysięcy (analogicznie z milionami, miliardami, bilionami,...)
także warunek if ((liczba/1000==1) ... else ... jest niewystarczający.

pozdrawiam Janusz S.


Nie pytajcie po co to robię http://images.chomikuj.pl/button/jsszczytna.gif

Offline

 

#5 2010-11-08 13:11:44

mess

Użytkownik

3038132
Zarejestrowany: 2010-10-21
Posty: 17
Punktów :   

Re: Laboratorium 2

nie wiem kto pisze kody, które uznawane są za te poprawne...

Zadaniem programisty jest "balansować" między czytelnością kodu a jego szybkością, a nie pisanie kodu, który działa ale kolega, który go czyta musi się zastanawiać np. co to jest zmienna "a". Formalnie, bezpiecznie jest używać zmiennych do 31 znaków więc z pewnością przy odrobinie chęci można wymyślić nazwę, która coś mówi o tej zmiennej.
To samo tyczy się nazw funkcji. Ogólnie sugerował bym pisać je w języku angielskim, bo kiedy dojdziemy do programowania obiektowego, to zauważycie potrzebę używania "get'erów" i "set'rów", bez czego nie widzę możliwości pisania używając testów jednostkowych, które z kolei tworzą nam "interfejs" pod funkcjonalność naszego programu.
Wiem, że te programy, które teraz piszemy są małe, ale naprawdę warto wyrobić sobie pewne nawyki na tych małych programach, żeby potem nie męczyć się z tymi dużymi.

Jest sporo konwencji, które stosuje się niezależnie od języka, w którym się programuje i nie zamierzam do żadnej namawiać bo to kwestia personalnych upodobań, jednakże namawiam to stosowania się "jakiejś".


pozdrawiam

Offline

 

Stopka forum

RSS
Powered by PunBB
© Copyright 2002–2008 PunBB
Polityka cookies - Wersja Lo-Fi


Darmowe Forum | Ciekawe Fora | Darmowe Fora
Zbiorniki na gnojówkę Zalewo