2015-10-20 3 views
0

Я с трудом с упражнениями, который выглядит следующим образом:Поиск массива в C

написать программу, которая подсчитывает количество вхождений каждого различного числа в массиве. Целые числа между 0 - 9. Возьмите этот массив в качестве примера:

int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 

создать указатель, который указывает на первый элемент массива. Пронумеруйте массив и подсчитайте количество появлений остроконечного числа. После того, как вы подсчитали количество появлений числа 1, указатель укажет на число 5. подсчитайте количество видимых чисел 5 и так далее. После того, как вы зациклировали пару раз, и указатель снова указывает на 1 (элемент 4 массива), программа может не засчитывать 1 снова, поэтому вам нужно сохранить счет где-то из числа, которое вы уже подсчитали.

Вывод должен выглядеть примерно так:

Количество появлений 1 является: 4

Количество появлений 3 является: 1

Количество появлений от 4: 2

Количество выступлений 5: 3

Количество появлений 7 лет: 2

код у меня теперь считается появление каждого элемента:

int main() 
{ 
    int getallen[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 
    int i , j, *aimedNumber, appearance = 0, arraySize = sizeof(getallen)/sizeof(int); 

    for(i=0;i<arraySize;i++)       
    { 
     aimedNumber = getallen[i];     // every loop, the pointer points to the next element 

     for(j=0; j<arraySize; j++)     // loops through the array comparing the pointer 
     { 
      if(getallen[j]==aimedNumber)   // if the element of the array == pointer 
      { 
       appearance++;      // +1 to the appearance 
      } 
     } 

     printf("the appearance of %i in the array is: %i\n", aimedNumber, appearance); 
     appearance = 0;        // after checking the appearance of the pointed number... 
    }            // reset the appearance variable 

    return 0; 
} 

Но мне еще нужно что-то, что проверяет, является ли я уже подсчитал число, и если бы я это сделал, убедитесь, что число не будет подсчитано снова.

Заранее благодарен!

+0

, если вы можете использовать набор, то ваша проблема решается, но это stl и C++ – macroland

+1

. Ваш внешний цикл должен пробегать все возможные числа, т. е. от 0 до 9 в вашем случае, а 'aimNumber' - equla to'i'. (Конечно, если вы знаете диапазон возможных значений, вы можете пройти внутренний цикл только один раз и заполнить массив счетчиков для каждого номера от 0 до 9.) –

+0

В чем проблема? – Roushan45

ответ

0

Ваша программа должна выглядеть следующим образом:

#include <stdio.h> 

int main(void) 
{ 
    //Original array of numbers 
    int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 

    //array of 10 integers to count the number of occurences 
    int num_of_occ[10] = {0}; 

    int *ptr = numbers; 

    //tmp variable to hold the value of numbers array in the loop 
    int tmp ,n = 0 ; 

    while(n < 12) 
    { 
     tmp = *ptr; 
     num_of_occ[tmp]++; 
     ptr++; 
     n++; 
    } 

    //print the occurences 
    for(int n = 0 ; n < 10 ; n++) 
    { 
     if(num_of_occ[n] != 0) 
     { 
      printf("The ammount of appearences of %d : %d\n", n , num_of_occ[n]); 
     } 
    } 
} 
+0

ДА! Спасибо! таким образом, вы все еще работаете с указателем (как сказано в присваивании), и вы получаете правильный результат! – arnofrederiks

+0

Отметьте последние изменения.thanks. @ Arnofrederiks –

+0

большое спасибо @ machine_1! Я хорошо посмотрел на редактирование, и это замечательно! – arnofrederiks

0

Поскольку вы, кажется, не нуждаются в getallen массиве после подсчета, вы можете изменить его, считая, например, когда вы ищете все 1 с в массиве, каждый раз, когда вы читаете 1 вы можете установить его , скажем, -1 (вы знаете, что все ваш номер будет в [0,9] диапазоне), так что, когда вы вернетесь к внешней петле, вы можете пропустить записи со значениями из -1

Edit: это если вы ответ должны придерживаться такого поведения, описанного в вашем примере; в противном случае решение с дополнительным массивом, как и Йоахим Пилеборг, лучше.

1

У вас есть ограничения на то, что числа в массиве могут быть только между 0 и 9 (включительно), и это фактически делает его намного проще, потому что тогда вы можете иметь массив «счетчик» из десяти целых чисел (по одному для номер в массиве, который вы «ищете»), и для каждого номера в основном массиве вы увеличиваете соответствующее значение (используя число как индекс) в массиве счетчиков. Затем просто распечатайте значения в массиве счетчиков, которые отличны от нуля.

Что-то вроде следующего

int count[10] = { 0 }; // Initialize all to zero 

for (i = 0; i < arraySize; ++i) 
    ++count[getallen[i]]; 

// Now print out all non-zero values from count, 
// and the index is the number in getallen 
+0

Большое спасибо, так оно и работает, но в присваивании указывается, что обязательно использовать указатель. Но спасибо, в любом случае, я многому научился от этого! – arnofrederiks

0

Вам нужно будет сделать еще один массив с именем tempArr, например, с размером getallen массива, инициализировать он с 10-ю (потому что числа в массиве getallen находятся между 0-9), и перед подсчетом следующего числа сканируйте tempArr и проверьте, существует ли этот номер, если это так, перейдите к следующему номеру.

0

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

skip = 0; 
for (j=0; j < i; j++) { 
    if (getallen[j] == aimedNumber) { 
    skip = 1; 
    break; 
    } 
} 
if (skip) { 
    continue; 
} 
Смежные вопросы