2014-12-11 2 views
0

У меня вопрос о домашнем задании. Я так близок к полной программе. У меня проблемы с чем-то. Это вопрос:Перемещающийся элемент массива один за другим

написать программу C, которая генерирует и выводит массив символов размера 10, состоящего из случайных английских букв нижнего регистра. Затем программа запрашивает у пользователя, сколько раз массив будет сдвинут вправо и отобразит смещенный справа массив на каждом шаге правого смещения. Образец вывод выполнения программы приведен ниже. (Подсказка: используйте коды ASCII английских строчных букв , которые составляют 97, 98, ... 122 для a, b, ..., z, соответственно, для генерации массива символов).

Это мой код:

#include <time.h> 
#include <stdio.h> 
#include <stdlib.h> 

void print_string (char *string){ 
int i; 
for (i=0 ; i < 10 ; i ++){ 
    printf("%c ", string[i]); 
    if (i == 9) 
    printf("\n"); 
    } 

} 
void random_string(char *string, unsigned length) 
{ 
    /* Seed number for rand() */ 
    srand((unsigned int) time(0) + getpid()); 

    /* ASCII characters 97 to 122 */ 
    int i; 
    for (i = 0; i < length; ++i) 
    { 
     string[i] = (rand() % 26)+ 97; 
    } 

    string[i] = '\0'; 
} 

void reverse_string(char* str, int left, int right) { 
    char* p1 = str + left; 
    char* p2 = str + right; 
    while (p1 < p2) { 
    char temp = *p1; 
    *p1 = *p2; 
    *p2 = temp; 
    p1++; 
    p2--; 

    } 
} 

void rotate(char* str, int k, int n) { 

    reverse_string(str, 0, n-1); 
    reverse_string(str, 0, k-1); 
    reverse_string(str, k, n-1); 

} 

int main(void) 
{ 
    char s[11]; 
    int i,shiftNum; 

    random_string(s, 11); 
    printf("Randomly constructed array is :\n"); 

    print_string(s); 

    printf("Enter how many times array will be shifted: "); 
    scanf("%d",&shiftNum); 

    rotate(s,shiftNum,11); 
    print_string(s); 

} 

Что случилось с этим кодом? Когда я выполняю его с 1, я не мог правильно получить первое обратное, и я хочу отобразить все шаги переключения.

+1

У вас есть неопределенное поведение, поскольку вы устанавливаете '\ 0' в' s [11] ', что является недопустимым местоположением.Кроме того, 'print_string()' не печатает первый символ 's' –

+0

да, вы правы, я пытался что-то забыть, изменив его, прежде чем спрашивать его здесь, спасибо u – tackleberry

+0

Nit pick:« Английские строчные буквы »- это те, которые используются в английской системе письма, которая включает в себя акценты, лигатуры и т. д. Вы могли бы называть «a» .. «z» строчными буквами с английского алфавита или, в других терминах CS, [Basic Latin] (http: //www.unicode.org/charts/nameslist/index.html) небольшие буквы. –

ответ

1

Для начала это ужасно, что ваш лектор/профессор говорит вам использовать 97..122. C не требует, чтобы ASCII был набором символов в каждой системе, поэтому этот код полностью не переносимый, но если вы посмотрите на историю до Unix, то C должен быть переносным языком программирования. Если вы хотите, чтобы написать это переносимым способом, вам нужно хранить символы в массиве и выбрать из этого массива:

char lowercase[] = "abcdefghijklmnopqrstuvwxyz"; 
string[i] = lowercase[rand() % (sizeof lowercase - 1)]; 

Теперь, когда мы рассмотрели, что педантичный деталь, Cool Guy indicated in a comment что эта линия кода является ошибочным: string[i] = '\0';. Он прав.


Это также должно выполняться в main, а не в random_string: srand((unsigned int) time(0) + getpid());. Причина в том, что вызов random_string несколько раз за ту же секунду приведет к той же «случайной строке», которая очень неровная.


scanf("%d",&shiftNum); не может гарантировать успех (что пользователь будет вводить числовые данные), и поэтому не может гарантировать, что shiftNum будет содержать значение вменяемого. Вам нужно проверить возвращаемое значение. Например:

if (scanf("%d", &shiftNum) != 1) { 
    puts("Invalid shift count!\n"); 
    exit(0); 
} 

Вы, вероятно, следует также рассмотреть возможность использования без знака типа для shiftNum (и это вызовет соответствующий формат спецификации %d, чтобы изменить что-то другое, например, %u для unsigned int). более


Одной из важных задач, прежде чем я закончу эту задачу: Вам нужно изменить rotate обрабатывать ввод-правильно, так как некоторые пользователи могут хотеть, чтобы повернуть/сдвиг 0 раз (в качестве альтернативы не вращаются/переключением вообще). Я уверен, что для вас это будет легкой задачей.

Смежные вопросы