Lỗi hàm nhập xuất và vòng lặp do{ }while( );

Em chào các anh chị. cho em hỏi 2 vấn đề ạ:

  1. Khi em sử dụng hàm nhập để nhạp n và a[ ] tại sao hàm xuất của em trong code bên dưới không lấy được giá trị n( do vậy nên nó không xuất ra màn hình được ạ). Nhưng khi em cho nhập riêng n trong hàm main thì không bị lỗi thế ạ.
  2. Sao điều kiện của code em trong vòng lặp do{ }while(); lại bị sai ạ. khi em nhập giá trị lần lượt là -3 và 300 thì chạy được( nó bắt được lỗi ạ) mà nhập giá trị 3 mà vẫn vị sai cùng điều kiện thế em dùng
    if( ) thì lại chạy ổn ạ.
    Em cảm ơn ạ.
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<cstring>
#define max 100
using namespace std;
void nhapMang(int a[],int n){
	cout<<" nhap n: ";
	lap:
	cin>>n;
	if( 100<n || n<=0){
		cout<<" nhap n sai. nhap lai: ";
		goto lap;
	}

//	do{
//		cout<<" nhap n sai. nhap lai: ";
//		goto lap;
//	}while(100<n || n<=0);
	
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
}
void xuatMang(int a[],int n){
	for(int i=0;i<n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	}
int main(){
	int a[max],n,b[max],m;
	nhapMang(a,n);
	xuatMang(a,n);
	
}
  1. bạn nên tìm hiểu về int n và int &n thì bạn sẽ biết tại sao?
    Tham số truyền vào ham(int &a) và ham(int *a) khác nhau thế nào
  2. Nếu bạn thay chỗ if( ) bằng do…while như trên hình thì sai là đúng rồi, bởi vì do…whie nó thực thi đoạn code trong ngoặc trc rồi mới so sánh điều kiện mà trong đoạn code của bạn có lệnh: goto lap; thì nó lặp mãi luôn.
1 Like

Mình xin trả lời hai ý của bạn :

  • Khi bạn cần nhập số trong hàm thì bạn nên dùng tham chiếu, hoặc con trỏ

    void nhapMang(int a[], int &n) // truyền tham chiếu
    void nhapMang(int a[], int *n) // truyền con trỏ khi dùng nhớ cin >> *n;
    

    vì khi bạn muốn thay đổi giá trị của một biến truyền vào hằng mà không truyền con trỏ hay đại loại thế mà chỉ truyền vào hàm cái giá trị của biến thôi thì

    Mọi thay đổi giá trị của tham số bên trong hàm không tác động gì đến giá trị gốc mà đối số đang nắm giữ (mình học theo bộ cpp.daynhauhoc.com)

  • vòng lặp do - while thì nó sẽ thực hiện các lệnh trong ngoặc do { } trước rồi mới kiểm tra điều kiện xem có cần lặp tiếp hay không (đúng hay sai)
    nếu bạn dùng cái goto rồi thì không cần dùng vòng lặp đâu, dùng if thôi.
    nếu dùng vòng lặp thì không cần dùng cái goto.

4 Likes

Mình cảm ơn cậu nhiều. m bắt đầu nghĩ là nó kiểm tra trước thì mới cho lặp do{ }. nên bị sai. mình đã sửa được rồi.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?