יום ראשון, 6 בנובמבר 2016

שפת C - מערכים ו define (יום ראשון)

פתרונות המשימות מהשיעור הקודם:


#include <stdio.h>
void main() {
 int i , j , n;
 printf("Enter n: ");
 scanf("%d",&n);
 
 
 
 for(i=1; i<=n; i++) {
  for(j=1; j<=i ; j++)
   printf("%d",j);
  putchar('\n');
 }
 
/*
 
 
 
 for(i=1; i<=n; i++) {
  for(j=1; j<=n ; j++)
   putchar('*');
  putchar('\n');
 }
 
 
 for(i=1; i<=n; i++) {
  for(j=1; j<=i ; j++)
   putchar('*');
  putchar('\n');
 }
 
 
 for(i=n; i>=1; i--) {
  for(j=1; j<=i ; j++)
   putchar('*');
  putchar('\n');
 }
 
 
 
 for(i=1; i<=n; i++) {
  for(j=1; j<=n ; j++)
   if(i==1 || i==n || j==1 || j==n)
    putchar('*');
   else
    putchar(' ');
 
  putchar('\n');
 }
 */
}



מערכים - Arrays:

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


הגדרה כללית:

   type Name[tength];

כלומר:     ;[כמות איברי המערך]שם_המערך     סוג איברי המערך


ניצור מערך שנקרא A בעל 5 איברים מסוג int:

int A[5] ;                 

-משום שכל איבר הוא int בפני עצמו, ומשום ש int זה טיפוס בגודל 4 בתים,
גודל כל מערך A הוא 20 בתים.






קליטה מהמשתמש:
נקבל מהמשתמש תוכן לכל 5 איברי מערך A:


int A[5], j ;                     
for ( j=0 ; j<5; j++)        
scanf ( "%d",&A[j] );    

שימו לב שהאיבר הראשון במערך הוא במקום 0.
לכן האיבר הראשון במערך A הוא [A[0 והאיבר האחרון הוא [A[4. כך שגודלו 5 איברים.







אתחול מערך בשורת הפקודה:

int A[5] = {17,13,30,20,5};      => [17,13,30,20,5] :המערך
int A[5] = {17,13,30};      =>   [17,13,30,0,0] :המערך
.כי משלים אוטומטית את כל שאר האיברים שלא כתבנו לאפסים-


לכן אפשר לאפס בקלות את כל האיברים:
int A[5] = {0};                                                                
.כי הגדרנו את הראשון כ0, ומשלים אוטומטית את כל השאר לאפסים-



אפשר אפילו לדלג על כתיבת גודל המערך:
int A[ ] = {0,1,3};                                                            
כעת גודל המערך יוגדר 3, כי ישנם שלושה איברים בהגדרה.
-לא נהוג להשתמש בשיטה הזאת.








הגדרת קבועים בעזרת define:

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

הגדרה כללית:

#define  ערך    שם_קבוע   

:לדוגמה
#define N 10                  
(.שימו לב שאין ';' בסוף)



שימו לב!
#include <stdio.h>
#define P 10
void main()
{ 
 printf ("%d\n",P);
}
-ידפיס 10




אבל:
#include <stdio.h>
#define P 10
void main()
{ 
 printf ("P\n");
}
-ידפיס P




- השתמשנו ב d% כי הגדרנו את P כ 10. אם הערך דורש סוג אחסון אחר (שהוא לא int) הסימן יהיה בהתאם.





דוגמאות מהשיעור:

#include <stdio.h>
#define N 7
#define P printf  // :לא מומלץ להגדיר מילים שמורות כמו בדוגמה הזאת
void main() { 
 int A[N] , i , sum = 0 , c=0;
 double avg;
 
 P("Enter %d numbers: ",N);
 for(i=0; i<N; i++)
  scanf("%d",&A[i]);
 
 for(i=0; i<N; i++) {
  P(" %d ",A[i]);
  sum += A[i];
 }
 avg = (double) sum / N;
 P("\nSum: %d   average: %.2f\n",sum , avg);
 
 for(i=0; i<N; i++)
  if(A[i] > avg)
   c++;
 
 P("Cnt: %d\n",c);
 
}






תגובה 1: