Member 13127135 Ответов: 2

Программа C подсчитывает количество пиков


12 13 14 15 16
10 50 11 60 10
5  10 12 16 13
20 70 18 80 14
13  5 12 20 11


Вершины:{50,60,70,80}

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

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

int main(int argc, char** argv) {
FILE *pToFile = fopen("C:/Users/Win10User/Desktop/ana.txt","r");

int **A;int i,j; 
while (!feof (pToFile))
{
for(i=1,j=1;i<=3,j<=8;i++,j++);
fscanf (pToFile, "%d", &A[i][j]); 
printf ("%d ",A[i][j]);
if (A[i][j]>A[i-1][j]&& A[i][j]>A[i][j-1] && A[i][j]>A[i-1][j+1] && A[i][j]>A[i-1][j-1] && A[i][j]>A[i+1][j] && A[i][j]>A[i][j+1]&& A[i][j]>A[i+1][j-1] && A[i][j]>A[i+1][j+1]) 
{
printf("%d ",A[i][j]);
}
return (EXIT_SUCCESS);
} 

Richard MacCutchan

Ваш целочисленный указатель A ни на что не указывает. И это утверждение if должно гарантировать вам проблемы.

Member 13127135

Спасибо

2 Ответов

Рейтинг:
18

OriginalGriff

Так... до сих пор вы читали входы и ничего с ними не делали?

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

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!
Однако я дам вам пару подсказок:
1) Подумайте о проблеме: что такое пик? Предположительно, это значение выше, чем все восемь значений вокруг него:

14 15 16
11 60 10
12 16 13
Итак, начните с рассмотрения этого как двумерного массива и выделите A как раз так - в данный момент Вы создаете указатель на указатель на целое число, но никогда не выделяете никакой фактической памяти для хранения значений.
2) Когда вы рассматриваете это как 2D-массив, вы можете написать функцию, которая принимает массив и два индекса : X и Y. она "смотрит" на восемь местоположений вокруг этой точки (обязательно игнорируя индексы вне границ) и возвращает "true" или "false" в зависимости от того, является ли это пик или нет. Тогда все, что вам нужно, - это пара вложенных циклов и оператор "if"...

Попробуйте-это совсем не сложно!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


Рейтинг:
1

Patrice T

Вы должны использовать отладчик, чтобы увидеть, что делает ваш код.

for(i=1,j=1;i<=3,j<=8;i++,j++)

Цикл с двойным счетчиком не существует, я думаю, вы хотели сделать вложенные циклы.
Учебник По Программированию На Языке Си-39: Вложенные Циклы-YouTube[^]

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.