Introduction to C - Indian Institute of Technology Kharagpur

Download Report

Transcript Introduction to C - Indian Institute of Technology Kharagpur

Arrays
Spring 2013
Programming and Data Structure
1
Basic Concept
• Many applications require multiple data
items that have common characteristics.
– In mathematics, we often express such groups
of data items in indexed form:
• x1, x2, x3, …, xn
• Why are arrays essential for some
applications?
– Take an example.
– Finding the minimum of a set of numbers.
Spring 2013
Programming and Data Structure
2
3 numbers
if ((a <= b) && (a <= c))
min = a;
else
if (b <= c)
min = b;
else
min = c;
Spring 2013
4 numbers
if ((a <= b) && (a <= c) && (a <= d))
min = a;
else
if ((b <= c) && (b <= d))
min = b;
else
if (c <= d)
min = c;
else
min = d;
Programming and Data Structure
3
The Problem
• Suppose we have 10 numbers to handle.
• Or 20.
• Or 100.
• How to tackle this problem?
• Solution:
– Use arrays.
Spring 2013
Programming and Data Structure
4
Using Arrays
• All the data items constituting the group
share the same name.
int x[10];
• Individual elements are accessed by
specifying the index.
x[0]
x[1]
x[2]
x[9]
X is a 10-element one
dimensional array
Spring 2013
Programming and Data Structure
5
Declaring Arrays
• Like variables, the arrays that are used in a
program must be declared before they are
used.
• General syntax:
type array-name [size];
– type specifies the type of element that will be
contained in the array (int, float, char, etc.)
– size is an integer constant which indicates the
maximum number of elements that can be stored
inside the array.
int marks[5];
• marks is an array containing a maximum of 5 integers.
Spring 2013
Programming and Data Structure
6
• Examples:
int x[10];
char line[80];
float points[150];
char name[35];
• If we are not sure of the exact size of the array,
we can define an array of a large size.
int marks[50];
though in a particular run we may only be using,
say, 10 elements.
Spring 2013
Programming and Data Structure
7
How an array is stored in memory?
• Starting from a given memory location, the
successive array elements are allocated space in
consecutive memory locations.
Array a
• Let
x
x+k
x+2k
x: starting address of the array in memory
k: number of bytes allocated per array element
– Element a[i] :: allocated memory location at address
x + i*k
• First array index assumed to start at zero.
Spring 2013
Programming and Data Structure
8
Accessing Array Elements
• A particular element of the array can be accessed
by specifying two things:
– Name of the array.
– Index (relative position) of the element in the array.
• In C, the index of an array starts from zero.
• Example:
– An array is defined as int x[10];
– The first element of the array x can be accessed as
x[0], fourth element as x[3], tenth element as x[9],
etc.
Spring 2013
Programming and Data Structure
9
Contd.
• The array index must evaluate to an integer
between 0 and n-1 where n is the number of
elements in the array.
a[x+2] = 25;
b[3*x-y] = a[10-x] + 5;
Spring 2013
Programming and Data Structure
10
A Warning
• In C, while accessing array elements, array
bounds are not checked.
• Example:
int marks[5];
:
:
marks[8] = 75;
– The above assignment would not necessarily cause an
error.
– Rather, it may result in unpredictable program results.
Spring 2013
Programming and Data Structure
11
Initialization of Arrays
• General form:
type array_name[size] = { list of values };
• Examples:
int marks[5] = {72, 83, 65, 80, 76};
char name[4] = {‘A’, ‘m’, ‘i’, ‘t’};
• Some special cases:
– If the number of values in the list is less than the
number of elements, the remaining elements are
automatically set to zero.
float total[5] = {24.2, -12.5, 35.1};
 total[0]=24.2, total[1]=-12.5, total[2]=35.1,
total[3]=0,
total[4]=0
Spring 2013
Programming and Data Structure
12
Contd.
– The size may be omitted. In such cases the
compiler automatically allocates enough space for
all initialized elements.
int flag[] = {1, 1, 1, 0};
char name[] = {‘A’, ‘m’, ‘i’, ‘t’};
Spring 2013
Programming and Data Structure
13
Example 1: Find the minimum of a set of 10 numbers
Array
declaration
#include <stdio.h>
main()
{
int a[10], i, min;
printf(“Give 10 values \n”);
for (i=0; i<10; i++)
scanf (“%d”, &a[i]);
min = 99999;
for (i=0; i<10; i++)
{
if (a[i] < min)
min = a[i];
}
printf (“\n Minimum is %d”, min);
Reading
Array Element
Accessing
Array Element
}
Spring 2013
Programming and Data Structure
14
Alternate
Version 1
Change only one
line to change the
problem size
#include <stdio.h>
#define size 10
main()
{
int a[size], i, min;
printf(“Give 10 values \n”);
for (i=0; i<size; i++)
scanf (“%d”, &a[i]);
min = 99999;
for (i=0; i<size; i++)
{
if (a[i] < min)
min = a[i];
}
printf (“\n Minimum is %d”, min);
}
Spring 2013
Programming and Data Structure
15
Alternate
Version 2
#include <stdio.h>
main()
{
int a[100], i, min, n;
printf(“Give number of elements (n) \n”);
scanf (“%d”, &n); /* Number of elements */
Define an array of
large size and use
only the required
number of elements
printf(“Input all n integers \n”);
for (i=0; i<n; i++)
scanf (“%d”, &a[i]);
min = 99999;
for (i=0; i<n; i++)
{
if (a[i] < min)
min = a[i];
}
printf (“\n Minimum is %d”, min);
Spring 2013
} Programming and Data Structure
16
Example 2:
Computing gpa
#include <stdio.h>
#define nsub 6
main()
{
int grade_pt[nsub], cred[nsub], i,
gp_sum=0, cred_sum=0, gpa;
Handling two arrays
at the same time
printf(“Input gr. points and credits for six subjects \n”);
for (i=0; i<nsub; i++)
scanf (“%d %d”, &grade_pt[i], &cred[i]);
for (i=0; i<nsub; i++)
{
gp_sum += grade_pt[i] * cred[i];
cred_sum += cred[i];
}
gpa = gp_sum / cred_sum;
printf (“\n Grade point average: is %d”, gpa);
}
Spring 2013
Programming and Data Structure
17
Things you cannot do
• You cannot
– use = to assign one array variable to another
a = b; /* a and b are arrays */
– use == to directly compare array variables
if (a = = b) ………..
– directly scanf or printf arrays
printf (“……”, a);
Spring 2013
Programming and Data Structure
18
How to copy the elements of one array to another?
• By copying individual elements
int a[25],b[25];
for (j=0; j<25; j++)
a[j] = b[j];
Spring 2013
Programming and Data Structure
19
How to read the elements of an array?
• By reading them one element at a time
int a[25];
for (j=0; j<25; j++)
scanf (“%f”, &a[j]);
• The ampersand (&) is necessary.
• The elements can be entered all in one line or
in different lines.
Spring 2013
Programming and Data Structure
20
How to print the elements of an array?
• By printing them one element at a time.
for (j=0; j<25; j++)
printf (“\n %f”, a[j]);
– The elements are printed one per line.
printf (“\n”);
for (j=0; j<25; j++)
printf (“ %f”, a[j]);
– The elements are printed all in one line (starting
with a new line).
Spring 2013
Programming and Data Structure
21
Example: Matrix Addition
#include <stdio.h>
for (p=0; p<m; p++)
for (q=0; q<n; q++)
c[p]q] = a[p][q] + b[p][q];
main()
{
int a[100][100], b[100][100],
c[100][100], p, q, m, n;
for (p=0; p<m; p++)
{
printf (“\n”);
for (q=0; q<n; q++)
printf (“%f ”, a[p][q]);
}
scanf (“%d %d”, &m, &n);
for (p=0; p<m; p++)
for (q=0; q<n; q++)
scanf (“%d”, &a[p][q]);
}
for (p=0; p<m; p++)
for (q=0; q<n; q++)
scanf (“%d”, &b[p][q]);
Spring 2013
Programming and Data Structure
22
Passing Arrays to a Function
• An array name can be used as an argument to a function.
– Permits the entire array to be passed to the function.
– Array name is passed as the parameter, which is effectively the
address of the first element.
• Rules:
– The array name must appear by itself as argument, without
brackets or subscripts.
– The corresponding formal argument is written in the same
manner.
• Declared by writing the array name with a pair of empty brackets.
• Dimension or required number of elements to be passed as
a separate parameter.
Spring 2013
Programming and Data Structure
23
Example: Average of numbers
#include <stdio.h>
Array as parameter
float avg(float [], int );
prototype
main()
{
float a[]={4.0, 5.0, 6.0, 7.0};
printf("%f \n", avg(a,4) );
}
Array name passed
float avg (float x[], int n)
{
float sum=0; Number of
int i;
Elements used
for(i=0; i<n; i++)
sum+=x[i];
return(sum/(float) n);
}
5.5000
Spring 2013
Programming and Data Structure
24
The Actual Mechanism
• When an array is passed to a function, the
values of the array elements are not passed to
the function.
– The array name is interpreted as the address of the
first array element.
– The formal argument therefore becomes a pointer
to the first array element.
– When an array element is accessed inside the
function, the address is calculated using the
formula stated before.
– Changes made inside the function are thus also
reflected in the calling program.
Spring 2013
Programming and Data Structure
26
Contd.
• Passing parameters in this way is called
call-by-reference.
• Normally parameters are passed in C using
call-by-value.
• Basically what it means?
– If a function changes the values of array elements,
then these changes will be made to the original array
that is passed to the function.
– This does not apply when an individual element is
passed on as argument.
Spring 2013
Programming and Data Structure
27
Example: Minimum of a set of
numbers
#include <stdio.h>
int minimum (x, size)
int x[], size;
{
int i, min = 99999;
main()
{
int a[100], i, n;
for (i=0; i<size; i++)
if (min < a[i])
min = a[i];
scanf (“%d”, &n);
for (i=0; i<n; i++)
scanf (“%d”, &a[i]);
return (min);
printf (“\n Minimum is %d”,
minimum (a, n));
}
}
Spring 2013
Programming and Data Structure
28
Some Exercise Problems to Try Out
• Find the mean and standard deviation of a set
of n numbers.
• A shop stores n different types of items. Given
the number of items of each type sold during
a given month, and the corresponding unit
prices, compute the total monthly sales.
Spring 2013
Programming and Data Structure
29
Character Strings
21 July 2015
Programming and Data Structure
30
Introduction
• A string is an array of characters.
–Individual characters are stored in
memory in ASCII code.
–A string is represented as a sequence
of characters terminated by the null
(‘\0’) character.
“Hello” 
21 July 2015
H
e
Programming and Data Structure
l
l
o ‘\0’
31
Character Strings
Character vs. String
• A string constant is a sequence of characters
enclosed in double quotes.
– For example, the character string:
char s1[2]="a"; //Takes two bytes of
storage.
s1: a
‘\0’
– On the other hand, the character, in single quotes:
char s2= `a`; //Takes only one byte of
storage.
a
s2:
Declaring String Variables
• A string is declared like any other array:
char string-name [size];
– size determines the number of characters in
string_name.
• When a character string is assigned to a character
array, e.g. s=“abc”;
– It automatically appends the null character (‘\0’) at
the end of the string.
– size should be equal to the number of characters in
the string plus one.
21 July 2015
Programming and Data Structure
34
Examples
char name[30];
char city[15];
char dob[11];
• A string may be initialized at the time of
declaration.
Equivalent
char city[15] = “Calcutta”;
char city[15] = {‘C’, ‘a’,‘l’,‘c’,‘u’,‘t’,‘t’,‘a’,’\0’};
char dob[] = “12-10-1975”;
21 July 2015
Programming and Data Structure
35
Reading Strings from the Keyboard
• Two different cases will be
considered:
–Reading words
–Reading an entire line
21 July 2015
Programming and Data Structure
36
Reading Words
• scanf with “%s” format:
char name[30];
:
:
scanf (“%s”, name);
– The ampersand (&) is not required before the
string name.
– Point to remember here is that the string is taken
to be upto the first white space (blank, tab,
carriage return, etc.)
• If we type “Rupak Biswas”
• name will be assigned the string “Rupak”
21 July 2015
Programming and Data Structure
37
Reading a Line of Text
• In many applications, we need to read in an
entire line of text (including blank spaces).
• We can use the getchar() function for the
purpose.
21 July 2015
Programming and Data Structure
38
char line[81], ch;
int c=0;
:
:
do
{
ch = getchar();
line[c] = ch;
c++;
}
while (ch != ‘\n’);
c = c – 1;
line[c] = ‘\0’;
21 July 2015
Read characters
until CR (‘\n’) is
encountered
Make it a valid string
Programming and Data Structure
39
Reading a Line :: Alternate Approach
char line[81];
:
:
scanf (“%[ ABCDEFGHIJKLMNOPQRSTUVWXYZ]”, line);
 Reads a string containing uppercase
characters and blank spaces
char line[81];
:
scanf (“%[^\n]”, line);
 Reads a string containing any characters
21 July 2015
Programming and Data Structure
40
Displaying Strings on the Screen
• We can use printf with the “%s” format
specification.
char name[50];
:
:
printf (“\n %s”, name);
21 July 2015
Programming and Data Structure
41
Processing Character Strings
• C library functions for character string
manipulation.
– strcpy :: string copy
– strlen :: string length
– strcmp :: string comparison
– strtcat :: string concatenation
• It is required to include the following
#include <string.h>
21 July 2015
Programming and Data Structure
42
strcpy()
• Works very much like a string assignment
operator.
strcpy (string1, string2);
– Assigns the contents of string2 to string1.
• Examples:
strcpy (city, “Calcutta”);
strcpy (city, mycity);
• Warning:
– Assignment operator does not work for
strings.
city = “Calcutta”;  INVALID
21 July 2015
Programming and Data Structure
43
strlen()
• Counts and returns the number of
characters in a string.
len = strlen (string); /* Returns an integer
*/
–The null character (‘\0’) at the end is not
counted.
–Counting ends at the first null character.
21 July 2015
Programming and Data Structure
44
char city[15];
int n;
:
:
strcpy (city, “Calcutta”);
n = strlen (city);
n is assigned 8
21 July 2015
Programming and Data Structure
45
Writing String length….
int strlen(char str[]){
int len = 0;
while (str[len] != ‘\0’)
len++;
can pass an
array or pointer
Check for
terminator
return (len);
}
Cox
Arrays and Pointers
46
strcmp()
• Compares two character strings.
int strcmp (string1, string2);
– Compares the two strings and returns 0 if they
are identical; non-zero otherwise.
• Examples:
if (strcmp (city, “Delhi”) = = 0)
{ ……. }
if (strcmp (city1, city2) ! = 0)
{ ……. }
21 July 2015
Programming and Data Structure
47
strcat()
• Joins or concatenates two strings together.
strcat (string1, string2);
– string2 is appended to the end of string1.
– The null character at the end of string1 is removed, and
string2 is joined at that point.
• Example:
strcpy (name1, “Amit “);
strcpy (name2, “ Roy“);
strcat (name1, name2);
21 July 2015
A m i t
‘\0’
R o y ‘\0’
Am i t
Programming and Data Structure
R o y ‘\0’
48
Example
/* Read a line of text and count the number of uppercase letters */
#include <stdio.h>
Include header for string processing
#include <string.h>
main()
{
Character Array for String
char line[81];
int i, n, count=0;
printf(“Input the line \n”);
scanf (“%[^\n]”, line);
Reading a line of text
n = strlen (line);
for (i=0; i<n; i++)
{
Computing string length
if (isupper (line[i]))
count++;
Checking whether a character is Uppercase
}
printf (“\n The number of uppercase letters in string %s is %d”,
line, count);
}
21 July 2015
Programming and Data Structure
49
Introducing Searching
Spring 2013
Programming and Data Structure
50
Searching
• Check if a given element (key) occurs in the
array.
• Two methods to be discussed:
– If the array elements are unsorted.
• Linear search
– If the array elements are sorted.
• Binary search
Spring 2012
Programming and Data Structure
51
Linear Search
• Basic idea:
– Start at the beginning of the array.
– Inspect every element to see if it matches the key.
• Time complexity:
– A measure of how long an algorithm takes to run.
– If there are n elements in the array:
• Best case:
match found in first element (1 search operation)
• Worst case:
no match found, or match found in the last element (n search operations)
• Average:
(n + 1) / 2 search operations
Spring 2012
Programming and Data Structure
52
Contd.
/* If key appears in a[0..size-1], return its location, pos, s.t. a[pos]
== key. If key is not found, return -1 */
int linear_search (int a[], int size, int key)
{
int pos = 0;
while ((pos < size) && (a[pos] != key))
pos++;
if (pos<n)
return pos; /* Return the position of match */
return -1;
/* No match found */
}
Spring 2012
Programming and Data Structure
53
Contd.
int x[ ]= {12, -3, 78, 67, 6, 50, 19, 10} ;
• Trace the following calls :
search (x, 8, 6) ;
search (x, 8, 5) ;
Returns 4
Returns -1
Spring 2012
Programming and Data Structure
54