А напишіть но автоматизовану систему повідомлень, щось типу email, котра має інтерфейс в якому може розібратися будь-який прапорщик, повністю контролює всі дії користувача та формує купу звітів на С++ без RAD. А на Delphi це хоч так уж достатньо просто, але можливо - розробка для одного програміста.
Хоча, якщо чесно, там немає чогось вартісного - банальна реалізація оберненої польської нотації.
/*Training program for cfkculatin functions*/#include <ctype.h>#include <stdlib.h>void charadd(char *ch,char c){ int i; for(i=0;ch[i];i++);ch[i]=c;ch[i+1]=0;}int analisis(double *consts,int *ops,int nc,int no, char *form){ int i; char digstr[10]; int isdig, iconsts,iops,ispoint,isexp; isdig=0; iconsts=0; iops=0; *digstr=0;ispoint=0;isexp=0; for(i=0;form[i];i++)/* by characters */ { if(isdigit(form[i])){isdig=1;charadd(digstr,form[i]);} else if(form[i]=='.'||form[i]==',') { if(ispoint||isexp)return 5; ispoint=1; charadd(digstr,'.'); }/*if*/ else if(form[i]=='e'||form[i]=='E') { if(isexp)return 6; isexp=1; if(!isdig) {charadd(digstr,'1');isdig=1;} charadd(digstr,'e');if(form[++i]=='-')charadd(digstr,'-');else i--; if(!isdigit(form[i+1])) return 1; }/*if*/ else { if(isdig) { consts[iconsts]=strtod(digstr,(char**)NULL);*digstr=0;isdig=0;isexp=0;ispoint=0; ops[iops]=iconsts; iops++; if(iops>=no)return 2; iconsts++; if(iconsts>=nc)return 3; }/*if*/ switch(form[i]) { case '+':ops[iops]=-1;break; case '-':ops[iops]=-2;break; case '*':ops[iops]=-3;break; case '/':ops[iops]=-4;break; case '(':ops[iops]=-5;break; case ')':ops[iops]=-6;break; default : return 4; }/*switch*/ iops++; if(iops>=no)return 2; }/*else*/ }/*for by characters*/ if(isdig) { consts[iconsts]=atof(digstr); ops[iops]=iconsts; iops++; if(iops>=no)return 2; }/*if*/ ops[iops]=-7; return 0;}/*switch for + / - */#define __switch_p_m switch(stek_op[cst_op-1]) { \case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\case -3: stek[cstek-1]*=stek[cstek];cstek--;cst_op--;\if(cst_op>0) switch(stek_op[cst_op-1]) { \case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\ } break;\case -4: stek[cstek-1]/=stek[cstek];cstek--;cst_op--;\if(cst_op>0) switch(stek_op[cst_op-1]) { \case -1: stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break;\case -2: stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break;\ } break;\} \/*end of definning*/double interpret(double *consts,int *ops){ double stek[10]; int stek_op[10]; int cstek=0,cst_op=0,uniq=0,i;char isfirstload=1; for(i=0;ops[i]!=-7;i++) { if(ops[i]>=0) { if(isfirstload)isfirstload=0;else cstek++; stek[cstek]=consts[ops[i]]; if(uniq){stek[cstek]*=-1.;uniq=0;} } else { if(ops[i]==-2)if(i==0)uniq=1;else if(ops[i-1]==-5) uniq=1; else { if(cst_op>0) __switch_p_m stek_op[cst_op]=-2;cst_op++; } if(ops[i]==-1) { if(cst_op>0) __switch_p_m stek_op[cst_op]=-1;cst_op++; } if(ops[i]==-3) { if(cst_op>0) switch(stek_op[cst_op-1]) { case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--;break; case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--;break; } stek_op[cst_op]=-3;cst_op++; } if(ops[i]==-4) { if(cst_op>0) switch(stek_op[cst_op-1]) { case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--;break; case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--;break; } stek_op[cst_op]=-4;cst_op++; } if(ops[i]==-5){if(uniq){stek_op[cst_op]=-7;uniq=0;} else stek_op[cst_op]=-5;cst_op++;} if(ops[i]==-6) { /*if(stek_op[cst_op-1]==-5)cst_op--; else */ { switch(stek_op[cst_op-1]) { case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--; switch(stek_op[cst_op-1]) { case -5:cst_op--;break; case -7:cst_op--;stek[cstek]*=-1.;break; }break; case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--; switch(stek_op[cst_op-1]) { case -5:cst_op--;break; case -7:cst_op--;stek[cstek]*=-1.;break; }break; case -3:stek[cstek-1]*=stek[cstek];cstek--;cst_op--; switch(stek_op[cst_op-1]) { case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break; case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break; case -5:cst_op--;break; case -7:cst_op--;stek[cstek]*=-1.;break; }break; case -4:stek[cstek-1]/=stek[cstek];cstek--;cst_op--; switch(stek_op[cst_op-1]) { case -1:stek[cstek-1]+=stek[cstek];cstek--;cst_op--;break; case -2:stek[cstek-1]-=stek[cstek];cstek--;cst_op--;break; case -5:cst_op--;break; case -7:cst_op--;stek[cstek]*=-1.;break; }break; case -5:cst_op--;break; case -7:cst_op--;stek[cstek]*=-1.;break; } } } } } if(cst_op>0) __switch_p_m return *stek;}/*interpret*/int varify(int* ops){ int i,br; for(i=0,br=0;ops[i]!=-7;i++) { if(ops[i]==-5)br++; if(ops[i]==-6){br--;if(br<0)return 1;} } if(br>0)return 2; if(ops[0]<0&&ops[0]!=-2&&ops[0]!=-5)return 3; for(i=1;ops[i]!=-7;i++) if(ops[i]<0) { if(ops[i]==-5) { if(ops[i-1]>=0) return 4; if(ops[i-1]==-6)return 5; } else if(ops[i-1]<0&&!(ops[i]==-2&&ops[i-1]==-5)&&ops[i-1]!=-6)return 6; } if(ops[i-1]!=-6&&ops[i-1]<0) return 7; return 0;}
int anlisis(double *,int *,int,int,char*);double interpret(double*,int*);int varify(int*);
#include <stdio.h>#include "fun_fs.h"main(){char str[40];int oprs[20],i;double cnsts[10];do{printf("enter a formula correctly:");scanf("%s",str);printf("error in numbers: %d\n",analisis(cnsts,oprs,10,20,str));printf("error in operators: %d\n",varify(oprs));for(i=0;i<15;i++)printf("%g\t%d\n",cnsts[i],oprs[i]);printf("result is %g\n",interpret(cnsts,oprs));}while(*str!='^');}
Ось страждав фігнею: почитав документацію до zip формату і вирішив перевірити деякі поля, зацікавили мене дата і час останньої модифікації запакованого файлу і там описувалось , що перші 5 біт вдповідають за секунди, наступні 6 - за хвилини, 5 - за години і т.д. Написав одразу програмку на С, яка мала визначити ці данні (правильність роботи своєї навчальної програми перевіряв з допомогою pkunzip). Мучився, мучився - все запрацювало і аж потім зрозумів, що пойнтери вказують на молодші байти А перед дельфістами така проблема позтає? Вони взагалі щось чули про адресну арифметику? (в Turbo Pascal спеціальні функції пойнтерами совають )В С дуже зручний цикл for: іноді в середині дужок такого понаписуєш, що й тіло циклу виявиться непотрібним. інструкція с++; в паскалі реалізується : с:=с+1; Навіщо так багато мучитись а про a=b=c=d=0; я взагалі мовчу Пишучи програму на с іноді так починаєш любуватись вишуканістю собою ж написаних виразів, особливо, коли робиться перетворення типів.
про a=b=c=d=0; я взагалі мовчу
Пишучи програму на с іноді так починаєш любуватись вишуканістю собою ж написаних виразів, особливо, коли робиться перетворення типів.
Так-то воно так, але пік самозахоплення наступає тоді, коли ні з того ні з цього програма починає видавати незрозумілі глюки і після тижня нецензурних слів і впертого тараканолапання знаходиш поблему - відсутність, наприклад, "зірочки" у присвоєнні (р=0; замість *р=0;) посеред якогось такого вишуканого виразу ;о)Це все я до того, що елегантність коду і свобода програмування мають і свій негативний бік.
Мова Сі (а особливо Сі++) відносяться належать до тих мов, які стимулюють до хаків.
#include <stdio.h>char* ldec8(long int in){static char out[9];long int j, ou;ou = in;for(j=7;j>=0;j--,ou/=10) out[j]='0'+(ou%10); out[8]=0;return out;}int Dshift(int Y,int M,int D){int N,i,Sh;int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};N=Y-1;if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;Sh=365*N+N/4-N/100+N/400;for(i=0;i<M-1;i++)Sh+=md[i];Sh+=D;return Sh;}struct datetime{int dt_year,dt_month,dt_day,dt_hour,dt_min,dt_sec;};struct datetime searchdate(unsigned long int seconds){int nvp=1969/4-1969/100+1969/400;long int days,years,nv,Y,diy,sum,i;long int secrem;int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};struct datetime dt;days=seconds/(86400);printf("days = %d\n",days);years=days/365;again:Y=years+1969;nv=(Y)/4-(Y)/100+(Y)/400-nvp;diy=days-years*365-nv;if(diy<0){years--;goto again;}Y++;if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;for(sum=0,i=-1;diy>sum;)sum+=md[++i];if(i>=0)sum-=md[i];dt.dt_year=1970+years;dt.dt_month=i<0?1:i+1;dt.dt_day=diy-sum+1;secrem=seconds%(86400);dt.dt_hour=secrem/3600;secrem%=3600;dt.dt_min=secrem/60;secrem%=60;dt.dt_sec=secrem;return dt;}unsigned long int Secundo(int D,int M,int Y,int H,int m,int S){long int days;unsigned long int res;days=Dshift(Y,M,D)-Dshift(1970,1,1);res=days*86400;res+=H*3600;res+=m*60+S;return res;}int main(){int d,m,y,h,mi,s;unsigned long int seconds;struct datetime dt;printf("d m y h mi s ");scanf("%d%d%d %d%d%d",&d,&m,&y,&h,&mi,&s);seconds=Secundo(d,m,y,h,mi,s);dt=searchdate(seconds);printf("%s\n%d-%d-%d\t%d:%d:%d\n",ldec8(seconds),dt.dt_day,dt.dt_month,dt.dt_year,dt.dt_hour,dt.dt_min,dt.dt_sec);return 0;}
char* ldec8(long int in){static char out[9];long int j, ou;ou = in;for(j=7;j>=0;j--,ou/=10) out[j]='0'+(ou%10); out[8]=0;return out;}int Dshift(int Y,int M,int D){int N,i,Sh;int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};N=Y-1;if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;Sh=365*N+N/4-N/100+N/400;for(i=0;i<M-1;i++)Sh+=md[i];Sh+=D;return Sh;}struct datetime{int dt_year,dt_month,dt_day,dt_hour,dt_min,dt_sec;};struct datetime searchdate(unsigned long int seconds){int nvp=477;long int days,years,nv,Y,diy,sum,i;long int secrem;int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};struct datetime dt;days=seconds/86400L;years=days/365L;again:Y=years+1969L;nv=(Y)/4-(Y)/100+(Y)/400-nvp;diy=days-years*365L-nv;if(diy<0){years--;goto again;}Y++;if((!(Y%4))&&(Y%100)||(!(Y%400)))md[1]=29;for(sum=0,i=-1;diy>sum;)sum+=md[++i];if(i>=0)sum-=md[i];dt.dt_year=1970+years;dt.dt_month=i<0?1:i+1;dt.dt_day=diy-sum+1;secrem=seconds%86400L;dt.dt_hour=secrem/3600L;secrem%=3600L;dt.dt_min=secrem/60L;secrem%=60L;dt.dt_sec=secrem;return dt;}unsigned long int Secundo(int D,int M,int Y,int H,int m,int S){long int days;unsigned long int res;days=Dshift(Y,M,D)-Dshift(1970,1,1);res=(long)days*86400;res+=(long)H*3600;res+=(long)m*60l+(long)S;return res;}int main(){int d,m,y,h,mi,s;unsigned long int seconds;struct datetime dt;printf("d m y h mi s ");scanf("%d%d%d %d%d%d",&d,&m,&y,&h,&mi,&s);seconds=Secundo(d,m,y,h,mi,s);dt=searchdate(seconds);printf("%s\n%d-%d-%d\t%d:%d:%d\n",ldec8(seconds),dt.dt_day,dt.dt_month,dt.dt_year,dt.dt_hour,dt.dt_min,dt.dt_sec);return 0;}
Procedure ShowFax(MessageId:integer;var Page: TfrPage;var ShowFaxQuery:TSDQuery;LowQualityPreview:boolean);var F1:TFileStream;Var BlobStream:TStream;var Attr,Filename:Pchar;var i,j:longword;var p:PByteArray;var b,TinyB:TBitMap;var Tif:Pointer;var w,h,bw,bh,iw:longword;var raster:array of longword;var frpic:TfrPictureView;var XRes,Yres:single;var Ypos:longword;var ReadResult:integer;var CurrentPageNumber:integer;var TinyRect:TRect; procedure WritePageNumberOnBitmap(var SBitmap:TBitMap;SPageNumber,FaxOrientation:integer); var PSize:TSize; var TextPageNumber:string; var LB:Tbitmap; var Rect:TRect; begin if SystemVariables.PrintPositionPageNumber<>'0' then begin LB:=Tbitmap.Create; //297 высота //210 ширина //20 отступ снизу LB.Canvas.Font.Size:=16; // TextPageNumber:=IntToStr(SPageNumber); PSize:=LB.Canvas.TextExtent(TextPageNumber); // LB.Height:=PSize.cy; LB.Width:=PSize.cx; LB.Canvas.TextOut(0,0,TextPageNumber); if (FaxOrientation=0) or (FaxOrientation=2) then begin //сверху страницы if (SystemVariables.PrintPositionPageNumber='1') then Rect.Top:=Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1); //снизу страницы if (SystemVariables.PrintPositionPageNumber='2') then Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DYmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DYmm)/3){отступ текста}); // Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DXmm)/3))) div 2; Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DXmm)/3); Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DYmm)/3); end; // if (FaxOrientation=1) or (FaxOrientation=3) then begin //сверху страницы if (SystemVariables.PrintPositionPageNumber='1') then Rect.Top:=Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1); //снизу страницы if (SystemVariables.PrintPositionPageNumber='2') then Rect.Top:=SBitmap.Height-(Trunc((SBitmap.Height/DXmm)*StrToInt(SystemVariables.ShiftNumberEdit){мм}+1)+PSize.cy*Trunc((SBitmap.Height/DXmm)/3){отступ текста}); // Rect.Left:=(SBitmap.Width-(PSize.cx*Trunc((SBitmap.Width/DYmm)/3))) div 2; Rect.Right:=Rect.Left+LB.Width*Trunc((SBitmap.Width/DYmm)/3); Rect.Bottom:=Rect.Top+LB.Height*Trunc((SBitmap.Height/DXmm)/3); end; // SBitmap.Canvas.StretchDraw(Rect,LB); // LB.Free; end; end;begin Application.ProcessMessages; CurrentPageNumber:=0; ShowFaxQuery.Active:=False; ShowFaxQuery.SQL.Clear; ShowFaxQuery.SQL.Add('select fax from faxmessages where id=:id;'); ShowFaxQuery.ParamByName('id').AsInteger:=MessageId; ShowFaxQuery.Active:=True; if (ShowFaxQuery.RecordCount>0) then begin CheckTempDir; Filename:=Pchar(ExtractFilePath(Application.EXEName)+'temp\'+'tmp#'+IntToStr(MessageId)+'#tif.tif'); //загружаем в поток BlobStream:=ShowFaxQuery.CreateBlobStream(ShowFaxQuery.FieldByName('fax'),bmRead); F1:=TFileStream.Create(Filename,fmCreate); F1.CopyFrom(BlobStream,0); F1.Free; BlobStream.Free; ShowFaxQuery.Active:=False; ShowFaxQuery.SQL.Clear; //открываем в бмп Attr:='rw'; tif:=TiffOpen(Filename,Attr); // frpic:=TfrPictureView(Page.FindObject('Picture1')); frpic.FillColor:=clWhite; frpic.IsPrinting:=False; // if tif<>nil then begin repeat TiffGetField(tif,TIFFTAG_IMAGEWIDTH,Addr(w)); TiffGetField(tif,TIFFTAG_IMAGELENGTH,Addr(h)); TiffGetField(tif,TIFFTAG_XRESOLUTION,Addr(XRes)); TiffGetField(tif,TIFFTAG_YRESOLUTION,Addr(Yres)); SetLength(raster,w*h+1); case (FaxOrientation) of 0:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0); 1:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPRIGHT,0); 2:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTRIGHT,0); 3:ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_BOTLEFT,0) else ReadResult:=TIFFReadRGBAImageOriented(tif,w,h,raster,ORIENTATION_TOPLEFT,0); end; b:=TBitMap.Create; b.pixelformat:=pf8bit; b.Canvas.Pen.Color:=clWhite; b.Canvas.Brush.Color:=clWhite; b.Transparent:=false; // if (FaxOrientation=0) or (FaxOrientation=2) then begin b.width:=Trunc(A4InchWidth*Xres); b.height:=Trunc(A4InchHeight*Yres); end; // if (FaxOrientation=1) or (FaxOrientation=3) then begin b.width:=Trunc(A4InchHeight*Yres); b.height:=Trunc(A4InchWidth*Xres); end; // Ypos:=0; if ReadResult<>0 then begin repeat // if ((Trunc(A4InchHeight*Yres)+Ypos)<=h) then bh:=(Trunc(A4InchHeight*Yres)-1) else bh:=h-1-Ypos; // if (Trunc(A4InchWidth*Xres)<=w) then bw:=(Trunc(A4InchWidth*Xres)-1) else bw:=w-1; // if Ypos<>0 then b.Canvas.Rectangle(0,0,b.Width,b.Height); // if (FaxOrientation=0) or (FaxOrientation=2) then begin // for i:=0 to bh do begin p:=B.ScanLine[i]; iw:=(i+Ypos)*w; for j:=0 to bw do p[j]:=Raster[iw+j]; end; end; // if (FaxOrientation=1) or (FaxOrientation=3) then begin for i:=0 to bw do begin p:=B.ScanLine[i]; for j:=0 to bh do p[j]:=Raster[(j+Ypos)*w+i]; end; end; // inc(CurrentPageNumber); WritePageNumberOnBitmap(b,CurrentPageNumber,FaxOrientation); //assig low quality image to save memory usage if LowQualityPreview then begin TinyB:=TBitmap.Create; TinyB.Height:=Trunc((b.Height*50)/YRes); TinyB.Width:=Trunc((b.Width*50)/XRes); TinyRect.Left:=0;TinyRect.Top:=0; TinyRect.Right:=TinyB.Width; TinyRect.Bottom:=TinyB.Height; TinyB.Canvas.StretchDraw(TinyRect,b); frpic.Picture.Bitmap:=TinyB; TinyB.Free; end else begin frpic.Picture.Bitmap:=b; end; // frpic.Picture.Bitmap.Monochrome:=True; frpic.Picture.Bitmap.PixelFormat:=pf1bit; // Page.ShowBandByName('MasterData1'); // Ypos:=Ypos+Trunc(A4InchHeight*Yres); //2 Дюйма отбрасываем until ((Ypos+Trunc(2*Yres))>h); end else begin b.Canvas.Rectangle(0,0,b.Width,b.Height); b.Canvas.Font.Size:=36; b.Canvas.Pen.Color:=clBlack; b.Canvas.TextOut(Trunc(2.5*Xres),Trunc(5*Yres),'Помилка вiдкриття сторiнки'); // frpic.Picture.Bitmap:=b; Page.ShowBandByName('MasterData1'); end; // SetLength(raster,0); b.Free; until (TiffReadDirectory(tif)=0); end; //сбрасываем ориентацию факса FaxOrientation:=0; //закрываем тифф if tif<>nil then TiffClose(tif); //удаляем DeleteFile(Filename); end;end;
Я просто дурію: в нас ДЕЛЬФІСТА назвали системним програмістом На мою думку, тут зайвим було не тільки "системним" При чому мені навть в голову не стукнуло б назватися системним програмістом, не зважаючи на те, що C вважається мовою системного програмування, оскільки не писав жодної дровеняки, а лише кілька бібліотек (які корисні лише мені ).
Система (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.
ЦитатаСистема (system) - сукупність об`єктів і відношень між ними, що утворюють єдине ціле.Тоді виходить, що системним може бути і програміст на Java-Script
Історично склалось так, що після розпаду союзу було миттєво_втрачено Культуру Кібернетики: інженери в білих халати, машинні зали, а разом з ними і ієрархію спеціалістів, і розуміння цієї шєрархії [...]
Півроку тому, я закінчив розробку віконної системи з всякими драг-ен-дроп_ами і тому подібне, саме на ЯваСкрипт_ах для ВогнеЛис_а. Кінцевий результат вразив всіх моїх знайомих, майже, всі змінили думку про могутність ЯваСкрипт_ів.