290 likes | 460 Views
void mergeSchedule(FILE *f370, FILE *f380, char *filename){ FILE *newfile=fopen(filename,"w"); char time1[10],time2[10],d1[20],d2[20],d3[80],eof1,eof2; if (!newfile) exit(1); eof1=fscanf(f370,"%6[^$]%s%*c",time1,d1); eof2=fscanf(f380,"%6[^$]%s%*c",time2,d2);.
E N D
void mergeSchedule(FILE *f370, FILE *f380, char *filename){ FILE *newfile=fopen(filename,"w"); char time1[10],time2[10],d1[20],d2[20],d3[80],eof1,eof2; if(!newfile) exit(1); eof1=fscanf(f370,"%6[^$]%s%*c",time1,d1); eof2=fscanf(f380,"%6[^$]%s%*c",time2,d2);
while(eof1!=EOF || eof2!=EOF){ if(eof2==EOF || eof1!=EOF && strcmp(time1,time2)<0){ fprintf(newfile,"%s%s\n",time1,d1); eof1=fscanf(f370,"%6[^$]%s%*c",time1,d1); } if(eof1==EOF || eof2!=EOF && strcmp(time1,time2)>0){ fprintf(newfile,"%s%s\n",time2,d2); eof2=fscanf(f380,"%6[^$]%s%*c",time2,d2); } if (eof1!=EOF && eof2!=EOF &&strcmp(time1,time2)==0){ mergeDays(d1,d2,d3); fprintf(newfile,"%s%s",time1,d3); eof1=fscanf(f370,"%6[^$]%s%*c",time1,d1); eof2=fscanf(f380,"%6[^$]%s%*c",time2,d2); } } fclose(newfile);
void mergeDays(char *d1,char *d2,char *d3){ int i,j,arr[8]={0}; for(;*d1;d1++) if(*d1>='1' && *d1<='7') arr[*d1-'0']++; for(;*d2;d2++) if(*d2>='1' && *d2<='7') arr[*d2-'0']++; for(i=1,j=0;i<8;i++) if(arr[i]){ d3[j++]=i+'0'; d3[j++]=','; } d3[j-1]='\n'; d3[j]='\0'; }
void mergeDays(char *d1,char *d2,char *d3){ int i,j,arr[8]={0}; for(i=0;i<strlen(d1);i=i+2) arr[d1[i]-'0']++; for(i=0;i<strlen(d2);i=i+2) arr[d2[i]-'0']++; for(i=1,j=0;i<8;i++) if(arr[i]){ sprintf(&d3[2*j],"%d,",i); j++; } sprintf(&d3[2*j-1],"\n\0"); }
במסגרת התייעלות המשרדים הממשלתיים החליטו במשרד הפנים ובמשרד הרישוי לעדכן את מאגרי מידע של כל משרד על פי המאגר של השני. נתונים שני קבצים:
קובץ משרד הפנים • שם משפחה - 15תווים • שם פרטי - 15 תווים • שם האב - 15 תווים • כתובת - 20 תווים • טלפון - 10 ספרות • מספר ת.ז. - 9 ספרות • תאריך לידה - 8 ספרות • תאריך עדכון - 8 ספרות
קובץ משרד הרישוי • שם משפחה - 15תווים • שם פרטי - 15 תווים • כתובת - 20 תווים • טלפון - 10 ספרות • מספר ת.ז. - 9 ספרות • מס' רשיון - 7 ספרות • סוג רשיון - אות אחת • תאריך עדכון - 8 ספרות
שני הקבצים מסודרים לפי מספר ת.ז. בסדר עולה. • תאריך עדכון הוא משמאל לימין: שנה , חודש, יום. (התאריך של היום הוא 20050929) • השדות המסומנים עם קו תחתי והדגשה (כמו כתובת ) ניתנים לעדכון על סמך פרטי הקובץ השני במידה והפרטים חדשים יותר בקובץ השני.
כתוב פונקציה לעדכון: void update(FILE* pnim, FILE* rishui, char *upd_pni, char *upd_ris) • שמקבלת: pnim מצביע לקובץ משרד הפנים, rishui מצביע לקובץ משרד הרישוי , ויוצרת שני קבצים חדשים, קבצי המשרדים המעודכנים
פתיחת קבצים וקריאת שורה void update(FILE* pnim, FILE* rishui, char *upd_pni, char *upd_ris){ FILE *fupdP, *fupdR; char nameP[31] ,nameR[31],father[16],adtelP[31],adtelR[31],idP[10],idR[10],license[9]; long birth, updP, updR; int eofR; if(!(fupdP=fopen(upd_pni,"w"))|| !(fupdR =fopen(upd_ris,"w"))){ printf("Error can't open file\n"); exit(1); } eofR=fscanf(rishui,"%30[^$]%30[^$]%9s%8s%ld%*c",nameR,adtelR,idR,license,&updR);
while(fscanf(pnim,"%30[^$]%15[^$]%30[^$]%9s%8ld%ld%*c", nameP, father,adtelP,idP,&birth,&updP)==6) if(eofR !=5 || strcmp(idP,idR)<0) fprintf(fupdP,"%s%s%s%s%8d%8d\n", nameP,father,adtelP,idP,birth,updP); else{ if(updP>updR){ strcpy(nameR,nameP); strcpy(adtelR,adtelP); updR=updP; } else{ strcpy(adtelP,adtelR); updP=updR; } fprintf(fupdP,"%s%s%s%s%8d%8d\n", nameP,father,adtelP,idP,birth,updP); fprintf(fupdR,"%s%s%s%s%d\n", nameR,adtelR,idR,license,updR); eofR=fscanf(rishui,"%30[^$]%30[^$]%9s%8s%ld%*c", nameR,adtelR,idR,license,&updR); }
סגירת הקובץ fclose(fupdP); fclose(fupdR); }
הפונקציה rewind • מחזירה את המצביע לתחילת הקובץ
createPermutChainRec void createPermutChainRec (llink **pChain, link *domain, link *suffix){ link *temp=domain; if (domain==NULL){ insertFirst1(pChain,copyToNewLlink(suffix)); return; } while (temp){ if (temp->next==NULL || temp->data!=temp->next->data){ moveLinkToSuffix(&domain,temp,&suffix); createPermutChainRec(pChain, domain, suffix); returnLinkToDomain(&domain,temp,&suffix); } temp=temp->next; } }
Move links from domain to suffix void moveLinkToSuffix (link **head, link *toMove, link **suffix){ removeWithoutFree(head,toMove); insertFirst(suffix,toMove); } void returnLinkToDomain (link **head, link *toMove, link **suffix){ removeWithoutFree(suffix,toMove); insertSorted(head,toMove); }
removeWithoutFree void removeWithoutFree (link **head, link *toRemove){ link *temp=*head; if (*head==toRemove) *head=(*head)->next; else{ while (temp->next!=toRemove) temp=temp->next; temp->next=temp->next->next; } }
insertSorted void insertSorted (link **head, link *toInsert){ link *temp=*head; if (*head==NULL||toInsert->data<(*head)->data){ toInsert->next=*head; *head=toInsert; return; } while (temp->next && toInsert->data >= temp->next->data) temp=temp->next; insertAfter(temp,toInsert); }
insertFirst void insertFirst(link **head,link *newLink){ newLink->next = *head; *head = newLink; } void insertFirst1(llink **head,llink *newLink){ newLink->next = *head; *head = newLink; }
copyToNewLlink llink * copyToNewLlink (link * head){ llink * lhead=(llink *)malloc(sizeof(llink)); lhead->data=NULL; while (head){ insertLast(&(lhead->data), createLink(head->data,head->next)); head=head->next; } return lhead; }
insertLast void insertLast(link ** head, link * newLink){ link * temp=*head; if (!(*head)){ insertFirst(head,newLink); return; } while (temp->next!=NULL) temp=temp->next; temp->next=newLink; newLink->next=NULL; }
createLink link * createLink(int data, link * next){ link * l=(link *)malloc(sizeof (link)); if (l){ l->data=data; l->next=next; } return l; }
Add parameters int queens(int board[][8]){ return queens1(board,0); }
int queens1(int board[][8], int row){ int i; if (row==8) return 1; for (i=0; i<8; i++){ board[row][i]=1; if (checkBoard(board,row,i) && queens1(board,row+1)) return 1; board[row][i]=0; } return 0; }
שימוש במשתנים סטאטיים • כתוב תכנית המקבלת מספר n ומדפיסה את כל המספרים בעלי n ספרות שהספרות שלהן בסדר עולה. לדוגמא עבור n=3 יודפס • 123 • 124 • 125 • … • 679 • 689 • 789
void printAsc(int n){ int i; staticint number=0; if (!n){ printf ("%d\n",number); return; } for (i = number%10+1 ;i<10;i++){ number=number*10+i; printAsc(n-1); number=number/10; } }
המרת לולאה לרקורסיה void printArray(int *a, int size){ int i; for (i=0;i<size;i++) printf("%d ",a[i]); } void printArrayRec(int *a, int size,int i){ if (i==size)return; printf("%d ",a[i]); printArrayRec(a, size, i+1); } void printArrayRec1(int *a, int size){ if (size==0)return; printArrayRec1(a, size-1); printf("%d ",a[size-1]); }