2015-01-26 2 views
0

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

Так что в основном я должен массировать [] и заменять [], которые 200 заполнены случайными числами.

Я хочу найти значение [] для значения 32 (ele) и заменить любое значение этого значения соответствующим значением взамен [].

E.g. если: a [22] = 32, замените [22] = 78 => a [22] = 78

В то же время я хотел бы, чтобы он «записывал» номер индекса (22) и записывал его на файл.

Я не могу заставить его проходить через [] несколько раз и заменять каждый экземпляр. Он заменяет только 1 экземпляр, а затем прерывает.

У меня нет ошибки. Msg. для кода ниже. Надеюсь, вы сможете помочь новичкам. Если у вас есть ответ, пожалуйста, найдите минутку, чтобы объяснить, как и почему.

#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <time.h> 

FILE *ifp, *ofp; 

int ix; 
int ik; 
int i; 
int change; 
int count = 0; 
int ele = 32; 
int num = 200; 
int a[200]; 
int replace[200]; 


void swap(int a[], int replace[], int change) 
{ 
    int temp = replace[change]; 
    a[change] = replace[change]; 
    a[change] = temp; 

    ifp = fopen("/Users/kjaerolsen/tmp/ilog.txt", "a+"); 

    fprintf(ifp, "%d\n", change); 

    fclose(ifp); 
} 


int main(int argc, char *argv[]) { 
    // creates array with random numbers to draw new numbers from. 
    srand(time(NULL)); 

    for (int ik = 0; ik < 200; ik++) 
    { 
     rand(); 
     replace[ik] = rand() % 200; ///rand_max; 
    } 

    for (int ik = 0; ik < 200; ik++) 
    { 
     fprintf(ifp, "%d\n", replace[ik]); 
    } 
    // creeates main array with random numbers. 
    srand(time(NULL)); 

    for (int ix = 0; ix < 200; ix++) 
    { 
     rand(); 
     a[ix] = rand() % 200; ///rand_max; 
    } 

    for (int ix = 0; ix < 200; ix++) 

    { 
     printf("plads %d i array: %d\n",ix, a[ix]); 
    } 

    // Looks for number 32 (ele) in array 
    i = 0; 
    for (int i =0; i < 200; i++) 
    { 
     change++; 
     swap(int a[], int replace[], int change) 
     count++; 

    } 

    if (count == 0) 
     printf("%d is not present in array.\n", ele); 
    else 
     printf("%d is present %d times in array.\n", ele, count); 

    // Opens the file and rewrites the new array. 

    ifp = fopen("file1.txt", "w+"); 
    for (int ix = 0; ix < 200; ix++) 
    { 
     fprintf(ifp, "%d\n", a[ix]); 
    } 

    fclose(ifp); 

    printf("very done..."); 
    return (0); 
} 
+1

Не называть 'srand' несколько раз. И нет необходимости в дополнительном вызове 'rand' в циклах инициализации. –

+0

Первое наблюдение, отформатируйте свой код таким образом, чтобы он был наиболее читаемым. И всегда проверяйте функции, которые могут потенциально потерпеть неудачу, например, 'fopen()' возвращает 'NULL', когда возникает проблема, проверьте это. Избегайте глобальных переменных, если вы действительно не знаете, что делаете, и избегайте их, когда не знаете, зачем они вам нужны. –

+1

Что касается вашей проблемы, всегда отправляйте любые ошибки компилятора, полные и неотредактированные в свой вопрос. И вы * делаете * знаете, как вызывать функции массивов сбора данных? Вы делали это несколько раз, даже в этой программе (подсказка: посмотрите на эти вызовы 'printf'), чтобы вы знали, как это сделать, и как вызывать функции в целом. Это не так, как вы пытаетесь вызвать функцию 'swap'. –

ответ

0

Должен fopen ifp перед вторым контуром и fclose его после. Ваш текущий код идет сбой сегментации:

ifp = fopen(...); 
for (int ik = 0; ik < 200; ik++) 
{ 
    fprintf(ifp, "%d\n", replace[ik]); 
} 
fclose(ifp); 

Кроме того, вы можете поменять местами с тремя XOR:

a ^= b; 
b ^= a; 
a ^= b; 

и без каких-либо временных переменных;

+0

Спасибо, это действительно помогло! Я не могу повышать - но я бы мог, если бы мог :) – wtbrg

+0

мне тоже пока не удается;) – micarelli

0

Огромное спасибо за вашу помощь. Наконец-то мне удалось заставить его работать - и это красиво. Я переместил его из фактической функции и в цикл, так как не было необходимости называть катушку функцией. Во-вторых, мне не хватало вершины IF. Но самые важные @micarelli ваши предложения с XOR сделали трюк.

Возможно, это не так много для таких хардкорных кодеров, как вы, но это было действительно приятно. Я отправил окончательный фрагмент кода ниже.

i = 0; 
    for (int i =0; i < 200; i++) 

    if (a[i] == ele) 
{ 
    a[i] ^= replace[i]; 
    count++; 
} 

    if (count == 0) 
    printf("%d is not present in array.\n", ele); 
    else 
    printf("%d is present %d times in array.\n", ele, count); 

// Opens the file and rewrites the new array. 

    ifp = fopen("/Users/kjaerolsen/tmp/file1.txt", "w+"); 

    for (int ix = 0; ix < 200; ix++) 

{ 
    fprintf(ifp, "%d\n", a[ix]); 
} 

    fclose(ifp); 
Смежные вопросы