pseudocode a way to make programming easier start with a verbal description of what the program is...

34
Pseudocode A way to make programming easier Start with a verbal description of what the program is supposed to do! Slowly transform it into C, defining variables as you go

Upload: jesse-leas

Post on 14-Dec-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

Pseudocode

A way to make programming easier

Start with a verbal description of what the program is supposed to do!

Slowly transform it into C, defining variables as you go

Exercise - example

Write a program that gets a string from the user and checks whether or not it is a palindrome

Example for a palindrome: abbcbba

(Hint: use strlen…)

Exercise – solution step 1

Read a string from the user If it is a palindrome, print so End the program

… and in C/* This program checks whether a given string is a palindrome*/#include <stdio.h>#include <string.h>

int main(void){ char str[101];

printf("Enter a string\n"); scanf("%100s",str); if (isPalindrome(str) == 1) printf("The string is a palindrome!\n"); else

printf(“The string is NOT a palindrome!\n”);

return 0;}

Exercise – solution step 2 Implementing the function… Ask myself – how do I know abbcbba,

for example, is a palindrome? One way – when I read the letters

from left to right, it’s the same as when I read from right to left

A possible solution: copy first string in reverse, and compare to the original

… and in Cint isPalindrome(char str[]) { char reverse[101];

COPY str IN REVERSE TO reverse if str AND reverse ARE IDENTICAL

return 1; else return 0;}

How to copy a string in reverse?

Start at the end and work your way backwards

What variables would we need? One for the next place to copy to One for the next place to copy from

… and in Cint isPalindrome(char str[]) { char reverse[101];

int from, to;

to = 0; for (from = END OF str; from>=0; from--) { reverse[to] = str[from];

to++; }

… and in Cint isPalindrome(char str[]) { char reverse[101];

int from, to;

to = 0; for (from = strlen(str); from>=0; from--) { reverse[to] = str[from];

to++; }

… and in Cint isPalindrome(char str[]) { char reverse[101];

int from, to;

to = 0; for (from = strlen(str)-1; from>=0; from--) { reverse[to] = str[from];

to++; }

… and in Cint isPalindrome(char str[]) { char reverse[101];

int from, to;

to = 0; for (from = strlen(str)-1; from>=0; from--) { reverse[to] = str[from];

to++; }

reverse[to] = ‘\0’;…

Continuing the function …

if str AND reverse ARE IDENTICAL return 1;

else return 0;}

Continuing the function …

if (strcmp(str, reverse) == 0)

return 1;

else

return 0;

}

Great!

But what if we want to not use a second array? Can we ‘read’ from the start and from

the end at the same time? And what if we want to ignore non-

letters and letter-case? For example – Madam, I’m Adam

should would be a palindrome

Solution

palindrome.c advanced_pal.c

Exercise

Implement the function void my_strcat(char s1[], char

s2[]); Takes two strings, and copies s2 at

the end of s1 Write a program that takes two

strings from the user and prints their concatenation

Solution

strcat.c

String in string

Write a function that takes two strings, str1 and str2, and returns the index of the first time str2 occurs in str1, or -1 if that doesn’t happen For str1 = “abcde”, str2 = “bc”, return

1 For str1 = “abbcc”, str2 = “rg”, return -

1

Solution – step 1

Ask yourself – how do you know where str2 occurs in str1?

For example – str1 = “abbccba”, str2 = “bc” How do you know you shouldn’t return 0? How do you know you shouldn’t return 1? How do you know you should return 2?

Solution – pseudocode 1

int strstr(char str1[], char str2[]) {for each location in str1

if str2 occurs in str1 starting in that location

return that location

if we didn’t find str1 anywherereturn -1;

Solution – pseudocode 2

int strstr(char str1[], char str2[]) {int i;for (i=0; i<strlen(str1); i++) {

if str2 occurs in str1 starting in ireturn i;

}if we didn’t find str1 anywhere

return -1;

Solution – pseudocode 3

int strstr(char str1[], char str2[]) {int i;for (i=0; i<strlen(str1); i++) {

if (occursAtI(str1, str2, i)==1)return i;

}if we didn’t find str1 anywhere

return -1;

Solution – pseudocode 4

int strstr(char str1[], char str2[]) {int i;for (i=0; i<strlen(str1); i++) {

if (occursAtI(str1, str2, i)==1)return i;

}

return -1;

Solution – pseudocode 4

int occurs(char str1[], char str2[], int index) {run over str2if for every letter there’s a corresponding letter in str1, starting at index, return 1;otherwise return 0;

}

Solution – pseudocode 5int occurs(char str1[], char str2[], int index) {

run over str2for each letter

if there’s no corresponding letter in str1, starting at index

return 0;

if we found corresponding letters for ALL letters in str2

return 1;}

Solution – pseudocode 6int occurs(char str1[], char str2[], int index) {

int i;for (i=0; i<strlen(str2); i++) {

if there’s no corresponding letter in str1, starting at index

return 0;}if we found corresponding letters for ALL letters in str2

return 1;}

Solution – pseudocode 7int occurs(char str1[], char str2[], int index) {

int i;for (i=0; i<strlen(str2); i++) {

if (str1[index+i] != str2[i])return 0;

}if we found corresponding letters for ALL letters in str2

return 1;}

Solution – pseudocode 8

int occurs(char str1[], char str2[], int index) {int i;for (i=0; i<strlen(str2); i++) {

if (str1[index+i] != str2[i])return 0;

}

return 1;}

Another exercise Implement the following function:

Input – str1, str2, integer n Output – 1 if str1 is at most n letters

away from str2, 0 otherwise isSimilar(“watar”, “woter”, 2) == 1 isSimilar(“watar”, “woter”, 1) == 0 If the strings are a different length

return 0

solution

is_similar.c

Could it be another one? :O Implement the following function –

int isInArray(int[] arr, int len, int val) Should return 1 if arr contains val, 0 otherwise

Implement the following function –int differentNums(int[] arr, int len)

Should return how many distinct numbers are in arr – {1, 2, 4, 1, 5, 1} -> 4

Write a program that takes in numbers from the user and returns how many distinct ones there were

solution

different_nums.c

Last one Implement the following function –

Input – two strings str1, str2 Output – pointer to the first instance in str1

of any of the characters contained in Hint - use strchr!

Write a program that accepts a string from the user and replaces all punctuation signs (,.;:!?) with spaces

solution

strcspn.c