1. Clasicul MyStrcmp
Doua siruri de caractere sunt "egale" daca au
exact aceleasi caractere dispuse in aceeasi ordine.
O functie testeaza aceasta "egalitate" si
intoarce zero in caz ca se verifica egalitatea.
Daca sir1 < sir2, adica daca verificarea, pentru un
caracter oarecare, incepand cu primul, a codurilor ASCII, satisface
inegalitatea, functia intoarce -1.
In caz contrar, intoarce +1.
Codul si printscreen-ul:
#include <stdio.h>
int MyStrcmp(char *s1, char *s2);
void FeedString(char *s); // in loc de functiile
predefinite gets si scanf
int main()
{
char
s1[31], s2[31];// vectori de max 30 de caractere + terminatorul de sir
int
check;
puts("Introduceti
primul sir, s1. Incheiati cu zero.");
FeedString(s1);
puts("Introduceti
al doilea sir, s2. Incheiati cu zero.");
FeedString(s2);
check =
MyStrcmp(s1, s2);
if(!check)
printf("\nSirurile sunt egale.\n");
else
if(check < 0) printf("\nSirul %s < %s.\n", s1, s2);
else
printf("\nSirul %s > %s.\n", s1, s2);
return
0;
}
int MyStrcmp(char *s1, char *s2)
{
int l1,
l2, i;
i = l1 =
l2 = 0;
//De
fapt, se poate renunta la portiunea de cod
//pentru
calculul lungimii sirurilor si la
//luarea
deciziei pe baza compararii lungimilor.
//Rezolvarea
a fost scrisa astfel pentru a ilustra
//prioritatile
diferite ale operatorului de indexare
//si a
celui de incrementare postfix
while(s1[l1++]
!= '\0');
l1--;
while(s2[l2++]
!= '\0');
l2--;
if(l1 !=
l2)
{
for(;
i < (l1 < l2? l2 : l1); i++)
{
if(s1[i]
== s2[i]) continue;
else
if(s1[i] < s2[i]) return -1;
else
return 1;
}
}
else
{
i
= 0;
while(s1[i]
== s2[i]) i++;
i;
if(i
- 1 == l1) return 0;
else
if(s1[i] < s2[i]) return -1;
else
return 1;
}
}
void FeedString(char *s)
{
int i =
0;
char c =
'\0';
while((c
= getchar()) != '0')
{
s[i]
= c;
if(i
== 29)
{
s[i
+ 1] = '\0';
_flushall();
break;
}
i++;
s[i]
= '\0';
}
_flushall();
}
2. Clasicul program de eliminare a caracterelor
white-space dintr-un sir.
Se scrie o functie de eliminare a unui caracter
white-space, fie el spatiu (ASCII 32), tab (ASCII 9) sau new line ('\n'.
Compilatorul va efectua translatia line feed + carriage return, coduri ASCII 10
si 13).
Odata caracterul 'alb' eliminat, se invoca in mod convenabil, intr-o bucla, functia pana
la elimitarea tuturor caracterelor white-space.
Codul si printscreen-ul:
#include <stdio.h>
void EliminWhite(char tab[], int n, int poz);
void FeedString(char *p);
int main()
{
char
tab[81];
int i = 0, l =
0;
puts("Introduceti
un sir de max. 80 de caractere terminat prin 0.\nPoate contine whitespaces. Le
vom elimina!\n");
FeedString(tab);
while(tab[l++]
!= '\0');
l--;
while(tab[i++]
!= '\0') if(tab[i - 1] == '\t' || tab [i - 1] == '\n' || tab[i - 1] == ' ')
EliminWhite(tab, l, i - 1);
printf("\nAm
elimitat white-spaces si a rezultat sirul:\n\n%s\n", tab);
return
0;
}
void EliminWhite(char tab[], int n, int poz)
{
int i;
for(i =
poz; i < n; i++) tab[i] = tab[i + 1];
}
void FeedString(char *p)
{
int i =
0;
char c =
'\0';
while((c
= getchar()) != '0')
{
p[i]
= c;
if(i
== 80)
{
p[i
+ 1] = '\0';
_flushall();
break;
}
p[i
+ 1] = '\0';
i++;
}
_flushall();
}
No comments:
Post a Comment