thakurcoder Ответов: 2

Программу на C, чтобы проверить, если есть подмассив сумма равна нулю или не


я сделал программу на языке Си чтобы проверить есть ли суб массив с суммой ноль или нет
ограничение здесь заключается в том что я должен сделать эту проблему используя только цикл это моя программа которую я пробовал
я новичок в программировании

Что я уже пробовал:

#include<stdio.h>
#include<stdlib.h>
int checksum(int* a,int size);
int main()
{
int size,i,flag=0;
printf("enter the size of array");
scanf("%d",&size);
int* a=(int*)malloc(size*sizeof(int));
for(i=0;i<size;i++)
scanf("%d",&a[i]);
printf("the entered array is\n ");
for(i=0;i<size;i++)
printf("%d\n",*(a+i));
flag=checksum(a,size);

if(flag==1)
printf("subarray with sum 0 is present");
else
    printf("subarray with sum zero not present");


}

это моя функция для проверки суммы
int checksum(int* a,int size)

{  int i,k,sum=0,flag;


   for(i=0;i<size;i++){
        sum=a[i];
    for(k=0;k<size;k++)
    {

       sum=sum+a[k];
   if(sum==0){
    flag=1;
    break;}



    }
   


   }

return flag;

}

я получаю правильный вывод bt я не удовлетворен своей программой может ли кто нибудь помочь мне исправить эту программу
Примечание-используйте только цикл,использование указателей,по крайней мере одну функцию, отличную от main

2 Ответов

Рейтинг:
13

OriginalGriff

Итак, теперь вы написали некоторый код - или, по крайней мере, собрали его вместе. Начните с рефакторинга кода, чтобы он был с отступами и читался: используйте осмысленные имена вместо самых коротких, которые вам могут сойти с рук, и выберите стиль брекетинга и будьте последовательны. Не имеет значения, используете ли вы K&R, Whitesmiths или даже отвратительный 1TB, последовательный отступ делает ваш код намного более читабельным!

int checksum(int* a,int size)
    {
    int i,k,sum=0,flag;
    for(i=0;i<size;i++)
        {
        sum=a[i];
        for(k=0;k<size;k++)
            {
            sum=sum+a[k];
            if(sum==0)
                {
                flag=1;
                break;
                }
            }
        }
    return flag;
    }
Теперь вы можете сразу увидеть, каким будет поток управления через вашу функцию.

Теперь пришло время перейти к следующему шагу. Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Я не могу точно сказать вам, какие клавиши нажимать, чтобы использовать отладчик - существует столько же различных способов, сколько и компиляторов, - но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.
Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
11

Patrice T

У вашей функции есть проблема, вы не инициализируете ее flag в самом начале.

int i,k,sum=0,flag=0;

что может привести к ложному срабатыванию.

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
int checksum(int* a,int size){
	int i,k,sum=0,flag;
	for(i=0;i<size;i++){
		sum=a[i];
		for(k=0;k<size;k++)
		{
			sum=sum+a[k];
			if(sum==0){
				flag=1;
				break;
			}
		}
	}
	return flag;
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

[Обновление]
Кстати, при втором чтении код вашей функции выглядит странно, проверьте, что это за ваша функция. sum.


[no name]

Хороший улов.