我正在尝试弄清楚如何首先修改我的QuickSort程序以使用指针算术,然后将我的Bubblesort程序更改为使用指针的递归程序,并最终将这两个程序实现为计算器(CALC.C)程序。我将按照提及的顺序发布我的代码。
QuickSort:
#include <stdio.h>
#define N 10
void quicksort(int a[], int low, int high);
int split(int a[], int low, int high);
int main(void)
{
int a[N], i;
printf("Enter %d numbers to be sorted: ", N);
for (i = 0; i < N; i++)
scanf("%d", &a[i]);
quicksort(a, 0, N - 1);
// bubblesort(a, 0, N-1);
printf("In sorted order: ");
for (i = 0; i < N; i++)
printf("%d ", a[i]);
printf("n");
return 0;
}
void quicksort(int a[], int low, int high)
{
int middle;
if (low >= high) return;
middle = split(a, low, high);
quicksort(a, low, middle - 1);
quicksort(a, middle + 1, high);
}
int split(int a[], int low, int high)
{
int part_element = a[low];
for (;;) {
while (low < high && part_element <= a[high])
high--;
if (low >= high) break;
a[low++] = a[high];
while (low < high && a[low] <= part_element)
low++;
if (low >= high) break;
a[high--] = a[low];
}
a[high] = part_element;
return high;
}
bubblesort:
void bubblesort(int a[], int low, int high)
{
int i, j, temp;
for (j = high; j > low; j--) {
for (i = low+1; i <= j;i++) {
if (a[i] < a[i-1]) {
temp=a[i];a[i]=a[i-1];a[i-1]=temp;
}
}
}
}
calc.c:
/** To compile this code, use **
* gcc -o calc calc.c -std=c99 -lm **/
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <stdbool.h>
#define KEY "Enter the calculator operation you want to do: "
#define enter_option() printf("%s", KEY)
#define SCREEN_HEIGHT 15
#define clear_screen()
for ( int i = 0; i < SCREEN_HEIGHT; i++ ) printf("n");
#define clean_input() while ((getchar())!='n') continue;
#define calculator_operations() printf("n");
printf("******** Welcome to C calculator ***********n");
printf("**-----------------------------------------------**n");
printf("** Press 'Q' or 'q' to quit the program **n");
printf("** Press 'H' or 'h' to display below options **n");
printf("** Press 'C' or 'c' to clear the screen **n");
printf("**-----------------------------------------------**n");
printf("** Enter 'A' or 'a' for arithmetic mode **n");
printf("** Enter 'F' or 'f' for function mode **n");
printf("** Enter 'S' or 's' for sorting mode **n");
printf("***************************************************n");
printf("n");
#define DISP(f,x) printf(#f"(%g) = %gn",x,f(x));
#define DISP_I(f,x) printf(#f"(%d) = %dn",(int) x,(int) f((int) x));
// Function prototype declaration
void arith_mode();
void func_mode();
void sort_mode();
void read_line(char *);
int factorial(int );
// Start of Main Program
int main()
{
int X=1;
char Calc_Mode;
do
{
calculator_operations();
enter_option();
Calc_Mode=getchar();
switch(Calc_Mode)
{
case 'A': case 'a': arith_mode(); break;
case 'F': case 'f': func_mode(); break;
case 'S': case 's': sort_mode(); break;
// Can you integrate the quick sort program into our calculator?
case 'H': case 'h': case 'n': break;
case 'Q': case 'q': printf("Leaving Calculator!n");
exit(0);
case 'C': case 'c': clear_screen();
clean_input(); break;
}
} while (X);
}
//Function Definitions
void arith_mode()
{
double value, operand;
char operator;
printf("nPlease enter arithmetic expression "
"as in "x +-*/%%^ y +-*/%%^ z ..." n");
printf("Your expression is: ");
/* Read first operand */
scanf("%lf", &value);
/* Read successive operators and operands */
while ((operator = getchar()) != 'n') {
if (operator == ' ') continue;
scanf("%lf", &operand);
switch (operator) {
case '+': value += operand; break;
case '-': value -= operand; break;
case '*': value *= operand; break;
case '/': value /= operand; break;
case '%': value = ((int) value)%((int) operand); break;
case '^': value = pow(value,operand); break;
default: printf("n Invalid Operator! n"); exit(0);
}
}
/* Print result */
printf("Value of expression: %gnn", value);
}
void func_mode()
{
char *cp, func_initial, line[40];
double variable;
printf("nPlease enter functions as in "
""name(x)". n");
printf("Your function is: ");
clean_input();
read_line(line);
func_initial = line[0];
for (cp = line; *cp; cp++) {
if (*cp == '(') {
sscanf(++cp,"%lf", &variable);
switch (func_initial) {
case 'F': case 'f': DISP_I(factorial,variable); break;
case 'E': case 'e': DISP(exp,variable); break;
case 'S': case 's': DISP(sqrt,variable); break;
default: printf("n Invalid Function! n"); exit(0);
}
break;
}
}
}
void sort_mode()
{
clean_input();
printf("nComing Attraction!!!n");
printf("We'll integrate the quicksort program into our calculator!!!nn");
}
void read_line(char *line)
{
int index; char ch;
index = 0;
while ((ch= getchar()) !='n') {
if (ch == ' ') continue;
line[index++] = ch;
}
line[index] = ' ';
}
int factorial(int n)
{
if(n<=1) return 1;
else return n*factorial(n-1);
}
基于指针的快速排列者应该看起来像这样:
void quicksort(int * low, int * high)
{
int * middle = low + ((high-low)/2);
/* ... */