|
ΠΕΡΙΕΧΟΜΕΝΑ |
|||||
|
|
|
|
|||
|
|
|||||
Να περιγραφεί η λειτουργία της
παρακάτω function της C.
void unknown_function (char *s, char *t)
{
while (*s++ = *t++)
;
}
Προσέξτε
ότι έχει μόνο ένα =.
ΛΥΣΗ:
Η
συνάρτηση αυτή δέχεται σαν ορίσματα τις διευθύνσεις δύο αλφαριθμητικών. Άρα
χρησιμοποιεί τη μέθοδο Call
By Reference (Κλήση με Αναφορά).
Στην
εντολή while καταχωρούνται οι
χαρακτήρες του string
t στο string s, έως ότου
βρεθεί το τέλος του t.
Σε
γενικές γραμμές είναι μία συνάρτηση που αντιγράφει strings.
Να γραφεί συνάρτηση της C με όνομα
strcmp(s, t) που
επιστρέφει 0 εάν το string
s είναι το ίδιο με το string t. Αρνητικό αριθμό εάν το string s είναι
αλφαβητικά μικρότερο από το string
t, και θετικό αριθμό εάν το string s είναι αλφαβητικά μεγαλύτερο από το string t.
ΛΥΣΗ:
Η
συνάρτηση strcmp( )
αποτελεί μέρος της standard
βιβλιοθήκης της Turbo
C Ver. 2.0. Για να αποφευχθεί λοιπόν σύγχυση του compiler με τη standar library της γλώσσας
, η συνάρτηση θα δηλωθεί ως strcmpr( ).
Για
την απάντηση του ζητήματος δεν απαιτείται ολόκληρο το πρόγραμμα αλλά μόνο η
συνάρτηση strcmpr( ).
Μέσα στη
συνάρτηση ελέγχουμε τα στοιχεία των αλφαριθμητικών ένα προς ένα με μία while και εφόσον είναι ίσα
ελέγχουμε τα επόμενα για NULL. Εάν τα
μεγέθη των string είναι ίσα
με το i, τότε και τα string είναι ίσα αλλιώς ελέγχουμε
τους αντίστοιχους χαρακτήρες και επιστρέφουμε.
#include <stdio.h>
int strcmpr (char
*, char *);
main( )
{
char *str1, *str2;
int
c;
clrscr( );
printf(“Δώστε Το Πρώτο Αλφαριθμητικό : “);
gets(str1);
printf(“Δώστε Το Δεύτερο Αλφαριθμητικό :”);
gets(str2);
c=strcmpr (str1, str2);
if
(c==0)
printf(“Τα
Αλφαριθμητικά Είναι Ίσα \n”);
if (c==1)
printf(“Το %s
Είναι Μεγαλύτερο του %s \n”, str1, str2);
if (==-1)
printf(“Το %s Είναι
Μικρότερο του %s \n”, str2, str1);
}
int strcmpr (char
*s, char *t)
{
int
val, i=0;
while
(s [ i ] == t [ i ] {
i++;
if
(s [ i ] == NULL
t [ i ] == NULL) break;
}
if
(i==strlen(s) && i==strlen(t))
val
= 0;
else {
if
(s [ i ] < t [ i ]) val = -1;
if
(s[ i ] > t [ i ]) val = -1;
}
return
val;
}
Να γραφεί πρόγραμμα C που θα
διαβάζει μία ημερομηνία με τη μορφή 25 Feb 1995, και θα την τυπώνει με τη μορφή: 25/2/95.
ΛΥΣΗ:
#include <stdio.h>
#include <string.h>
main( )
{
char
months [ ] [4] = { “ \0”,
“Jan\0”,
“Feb\0”,
“Mar\0”,
“Apr\0”,
“May\0”,
“Jun\0”,
“Jul\0”,
“Aug\0”,
“Sep\0”,
“Oct\0”,
“Nov\0”,
“Dec\0”
};
int hm, etos, neo_etos, i=0;
char
mhn[3];
clrscr(
);
printf(“Δώσε
Ημερομηνία Με Μορφή 25 Feb 1995: “);
scanf(“%d %s %d, &hm, mhn, &etos);
while
(strcmp(mhn, months[ i ])) i++;
neo_etos = etos%100;
printf(“Η Ημερομηνία Είναι: %d / %d /
%d”, hm, i, neo_etos);
}
Να γραφεί πρόγραμμα της C με το
όνομα filecopy που θα
αντιγράψει τα περιεχόμενα ενός αρχείου σε ένα άλλο αρχείο. Τα ονόματα των δύο
αρχείων θα περνούν ως Command-Line Arguments, δηλαδή η κλήση του προγράμματος θα γίνεται ως εξής:
filecopy inputfile outputfile
ΛΥΣΗ:
Πρόκειται
για πρόγραμμα που διαβάζει και αντιγράφει Δυαδικά Αρχεία. Δηλαδή μπορεί να
αντιγράψει όλους τους τύπους αρχείων που χρησιμοποιεί το DOS, ακόμη και .EXE ή .COM. Για το
λόγο αυτό σαν καθοριστές ανοίγματος στη συνάρτηση fopen( ) χρησιμοποιούνται οι παράμετροι rb και wb. Η
συνάρτηση feof( )
χρησιμοποιείται για τον έλεγχο τέλους του Δυαδικού αρχείου.
#include <stdio.h>
main(argc, argv)
int argc;
char *argv[ ];
{
FILE *in, *out;
char
ch;
clrscr(
);
if
(argc!=3) {
printf(“Εσφαλμένη Σύνταξη !!! \n”);
printf(“
ΣΥΝΤΑΞΗ : Filecopy InputFile
OutputFile \n”);
exit
(0);
}
if
( ( in = fopen (argv [1], “rb”) ) == NULL)
{
printf(“Σφάλμα
Στο Άνοιγμα Του Πηγαίου Αρχείου \n”);
exit (0);
}
if
( ( out = fopen (argv [2], “wb”) ) == NULL)
{
printf(“Σφάλμα
Στο Άνοιγμα Του Αρχείου Προορισμού \n”);
exit (0);
}
while (!feof (in) )
{
ch
= getc(in);
if
(!feof (in) ) putc (ch, out);
}
fclose(in);
fclose(out);
printf(“ Η Αντιγραφή Ολοκληρώθηκε Με Επιτυχία \n”);
}
Να γραφεί πρόγραμμα C με όνομα Compfiles το οποίο
θα συγκρίνει γραμμή προς γραμμή δύο αρχεία και θα τυπώνει την πρώτη γραμμή που
διαφέρουν. Τα ονόματα των δύο αρχείων θα περνούν ως Command Line
Arguments, δηλαδή η
κλήση του προγράμματος θα γίνεται ως εξής:
Compfiles File_1
File_2
ΛΥΣΗ:
#include <stdio.h>
#define NEWLINE ‘\n’
main (int argc, char
*argv[ ])
{
FILE *fp1, *fp2;
char
ch1, ch2, *s1, *s2;
int
flag = 0, cntr = 0;
clrscr(
);
if
(argc!=3) {
printf(“Εσφαλμένες Παράμετροι !!! \n”);
printf(“ΣΥΝΤΑΞΗ: Compfile File1 File2 \n”);
exit
(0);
}
if
((fp1 = fopen(argv[1], “r”)) ==NULL) {
printf(“Σφάλμα
Στο Άνοιγμα Του %s \n”, argv[1]);
exit(0);
}
if ((fp2
= fopen(argv[2], “r”)) ==NULL) {
printf(“Σφάλμα
Στο Άνοιγμα Του %s \n”, argv[2]);
exit(0);
}
for
(;;) {
ch1
= getc(fp1);
ch2
= getc(fp2);
if
(( ch1 == EOF) (ch2 ==EOF) ) break;
if
(( ch1 == NEWLINE)
(ch2 ==NEWLINE) ) {
s1
[cntr] = NULL;
s2
[cntr] = NULL;
if
(strcmp (s1, s2) ) {
printf(“\n%s”,
s1);
printf(“\n%s”,
s2);
fclose(fp1);
fclose(fp2);
exit(0);
}
else
cntr = 0;
}
else {
s1[cntr]
= ch1;
s2[cntr]
= ch2;
cntr++;
}
}
printf(“Τα Αρχεία Δεν Έχουν Διαφορές \ n”);
fclose(fp1);
flocse(fp2);
}
Να γραφεί συνάρτηση C που θα
δέχεται σαν παραμέτρους το όνομα ενός μήνα (π.χ. Jan, Feb, κλπ) και
το έτος (π.χ. 1996) και θα επιστρέφει τον αριθμό των ημερών του μήνα(28, 29,
30, 31). Να ληφθούν υπόψη τα δίσεκτα έτη και να χρησιμοποιηθεί η εντολή case.
ΛΥΣΗ:
Το έτος είναι δίσεκτο όταν διαιρείται ακριβώς με το 4 εκτός αν είναι πολλαπλάσιο του 100 και όχι του 400. για την απάντηση του ζητήματος δε χρειάζεται όλο το πρόγραμμα αλλά μόνο η συνάρτηση.
#include <stdio.h>
main( )
{
clrscr( );
printf(“%d”,
Days_Of_Month (“Feb”, 1992) );
}
Days_Of_Month
(char *mhnas, int etos)
{
int
hmeres, ypol, i = 0;
char
months[ ] [4] = { “ \0”,
“Jan\0”,
“Feb\0”,
“Mar\0”,
“Apr\0”,
“May\0”,
“Jun\0”,
“Jul\0”,
“Aug\0”,
“Sep\0”,
“Oct\0”,
“Nov\0”,
“Dec\0”
};
while
(strcmp (mhnas, months [ i ]) ) i++;
switch(
i ) {
case
1: hmeres = 31; break;
case
2:
if( (
(etos%4)!=0) && ((etos%100)!=0 (etos%400)==0)
hmeres
= 28 ;
else hmeres = 29 ; break ;
case 3: hmeres
= 31; break;
case 4: hmeres
= 30; break;
case 5: hmeres
= 31; break;
case 6: hmeres
= 30; break;
case 7: hmeres
= 31; break;
case 8: hmeres
= 31; break;
case 9: hmeres
= 30; break;
case
10: hmeres = 31; break;
case
11: hmeres = 30; break;
case
12: hmeres = 31; break;
}
return
hmeres;
}
Να γραφεί function της C που θα δέχεται σαν παράμετρο το όνομα ενός
πίνακα από ακεραίους και των αριθμό των στοιχείων του πίνακα και θα επιστρέφει
το μέσο όρο των στοιχείων του πίνακα σε δεκαδική μορφή.
ΛΥΣΗ:
Για
το πέρασμα του πίνακα στη συνάρτηση χρησιμοποιείται η μέθοδος Call By Reference, ενώ για
το πέρασμα του μεγέθους του πίνακα η μέθοδος Call By
Value.
Για
την απάντηση του ζητήματος δε χρειάζεται όλο το πρόγραμμα αλλά μόνο η
συνάρτηση. Επίσης, μέσα στη συνάρτηση main( )
γίνεται μία τυπική αρχικοποίηση του πίνακα.
#include <stdio.h>
float Mesos_oros (int
*, int);
main( )
{
int num,
i;
int *pinax;
clrscr(
);
scanf(“%d”, &num);
for(i=0 ; i<=num ; i++) pinax [ i ] = i;
printf(“%f”,
Mesos_oros(pinax, num) );
}
float Mesos_oros(int *pin, int n)
{
float
sum = 0.0;
int j;
for( j =
0; j<=n-1; j++)
sum
= sum + *(pin + j);
return
(sum/n);
}
Η μεταβλητή STATE παίρνει δύο μόνο τιμές ENABLED και DISABLED.
α) Να δηλωθεί η STATE ως τύπου enum.
β) Να γραφεί συνάρτηση της C που να
δέχεται ως παράμετρο την STATE και να
τυπώνει το κείμενο:
The Machine Is ENABLED ή
The
Machine Is DISABLED
Ανάλογα με
τη τιμή της STATE.
ΛΥΣΗ:
Εδώ τα δύο ερωτήματα
ενσωματώνονται στο ίδιο πρόγραμμα. Δηλώνεται η μεταβλητή STATE να είναι του τύπου s όπου πρόκειται για έναν απαριθμητή με δύο τιμές ENABLED και DISABLED. Πρόκειται για κλήση Call By Value γιατί η μεταβλητή STATE αναγνωρίζεται σαν διαφορετική από τη state από την C.
/ * Το (α) Ερώτημα */
enum s {ENABLED, DISABLED};
enum s STATE;
/ * To (β) Ερώτημα */
void status (enum s state)
{
printf(“The
Machine’s State Is “);
if
(state ==ENABLED)
printf(“ENABLED\n”);
else
printf(“DISABLED\n”);
}
Να γραφεί πρόγραμμα C το οποίο θα αλλάζει
τους χαρακτήρες * ενός αρχείου, σε +. Τα ονόματα των αρχείων εισόδου – εξόδου
θα περνούν σαν Command Line Arguments.
ΛΥΣΗ:
Διαβάζεται
το αρχείο χαρακτήρα – χαρακτήρα. Ο χαρακτήρας που διαβάστηκε γράφεται στο
δεύτερο αρχείο. Εάν ο χαρακτήρας που διαβάστηκε είναι * τότε στο δεύτερο αρχείο
γράφεται ένα +.
#include <stdio.h>
#include <conio.h>
main (argc, argv)
int argc;
char *argv[ ];
{
char
ch;
FILE *in,
*out;
if
(argc!=3) {
printf(“Λάθος Ορίσματα !!!\n”);
exit
(0);
}
if
( (in = fopen (argv [1], “r”) ) == NULL)
{
printf(“Το
Πηγαίο Αρχείο Δεν Άνοιξε \n”);
exit (0);
}
if
( (out = fopen (argv [2], “w”) ) == NULL)
{
printf(“Το
Αρχείο Προορισμού Δεν Άνοιξε \n”);
exit (0);
}
while ( (ch=getc(in))!=EOF)
{
if
(ch == ‘*’)
putc(‘+’,
out);
else
putc(ch,
out);
}
fclose(in);
fclose(out);
}
Έχουμε ένα αρχείο που κάθε γραμμή του είναι ένας πραγματικός αριθμός. Να γραφεί πρόγραμμα σε C που θα μετρά και θα τυπώνει:
α) Τον αριθμό των γραμμών του
αρχείου.
β) Πόσες τιμές υπάρχουν στο αρχείο
μεταξύ 3 και 5.
γ) Τον μέσο όρο των τιμών του
αρχείου.
Το όνομα του αρχείου θα περνά σαν Command Line Argument.
ΛΥΣΗ:
Εδώ χρησιμοποιείται η συνάρτηση scanf( ) για την ανάγνωση των τιμών από το αρχείο.
Χρησιμοποιείται ένας αθροιστής για τον υπολογισμό του μέσου όρου και ένας για
τον υπολογισμό των γραμμών. Χρησιμοποιείται επίσης ένας αθροιστής για τις τιμές
μεταξύ 3 και 5.
#include <stdio.h>
#include <conio.h>
main (argc, argv)
int argc;
char *argv[ ];
{
char
ch;
FILE *in;
float
num, sum = 0.0, MO;
int
lines = 0;
int
times = 0;
clrscr(
);
if
(argc!=2) {
printf(“Λάθος
Ορίσματα \n”);
exit (0);
}
if
( (in = fopen (argv[1], “r”))==NULL) {
printf(“Σφάλμα Κατά
Το Άνοιγμα Του Αρχείου \n”);
exit (0);
}
while
(fscanf(in, “%f”, &num)==1)
{
printf(“%f\n”, num);
sum
= sum + num;
lines++;
if (num >=3
&& num<=5) times++;
}
MO
= sum / lines;
printf(“Το Αρχείο Έχει %d Γραμμές \n”,
lines);
printf(“ Τιμές
Μεταξύ 3 και 5 %d \n”, times);
printf(“ Μέσο Όρο Τιμών %f”, MO);
fclose(in);
}
/ *
ΣΥΝΕΧΕΙΑ ΖΗΤΗΜΑΤΟΣ 34 – ΔΗΜΙΟΥΡΓΙΑ ΑΡΧΕΙΟΥ */
/ *
Χρησιμοποιήστε το παρακάτω πρόγραμμα για να δημιουργήσετε το
αρχείο και να του περάσετε στοιχειώδεις
τιμές */
main( )
{
FILE *in;
int
i;
float
num;
clrscr(
);
if
( (in=fopen(“testf1.f1o”, “wb”)) ==NULL)
{
printf(“Error
!!! “);
exit
(0);
}
for
( i=1; i<=10; i++) {
scanf(“%f”, &num);
fprintf(in, “%f\n”, num);
}
fclose
(in);
}
Δίδονται
δύο αρχεία που κάθε γραμμή είναι ένας ακέραιος. Να γραφεί πρόγραμμα C που θα
περιέχει τις κοινές τιμές των δύο αρχείων εισόδου. Τα ονόματα των τριών αρχείων
θα περνούν σαν Command Line Arguments.
ΛΥΣΗ:
Υπάρχει ασάφεια στην εκφώνηση της άσκησης. Δε διευκρινίζεται αν ο έλεγχος γίνεται γραμμή προς γραμμή, ή αν αφορά συνολικά και τα δύο αρχεία. Επίσης, δε διευκρινίζεται το τι θα συμβαίνει σε περίπτωση που μία τιμή υπάρχει μεν στο ένα αρχείο αλλά στο άλλο επαναλαμβάνεται περισσότερες από μία φορές.
Στην
παρακάτω λύση υποθέτουμε ότι ο έλεγχος γίνεται γραμμή προς γραμμή.
#include <stdio.h>
#include <conio.h>
main (argc, argv)
int argc;
char *argv[ ];
{
FILE *f1,
*f2, *f3;
int num1, num2;
clrscr(
);
if
(argc!=4) {
printf(“Λάθος Ορίσματα
!!! \n”);
exit (0);
}
if
(( f1=fopen (argv [1], “r”)) == NULL) {
printf(“Το Πρώτο
Αρχείο Δεν Άνοιξε \n”);
exit (0);
}
if
(( f2=fopen (argv [2], “r”)) == NULL) {
printf(“Το
Δεύτερο Αρχείο Δεν Άνοιξε \n”);
exit (0);
}
if
(( f3=fopen (argv [3], “w”)) == NULL) {
printf(“Το Aρχείο Προορισμού Δεν Άνοιξε \n”);
exit (0);
}
while (((fscanf (f1, “%d”, &num1)==1) &&
(fscanf(f2, “%d”, &num2)==1)))
if (num1==num2)
fprintf(f3, “%d\n”, num1);
fclose(f1);
fclose(f2);
fclose(f3);
}
/ *
ΣΥΝΕΧΕΙΑ ΣΤΗΝ ΑΣΚΗΣΗ 35 */
/ * Το
πρόγραμμα αυτό δεν είναι απαραίτητο για την επίλυση της άσκησης. Σας χρειάζεται
όμως για να δώσετε κάποιες τιμές στα αρχεία σας και να κάνετε έλεγχο για την
ορθότητα του παραπάνω κώδικα.
Πρόγραμμα για την αρχικοποίηση
των αρχείων */
main( )
{
FILE *fp1,
*fp2;
int
i, j;
clrscr(
);
if
((fp1 = fopen (“inttst1”, “w”)) ==NULL)
{
printf(“Το Πρώτο
Αρχείο Δεν Άνοιξε”);
exit (0);
}
if
((fp2 = fopen (“inttst2”, “w”)) ==NULL)
{
printf(“Το
Δεύτερο Αρχείο Δεν Άνοιξε”);
exit (0);
}
for (i=0; i<=10; i++) fprintf(fp1, “%d\n”, i);
for
(j=0; j<=5; j++) fprintf(fp2, “%d\n”,
j);
fclose (fp1);
fclose(fp2);
}
Δίνεται αρχείο με κείμενο. Να
γραφεί πρόγραμμα C που αντιγράφει το αρχείο σε άλλο, αφού πρώτα πετάξει τα
περιττά κενά του πρώτου. Δηλαδή όπου στο πρώτο αρχείο υπάρχουν περισσότερα από
ένα συνεχόμενα κενά, στο νέο θα υπάρχει μόνο ένα. Τα ονόματα των αρχείων θα
περνούν σαν Command Line Arguments.
ΛΥΣΗ:
Εδώ
διαβάζουμε το αρχείο χαρακτήρα – χαρακτήρα έως ότου συναντηθεί το τέλος του.
Εάν συναντηθεί δεύτερο συνεχόμενο κενό μία σημαία (flag) ενεργοποιείται και γράφεται μόνο ένα κενό στο δεύτερο
αρχείο.
#include <stdio.h>
#include <conio.h>
main(argc, argv)
int argc;
char *argv [ ];
{
char
ch;
int
flag=0;
FILE *in,
*out;
clrscr(
);
if
(argc!=3) {
printf(“Λάθος Ορίσματα !!! “);
exit(0);
}
if
((in =fopen (argv [1], “r”)) ==NULL) {
printf(“Το
Πηγαίο Αρχείο Δεν Άνοιξε !!!”);
exit(0);
}
if
((out =fopen (argv [2], “w”)) ==NULL) {
printf(“Το
Αρχείο Προορισμού Δεν Άνοιξε !!!”);
exit(0);
}
while ((ch = getc(in))!=EOF) {
if
(ch != ‘ ‘ ) {
flag
= 0;
putc(ch,
out);
}
if
(ch == ‘ ‘ &&
flag==0) {
flag
=1;
putc(‘ ‘, out);
}
}
fclose
(in);
fclose
(out);
}
Δίνεται ένα ρχείο με κείμενο. Οι
λέξεις χωρίζονται μεταξύ τους με ένα κενό ή τελεία ή κόμμα ή τέλος γραμμής.
Γράψτε ένα πρόγραμμα C που να μετράει τον αριθμό των γραμμών, των χαρακτήρων
και των λέξεων του αρχείου. Το όνομα του αρχείου περνά σαν Command Line Argument.
ΛΥΣΗ:
Χρησιμοποιούμε
τη συνάρτηση isalpha( ) για να
διερευνήσουμε αν ο χαρακτήρας που διαβάστηκε είναι κανονικό γράμμα ή σημείο
στίξης ή τέλος γραμμής.
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main (argc, argv)
int argc;
char *argv [ ];
{
char
ch;
long
nchars=0L;
int
nlines=0;
int
nwords=0;
int
wflags=0;
FILE *in;
clrscr(
);
if(argc!=2) {
printf(“Λάθος Ορίσματα !!! \n”);
exit(0);
}
if
((in =fopen (argv [1], “r”)) ==NULL) {
printf(“Το
Αρχείο Δεν Άνοιξε”);
exit(0);
}
while
((ch = getc (in) != EOF) {
nchars++;
if
(ch == ‘\n’) nlines++;
if
(isalpha (ch) && wflag==0)
{
wflag
=1;
nwords++;
}
if
((!isalpha (ch)) && (wflag==1)) wflag =0;
}
fclose(in);
printf(“Υπάρχουν %d Χαρακτήρες,
%d Λέξεις, %d Γραμμές”, nchars, nwords, nlines);
}
Να γραφεί function C που να καθορίζει την τιμή ενός δισδιάστατου πίνακα Α από NxN ακεραίους σύμφωνα με τον παρακάτω κανόνα:
Α[i, j] = 1, Αν i + j είναι
άρτιος
Α[i, j] = -1, Αν
i + j είναι περιττός
Οι παράμετροι της function είναι ο πίνακας Α και η διάστασή
του Ν.
ΛΥΣΗ:
Εδώ
χρειάζεται μόνο η συνάρτηση και όχι ολόκληρο το πρόγραμμα για την απάντηση του
ζητήματος. Περνιέται ένας pointer σε
δισδιάστατο πίνακα από ακεραίους και για τον υπολογισμό του κάθε στοιχείου
χρησιμοποιείται ο τύπος:
a [ j] [k] is equivalent to *(a+( j * row length) +k)
#include <stdio.h>
#include <conio.h>
main( )
{
int *pinax;
int
num,x,y;
clrscr( ) ;
printf(“Δώσε
Μέγεθος Πίνακα:”);
scanf(“%d”, &num);
Array_Func (pinax, num) ;
for
(x=0; x<num; x++) {
for (y=0; y<num; y++)
printf(“%d”,
(pinax + (x*num) +y));
printf(“\n”);
}
}
Array_Func (int
*Num_Arr [ ], int N)
{
register
int i, j;
for
(i=0; i<N; i++)
for(
j = 0; j<N; j++)
if
((i+ j ) %2 == 0) * (Num_Arr + (i*N) +j)
=1;
else
(Num_Arr
+ (i*N) +j) = -1;
}
Να γραφεί συνάρτηση C που να δέχεται σαν παραμέτρους έναν πίνακα ακεραίων Α και τη διάστασή του Ν, και να επιστρέφει τον ίδιο πίνακα με ανάποδη σειρά, δηλαδή το στοιχείο 0 να έχει αντιμετατεθεί με το στοιχείο Ν-1, το στοιχείο 1 με το Ν-2, κοκ.
ΛΥΣΗ:
Κι
εδώ επίσης δεν είναι απαραίτητη η συγγραφή ολόκληρου του προγράμματος παρά μόνο
της συνάρτησης. Ο πίνακας περνά Call By Reference, ενώ το μέγεθός του Call By Value.
#include <stdio.h>
#include <stdlib.h>
void Int_Rev(int *, int);
main( )
{
int
*Int_Arr, x, Num;
clrscr(
);
scanf(“%d”, &Num);
for (x=0 ; x<=Num-1; x++) Int_Arr [x] = x;
Int_Rev(Int_Arr,
Num);
for(x=0;
x<=Num-1; x++) printf(“%d”, Int_Arr
[x]);
}
void Int_Rev(int *A, int N)
{
int
*B;
register
int i, j;
for
(i =0, j = N-1; i<=N-1; i++, j--) B
[i] = A [ j];
for(
i = 0; i<=N-1; i++) A [i] = B
[i];
}
Να γραφεί function της C που να δέχεται σαν παραμέτρους ένα πίνακα ακεραίων και
τη διάστασή του Ν, και να επιστρέφει τη θέση του ελάχιστου στοιχείου.
ΛΥΣΗ:
Για την απάντηση του ζητήματος είναι απαραίτητη μόνο η συνάρτηση.
#include <stdio.h>
main( )
{
int *Int_Arr, Num, x;
clrscr(
);
scanf(“%d”, &Num);
for (x=0 ; x<=Num-1 ; x++) Int_Arr [x] = -x;
printf(“Η θέση του
ελάχιστου στοιχείου είναι η %d”, Min_Thesi(Int_Arr, Num));
}
Min_Thesi (int
*A, int N)
{
int i,
min, thesi;
min = A
[0];
thesi =
0;
for
(i=1; i<N-1; i++) {
if
(A [i] < min ) {
min
= A [i];
thesi
= i
}
return
thesi;
}
Ένας καθηγητής στο μάθημα της
γλώσσας C κρατάει αρχείο με τους φοιτητές. Για κάθε φοιτητή χρησιμοποιεί το
όνομα (15 χαρ.), το επώνυμο (20 χαρ.), το έτος (ακέραιος), το εξάμηνο (1 χαρ.
με τιμές Α ή Β) και το βαθμό (ακέραιος).
Α) Να οριστεί η παραπάνω structure (Δομή) της C.
Β) Να γραφεί πρόγραμμα που θα
διαβάζει από το αρχείο τα στοιχεία των φοιτητών και να τυπώνει το μέσο όρο
βαθμολογίας για το Α’ εξάμηνο του 1995. Κάθε γραμμή του αρχείου αντιστοιχεί σε
ένα φοιτητή και τα στοιχεία χωρίζονται μεταξύ τους με ένα ακριβώς κενό. Το
όνομα του αρχείου περνά παραμετρικά στο πρόγραμμα (Command Line Argument).
ΛΥΣΗ:
#include <stdio.h>
#include <conio.h>
/ * To α’ υποερώτημα */
struct student
{
char
F_Name [15];
char L_Name [20];
int Year;
char Sem;
int Grade;
} ;
/ * Το
πρόγραμμα, β’ υποερώτημα */
main (argc, argv)
int argc;
char *argv [ ];
{
struct
student Stud;
int
sum=0, i=0;
float
MO=0.0;
FILE *in;
clrscr(
);
if
(argc!=2) {
printf(“Λάθος
Ορίσματα !!! \n”);
exit (0);
}
if ((
in =fopen (argv [1], “r”)) ==NULL) {
printf(“Σφάλμα
Στο Άνοιγμα Του Αρχείου \n”);
exit(0);
}
while
((fscanf (in, “%s %s %d %c %d”, Stud.F_Name, Stud.L_Name, &Stud.Year,
&Stud.Sem, &Stud.Grade) == 5))
{
if(Stud.Year
==1995 && Stud.Sem==’A’) {
sum=sum
+ Stud.Grade;
i++;
}
}
MO = sum / i;
printf(“Ο Μ. Ο. Βαθμολογίας Για Το Α’ Εξάμηνο του ’95 Είναι %f”, MO);
fclose (in);
}
Έστω οι δηλώσεις:
int a [10];
int pa;
Ποιες από τις παρακάτω εντολές είναι
σωστές:
pa = &a [0];
pa = a++;
pa = a + 4;
pa = a [2];
pa = a
pa = (a+3);
a = pa;
pa--;
pa - = 3;
a++;
ΛΥΣΗ:
Σωστές είναι οι εντολές:
pa = a[2];
pa --;
pa -=3;
Οι
παρακάτω εντολές είναι λάθος γιατί επιδρούν στο a, που είναι ονομασία Πίνακα και δε μπορεί να αλλάξει τιμή.
pa = a++;
a = pa;
a++;
Οι
παρακάτω εντολές είναι λάθος γιατί κάνουν πράξεις με το pa και το a, όπου
είναι ακέραιος αριθμός και δείκτης σε ακεραίους αντίστοιχα.
pa = &a [0];
pa = a +4;
pa = a;
pa = (a+3);
===============================================================================================================
Ζήτημα 4ο: (ΔΕΝ
ΥΠΑΡΧΕΙ ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)
Να γραφεί συνάρτηση της C με όνομα
htoi που θα μετατρέπει ένα string από δεκαεξαδικούς χαρακτήρες στον
αντίστοιχο ακέραιο. Οι επιτρεπόμενοι δεκαεξαδικοί χαρακτήρες είναι από 0 ως 9
και Α έως F ή a έως f.
ΛΥΣΗ:
Για την απάντηση της ερώτησης
αυτής χρειάζεται μόνο η συνάρτηση htoi και όχι
ολόκληρο το πρόγραμμα. Χρησιμοποιούμε την tolower( ) για να μετατρέψουμε όλους τους χαρακτήρες σε πεζούς.
#include <math.h>
#include <stdio.h>
long htoi (char *);
main
{
char *Hex_Val ;
clrscr(
) ;
printf(“Δώστε μία Δεκαεξαδική Τιμή :”);
gets
(Hex_Val);
printf(“\n\nΗ Δεκαδική Της Τιμή Είναι %ld\n”, htoi (Hex_Val));
}
long htoi (char
*s)
{
int
length, timh, i=1;
long
sum=0;
length
= strlen (s);
while
(*s) {
s
= tolower (*s);
switch
(*s) {
case
‘0’: timh = 0; break;
case
‘1’: timh = 1; break;
case
‘2’: timh = 2; break;
case
‘3’: timh = 3; break;
case
‘4’: timh = 4; break;
case
‘5’: timh = 5; break;
case
‘6’: timh = 6; break;
case
‘7’: timh = 7; break;
case
‘8’: timh = 8; break;
case
‘9’: timh = 9; break;
case
‘a’: timh = 10; break;
case
‘b’: timh = 11; break;
case
‘c’: timh = 12; break;
case
‘d’: timh = 13; break;
case
‘e’: timh = 14; break;
case
‘f’: timh = 15; break;
default:
printf(“Δόθηκε
Εσφαλμένη Δεκαεξαδική Τιμή\n”);
exit(0);
}
sum
= sum + ((long) pow(16, (double) lentgh
–i *timh);
i++; *s++;
}
return sum;
}
Ζήτημα 15ο: (ΔΕΝ ΥΠΑΡΧΕΙ
ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)
Να οριστεί η Structure RecPhones της C που κρατάει το όνομα, τη
διεύθυνση και την ημερομηνία γέννησης διαφόρων ανθρώπων. Να ληθφεί υπόψη ότι οι
structure αυτές
είναι οργανωμένες σε δομή λίστας, δηλαδή κάθε structure αυτού του τύπου “δείχνει” στην επόμενη structure του ίδιου τύπου. Οι τύποι των
πεδίων της structure είναι:
Επίθετο String, 20 χαρ.
Όνομα String, 15 χαρ.
Διεύθυνση String, 40 χαρ.
Τηλέφωνο String, 20 χαρ.
Έτος
Γέννησης Ακέραιος
Μήνας
Γένν. Ακέραιος
Ημέρα
Γενν. Ακέραιος.
ΛΥΣΗ:
Στη δομή αυτή θα χρησιμοποιηθεί
μία μεταβλητή για να δείξουμε στην επόμενη δομή, μια και η structure RecPhones αποτελεί στοιχείο μιάς λίστας,
που το ένα στοιχείο “δείχνει” στο επόμενο. Έτσι θα χρησιμοποιηθεί ένας Pointer του τύπου RecPhones.
struct RecPhones
{
char Last_Name [20];
char
First_Name [15];
char
Address [40];
char
TeleNum [20];
int
Etos;
int
Mhnas;
int
Hmera;
struct
RecPhones *Next_Rec;
};
Ζήτημα 18ο: (ΔΕΝ ΥΠΑΡΧΕΙ ΣΤΗΝ ΚΑΙΝΟΥΡΙΑ ΠΙΣΤΟΠΟΙΗΣΗ)
Αν η τιμή του x είναι 9 και του y είναι 3, ποια η τιμή του z σε κάθε μία από τις παρακάτω περιπτώσεις;
z = x & y;
z
= x y ;
z
= x << 2 ;
z
= x >> 2 ;
z = ~
x ;
z = x & ~
07 ;
ΛΥΣΗ:
Στο δυαδικό σύστημα έχουμε:
x = 9 = 1001 και y = 3 = 0011
Άρα:
z = x & y = 1001 &
0011 = 0001 = 1
z = x y = 1001
0011 = 1011 = 11
z = x << 2 = 1001 << 2 = 100100 = 36
z = x >> 2 =
1001 >> 2 = 0010 = 2
z = ~ x
= ~ 1001 = 0110 = 6
z = x & ~
07 = 1001 & ~ 0111 = 1001 & 1000 = 1000 = 8