יום ראשון, 25 בדצמבר 2016

שפת C - מבנים struct (יום ראשון)

מבנים - struct


- המבנה מיועד לשמירת הרבה נתונים מסוגים שונים.
- איברי המבנה (השדות) נשמרים ברצף בזכרון.

הגדרה כללית:
        struct Name{
        type1  n1;
        type2  n2;
              .
              .
              .
        };





דוגמה - אופן השימוש (נגדיר "עובד"):

#include <stdio.h>
struct worker {
 char name[20];
 int age;
 double hours, pph; 
};
 
void main() {
 struct worker w1 , w2;
 printf("Enter name , age , hours & price per hour: ");
 scanf("%s %d %lf %lf",w1.name , &w1.age , &w1.hours , &w1.pph);
 
 printf("Enter name , age , hours & price per hour: ");
 scanf("%s %d %lf %lf",w2.name , &w2.age , &w2.hours , &w2.pph);
 
 printf("Name: %s    Sallary: %.2f\n",w1.name , w1.hours * w1.pph);
 printf("Name: %s    Sallary: %.2f\n",w2.name , w2.hours * w2.pph);
}




דוגמה 2 (עם מערכים):

#include <stdio.h>
#define N 100
struct worker {
 char name[20];
 int age;
 double hours, pph; 
};
void main() {
 struct worker A[N];
 
 int i ;
 double sum = 0;
 
// printf("%d\n",sizeof( A ) );
// printf("%d\n",sizeof( A[0] ) );
 
 for(i=0; i<N; i++) {
  printf("%d. Enter name , age , hours & price per hour: ",i+1);
  scanf("%s %d %lf %lf",A[i].name, &A[i].age, &A[i].hours, &A[i].pph);
 }
 
 for(i=0; i < N; i++) {
  printf("%d. Name: %s    Sallary: %.2f\n",i+1, A[i].name , A[i].hours * A[i].pph);
  sum += A[i].hours * A[i].pph;
 }
 printf("Sum => %.2f N.I.S\n",sum);
}





משתנה גלובאלי:
כפי שראינו, אם הגדרנו struct worker אזי הוא טיפוס חדש (כמו int או char).
ניתן גם ליצור משתנה גלובאלי מהסוג הזה, וניתן  אף להגדיר אותו מייד בסוף הגדרת ה struct

כך נגדיר a כמשתנה גלובאלי מסוג struct worker :
struct worker{
  char name[20];
  int age;
  double pph, hour;
} a ;
כך נגדיר a כמשתנה גלובאלי מסוג מצביע ל struct worker :
struct worker{
  char name[20];
  int age;
  double pph, hour;
}* a ;


ניתן לאפס בקלות את כל השדות של משתנה מסוג struct באופן הבא:
(כאשר a הוא משתנה מסוג כלשהו של struct )
a = {0} ;
ואף להעתיק את ערכי כל השדות של משתנה אחד לאחר:
(עליהם להיות מאותו סוג struct )
a = b ;









שאלות משבוע שעבר:

1. ליצור מערך דו ממדי שמתקבל מהמשתנה ונשמר בצורה דינמית

2. כתוב פונקציה find שמקבלת 2 מצביעים של מחרוזות ומחזירה כמה פעמים מופיעה מחרוזת אחת במחרוזת השנייה.

3. כתוב פונקציה שמקבלת מצביע למחרוזת ומצביע למצביעי מחרוזת (כלומר מצביע של מערך דו ממדי), ומחזירה
    כמה פעמים בסה"כ מופיעה המחרוזת שקיבלנו בכל המחרוזות האחרות (עליהן מצביע ה"מצביע של מצביע"
    שקיבלנו) - יחד. (אפשר להשתמש בפונקציה שבנינו בשאלה הקודמת)

פתרונות:

/*
//////////////Exe No' 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main() {
 char **A , str[80];
 int i , n;
 printf("Enter n: ");
 scanf("%d",&n);
  if( (A = (char**) malloc( n * sizeof(char*) ) ) == NULL) {
  printf("No enoght memory\n");
  exit(0);
 }
  for(i=0; i<n; i++) {
   printf("Enter string:\n");
   flushall();
   gets( str );
   A[i] = (char*) malloc( strlen(str) + 1);
   strcpy(A[i] , str);
  }
 
  for(i=0; i<n; i++) 
   puts( A[i] );
 
  
  for(i=0; i<n; i++) 
   free( A[i] );
  free( A );
}
 
//////////////Exe No' 2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find(char *s1, char *s2) {
 int i , j , k , cnt = 0;
 for(i=0; s1[i] ; i++) {
  for(k=i, j=0; s2[j] != NULL && s1[k] == s2[j]; j++ , k++) ;
 
  if(s2[j] == NULL)
   cnt++;
 }
 return cnt;
}
void main() {
 char st1[80] , st2[80];
 printf("Enter 2 string:\n");
 gets( st1 );
 gets( st2 );
 printf("%d\n",find(st1, st2) ); 
}
*/
 
//////////////Exe No' 3
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int find1(char *s1, char *s2) {
 int i , j , k , cnt = 0;
 for(i=0; s1[i] ; i++) {
  for(k=i, j=0; s2[j] != NULL && s1[k] == s2[j]; j++ , k++) ;
 
  if(s2[j] == NULL)
   cnt++;
 }
 return cnt;
}
int find2(char **A, char *s)  {
 int c = 0, i;
 for(i=0; A[i] != NULL; i++)
  c += find1(A[i], s);
 
 return c;
}
 
void main() {
 char **A , str[80];
 int i , n;
 printf("Enter n: ");
 scanf("%d",&n);
  if( (A = (char**) calloc( (n+1) , sizeof(char*) ) ) == NULL) {
  printf("No enoght memory\n");
  exit(0);
 }
  for(i=0; i<n; i++) {
   printf("Enter string:\n");
   flushall();
   gets( str );
   A[i] = (char*) malloc( strlen(str) + 1);
   strcpy(A[i] , str);
  }
 
  printf("Enter string to search: ");
  gets( str );
 
 
 printf("%d\n",find2(A, str) );
 
  
  for(i=0; i<n; i++) 
   free( A[i] );
  free( A );
}





בהצלחה!




אין תגובות:

הוסף רשומת תגובה