Студентам с лабораторными сюда (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 20 Jun 2007.

Thread Status:
Not open for further replies.
  1. Flame of Soul

    Flame of Soul Elder - Старейшина

    Joined:
    25 May 2007
    Messages:
    185
    Likes Received:
    146
    Reputations:
    45

    указывайте ЯП (язык программирования);


    PHP:
    program Project1;
    uses
      SysUtils
    ;
    var
      
    x,y,w,z: array[0..11of real;
      
    px,py,sw,sz,Sreal;
      
    iinteger;
    begin
      writeln
    ('#> PROGRAMMA: rabota s massivami.');
      
    writeln('===========================================================');
      
    writeln('#>  array X;');
      
    writeln('===========================================================');
      
    writeln('#>  x[0] := 1.20; x[1] := 3.63; x[2] := 4.52; x[3] :=-2.22;');
      
    writeln('#>  x[4] :=-12.0; x[5] :=-7.52; x[6] := 1.65; x[7] := 2.22;');
      
    writeln('#>  x[8] := 2.09; x[9] :=-6.23; x[10]:= 4.09; x[11]:= 2.43;'+#10);
      
    writeln('#>  array Y;');
      
    writeln('===========================================================');
      
    writeln('#>  y[0] :=-3.56; y[1] := 2.02; y[2] := 1.01; y[3] := 6.52;');
      
    writeln('#>  y[4] :=-11.7; y[5] :=-7.52; y[6] := 1.13; y[7] := 7.23;');
      
    writeln('#>  y[8] := 5.55; y[9] := 6.66; y[10]:=-7.77; y[11]:=-8.88;'+#10);
      
    writeln('#>  array W;');
      
    writeln('===========================================================');
      
    writeln('#>  w[0] := 1.22; w[1] := 3.03; w[2] := 2.32; w[3] := 5.63;');
      
    writeln('#>  w[4] :=-22.2; w[5] := 7.22; w[6] :=-5.65; w[7] :=-7.85;');
      
    writeln('#>  w[8] := 2475; w[9] :=-6.21; w[10]:= 3.17; w[11]:=-2.03;'+#10);
      
    writeln('#>  array Z;');
      
    writeln('===========================================================');
      
    writeln('#>  z[0] :=-8.88; z[1] := 8.01; z[2] :=-1.99; z[3] := 1.27;');
      
    writeln('#>  z[4] := 1.05; z[5] :=-7.77; z[6] := 8.02; z[7] := 2.38;');
      
    writeln('#>  z[8] := 4.09; z[9] := 5.23; z[10]:=-6.66; z[11]:= 4.23;'+#10);
      //=============#===============#===============#==============#====*
      
    x(.0.) := 1.20x(.1.) := 3.63x(.2.) := 4.52x(.3.) :=-2.22;//---
      
    x(.4.) :=-12.0x(.5.) :=-7.52x(.6.) := 1.65x(.7.) := 2.22;//---
      
    x(.8.) := 2.09x(.9.) :=-6.23x(.10.):= 4.09x(.11.):= 2.43;//---
      
    y(.0.) :=-3.56y(.1.) := 2.02y(.2.) := 1.01y(.3.) := 6.52;//---
      
    y(.4.) :=-11.7y(.5.) :=-7.52y(.6.) := 1.13y(.7.) := 7.23;//---
      
    y(.8.) := 5.55y(.9.) := 6.66y(.10.):=-7.77y(.11.):=-8.88;//---
      
    w(.0.) := 1.22w(.1.) := 3.03w(.2.) := 2.32w(.3.) := 5.63;//---
      
    w(.4.) :=-22.2w(.5.) := 7.22w(.6.) :=-5.65w(.7.) :=-7.85;//---
      
    w(.8.) := 2475w(.9.) :=-6.21w(.10.):= 3.17w(.11.):=-2.03;//---
      
    z(.0.) :=-8.88z(.1.) := 8.01z(.2.) := 1.99z(.3.) := 1.27;//---
      
    z(.4.) := 1.05z(.5.) :=-7.77z(.6.) := 8.02z(.7.) := 2.38;//---
      
    z(.8.) := 4.09z(.9.) := 5.23z(.10.):=-6.66z(.11.):= 4.23;//---
      
    writeln('___________________________________________________________');
      
    px:=1py:=1sw:=0sz:=0;
      for 
    i:=0 to 11 do if x[i]>0 then px:=px*x[i];
      for 
    i:=0 to 11 do if y[i]>0 then py:=py*y[i];
      for 
    i:=0 to 11 do if w[i]>0 then sw:=sw+w[i];
      for 
    i:=0 to 11 do if z[i]>0 then sz:=sz+z[i];
      
    S:=(px+py)/(sw+sz);
      
    writeln('#>  P(x) = ',px:0:8);
      
    writeln('#>  P(y) = ',py:0:8);
      
    writeln('#>  S(w) = ',sw:0:8);
      
    writeln('#>  S(z) = ',sz:0:8,#10);
      
    writeln('#>  S = [P(x)+P(y)]/[S(w)+S(z)] = ',s:0,3);
      
    readln;
    end.
     
    1 person likes this.
  2. fker

    fker Member

    Joined:
    26 Nov 2008
    Messages:
    135
    Likes Received:
    64
    Reputations:
    -1
    тоже самое, только на си
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    void main()
    {
    clrscr();
    int W[12], X[12], Y[12], Z[12];
    int pY=1, pX=1, sW=0, sZ=0, i;
    float S;
    //заполнение и вывод массивов
    printf("  W    X    Y    Z\n");
    for(i=0; i<12; i++){
       W[i]=rand()%10-5;
       X[i]=rand()%10-5;
       Y[i]=rand()%10-5;
       Z[i]=rand()%10-5;
       printf(" %3d  %3d  %3d  %3d\n",W[i],X[i],Y[i],Z[i]);
       }
    //Произведение и сумма
    for(i=0; i<12; i++){
       if(Y[i]>0) pY*=Y[i];
       if(X[i]>0) pX*=X[i];
       if(W[i]>0) sW+=W[i];
       if(Z[i]>0) sZ+=Z[i];
       }
    
    //printf("%d   %d   %d   %d",pY,pX,sW,sZ);
    
    S=(float)(pY+pX)/(sW+sZ);
    printf("\nS = %.2f",S);
    getch();
    }
    
     
    #1362 fker, 6 May 2009
    Last edited: 6 May 2009
  3. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    А подпрограммы где ? :)
     
  4. fker

    fker Member

    Joined:
    26 Nov 2008
    Messages:
    135
    Likes Received:
    64
    Reputations:
    -1
    И вправду (=
    Переделано :
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    
    void main()
    {
    //прототипы функций
    float S_c4eT(int *, int *, int *, int *);
    void mas_print(int *, int *, int *, int *);
    void rand_zap(int *, int *, int *, int *);
    clrscr();
    int W[12], X[12], Y[12], Z[12];
    //вызов ф-й
    rand_zap(W,X,Y,Z);
    mas_print(W,X,Y,Z);
    printf("\nS = %.2f",S_c4eT(W,X,Y,Z));
    getch();
    }
    
    
    //ф-я вывода массивов
    void mas_print(int w[12], int x[12], int y[12], int z[12])
    {
    printf("   W    X    Y    Z\n");
    for(int i=0; i<12; i++)
       printf(" %3d  %3d  %3d  %3d\n",w[i],x[i],y[i],z[i]);
    }
    
    
    //ф-я подсчета S
    float S_c4eT(int w[12], int x[12],int y[12], int z[12])
    {
    int pY=1,pX=1,sW=0,sZ=0;
    for(int i=0; i<12; i++){
       if(y[i]>0) pY*=y[i];
       if(x[i]>0) pX*=x[i];
       if(w[i]>0) sW+=w[i];
       if(z[i]>0) sZ+=z[i];
       }
    return (float)(pY+pX)/(sW+sZ);
    }
    
    
    //рандомное заполнение массивов
    void rand_zap(int W[12], int X[12], int Y[12], int Z[12])
    {
    for(int i=0; i<12; i++){
       W[i]=rand()%10-5;
       X[i]=rand()%10-5;
       Y[i]=rand()%10-5;
       Z[i]=rand()%10-5;
       }
    }
    
     
  5. fker

    fker Member

    Joined:
    26 Nov 2008
    Messages:
    135
    Likes Received:
    64
    Reputations:
    -1
    делать что-то нефиг(
    2 TR0J@N :
    5:
    Code:
    #include<stdio.h>
    #include<conio.h>
    void main()
    {
    clrscr();
    int a[10]={6,-7,23,100,-45,62,-30,-21,115,-32};
    int s=0;
    for(int i=1; i<10; s+=a[i], i+=2);
    printf("S = %d\n",s);
    getch();
    }
    6:
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<math.h>
    float fns(int x, int y)
    {
    return (float)sqrt(x*x+y*y);
    }
    
    void main()
    {
    clrscr();
    int x,y,a,b,c;
    float S;
    printf("Input x,y,a,b,c -> ");
    scanf("%d%d%d%d%d",&x,&y,&a,&b,&c);
    S=(fns(x,y)-fns(a,b))/(3*cos(c)+fns(b,c));
    printf("\nS = %.2f\n",S);
    getch();
    }
    7: (только без подпрограмм, как в примере на бэйсике)
    Code:
    #include<conio.h>
    #include<stdio.h>
    void main()
    {
    clrscr();
    int aS=0,bS=0;
    float Z;
    int a[8],b[10];
    for(int i=0; i<8; i++){
       a[i]=i+1;
       aS+=a[i]*a[i];
       }
    for(int j=0; j<10; j++){
       b[j]=j+1;
       bS+=b[j]*b[j];
       }
    Z=(float)aS/bS;
    printf("Z = %.2f",Z);
    getch();
    }
     
  6. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Я думаю, что в задании подразумевается через подрограммы считать суммы элементов ;)
     
  7. MRAK9

    MRAK9 Member

    Joined:
    29 Jul 2007
    Messages:
    115
    Likes Received:
    26
    Reputations:
    0
    Помогите, не знаю в чем трабла, но не могу написать прогу-все время в файлах вместо цифр иероглифы получаются

    собственно задача: PASCAL
    Дан текстовой файл с числами, нужно рассортировать элементы в 2 файла: в первом положительные элементы, во втором отрицательные
     
  8. NigHT_0WL

    NigHT_0WL Member

    Joined:
    28 Jan 2009
    Messages:
    32
    Likes Received:
    7
    Reputations:
    0
    попробуй создавать файлы в редакторе, которым пользуешься для написания программ.
     
  9. Nogy

    Nogy New Member

    Joined:
    14 Nov 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Скопировать все строки текстового файла F в текстовой файл G, добовляя после каждой строки число, равное её длинне( количестово символов, ключая пробелы )
    //если было...укажите страницу пжл...

    И ещё одна....
    Нужно записать число-буквами...

    задачи в delphi
     
  10. ZodiaX

    ZodiaX Reservists Of Antichat

    Joined:
    7 May 2009
    Messages:
    533
    Likes Received:
    308
    Reputations:
    51
    Всем доброго времени суток.
    Помогите с решением небольших траблов с лаболаторной.
    Требуеться разработать консольное приложение обрабатывающее текстовый файл, каждая строка которого содержит запись фиксированного формата, поля записей разделяються запятыми.
    Поля в записях нумеруються с 0, слева направо.
    В результате формируеться выходной файл формата аналогичного входному (txt), каждая запись которого включает в себя следующие поля исходной записи: 0, 1, 4, 9, 10, 12, 13, 14
    Реализация осуществляеться в Delphi.
    Заранее благодарен.
     
  11. MRAK9

    MRAK9 Member

    Joined:
    29 Jul 2007
    Messages:
    115
    Likes Received:
    26
    Reputations:
    0
    эт как? ты мне хочешь сказать чтобы я создал файл из окна TP что ли? исходный файлик не при чем-он у меня почемуто читает из файла в машинном коде и оставляет в таком же виде без изменений....
     
  12. VIP

    VIP Elder - Старейшина

    Joined:
    29 Dec 2004
    Messages:
    104
    Likes Received:
    3
    Reputations:
    0
    Доброго времени суток!

    Третью неделю уже не могу написАть лабораторную =( Вот решил спросить у добрых людей здесь. Задача заключается в прочтении текста о ноутбуках из файла file.txt и записывания данных о каждом ноутбуке в структуру.

    Пример файла file.txt
    Code:
    Acer Note Lite         | 2669 | 5.6 | 02.0x11.8x08.3 | 100 | 40 | 10.4 | 1 | 1024x768 | 60 | 0.774 
    ASW ND5123T            | 3489 | 7.2 | 02.3x11.8x10.1 | 133 | 32 | 12.1 | 2 | 1024x768 | 70 | 1.300
    ARMNote TS80CD         | 3699 | 7.2 | 02.0x11.8x08.8 | 133 | 64 | 11.3 | 1 | 1024x768 | 75 | 1.300
    AST Ascentia P50       | 4499 | 7.5 | 02.3x11.5x09.0 | 133 | 40 | 11.3 | 1 | 0800x600 | 70 | 0.774
    BSI NP8657D            | 2605 | 8.0 | 02.3x11.3x09.3 | 133 | 40 | 11.3 | 1 | 1024x768 | 60 | 0.810
    BSI NP5265A            | 3765 | 8.2 | 02.5x11.8x09.0 | 150 | 32 | 12.1 | 2 | 1024x768 | 70 | 1.300
    Dell Xpi P100SD        | 3459 | 6.0 | 02.3x12.0x08.8 | 100 | 40 | 10.3 | 1 | 1024x768 | 60 | 0.773
    Digital HiNote         | 4799 | 4.0 | 01.3x11.0x08.8 | 120 | 40 | 10.4 | 1 | 0800x600 | 56 | 1.000
    Gateway Solo S5        | 4499 | 5.6 | 02.0x11.0x08.8 | 133 | 40 | 11.3 | 2 | 1024x768 | 60 | 0.686
    Hertz Z-Optima NB      | 3995 | 8.0 | 02.3x11.9x09.0 | 150 | 40 | 11.2 | 2 | 1024x768 | 75 | 1.000
    HP OmniBook 5500       | 6120 | 7.1 | 02.0x11.9x09.0 | 133 | 64 | 11.4 | 1 | 1024x768 | 75 | 1.300
    IBM ThinkPad 560       | 3749 | 4.1 | 01.3x11.5x08.8 | 120 | 40 | 12.1 | 2 | 1024x768 | 85 | 0.774
    NEC Versa 4080H        | 4780 | 6.6 | 02.3x11.8x09.5 | 120 | 48 | 10.4 | 1 | 0800x600 | 70 | 0.776
    Polywell Poly 500      | 3300 | 7.9 | 02.3x11.8x09.0 | 120 | 40 | 10.4 | 1 | 1024x768 | 72 | 1.000
    Samsung SENS 810       | 3667 | 8.7 | 02.3x11.5x09.5 | 100 | 32 | 11.4 | 2 | 1024x768 | 75 | 0.773
    Twinhead Slimnote      | 2965 | 7.4 | 02.0x11.5x08.0 | 075 | 64 | 10.4 | 1 | 1024x768 | 70 | 0.772
    Вот что у меня получилось (т.е. не получилось)
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct _NOTEBOOK {
    	char model[20]; // название модели
    	int price; // цена
    	float mass; // масса
    	struct _size { // размеры
    		float highter; // высота
    		float longer; // длина
    		float widther; // ширина
    		}size;
    	int rate_of_CPU; // частота процессора
    	int max_RAM; // объём оперативной памяти
    	float diagonal_of_display; // диагональ дисплея
    	int video_memory; // объём видео памяти
    	struct _disp_res { // разрешение дисплея
    		int x; 
    		int y;
    		}disp_res;
    	int rate_of_dispay; // частота дисплея
    	float max_HDD; // объём ROM
    }NOTEBOOK;
    
    int open_and_read_file(NOTEBOOK* A);
    
    int main(){
    	NOTEBOOK A[1000];
    	open_and_read_file(A);
    }
    
    int open_and_read_file(NOTEBOOK* A){
    	FILE *in = fopen("file.txt", "r"); // отерыте файла
    	fseek(in, 0, 2); // выставление указателя в конец файла
    	long end = ftell(in); // вычисление длины файла. функция возвращает текущее положение	
    	char *text; 
    	text = (char *) malloc(end); //возвращает указатель на end байт неинициализированной памяти
    	fseek(in, 0L, 0); // выставление указателя в начало файла
    	fread(text, end, 1, in); // читаем файл в переменную text
    	printf("\n%s\n", text); // печатаем...
    	fseek(in, 0L, 0); // выставление указателя в начало файла
    
    	//===
    	int line=0,k;
    	int table=0;
    	long i=0, n;
    	int symbol;
    	char *iname;
    	//===
    
    	for(k=0;(symbol=getc(in))!=EOF;k++) { // идём по строкам до конца файла
    		if (symbol!='\n'){
    			if(symbol=='|'){
    				table++;			
    				}
    			if(symbol!='|'&&table==0){ // считываем название модели (столбец 0)
    				for(i=0; symbol!='|'; i++){ // считаем длину имени
    					A[k].model[i]=getc(in);
    					//printf("%d ", A[k].model[i]);
    					}
    //				fseek(in, n, 0); // выставление указателя в начало файла
    //				fread(iname, i, 100, in); // читаем имя в переменную iname
    				}
    			}
    		else { 
    			table=0;
    			};
    		}
    	fclose(in);
    	
    }
    Программа вылетает с ошибкой segmetation fault на этапе нахождения названия первого ноутбука...

    Перекопал уже все учебники, не знаю в чём причина... Кому не в лом помогите пожалуйста, скоро сессия =(
     
  13. VIP

    VIP Elder - Старейшина

    Joined:
    29 Dec 2004
    Messages:
    104
    Likes Received:
    3
    Reputations:
    0
    Честно говоря не очень понял задания (особенно что такое заглушки), но может быть это поможет:

    Code:
    # include <stdio.h> // библиотека для вызова функций ввода и вывода
    # include <time.h> // библиотека для заполнения массива случайными числами (зависит от текущего времени)
    # include <stdlib.h> // библиотека для вызова функции random
    #define ARRAY_MAX 1000
    
    int main(void){
    	srand(time(NULL));
    	int i,j,x1,x2;
    	int X[ARRAY_MAX];
    	printf("Введите x1 ");
    	scanf("%d", &x1);
    	printf("Введите x2 ");
    	scanf("%d", &x2);
    	
    	for(i=0; i<ARRAY_MAX; i++){ // цикл заполнения массива
    		X[i]=rand()%100; // генерирования случайного числа
    		printf("%d, ", X[i]);
    		}
    	printf("\n\n");
    
    	int summa=0;
    	for(i=x1-1, j=0;i<x2;i++){
    		summa=summa+X[i];
    		j++;
    		}
    	
    	printf("Сумма элементов = %d, число элементов = %d\n", summa, j);
    }
    
     
  14. Chupa-Chups

    Chupa-Chups Elder - Старейшина

    Joined:
    3 May 2008
    Messages:
    8
    Likes Received:
    10
    Reputations:
    0
    Ну заместь
    #define ARRAY_MAX 1000
    можно написать
    const int ARRAY_MAX=1000;

    директива #define означаета, что слову ARRAY_MAX присваевается значение 1000. В С так оглашали константы. А в С++ появились константы определенных типов. Но всеравно этот метод тоже используется. Особенно часто, при использовании заголовочных файлов(что бы по случайности не подключить их несколько раз) но в это углублятся не буду.

    То что пишет ошибку подключи и stdafx.h
    Тоесть в начале допиши #include <stdafx.h>
     
  15. ZorGan

    ZorGan New Member

    Joined:
    28 Apr 2009
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    Товарищи помагите решить 2 задачки:
    Найти значение переменной Y
    [​IMG]

    Найти значение переменной S
    [​IMG]
     
  16. Chupa-Chups

    Chupa-Chups Elder - Старейшина

    Joined:
    3 May 2008
    Messages:
    8
    Likes Received:
    10
    Reputations:
    0
    Code:
    #include "stdafx.h"
    # include <stdio.h> // библиотека для вызова функций ввода и вывода
    # include <time.h> // библиотека для заполнения массива случайными числами (зависит от текущего времени)
    # include <stdlib.h> // библиотека для вызова функции random
    #define ARRAY_MAX 1000
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	srand(time(NULL));
    	int i,j,x1,x2;
    	int X[ARRAY_MAX];
    	printf("Vvdite x1 ");
    	scanf("%d", &x1);
    	printf("Vvdite x2 ");
    	scanf("%d", &x2);
    	
    	for(i=0; i<ARRAY_MAX; i++){ // цикл заполнения массива
    		X[i]=rand()%100; // генерирования случайного числа
    		printf("%d, ", X[i]);
    		}
    	printf("\n\n");
    
    	int summa=0;
    	for(i=x1-1, j=0;i<x2;i++){
    		summa=summa+X[i];
    		j++;
    		}
    	
    	printf("Symma elementov = %d, 4islo elementov = %d\n", summa, j);
    
    	return 0;
    }
    
    Проверь так.
    Я не смотрел на результаты какие оно выдает, но откомпилировалось в Visual Studio 2005 :)
     
    #1376 Chupa-Chups, 9 May 2009
    Last edited: 9 May 2009
  17. Sibogatov

    Sibogatov New Member

    Joined:
    24 Nov 2008
    Messages:
    40
    Likes Received:
    0
    Reputations:
    0
    Помогите пожалуйста... Нужно нарисовать часы, с помощью Visual C++ вот задание:
    В диалоговом окне нарисовать часы (секундная, минутная и часовая стрелки). Цвет циферблата и стрелок выбираем из палитры с помощью объекта класса CColorDialog. Реальное время считывать с помощью класса CTime
     
  18. MRAK9

    MRAK9 Member

    Joined:
    29 Jul 2007
    Messages:
    115
    Likes Received:
    26
    Reputations:
    0
    кто-нибудь поможет?
    задачка в #1402 посте
     
  19. LLlOK

    LLlOK New Member

    Joined:
    9 May 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    помогите плс

    задали вот такое заданием: написать программу расчитывающаю количество дней,часов,минут,секунд между двумя датами, заданными в формате например 12.01.2009 14:37:59 и системной датой, временем... расчёт должен вестись по всем правилам, с учётом високосных годов....

    и если можно плиз с пояснениями.....
     
  20. Sibogatov

    Sibogatov New Member

    Joined:
    24 Nov 2008
    Messages:
    40
    Likes Received:
    0
    Reputations:
    0
    вот код скажите плиз че не так?:

    Code:
    #include <windows.h>
    #include <string.h>
    #include <time.h>
    #include <math.h>
    
    #define ID_TIMER    1
    #define TWOPI       (2 * 3.14159)
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
         {
         static char szAppName[] = "AnaClock" ;
         HWND        hwnd;
         MSG         msg;
         WNDCLASSEX  wndclass ;
    
    	 wndclass.cbSize        = sizeof (wndclass) ;
         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = NULL ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    	 wndclass.hIconSm       = NULL ;
    
         RegisterClassEx (&wndclass) ;
    
         hwnd = CreateWindow (szAppName, "Analog Clock",
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              NULL, NULL, hInstance, NULL) ;
    
         if (!SetTimer (hwnd, ID_TIMER, 1000, NULL))
              {
              MessageBox (hwnd, "Too many clocks or timers!", szAppName,
                          MB_ICONEXCLAMATION | MB_OK) ;
              return FALSE ;
              }
    
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
              {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
              }
         return msg.wParam ;
         }
    
    void SetIsotropic (HDC hdc, int cxClient, int cyClient)
         {
         SetMapMode (hdc, MM_ISOTROPIC) ;
         SetWindowExtEx (hdc, 1000, 1000, NULL) ;
         SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;
         SetViewportOrgEx (hdc, cxClient / 2,  cyClient / 2, NULL) ;
         }
    
    void RotatePoint (POINT pt[], int iNum, int iAngle)
         {
         int   i ;
         POINT ptTemp ;
    
         for (i = 0 ; i < iNum ; i++)
              {
              ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) +
                                pt[i].y * sin (TWOPI * iAngle / 360)) ;
    
              ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) -
                                pt[i].x * sin (TWOPI * iAngle / 360)) ;
    
              pt[i] = ptTemp ;
              }
         }
    
    void DrawClock (HDC hdc)
         {
         int   iAngle ;
         POINT pt[3] ;
    
         for (iAngle = 0 ; iAngle < 360 ; iAngle += 6)
              {
              pt[0].x =   0 ;
              pt[0].y = 900 ;
    
              RotatePoint (pt, 1, iAngle) ;
    
              pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100 ;
    
              pt[0].x -= pt[2].x / 2 ;
              pt[0].y -= pt[2].y / 2 ;
    
              pt[1].x  = pt[0].x + pt[2].x ;
              pt[1].y  = pt[0].y + pt[2].y ;
    
              SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;
    
              Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ;
              }
         }
    
    void DrawHands (HDC hdc, struct tm *datetime, BOOL bChange)
         {
         static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,
                                   0, -200,  50, 0, 0, 800,  -50, 0, 0, -200,
                                   0,    0,   0, 0, 0,   0,    0, 0, 0,  800 } ;
         int          i, iAngle[3] ;
         POINT        ptTemp[3][5] ;
    
         iAngle[0] = (datetime->tm_hour * 30) % 360 + datetime->tm_min / 2 ;
         iAngle[1] =  datetime->tm_min  *  6 ;
         iAngle[2] =  datetime->tm_sec  *  6 ;
    
         memcpy (ptTemp, pt, sizeof (pt)) ;
    
         for (i = bChange ? 0 : 2 ; i < 3 ; i++)
              {
              RotatePoint (ptTemp[i], 5, iAngle[i]) ;
    
              Polyline (hdc, ptTemp[i], 5) ;
              }
         }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
         {
         static int         cxClient, cyClient ;
         static struct tm   dtPrevious ;
         BOOL               bChange ;
         HDC                hdc ;
         PAINTSTRUCT        ps ;
         time_t             lTime ;
         struct tm         *datetime ;
    
         switch (iMsg)
              {
              case WM_CREATE :
                   time (&lTime) ;
                   datetime = localtime (&lTime) ;
    
                   dtPrevious = * datetime ;
                   return 0 ;
    
              case WM_SIZE :
                   cxClient = LOWORD (lParam) ;
                   cyClient = HIWORD (lParam) ;
                   return 0 ;
    
              case WM_TIMER :
                   time (&lTime) ;
                   datetime = localtime (&lTime) ;
    
                   bChange = datetime->tm_hour != dtPrevious.tm_hour ||
                             datetime->tm_min  != dtPrevious.tm_min ;
    
                   hdc = GetDC (hwnd) ;
    
                   SetIsotropic (hdc, cxClient, cyClient) ;
    
                   SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
                   DrawHands (hdc, &dtPrevious, bChange) ;
    
                   SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
                   DrawHands (hdc, datetime, TRUE) ;
    
                   ReleaseDC (hwnd, hdc) ;
    
                   dtPrevious = *datetime ;
                   return 0 ;
    
              case WM_PAINT :
                   hdc = BeginPaint (hwnd, &ps) ;
    
                   SetIsotropic (hdc, cxClient, cyClient) ;
                   DrawClock    (hdc) ;
                   DrawHands    (hdc, &dtPrevious, TRUE) ;
    
                   EndPaint (hwnd, &ps) ;
                   return 0 ;
    
              case WM_DESTROY :
                   KillTimer (hwnd, ID_TIMER) ;
                   PostQuitMessage (0) ;
                   return 0 ;
              }
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
         }
    
     
Loading...
Thread Status:
Not open for further replies.