Я прошу помощи для следующей программы, с которой я боролся несколько часов сегодня днем.
Я хотел бы создать функцию, которая получает массив символов (который принадлежит алфавитуA = {a,b,c}
) и его dim и return 1, если символ принадлежит языку L, или 0, если нет.
Язык был: a^k b^n c^m
, такой что k,m>=0
и n>0
.
Я очень старался, и я собираюсь опубликовать то, что я достиг, но мой метод кажется очень длинным (помимо отсутствия работы)
И я хотел бы знать, как я мог думатьс точки зрения улучшения моего кода.
#include <stdio.h>
int array(char v[], int dim) {
int i, j, k, trovato = 1;
if (v[0] == 'c') trovato = 0;
if (v[0] == 'a') {
for (i = 1; i < dim; i++) {
while (trovato == 1) {
if (v[i] == 'c')
trovato = 0;
else if (v[i] == 'b') {
trovato = 1;
for (j = i + 1; j < dim; j++) {
while (trovato == 1) {
if (v[j] == 'a') trovato = 0;
if (v[j] == 'b')
trovato = 1;
else if (v[j] == 'c') {
trovato = 1;
for (k = j + 1; k < dim; k++) {
while (trovato == 1) {
if (v[k] == 'c')
trovato = 1;
else
trovato = 0;
}
}
}
}
}
}
}
}
}
if (v[0] == 'b') {
for (i = 1; i < dim; i++) {
while (trovato == 1) {
if (v[i] == 'a') trovato = 0;
if (v[i] == 'b')
trovato = 1;
else if (v[i] == 'c') {
trovato = 1;
for (j = i; j < dim; j++) {
while (trovato == 1) {
if (v[j] != 'c')
trovato = 0;
else
trovato = 1;
}
}
}
}
}
}
return trovato;
}
int main() {
char d;
int DIM, i = 0, k;
scanf("%d", &DIM);
char r[DIM];
scanf("%c", &d);
d = getchar();
while (d != '\n') {
r[i] = d;
i++;
scanf("%c", &d);
d = getchar();
}
k = array(r, DIM);
printf("%d\n", k);
return 0;
}
Чего я действительно не понимаю, так это того, почему ввод продолжается, как если бы он был в цикле while.
Я думаю, чтопроблема в моем понимании getchar
и scanf
на символе, поэтому эти строки для примеров:
scanf("%c",&d);
d=getchar();
А как массив векторов должен быть инициализирован?
Что ядействительно обеспокоен эффективностью, я боюсь не улучшать так быстро и правильно, чтоВот почему я спрашиваю даже строгих, но конструктивных критиков в отношении моей работы, которую я пытался выполнить.