동적할당 배열의 출력결과 오류 문제(feat.난수)
글쓴이: sarah1326 / 작성시간: 화, 2024/02/13 - 3:36오후
안녕하세요. 저는
1) 난수를 받아 그 숫자크기만큼의 배열을 만들고
2) 그 배열의 요소도 난수로 받은 다음
3) 요소들을 출력하고
4) 또 다른 난수 k를 받아서
5) k와 배열의 요소들을 비교하여
6) 요소들 중에는 k가 몇 개가 있는지 최종적으로 출력하는
..프로그램을 devc++로 만들었습니다.
예)
1) 난수 3을 받음.
2)3) 요소도 난수로 받아서 배열 13 3 2 이 생성됨. 이것을 출력함
4) 난수k인 2를 받음.
5)6) 비교 결과 배열의 요소에는 k값과 같은 2가 1개 있음.>> 1을 출력함.
===========
3
13 3 2
이 배열에서 "2(=k)"의 개수는 "1"이다.
===========
..그런데 여기에서 cmd창으로 결과를 보면 오류가 나서 질문드립니다. 어떻게 하면 고칠 수 있을까요? 컴파일 이상은 없습니다.
<문제가 된다고 의심되는 함수의 코드>
int num_count_func2(){ srand(time(NULL)); int count = 0; int random2 = rand()%20+2; // 찾아야 하는 수 k. 2부터 21까지 가능하다. int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. int ary[random1]; for(int i=0; i<random1; i++){ if(ary[i]==random2){ count +=1; }; } printf("\n\n이 배열에서 \"%d\"의 개수는 \"%d\"이다.", random2,count); }
<프로그램 전체 코드>
#include<stdio.h> //scanf, printf #include<stdlib.h> // malloc, free #include<time.h> #include<windows.h> // delay int func1(); // 이 프로그램의 메인이 되는 함수 int num_count_func2(); // 사용자가 값을 입력하면// // 그 값과 일치하는 값이 몇개인지 알려주는 함수 // int main(){ func1(); num_count_func2(); } int func1(){ srand(time(NULL)); int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. int ary[random1]; for(int i=0; i<random1; i++){ ary[i] = rand()%19+2; // 2부터 20까지의 난수가 요소로 들어간다. } printf("배열에 대입한 난수값\n"); printf("%d\n\n", random1); for(int i=0; i<random1; i++){ printf("%d ", ary[i]); } return 0; } int num_count_func2(){ srand(time(NULL)); int count = 0; int random2 = rand()%20+2; // 찾아야 하는 수 k. 2부터 21까지 가능하다. int random1 = rand()%19+2; // 2부터 20까지 배열의 개수를 할당. int ary[random1]; for(int i=0; i<random1; i++){ if(ary[i]==random2){ count +=1; }; } printf("\n\n이 배열에서 \"%d\"의 개수는 \"%d\"이다.", random2,count); }
File attachments:
첨부 | 파일 크기 |
---|---|
cmd결과창입니다. | 18.88 KB |
Forums:
컴파일 된게 더 이상하네요. int ary
컴파일 된게 더 이상하네요. int ary[random1]와 같이 가변 길이로는 배열 선언 자체가 안되는데...
int *arr = malloc(random1*sizeof(int)) 이렇게 선언해야 되거든요.
Dev C++은 사용하지 마시고(정말 구닥다리 개발환경&컴파일러고 이제 버려야 할 때가 되었습니다) Visual Studio Code(https://code.visualstudio.com/)를 설치해서 해보세요. Windows 환경이라면 WSL2 개발 환경을 구축해서 하시는 걸 추천드립니다.
자 문제 해결은 ary[] 배열에 아무 값도 대입이 되고 있지 않아요. 먼저 ary[i] = rand()%20+2; 이렇게 배열에 비교할 값을 넣어놓는 단계가 먼저 있어야 하죠.
C99 에서.. 배열 가변 길이가 지원될 겁니다.
C99 에서.. 배열 가변 길이가 지원될 겁니다. 빌드할 때 C99 옵션을 주었을지는 모르겠지만 ^^
음 DEV C++ 에서 C99 를 지원하지 않아서 빌드가 안될 거라고 하신걸지도 모르겠군요. DEV C++은 써 본적이 없어서..
아 C99 에서는 그런 것도 지원하는 군요???
아 C99 에서는 그런 것도 지원하는 군요???
이런 기능이 2001년도 부터 가능했네요 ㅠ.ㅠ
음 ..
func1() 과 num_count_funct2() 에 있는 int ary[random1]; 는 서로 다른 메모리 영역을 가진 지역 변수입니다. 즉, 둘 사이에는 아무런 연결 고리가 없습니다. 심지어 num_count_funct2() 에 있는 ary[] 에는 아무런 값도 넣지 않았을 뿐만 아니라, 어떤 값이 들어 있는지 확인해 보지도 않았기 때문에, 결과가 이상하다고 할 수 없습니다.
int ary[random1]; 과 int random1; 을 전역 변수로 빼고, random1 은 딱 한 번만 값을 설정해 보세요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
...
다른 부분은 다른 분들이 지적하셨고, 코드에 큰 악영향은 아마도 없습니다만(?) srand는 난수를 "초기화"하는 함수이기 때문에 매번 부르면 더 훌륭한 난수가 나오는 게 아니라 엉터리 난수가 나옵니다.
프로그램 시작할 때 메인에서 한 번만 불러주세요.
모든 분들 감사합니다!
이전에 이미 수정해서 완료했지만 여기 있는 조언들을 잘 참고하겠습니다.
그리고 devc++ 말고 visual studio code에 익숙해지겠습니다 ㅎㅎ
댓글 달기