Write a C program that detects and reports on areas of brightness in the night s
ID: 3815450 • Letter: W
Question
Write a C program that detects and reports on areas of brightness in the night sky. You
will input a portion of the night sky (from standard input) represented by an n n grid of
integers where n <= 1000. Each value in the grid will indicate the detected brightness of
that portion of the night sky with a 0 value indicating no light. Unfortunately the detection
hardware sometimes reports erroneous values; these values will show up as negative numbers
and must be filtered out prior to finding the bright spots. After preprocessing your data
to filter out all of the noise (more on this below), your program must report the brightest
coordinate and the brightness value for that coordinate in every 5 5 patch of the sky that
contains no zeros. Report (none) if no bright spots exist. Keep in mind that bright areas
may overlap, and that any bright spot should only be reported once. You should also report
bright spots of the 5 5 areas you encounter as you scan the data in a top to bottom, left
to right order.
You should preprocess your data to eliminate noise in following manner: for every negative
value you encounter, average the (maximum of) 8 squares around it and replace the value
with the average (rounded off to the nearest whole number; use nearbyint from math.h).
If one of the surrounding squares also is negative, use the value of 0 in computing the average.
Your input will consist of a single integer s representing the size of the grid followed by ss
data values. Your output should be presented exactly like the sample run.
Data values are:
20
0 0 0 0 0 0 0 13 18 18 15 5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 6 16 19 16 6 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 12 16 18 17 5 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 12 14 12 14 9 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 8 10 4 6 10 0 0 0 0 0 0
0 0 0 0 3 3 5 3 -2 10 12 11 11 6 0 0 0 0 0 0
0 0 0 0 5 6 6 6 5 7 13 14 13 4 0 0 0 0 0 0
0 0 0 0 2 7 8 6 4 8 12 13 11 9 0 0 0 0 0 0
0 0 0 0 2 7 7 7 5 9 4 10 6 4 0 0 0 -2 0 0
0 0 0 0 4 4 3 4 3 6 6 4 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 6 8 8 7 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 5 7 9 8 6 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 5 7 7 8 3 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 3 5 4 4 4 0 0 0 0 0 0 0
0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 -1 -1 -2 8 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 -1 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Output should look like this and execute with a < data.txt and stores the data rather than reading it from a file.
Grid size 20x20 Bright spots: 9,111 14 [10, 6 8 L 8, 9] 10 9,101 13 [10, 111 13 [11,11] 10 C14, 101 9 liberty cprogs/96Explanation / Answer
#include <stdio.h>
#include <math.h>
#define SIZE 500
void preprocess(int brightness[SIZE][SIZE], int n)
{
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
if (brightness[i][j] < 0)
{
double d = 0;
int count = 0;
// coordinate in above row
if (i - 1 >= 0)
{
d += brightness[i-1][j];
count++;
if (j -1 >= 0)
{
d+= brightness[i-1][j-1];
count++;
}
if (j + 1 < n)
{
d+= brightness[i-1][j+1];
count++;
}
}
// row just below
if (i + 1 < n)
{
d += brightness[i+1][j];
count++;
if (j - 1 >= 0)
{
d+= brightness[i+1][j-1];
count++;
}
if (j + 1 < n)
{
d+= brightness[i+1][j+1];
count++;
}
}
// coordinate just left
if (j - 1 >= 0)
{
d += brightness[i][j-1];
count++;
}
// coordinate just right
if (j + 1 < n)
{
d += brightness[i][j+1];
count++;
}
brightness[i][j] = (int)nearbyint(d/count);
}
}
}
}
int findBrightSpotInSmaller(int brightness[SIZE][SIZE], int i, int j, int *coord1, int *coord2)
{
int max = brightness[i][j];
*coord1 = i;
*coord2 = j;
int r, c;
for(r = i; r < i+5; r++)
{
for(c = j; c < j+5; c++)
{
if (brightness[r][c] == 0)
{
return -1;
}
if (brightness[r][c] > max)
{
max = brightness[r][c];
*coord1 = r;
*coord2 = c;
}
}
}
return max;
}
void findBrightSpots(int brightness[SIZE][SIZE], int n)
{
printf("Grid size: %dx%d ", n, n);
printf("Bright spots: ");
int i, j;
int reported[n][n];
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
reported[i][j] = 0;
}
}
for(i = 0; i <= n-5; i++)
{
for (j = 0; j <= n-5; j++)
{
int coord1, coord2;
int maxBright = findBrightSpotInSmaller(brightness, i, j, &coord1, &coord2);
if (maxBright != -1)
{
if(reported[coord1][coord2] != 1)
{
printf("[%d,%d] %d ", coord1, coord2, maxBright);
reported[coord1][coord2] = 1;
}
}
}
}
}
int inputBrightness(int brightness[SIZE][SIZE])
{
int n;
scanf("%d", &n);
int i, j;
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d", &brightness[i][j]);
}
}
return n;
}
int main()
{
printf("Poject #6; Your name ");
int brightness[SIZE][SIZE];
int n = inputBrightness(brightness);
preprocess(brightness, n);
findBrightSpots(brightness, n);
return 0;
}
Please rate positively if this answered your qustion.
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.