Upload
jacqueline-nieves
View
39
Download
0
Embed Size (px)
DESCRIPTION
Minnen, variabler, att lagra i primärminnet forts. Fördefinierade minnes- variabeltyper. int main() { chartecken; intheltal; floatflyttal; doubledubbeltFlyttal; ” ”. Array ( vektor, matris ) ett exempel som illustrerar behovet. - PowerPoint PPT Presentation
Citation preview
Anders Sjögren
Fördefinierade minnes-variabeltyper
int main() {
char tecken;int heltal;float flyttal;double dubbeltFlyttal;
””
Anders Sjögren
Array ( vektor, matris )ett exempel som illustrerar behovet
Antag att man vill mäta temperaturen flera gånger och spara värdena för statistisk behandling .Hur gör man ett program som läser in flera mätvärden?
Anders Sjögren
#include <stdio.h>
int main(void){
int temp1, temp2, temp3, temp4, temp5;int temp6, temp7, temp8, temp9, temp10;
printf("Ge temperatur --> "); scanf("%d",&temp1);printf("Ge temperatur --> "); scanf("%d",&temp2);printf("Ge temperatur --> "); scanf("%d",&temp3);printf("Ge temperatur --> "); scanf("%d",&temp4);printf("Ge temperatur --> "); scanf("%d",&temp5);printf("Ge temperatur --> "); scanf("%d",&temp6);printf("Ge temperatur --> "); scanf("%d",&temp7);printf("Ge temperatur --> "); scanf("%d",&temp8);printf("Ge temperatur --> "); scanf("%d",&temp9);printf("Ge temperatur --> "); scanf("%d",&temp10);
printf("\ntemp = %d", temp1);
return 0;}
Varför array ?
Klumpigt !
Anders Sjögren
#include <stdio.h>
int main(void){
int temp[10];int i;
for (i=0 ; i<10 ; i++){printf("Ge temperatur %d --> ",i); scanf("%d",&temp[i]);
}
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i, temp[i]);
return 0;}
Varför array ?
Bra, hyfsat!
detta skapar 10 st minnen i primärminnet ( på stacken i detta fall) som vardera kan lagra en int.En array ( vektor ) om 10 element har sett dagens ljus
Anders Sjögren
#include <stdio.h>
int main(void){
int temp[10];int i;
for (i=0 ; i<10 ; i++){printf("Ge temperatur %d --> ",i); scanf("%d",&temp[i]);
}
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i, temp[i]);
return 0;}
Varför array ?
Bra, hyfsat!
detta skapar 10 st minnen i primärminnet ( på stacken i detta fall) som vardera kan lagra en int.En array ( vektor ) om 10 element har sett dagens ljus
Anders Sjögren
symboldefinitioner
Maskinkodprogrammet
Heap
Stack
BytesBytes
Ett minnesutrymme, variabel, i primärminnet
Ett minnesutrymme, variabel, i primärminnet somkan lagra en adress dvs en pekare. Pekaren kan tilldelas ett nytt värde.
En adress, pekare vars värde är konstant.
Anders Sjögren
Vad är en array ?
*temp == temp[0]
temp[1]
temp[9]
temp
temp[0]
temp[6]
intint
int main(void){
int temp[10];int i;
int main(void){
int temp[10];int i;
Maskinkodprogrammet
Heap
Stack
BytesBytes
OBS! Första index-nummer är 0 !!
Anders Sjögren
Vad är en array ?
• stega på index
int
temp[1]
temp[9]
temp
temp[0]
temp[6]
int
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i, temp[i]);
Anders Sjögren
Vad är en array ?
• stega på index
int
temp[1]
temp[9]
temp
temp[0]
temp[6]
int
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i, temp[i]);
• pekarstegningeffektivare = snabbare
int* heltalsPekare;
heltalsPekare = temp ;
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i,*heltalsPekare++); heltalspekare
Anders Sjögren
Vad är en array ?
• stega på index
int
temp[1]
temp[9]
temp
temp[0]
temp[6]
int
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i, temp[i]);
• pekarstegningeffektivare = snabbare
int* heltalsPekare;
heltalsPekare = temp ;
for (i=0 ; i<10 ; i++)printf("\ntemp %d = %d",i,*heltalsPekare++); heltalspekare
ofta är kompilatorerna standardmässigt inställda på att optimera maskinkoden så indexstegning översätts till pekar-stegning vid kompilering. Vill man ändra på detta måste man ändra kompilatordirektiven. Man kan studera detta genom att kompilera mot assemblerkod.
Anders Sjögren
Längden på en array ?
• tänk om arrayen inte räcker till !
int main(void){
int temp[10];int i;
Anders Sjögren
Längden på en array ?
• om man inte vet längden på arrayen i förväg så kan man allokera minne dynamiskt under exekvering int main(void)
{int temp[10];int i;
int main(void){
int temp[10];int i;int *tempPekare;
int n,i,j;
printf("Ange antal temperaturer --> "); scanf("%d",&n);
tempPekare = (int *) calloc(n,sizeof(int));
for (i=0 ; i<n ; i++){printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i);
}
Anders Sjögren
calloc(), ur manualenSyntax
#include <stdlib.h>void *calloc(size_t nitems, size_t size);
Description
Allocates main memory. calloc provides access to the C memory heap. The heap is available for dynamic allocation of variable-sized blocks of memory. Many data structures, such as trees and lists, naturally employ heap memory allocation.All the space between the end of the data segment and the top of the program stack is available for use in the small data models (small and medium),except for a small margin immediately before the top of the stack. This margin allows room for the application to grow on the stack, and provides a small amount of room needed by the operating system.In the large data models (compact, large, and huge), all space beyond the program stack to the end of physical memory is available for the heap.calloc allocates a block of size nitems * size. The block is cleared to 0. If you want to allocate a block larger than 64K, you must use farcalloc.
Return Value
calloc returns a pointer to the newly allocated block. If not enough space exists for the new block or if nitems or size is 0, calloc returns NULL.
Anders Sjögren
Vad är skillnaden på de två ?
<------ måste avallokeras av programmeraren !
int temp[10];
int *tempPekare;
tempPekare = (int *) calloc(n,sizeof(int));Maskinkodprogrammet
Heap
Stack
BytesBytes
main()main()
10 stint
10 stint <------ avallokeras
automatiskt !
Anders Sjögren
Vad är skillnaden på de två ?
<------ måste avallokeras!
int temp[10];
int *tempPekare;
tempPekare = (int *) calloc(n,sizeof(int));Maskinkodprogrammet
Heap
Stack
BytesBytes
main()main()
10 stint
10 stint
Det är jag som programmerare som ansvarar för att minne, allokerat dynamiskt på heapen, tas bort. Annars finns de kvar så länge programmet finns kvar.
Anders Sjögren
Vad är skillnaden på de två ?
<------ måste avallokeras!
int temp[10];
int *tempPekare;
tempPekare = (int *) calloc(n,sizeof(int));Maskinkodprogrammet
Heap
Stack
BytesBytes
main()main()
10 stint
10 stint
Jag måste också akta mig noga så jag inte skriver över adressen som nu finns lagrad i tempPekare. Om jag gör det så får jag ett borttappat ( dinglande) minne som inte kan användas eller avallokeras.
Anders Sjögren
#include <stdio.h>#include <stdlib.h>
int main(void) {
int *tempPekare;int n,i,j;
printf("Ange antal temperaturer --> "); scanf("%d",&n);tempPekare = (int *) calloc(n,sizeof(int));
for (i=0 ; i<n ; i++){printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i);
} for (i=0 ; i<n ; i++)
printf("\ntemp %d = %d",i, tempPekare[i]);
free(tempPekare) ;
return 0;}
Hela programmet
Anders Sjögren
#include <stdio.h>#include <stdlib.h>
int main(void) {
int *tempPekare;int n,i,j;
printf("Ange antal temperaturer --> "); scanf("%d",&n);tempPekare = (int *) calloc(n,sizeof(int));
for (i=0 ; i<n ; i++){printf("Ge temperatur %d --> ",i); scanf("%d",tempPekare+i);
}
for (i=0 ; i<n ; i++)printf("\ntemp %d = %d",i, tempPekare[i]);
free(tempPekare) ;
return 0;}
Hela programmet
för att en pekare ska kunna användas måste den peka på en känd datatyp. calloc() returnerar en pekare till typen void (ingenting) så måste pekaren ”castas” till att peka på någon känd typ.
Anders Sjögren
Syntax
#include <stdlib.h> or #include<alloc.h>void *malloc(size_t size);
Description
Allocates main memory.malloc allocates a block of size bytes from the memory heap. It allows a program to allocate memory explicitly as it's needed, and in the exact amounts needed. The heap is used for dynamic allocation of variable-sized blocks of memory. Many data structures, for example, trees and lists, naturally employ heap memory allocation.All the space between the end of the data segment and the top of the program stack is available for use in the small data models, except for a small margin immediately before the top of the stack. This margin is intended to allow the application some room to make the stack larger, in addition to a small amount needed by DOS.In the large data models, all the space beyond the program stack to the end of available emory is available for the heap.
Return Value
On success, malloc returns a pointer to the newly allocated block of memory. If not enough space exists for the new block, it returns NULL. The contents of the block are left unchanged. If the argument size == 0, malloc returns NULL.
Det finns yttterligare en funktion
för dynamisk minnesallokeringmalloc()
Anders Sjögren
Strängaratt hantera text
• strängar är en array av tecken
• sista tecknet skall vara ’\0’, ASCII nr 0 strang1
strang1[0]
char
Hej\0
??????
int main() {char strang1[10]={'H','e','j','\0'};
strang1[9]
Anders Sjögren
Kopiera arrayer - strängar
int main() {char strang1[10]={'H','e','j','\0'};char strang2[10];char* strangPekare;
strang1
strang1[0]
char
Hej\0
??????
strang2
strang2[0]
char
???
??????
?
strangPekare?
char
Anders Sjögren
Kopiera arrayer - strängarint main() {
strang2 = strang1 ;
strangPekare = strang1;
strang1strang1[0]
char
Hej\0
??????
strang2
strang2[0]
char
???
??????
?
strangPekare
?
char
tilldelar bara adressen till element 0.
Anders Sjögren
Kopiera arrayer - strängar#include <string.h>;int main() {
strang2 = strang1 ;strcpy( strang2,strang1);
strang1
strang1[0]
char
Hej\0
??????
strang2
strang2[0]
char
??????
Hej\0
detta löser problemet!
Anders Sjögren
Matriser
• flerdimensionella arrayerint main() {
int matris[10][3];
5
matris[8][2] = 5;
Anders Sjögren
Sortera element i en arrayfunktionspekare införs
antag att man vill sortera bokstäverna i en sträng
string
string[0]
char
Hej\0
??????
Anders Sjögren
Sortera element i en array
• funktion för detta finns redan
och prototypen ser ut på följande sätt
• void *base är en pekare till ”vad som helst” men som kan konverteras (cast) att peka på någon känd typ. Missar man att göra en cast till känd typ så sker en implicit konvertering. I detta fall ska det vara en pekare till 1:a elementet i arrayen som skall sorteras.
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));
Anders Sjögren
Sortera element i en array
• funktion för detta finns redan
och prototypen ser ut på följande sätt
• size_t är ett makro som i ANSI-standard anger typen på returvärdet för funktionen sizeof(). Här ska man ange hur många element det finns i arrayen som skall sorteras.
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));
Anders Sjögren
Sortera element i en array
• funktion för detta finns redan
och prototypen ser ut på följande sätt
• size_t är ett makro som i ANSI-standard anger typen på returvärdet för funktionen sizeof(). Här ska man ange hur stort varje ( i bytes) element i arrayen som skall sorteras är.
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));
Anders Sjögren
Sortera element i en arrayfunktionspekare
• funktion för detta finns redan
och prototypen ser ut på följande sätt
• pekare till en funktion (funktionspekare) vars argument är två void-pekare och som returnerar en int. Denna funktion specifierar hur det skall sorteras. Funktionen döper man och skriver själv.
void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void *, const void *));
Anders Sjögren
Funktionspekare
• på samma sätt som string är en adress till första elementet i arrayen
char string[10];
• så är ett funktionsnamn utan parenteser Sorteringsordning adressen till funktionen
int Sorteringsordning( void * a , void * b );
Anders Sjögren
Sortering implementerat#include <stdio.h>#include <string.h>#include <stdlib.h>
int Sorteringsordning( const void* a, const void* b);
int main ( void ){
char string[10]={ '\0' } ;int i ;
printf("Skriv text max 9 tecken: --> ");scanf("%s", string);
qsort( (void*) string , strlen( string ) , sizeof( char ) , Sorteringsordning );
for ( i=0; string[i]!='\0' ; i++)printf("%c", string[i]);
return 0 ;}
Anders Sjögren
Funktionen Sorteringsordning()
• sorterar på tecknens ASCII-kod
int Sorteringsordning( const void* a, const void* b){
if ( *((char *)a) < *((char *)b) ) return -1 ;else if ( *((char *)a) > *((char *)b) ) return 1 ;else return 0 ;
}
Anders Sjögren
Funktionen Sorteringsordning()
• sorterar på summan av tecknens ASCII-kodbitmönster
int Sorteringsordning( const void* a, const void* b){int summaA, summaB;
summaA = BinSumma(*((char *)a));summaB = BinSumma(*((char *)b)) ;
if ( summaA < summaB) return -1 ;else if ( summaA > summaB) return 1 ;else if ( *((char *)a) < *((char *)b) ) return -1 ;
else if ( *((char *)a) > *((char *)b) ) return 1 ;else return 0 ;
}
Anders Sjögren
Funktionen BinSumma()
• sorterar på summan av tecknens ASCII-kodbitmönsterint BinSumma( char tal ) {
int rest ;static int langd = 0;
langd++ ;rest = tal % 2 ;tal /= 2 ;if (tal==0 || langd==8) { /* summerar över 1 byte */
langd = 0 ;return rest ;
}else
return rest + BinSumma( tal );}
Blev samma!
(men inte alltid – å ä ö …)
Anders Sjögren
#include <stdio.h>#include <string.h>#include <stdlib.h>
int Sorteringsordning( const void* a, const void* b);int BinSumma( char tal );
int main ( void ){
char string[10]={ '\0' } ;int i ;
printf("Skriv text max 9 tecken: --> ");scanf("%s", string);
qsort( (void*) string , strlen( string ) , sizeof( char ) , Sorteringsordning );
for ( i=0; string[i]!='\0' ; i++)printf("%c", string[i]);
return 0 ;}
int Sorteringsordning( const void* a, const void* b){int summaA, summaB;
summaA = BinSumma(*((char *)a));summaB = BinSumma(*((char *)b)) ;
if ( summaA < summaB) return -1 ;else if ( summaA > summaB) return 1 ;else if ( *((char *)a) < *((char *)b) ) return -1 ;
else if ( *((char *)a) > *((char *)b) ) return 1 ;else return 0 ;
return 0 ;}int BinSumma( char tal ) {
int rest ;static int langd = 0;
langd++ ;rest = tal % 2 ;tal /= 2 ;if (tal==0 || langd==8) { /* summerar över 1 byte */
langd = 0 ;return rest ;
}else return rest + BinSumma( tal );
}
Hela programmet, översikt
main()
Sorteringordning()
BinSumma()
Anders Sjögren
Sortera strängarna
char list[5][4] = { "cat", "car", "cab", "cap", "can" };
ca
t\0
ca
r\0
ca
b\0
ca
p\0
ca
n\0
Anders Sjögren
/* qsort example */
#include <stdio.h>#include <stdlib.h>#include <string.h>
int sort_function( const void *a, const void *b);char list[5][4] = { "cat", "car", "cab", "cap", "can" };
int main(void){ int x;
qsort((void *)list, 5, sizeof(list[0]), sort_function); for (x = 0; x < 5; x++) printf("%s\n", list[x]); return 0;}
int sort_function( const void *a, const void *b){ return( strcmp((char *)a,(char *)b) );}
Sortera strängar• i sort_function() kan man
använda strcmp()
Anders Sjögren
_fstricmp, strcmp, strcmpi, stricmp <STRING.H>
Declaration
int strcmp(const char * s1, const char * s2);
Remarks
strcmp performs an unsigned comparison of s1 to s2. Return Value
These routines return an int value that is
- < 0 if s1 < s2 - == 0 if s1 == s2 - > 0 if s1 > s2
Sortera strängar
• i sort_function() kan man använda strcmp()
Anders Sjögren
_fstricmp, strcmp, strcmpi, stricmp <STRING.H>
Declaration
int strcmp(const char *s1, const char*s2);
Remarks
strcmp performs an unsigned comparison of s1 to s2. Return Value
These routines return an int value that is
- < 0 if s1 < s2 - == 0 if s1 == s2 - > 0 if s1 > s2
Sortera strängar• i sort_function() kan man använda strcmp()
• OBS! Å Ä Ö
Anders Sjögren
strcoll <STRING.H>
Compares two strings
Declaration
int strcoll(char *s1, char *s2);
Remarksstrcoll compares the string *s1 to the string *s2, according to the collating sequence set by setlocale().
Return Valuestrcoll returns a value that is - < 0 if s1 < s2 - == 0 if s1 == s2 - > 0 i f s1 > s2
Sortera strängar• i sort_function() kan man använda strcoll()
• OBS! Å Ä Ö
Anders Sjögren
Sökning i strängar_fstrstr, strstr <STRING.H>
Finds the first occurrence of a substring in another string
Declaration
char *strstr(const char *s1, const char *s2);
Remarks
strstr scans s1 for the first occurrence of the substring s2.
Return Value
- On success, strstr returns a pointer to the element in s1 where s2 begins (points to s2 in s1).
- On error (if s2 does not occur in s1), strstr returns null.