제 계획이
1.먼저 자리의 행과 열을 입력한다.
2.if함수를 이용해 범위내의 행과 열을 입력했을경우에 프로그램을 실행시킨다
3.for문을 이용해 학생의 이름을 입력한다.(만약 6*6일경우 36명의 이름 입력)
4.rand함수를 이용해 각 배열에 입력한 학생의 이름을 뒤섞는다.
5.뒤섞은 후 seat라는 2차원배열 각 자리에 배치시킨다.
이건데요 ..
일단 3번까지는 어찌어찌 됬는데 그다음부터가 문제네요 ..
랜드를 쓰면 잘 돌아가다가 36번이 나오는순간 연산을 멈추네요.
그리고 중복 숫자도 나오고 ..
일단 소스 올립니다
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand((unsigned)time(NULL));
int i;
int j;
printf(\"교실 좌석의 행과 열을 각각 입력하고 Enter\\n\");
printf(\"행(6~7) : \");
scanf(\"%d\",&i);
printf(\"열(6~7) : \");
scanf(\"%d\",&j);
if(i==6 && j==6)
{
int seat[6][6];
char name[36][36];
int n;
for(n=0;n<36;n++)
{
printf(\"이름 입력(%d) : \",n+1);
scanf(\"%s\",name[n]);
}
for(int a=0;a<36;a++)
{
a=rand()%37;
printf(\"%d번 %s\\n\",a+1,name[a]);
}
}
return 0;
}
질문 1. 첫번째 for문에서 36명의 이름을 입력하는 배열 name을 name[36][36] 이렇게 해줘야 디버그 에러
가 안나더라구요 .. name[36] 이렇게 쓰면 디버그 에러가 나고 .. 저렇게 써야 잘 입력되는 이유와
name[0]에 이름하나 . 이런식으로 넣을수 있는 소스 형식이 있나요?
질문 2. name이 2차원배열 모양처럼 보이는데 밑에서 scanf에서는 1차원배열에 입력을 주는것처럼 해도
별탈없이 실행이 되네요. 그렇다면 seat[0][0]=name[0] 이런식으로 대입 시킬수 있나요?
만약 그게 안된다면 포인터로 가리키기만 해야할까요?
질문 3. 랜드함수를 돌릴때 36번이 나오면 멈추는 이유가 뭘까요? 시간적 여유가 되신다면 그걸 고칠수있는
방법도 알려주시면 감사하겠습니다.
빠른답변 완전 감사하겠습니다 ㅜㅜㅜ
선리플 후보상
rand()%37이면 0부터 36까진데 name배열 첨자범위가 0부터 35잖아요
마지막 for문에서 a를 0부터 36까지 돌려야하는데 a에 랜덤값을 집어넣으면 for문도 다 안돌고..
질문 1번답 scanf(%s, name[n])을 하셨는데 일차원 배열으로 사용하시면 name[n] 쉽게 말해서 한 문자를 입력 하는데 문자열 입력 방식을 사용하고 있습니다 이것 잘못된 방법이죠 scanf(%s, name)으로 고쳐도 되지만 36명의 학생 이름을 저장 못하죠 그런 이유로 2차원 배열을 선언하고 scanf(%s, name[n])을 하셔야 합니다 name[0]에 요소에 35개 문자가 들어 갈수 있죠 마지막은 널문자가 필요하니까요 ㅋ
질문2답 음 char을 int형 넣는것이 옳다고 생각하시나요 잘못된것죠 3번은 윗분들 답 참고 일단 님은 전체적인 소스 수정이 필요합니다 먼저 난수 함수에서 중복 검사가 필요합니다 똑같은 숫자가 나오면 정렬이 안되잖아요 ㅋ