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

שפת C - פתרונות, מצביעים (pointer), ושאלות (יום ראשון)

פתרונות תרגילים 6,7



/*
#include <stdio.h>
void main() {
 char str[80];
 int i , cnt = 0;
 printf("Enter string:\n");
 gets( str );
 
 for(i=0; str[i] != NULL; i++) {
  if(str[i]>='a' && str[i]<='z' && !(str[i+1]>='a' && str[i+1]<='z' ) )
   cnt++;
 }
 printf("cnt: %d\n",cnt);
}
*/
 
 
 
/*
#include <stdio.h>
void main() {
 char str[80];
 int i , c = 0 , max = 0;
 printf("Enter string:\n");
 gets( str );
 for(i=0; str[i] != NULL; i++) {
  if(str[i]>='0' && str[i]<='9') {
   c++;
  }
  else {
   if(c > max)
    max=c;
   c = 0;
  }
 }
 if(c > max)
  max = c;
 printf("Max: %d\n",max);
}
*/




משימה בשיעור:

שאלה 1:
נתונה התוכנית הבאה:


#include <stdio.h>
void main( ){
int i,j,k;
char str[30] = "#Bill – Klinton 199581";
for(i=k=1; str[i] ; i++)
{
for(j=0; j<k && str[j] != str[i]; j++);
if(j == k)
str[k++] =str[i];
}
str[k] = NULL;
printf("%s",str);

}
· מה הפלט של התוכנית הנ"ל ?
· מה מבצעת התוכנית הנ"ל באופן כללי ?







מצביעים - pointer

- המצביע הוא משתנה שיכול לקבל דבר אחד בלבד: כתובת בזיכרון.
- כל המצביעם באותו הגודל: 4 בתים (= int=32bits), ללא התחשבות בסוגם.
   (הסוג נועד רק להגיד למצביע איך להתייחס למה שהוא מצביע עליו)

  הגדרה:
type *Name;     

דוגמה שמסבירה הרבה: 

#include <stdio.h>
void main() {
 int x, y=12, *p;    // כשמגדירים מצביע, חייבים להשתמש ב*. וצריך להקפיד
                       // שסוג המצביע זהה לסוג המשתנה עליו הוא עתיד להצביע-
 
 p = &x;             // & ע"י השימוש ב x מבקבלים את מיקום הבית הראשון של 
 *p = 27;            //  מכניסים את הערך 27 למשתנה שמתחיל בבית שהמצביע מצביע עליו
                              // ללא התחשבות אם המשתנה הזה מוגדר בפונקציה שלנו או לא-
 
 p = &y;             // & ע"י השימוש ב y מבקבלים את מיקום הבית הראשון של
 *p +=5;             // עוד 5 p מוסיפים למשתנה שבכתובת שעליה מצביע
 printf("x: %d    y: %d\n",x,y);
}







התוכנית הבאה מראה איך פונקציה מחליפה את ערכיהם של שני משתנים:

#include <stdio.h>
void swap(int *aint *b) {
 int tmp;
 tmp = *a;
 *a = *b;
 *b = tmp;
}
 
void main()
{
 int x=5, y=6;
 swap(&x,&y);
 printf("x:  %d    y:  %d\n",x,y);
}






דברים שעשינו בשיעור (כונן M):
/*
#include <stdio.h>          \\ דוגמה לתוכנית שלא עובדת
void swap(int a, int b) {
 int tmp;
 tmp = a;
 a = b;
 b = tmp;
 
}
void main() {
 int x = 5 , y = 6;
 swap(x, y);
 printf("x: %d    y: %d\n",x , y);
}
 
///////////////////////////////////////////////
 
 
 
#include <stdio.h>
void swap(int *a, int *b) {
 int tmp;
 tmp = *a;
 *a = *b;
 *b = tmp;
 
}
void main() {
 int x = 5 , y = 6;
 swap(&x, &y);
 printf("x: %d    y: %d\n",x , y);
}
 
 
/////////////////////////////////////////
#include <stdio.h>
void f1(int n, int *p1, int *p2) {
 int i;
 *p1 = 0;
 *p2 = 1;
 for(i=1; i <= n; i++) {
  *p1 += i;
  *p2 *= i;
 }
}
void main() {
 int n , S , M;
 printf("Enter n: ");
 scanf("%d",&n);
 
 f1(n, &S, &M);
 
 printf("Sum: %d   Mul: %d\n",S , M);
}
*/
 
 
#include <stdio.h>
int f1(int n, int *p1) {
 int i , m = 1;
 *p1 = 0;
 for(i=1; i <= n; i++) {
  *p1 += i;
  m *= i;
 }
 return m;
}
void main() {
 int n , S , M;
 printf("Enter n: ");
 scanf("%d",&n);
 
 M = f1(n, &S);
 
 printf("Sum: %d   Mul: %d\n",S , M);
}





משימה:























#include <stdio.h>
#include <math.h>
double f(double a,double b,double c,double *p1,double *p2)
{
 double m;
 if(a==0 || (b*b-4*a*c)<0)
  return 0;
 if((b*b-4*a*c)==0)
 {
  *p1=(-b)/2.0*a;
  return 1;
 }
 m=sqrt(b*b-4*a*c);
 *p1=((-b)+m)/(2.0*a);
 *p2=((-b)-m)/(2.0*a);
 return 2;
}
void main()
{
 double a,b,c,k;
 double x1,x2;
 printf("Enter a , b , c:  ");
 scanf("%lf%lf%lf",&a,&b,&c);
 k=f(a,b,c,&x1,&x2);
 if(k==0)  printf("No Solution\n");
 if(k==1)  printf("x1: %.2lf\n",x1);
 if(k==2)  printf("x1: %.2lf    x2: %.2lf\n",x1,x2);
}








תגובה 1:

  1. אתה יכול בבקשה להסביר ולהרחיב על השורה for (j = 0; j < k && str[j] != str[i]; j++);
    ?

    השבמחק