Тема: Сортування масиву із покажчиками на рядкові константи
Вітаю форумчани.
Я майже доробив програмку, яка б виконувала поставлене завдання, ось вона:
/*
* File: main.cpp
* Author: YaR
*
* Created on November 19, 2013, 12:04 PM
*/
#include <cstdlib>
#include <iostream>
#include <cstring>
#define MAXLINES 50
using namespace std;
/*
*
*/
char *wArrayPtr[MAXLINES]; // Масив покажчиків на рядкові константи
void arrayFill(char *array_ptr, int size); // заповнення масиву
int arraySort(char *array_ptr, int size); // перетворення рядку на масив векторів
void my_qsort(void *v[], int left, int right,
int(*comp)(void *, void *)); // сортування масиву покажчиків
int strcmp_t(char *s1, char *s2); // алфавітне порівняння двох рядкових констант
void swap(void *v[], int i, int j); // зміна двох елементів масиву місцями
int main(int argc, char** argv) {
int count;
char nameOfStates[1000];
arrayFill(nameOfStates, sizeof(nameOfStates));
cout << "Array was filled by this text:\n" << nameOfStates << '\n';
count = arraySort(nameOfStates, sizeof(nameOfStates));
cout << "Main function:\n";
cout << wArrayPtr[0] << "\n";
cout << wArrayPtr[1] << "\n";
return 0;
}
void arrayFill(char *array_ptr, int size){
int i = 0;
char statesNames[] = "Virginia\n"
"Texas\n"
"Oregon\n"
"Alabama\n"
"Dakota\n"
"California\n"
"Utah\n"
"Florida\n"
"Georgia\n"
"Pennsylvania\n"
"New Mexico\n"
"Nevada\n"
"Montana\n"
"\0" ;
// Заповнення масиву
while(i < size && statesNames[i] != '\0'){
*array_ptr = statesNames[i++];
array_ptr++;
}
// Видалення незакінченого слова
if(*array_ptr != '\0'){
while(*array_ptr != '\n' && i!=0){
array_ptr--;
i--;
}
}
// Додавання нуль-символу в кінець рядку
if(*array_ptr == '\n'){
array_ptr++;
}
*array_ptr = '\0';
}
int arraySort(char *array_ptr, int size){
int i, j, k; // i - загальний лічильник для проходження по масиву
// j - номер слова із яким ми працюємо
// k - індекс для другого виміру масиву
int count=0; // count - кількість слів в рядку
// Розрахунок кількості слів
i = 0;
while(*(array_ptr+i) != '\0'){
if(*(array_ptr+i) == '\n'){
count++;
}
i++;
}
cout << "Number of words in array: " << count << "\n";
char wordArray[count][30]; // Ініціалізація масиву векторів
// Встановлення покажчиків на рядкові константи
i = 0;
j = 0;
k = 0;
while(*(array_ptr+i) != '\0'){
if(*(array_ptr+i) != '\n'){
wordArray[j][k] = *(array_ptr+i); // Запис слова в векторний масив
k++;
} else {
wordArray[j][k] = '\0'; // Заміна переносу каретки на нуль-символ
wArrayPtr[j] = wordArray[j];
j++; // Новий вектор
k=0;
}
i++;
}
// Сортування масиву
my_qsort((void **) wArrayPtr, 0, count-1, (int (*)(void*, void*)) (strcmp_t));
cout << "Array_sort function:\n";
cout << wArrayPtr[0] << "\n";
cout << wArrayPtr[1] << "\n";
return count;
}
void my_qsort(void *v[], int left, int right, int(*comp)(void *, void *)){
int i, last;
void swap(void *v[], int i, int j);
if (left >= right) /* do nothing if array contains */
return; /* fewer than two elements */
swap(v, left, (left + right)/2);
last = left;
for (i = left+1; i <= right; i++)
if ((*comp)(v[i], v[left]) < 0)
swap(v, ++last, i);
swap(v, left, last);
my_qsort(v, left, last-1, comp);
my_qsort(v, last+1, right, comp);
}
int strcmp_t(char *s1, char *s2){
for( ; *s1 == *s2; s1++, s2++)
if(*s1 == '\0')
return 0;
return *s1 - *s2;
}
void swap(void *v[], int i, int j){
void *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
Вивід програми такий:
Array was filled by this text:
Virginia
Texas
Oregon
Alabama
Dakota
California
Utah
Florida
Georgia
Pennsylvania
New Mexico
Nevada
MontanaNumber of words in array: 13
Array_sort function:
Alabama
California
Main function:
;RUN SUCCESSFUL (total time: 103ms)
Я не розумію, чому в main() відбувається інший вивід, поясніть будь ласка.