HI1024 Programmering, grundkurs TEN2 2016-10-28 KTH STH Flemingsberg 08.00-13.30* (*Uppstart tentamiljö: 08.00-08.30. Tentamen 08.30-13.30) Tilla tna hja lpmedel: Kursboken C PROGRAMMING A Modern Approach K. N. King helt utan anteckningar Alternativt C från början Jan Skansholm givetvis också utan antecknigar. Blanka papper, och penna. 0-7 F, 8 Fx, 9-10 E, 11-12 D, 13-14 C, 15-16 B, 17-19 A Examinator: Nicklas Brandefelt Ra ttande la rare: Nicklas Brandefelt, Anders Cajander Lycka Till! 1. (4p) Enkla luftlindade spolar är en viktig komponent radiosammanhang. Formeln för en sådan spoles induktans kan beräknas med följande formel: Programmet ska också innehålla möjligheten att göra en ny beräkning! Ditt program bör likna följande exempel! Single layer coil inductans calcylator. Enter diameter in mm?10 Enter length in mm?10 Enter number of turns?10 Inductans is 0.69 uh! Another calculation [1=Yes, 0=No]?1 Enter diameter in mm?12 Enter length in mm?12 Enter number of turns?12 Inductans is 1.19 uh! Another calculation [1=Yes, 0=No]?0 SLCIC Done. L = (d 2 n 2 )/(l+0.45d) [uh], där d och l anges i meter. Du ska skriva ett enkelt program som frågar efter spolens diameter i mm, spolens längd i mm samt hur många varv tråd spolen består av. Du ska därefter med hjälp av formeln beräkna spolens induktans. Svaret ska presenteras med 2 decimaler och uttryckt i enheten uh. TIPS: Tänk på att int / int blir en int!
2. (4p) När Morse tänkt ut att bokstäver skulle kunna sändas som korta och långa signaler blev frågan vilken kod varje bokstav skulle få. Det sägs att han då tog en bok ur bokhyllan och noterade hur många gånger varje enskild bokstav fanns på en slumpmässigt vald sida. Han fann att bokstaven e var vanligast följt av t, i, a, n och m. Han gav därför de bokstäverna de kortaste koderna., -,..,.-, -. & --'. Nu är frågan: Hade Samuel Morse rätt? För att undersöka det behövs med fördel en lång text men ditt program nöjer sig med att analysera en lång mening. Med andra ord: Uppgiften är att skapa ett program som läser in en lång mening som ska lagras i en array. Därefter ska programmet gå igenom arrayen och notera förekomsten av varje enskild bokstav i en frekvenstabell. Sist ska programmet skriva ut både frekvenstabellen och vilken bokstav som var vanligast. Skulle flera bokstäver få samma toppnotering räcker det om en av dessa presenteras. En körning bör se ut som följande exempel: (Programmet ska enbart hantera A.. Z.) Text Letter Frequence Analyser. warning: this program uses gets(), which is unsafe. Please enter a short text: SITTING IN AN ENGLISH GARDEN WAITING FOR THE SUN IF THE SUN DONT COME YOU GET A TAN FROM STANDING IN THE ENGLISH RAIN A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 7 0 1 3 8 3 7 5 11 0 0 2 2 15 5 0 0 4 6 10 3 0 1 0 1 0 Most frequent letter is 'N' found 15 times. TLFA - Done. 3. (7p) En otroligt vanlig lagringsstruktur är en så kallad först in först ut kö (Eng: First in first out FIFO queue). Visuellt går det att likna kön med en ring av fack samt två index, kallade skriv och läs som initialt pekar på samma fack i ringen. (Eng: r=read & w=write) När information ska lagras i ringen så placeras informationen i facket som pekas ut av indexet skriv, varpå skriv flyttas fram till nästa fack. På samma sätt hämtas ett lagrat värde via indexet läs som därefter flyttas fram till nästa fack. OBS 1: Nästa fack kan ha indexet 0 om nuvarande fack är det sista i ringen! OBS 2: Det ska inte gå att läsa ett värde om ringen är tom, vilket inträffar när läs och skriv index pekar på samma fack. OBS 3: Det ska inte gå att lagra ett värde om ringen är full, vilket inträffar när skriv index +1 är lika med läs index (givet räknereglerna i OBS 1). Den observante inser då att en ring om n fack med denna metod bara kan lagra n-1 värden, men funktionerna blir mycket enkla med denna lilla eftergift. OBS4: Med andra ord, ringkön är i själva verket en array där vi tänker oss att sista elementet följs av det 0:e elementet! Det hela framgår tydligt av figuren på nästa sida:
a) (1p) Skapa ett program som skapar en egen datatyp Queue som är en post som innehåller: En heltalarray om 4 element, själva kön. Ett heltalsindex för att markera nuvarande skrivindex. Ett heltalsindex för att markera nuvarande läsindex. Programmet ska i detta skede enbart innehålla typdeklarationen samt ett tomt huvudprogram. b) (2p) Lägg till i huvudprogrammet en variabeldeklaration där variabeln är av typen Queue. Skapa därefter en funktion qinit, med lämpliga parametrar, som kan initiera en varaibel av Queue-typ på ett lämpligt sätt. Anropa funktionen från huvudprogrammet! c) (1p) Skapa en funktion qview, med lämpliga parametrar, som kan skriva ut en variabel av Queue-typ på det sättet som framgår av efterföljande exempel. D.v.s [ kö ] { läsindex, skrivindex. Anropa funktionen fån huvudprogrammet. d) (3p) Skapa funktionerna qempty, qfull, qput & qget med lämpliga parametrar samt anropa qput & qget från huvudprogrammet så att det framgår att funktionerna fungerar! Exemplet på nästa sida visar en körning där huvudprogrammet försöker lagra informationen 1,2,3,4 vilket går bra utom i sista fallet då kön är full. Därefter försöker programmet läsa fyra värden, vilket går bra utom i sista fallet då kön är tom. Slutligen upprepas proceduren med talen 2, 4,6,8 för att demonstrera hur indexen räknar runt. (Exempelprogrammets qget returnerar -1 om kön är tom.)
Circular Queue Package Test Program. [ ] {0,0 [ 1 ] {0,1 [ 1 2 ] {0,2 [ 1 2 3 ] {0,3 [ OVERFLOW ] [ 1 2 3 ] {0,3 [1] [ 2 3 ] {1,3 [2] [ 3 ] {2,3 [3] [ ] {3,3 [ UNDERFLOW ] [-1] [ ] {3,3 [ 2 ] {3,0 [ 2 4 ] {3,1 [ 2 4 6 ] {3,2 [ OVERFLOW ] [ 2 4 6 ] {3,2 [2] [ 4 6 ] {0,2 [4] [ 6 ] {1,2 [6] [ ] {2,2 [ UNDERFLOW ] [-1] [ ] {2,2 CQPTP Done. 4) (4p) Skapa ett program som innehåller en 2-dimensionell array 10*10 med elementtypen char, där varje element är initierat till ett + tecken. Tänk er därefter att det engelska alfabetet, bokstäverna A till Z, ska placeras ut i tur och ordning med start i position (0,0). När A :et är utplacerat ska B :et placeras ut slumpmässigt i ett angränsande fält, dock inte diagonalt. I detta fall kan bara positionerna (1,0) eller (0,1) komma på tal, då både positionen ovanför och till vänster är utanför spelplanen. Positioner som redan är upptagna av en bokstav är också uteslutna. Notera att det i sällsynta fall kan bli så att nästa bokstav inte kan placeras ut, vilket programmet ska detektera. Svårigheten i denna uppgift är att på ett slumpmässigt sätt välja nästa position givet banbegränsningar och blockerande bokstäver! Programmet behöver inte använda funktioner. En körning kan se ut på följande sätt
Lösningsförslag uppgift 1: Lösningsförslag uppgift 2:
Lösningsförslag uppgift #3: #include <stdio.h> #define QSIZE 4 typedef struct { int queue[qsize]; int r,w; Queue; void qinit(queue *aqueue){ aqueue->r=0; aqueue->w=0; int qempty(queue aqueue) { return (aqueue.w==aqueue.r); int qfull(queue aqueue) { return (((aqueue.w+1)%qsize)==aqueue.r); void qview(queue aqueue){ printf("[ "); for (int i=aqueue.r; i!=aqueue.w; i=(i+1)%qsize) printf(" %d", aqueue.queue[i]); printf(" ] {%d,%d\n",aqueue.r,aqueue.w); void qput(queue *aqueue, int avalue){ if (!qfull(*aqueue)){ aqueue->queue[aqueue->w]=avalue; aqueue->w=(aqueue->w+1)%qsize; else printf("[ OVERFLOW ]\n"); int qget(queue *aqueue){ int avalue=-1; if (!qempty(*aqueue)){ avalue=aqueue->queue[aqueue->r]; aqueue->r=(aqueue->r+1)%qsize; else printf("[ UNDERFLOW ]\n"); return avalue; int main(void){ Queue myqueue; printf("circular Queue Package Test Program.\n"); qinit(&myqueue); qview(myqueue); for (int j=0; j<2; j++) { for (int i=0; i<qsize; i++){ qput(&myqueue, (i+1)*(j+1)); qview(myqueue); for (int i=0; i<qsize; i++){ printf("[%d] ",qget(&myqueue)); qview(myqueue); printf("cqptp Done.\n");
Lösningsförslag uppgift #4: