מבוא לתכנות ולמדעי המחשב בשפת C/תרגיל 4: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
שורה 142:
'''בהצלחה!'''
</center>
 
== פתרון ==
 
=== q1.c ===
<syntaxhighlight>
#include <stdio.h>
#include <math.h>
 
int aRec(int i) {
if(i==1)
return 1;
return aRec(i-1)*3+1;
}
 
int aLoop(int i) {
int j;
int ret = 1;
for(j=1; j<i; ++j)
ret = 3*ret+1;
return ret;
}
 
int aFormula(int i) {
return (int) (pow(3,i)-1)/2;
}
 
int main() {
int i,min=1,max=15;
 
while(1) {
printf("Index: ");
scanf("%d",&i);
if(i>=min && i<=max)
break;
printf("Index must in [%d..%d], please try again.\n",min,max);
}
 
printf("aRec(%d) = %d\n",i,aRec(i));
printf("aLoop(%d) = %d\n",i,aLoop(i));
printf("aFormula(%d) = %d\n",i,aFormula(i));
return 0;
}
 
</syntaxhighlight>
 
=== q2.c ===
<syntaxhighlight>
#include <stdio.h>
 
void hanoi(int n, char from, char by, char to) {
if(n < 1)
return;
hanoi(n-1,from,by,to);
printf("Move from %c to %c\n",from,by);
hanoi(n-1,to,by,from);
printf("Move from %c to %c\n",by,to);
hanoi(n-1,from,by,to);
}
 
 
void hanoiMain(int n) {
hanoi(n,'A','B','C');
}
 
int getN() {
int n;
while(1) {
printf("Please enter number of rings: ");
scanf("%d",&n);
if(n>0 && n <=10)
return n;
printf("%d is out of range, please try again.\n",n);
}
}
 
int main() {
 
int n = getN();
hanoiMain(n);
 
return 0;
}
 
</syntaxhighlight>
 
=== q3.c ===
<syntaxhighlight>
#include <stdio.h>
 
int n;
int max = 100;
int array[100];
int count;
 
void init() {
int i;
for(i=0; i<n; ++i)
array[i] = i+1;
}
 
void printArray() {
int i;
for(i=0; i<n; ++i)
printf("%d, ",array[i]);
printf("\n");
}
 
void swap(int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
 
}
 
void permutations(int i) {
// function should leave the array exactly as it recieved it.
 
if(i == n-1) {
++count;
printArray();
return;
}
int j;
for(j=i; j<n; ++j) {
swap(i,j);
permutations(i+1);
swap(i,j);
}
}
 
void permutationsMain() {
count = 0;
permutations(0);
printf("\nTotal number of permutations: %d\n\n",count);
}
 
void getN() {
while(1) {
printf("n: ");
scanf("%d",&n);
if(n >= 1 || n < max)
return;
printf("n should be in [1..%d]\n",max-1);
}
}
 
int main() {
getN();
init();
permutationsMain();
return 0;
}
 
</syntaxhighlight>
 
=== q4.c ===
<syntaxhighlight>
#include <stdio.h>
 
int board[8][8];
int counts[8][8];
int count = 0;
 
int gi,gj;
 
int moves[][2] = {{1,2},{-1,2},{1,-2},{-1,-2},
{2,1},{-2,1},{2,-1},{-2,-1}};
 
void initBoard(int size) {
int i,j;
for(i=0; i<size; ++i)
for(j=0; j<size; ++j) {
board[i][j] = 0;
counts[i][j] = 0;
}
}
 
void drawLine(int n,int size) {
int j,k;
for(j=0; j<size; ++j) {
printf("+-");
for(k=0; k<n; ++k)
printf("-");
}
printf("+\n");
}
 
void printBoard(int size) {
int i,j;
printf("\n\nSolution %d:\n\n",count);
drawLine(3,size);
for(i=0; i<size; ++i) {
for(j=0; j<size; ++j)
printf("| %2d ",board[i][j]);
printf("|\n");
drawLine(3,size);
}
}
 
void printCounts(int size) {
int i,j;
printf("\n\nCounts:\n\n");
drawLine(5,size);
for(i=0; i<size; ++i) {
for(j=0; j<size; ++j)
printf("| %4d ",counts[i][j]);
printf("|\n");
drawLine(5,size);
}
}
 
void knight(int n, int i, int j, int size) {
if(i < 0 || i>= size || j < 0 || j >= size|| board[i][j] != 0)
return;
 
board[i][j] = n;
 
if(n == size*size) {
++count;
++ counts[gi][gj];
printBoard(size);
board[i][j] = 0;
return;
}
int k;
for(k=0; k<8; ++k) {
int i1 = i+moves[k][0];
int j1 = j+moves[k][1];
knight(n+1,i1,j1,size);
}
board[i][j] = 0;
 
}
void solveKnight(int size) {
initBoard(size);
for(gi=0; gi<size; ++gi)
for(gj=0; gj<size; ++gj)
knight(1,gi,gj,size);
 
// printCounts(size);
}
 
int main() {
int size;
int min = 3, max = 8;
while(1) {
printf("Size: ");
scanf("%d",&size);
if(size<min || size > max)
printf("Valid range: %d..%d\n",min,max);
else
break;
}
 
solveKnight(size);
return 0;
}
 
</syntaxhighlight>