2016-11-14 5 views
0

Я пытаюсь создать программу с массивом максимум 63 мест. Пользователь указывает фактические активные места массива, все из которых имеют начальное значение 0.Вложенные улучшения цикла

Я хочу: Сканировать через активные места массива и в местах, расположенных по адресу: 0 + 4 * n и 3 + 4 * n (где n = 0,1,2,3,4, ((всего 5)/4) проверьте, равно ли значение 0, и если да, сделайте это 1. Для последних 5 активных мест массива которые не были включены в предыдущий поиск, я просто проверю первое и последнее из пяти мест массива. Если значение равно 0, сделайте это 1. Во всех случаях я хочу изменить только только одно значение at Если нуль найдено, то укажите значение 1, а затем остановите. Если значения, указанные выше, не равны 0 -> имеют сообщение об ошибке.

Моя проблема заключается в последней части с сообщением об ошибке, который начинает работать, когда другие, если заявления активировать ..

#include <stdio.h> 
int main(void) 
{ 
    int array[63]; 
    int i,n,total; 
    char selection; 

    for (i=0; i<63; i++) 
     array[i] = 0; 
    printf("Enter active array places (maximum 63):"); 
    scanf(" %d",&total); 

    do{ 
     printf("0.Exit \n"); 
     printf("1.List array \n"); 
     printf("2.Change value of array: \n"); 
     scanf(" %c",&selection); 

     if (selection=='1') 
      { 
       for (i=0; i<total; i++) 
        printf("%d \n", array[i]); 
      } 

     else if (selection=='2') 
      { 
       for (i=0; i<(total); i++) 
        { 
        if ((i%4==0) && i<(total-5)&&(array[i]==0)) 
            { 
             array[i]=1; 
             printf("You changed array value in place %d, ",i); 

             break; 
            } 


           else if ((i%4==3)&&i<(total-5)&&(array[i]==0)) 
            { 
             array[i]=1; 
             printf("You changed array value in place %d, ",i); 

             break; 
            } 
           else if (i==(total-5)&&(array[i]==0)) 
            { 
             array[i]=1; 
             fprintf("You changed array value in place %d, ",i); 
             i=n=total+1; 
             break; 
            } 
           else if (i==(total-1)&&(array[i]==0)) 
            { 
             array[i]=1; 
             printf("You changed array value in place %d, ",i); 
             i=n=total+1; 
             break; 
            } 
           else 
            printf("Nothing to change"); 

          } 
        } 
      } 
    } while (selection!='0'); 
} 
+0

Вам не нужны вложенные петли. Просто убедитесь, что 'i% 4 == 0 || i% 4 == 3' – Barmar

+0

Спасибо! Я улучшил свой код с вашим предложением, как видно выше. Однако основная проблема, которая является последним else, остается. Я думаю, что я близок к проблеме. – baskon1

ответ

0

Ваш код является немного более сложным, чем потребность (см комментарий от @Barmar).

Однако, если мы используем ваш код так, как он есть в настоящее время, один из способов обработки сообщения об ошибке - вывести печать из цикла и использовать переменную, чтобы запомнить, было ли что-то изменено.

Что-то вроде:

int item_changed = 0; // In the start of the code before the for-loop 

и

if ((i%4==0) && i<(total-5)&&(array[i]==0)) 
{ 
    array[i]=1; 
    printf("You changed array value in place %d, ",i); 
    item_changed = 1; // Add this in all 4 places where you change the array 
    break; 
} 

Удалить эту часть

else 
    printf("Nothing to change"); 

и поставить это после для петли.

if (item_changed == 0) 
    printf("Nothing to change"); 
+0

Спасибо вам обоим. Это сработало. Я должен был внести небольшую небольшую корректировку в ваше решение. Только в начале цикла for я добавил item_changed = 0; так что переменная item_changed сбрасывается до 0 при каждом запуске цикла for! – baskon1

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