Mảng một chiều C/C++

biến toàn cục (global variable) trong C/C++ mặc định sẽ được khởi tạo giá trị 0, vì vậy cách thứ nhất sẽ chạy bình thường
biến cục bộ (local variable) thì không được khởi tạo giá trị trước, nó chứa giá trị rác -> cách thứ hai sẽ chạy sai, hoặc một số compiler như VSC++ sẽ chặn và báo lỗi biến dùng mà chưa được khởi tạo luôn. Cách sửa là gán nó = 0 trước.

1 Like

À mình thấy rồi, lỗi là do nhận giá trị rác chứ ko phải lỗi local variable. thank!

Mình thấy thế này có vẻ ổn.

#include<iostream>
using namespace std;

int main() {
    int sv[30],max;
	int dem=1;
	for (int i = 0; i < 30; i++) {
	cout<<"nhap vao diem sinh vien thu "<<i+1<<endl;
	cin>>sv[i];
	}
	max=sv[0];
	for (int i=0;i<30;i++){
	if (sv[i] > max) {
		max=sv[i];
		dem=i;
	}
	else {
	max=sv[0];
		dem=1;
	}
	}
	cout<<"diem sinh vien cao nhat la: "<<max<<"cua sinh vien thu: "<<dem+1<<endl;
	system("pause");
	}
#include <iostream>
#define n 30

int main()
{
	int a[n];
	for (int i = 0; i < n; i++)
	{
		std::cout << "a[" << i << "] = "; std::cin >> a[i];
	}
	for (int i = 0; i < n; i++)
	{
		std::cout << "a[" << i << "] = " << a[i] << std::endl;
	}
	int max = 0;
	for (int i = 0; i < n; i++)
	{
		if (a[i]>a[max]) max = i;
	}
	std::cout << "Sinh vien co diem cao nhat co stt : " << max << std::endl;
	return 0;
}

góp ý mình với mn, cảm ơn

bài tập mảng 1 chiều .

/*Với yêu cầu đặt ra ban đầu,
giảng viên cần biết điểm số cao nhất của 30 sinh viên trong lớp,
đồng thời muốn biết điểm cao nhất là của sinh viên có số thứ tự bao nhiêu.
Bạn hãy sử dụng mảng 1 chiều để giải quyết vấn đề này. 
(Điểm của sinh viên được nhập từ bàn phím)*/
#include <iostream>

int main()
{
	int i_diemhocsinh[5]; 
	int max;
	int so_sinhvien = sizeof(i_diemhocsinh) / sizeof(int);
	for (int i = 0; i <= (so_sinhvien - 1); i++)
	{
		std::cout << " nhap gia tri phan tu mang thu " << i << std::endl;
		std::cin >> i_diemhocsinh[i];
	}
	max = i_diemhocsinh[0];
	/*gia tri lon nhat cua mang*/
	for (int i = 0; i <= (so_sinhvien - 1); i++)
	{
		if (max < i_diemhocsinh[i])
		{
			max = i_diemhocsinh[i];
		}
	}
	std::cout <<" gia tri lon nha cua mang la " << max << std::endl;
	/*so thu tu max cao nhat trong mang*/
	for (int i = 0; i <= (so_sinhvien - 1); i++)
	{
		if (i_diemhocsinh[i]== max)
			std::cout << " vi tri thu " << i;
	}

	return 0;
}
1 Like

Gộp lại thành 1 vòng lặp được rồi, cần gì phải 3 vòng lặp chạy lâu.

1 Like

bài tập mảng 1 chiều :smiley:

#include <iostream>
using namespace std;
int main()
{
	int diem[10];
	int diemmax=0;
	int x, y;
	for (x = 0; x <= 9; x++)
	{
		do
		{
			cout << "Nhap diem hoc sinh " << x + 1 << " : ";
			cin >> diem[x];
		} while (diem[x] < 0 || diem[x] > 10);
	}

	system("cls");
	cout << "Diem cac hoc sinh trong lop:" << endl;

	for (int x = 0; x <= 9; x++)
	{
		cout << "Hoc sinh " << x+1 << ":" << diem[x] << endl;
	}
	for (x = 0; x <= 9; x++)
	{
		if (diemmax <= diem[x])
		{
			diemmax = diem[x];
			y = x;
		}
	}
	cout << "Diem so cao nhat la cua hoc sinh " << y+1 << ": " << diemmax << endl;
	system("pause");
	return 0;
}

Bài em sửa lại mọi người xem góp ý em với :slight_smile:

#include <iostream>
#include <limits.h>

using namespace std;

int main(){

	int n;
	
	do {
	
		cout<<"\n Hay nhap vao so luong phan tu: ";
		cin>>n;

	} while (n < 1 || n > INT_MAX);

	double arr[n];
	int i = 0;

	while(true){

		come_back:

		cout<<" Nhap diem cua sinh vien thu "<<i + 1<<": ";
		cin>>arr[i];

		if(arr[i] < 1 || arr[i] > 10){

			goto come_back;
		}

		++i;

		if(i >= n){

			break;
		}
	}

	int pos = 0;

	for (int i = 1; i < n; ++i) {
		
		if(arr[pos] < arr[i]){

			pos = i;
		}
	}

	cout<<"\n Sinh vien co diem cao nhat: "<<arr[pos]<<" o vi tri thu "<<pos + 1<<endl;

	return 0;
}

Dòng này chỉ cần khai báo là đủ, không cần gán giá trị

Dòng này nên cho ngoặc đơn ()

2 Likes

bai cua em moi lam:

#include <iostream>
#include <cstdint>

int main()
{
	int32_t student[31];
	int32_t max = INT32_MIN;
	int16_t number_of_student;

	for (int32_t index = 1; index <= 30; index++)
	{
		std::cout << "Enter a grade for student " << index << ": ";
		std::cin >> student[index];
		
		if (student[index] >= max)
		{
			max = student[index];
			number_of_student = index;
		}
	}

	std::cout << "The highest grade is " << max << " of student number " << number_of_student << std::endl;
	
	system("pause");
	return 0;
}

bạn format lại source code đi nha
thêm ba dấu ba chấm ở đầu và cuối mã nguồn là được

Em nghĩ làm như thế này ổn hơn vì không xái mảng phụ để lưu trữ :slight_smile:

// Array practice

#include <iostream>

using namespace std;

#define MAX_SIZE 10

int main() {

	double Mark[MAX_SIZE];
	double Max = 0.0;

	for (int i = 0; i < MAX_SIZE; ++i) {

		do {

			cout << " Enter student_mark[" << i << "] == ";
			cin >> Mark[i];

		} while (Mark[i] < 0 || Mark[i] > 10);

		if (Max < Mark[i]) {

			Max = Mark[i];
		}
	}

	for (int i = 0; i < MAX_SIZE; ++i) {

		if (Max == Mark[i]) {

			cout << " Pos == " << i << endl;
		}
	}

	system("pause");
	return 0;
}

Mình có một thắc mắc nhỏ là ở ví dụ mảng, phần tử cuối cùng là ‘\0’. Phần tử nảy có vai trò như thế nào nhỉ??

#include <iostream>
using namespace std;
int main()
{
	int SV[30];
	int Max,n;
	for (int i=1;i<=30;i++)
	 {
	 	cout<<" SV thu "<<i<<" ";
	 	cin>>SV[i];
	 }
	Max=SV[1];
	for (int i=1;i<=30;i++)
	 {
	 	if (Max<SV[i])
	 	 {
	 	 	Max=SV[i];
	 	 	n=i;
		 }		 
	 }
	cout<<"SV co diem cao nhat la "<<n<<" voi so diem "<<Max; 
}

cho em hỏi là nếu nhiều sinh viên có điểm cao nhất thì mình muốn liệt kê đủ stt của các sinh viên đó thì mình làm sao ạ?

Thêm 1 vòng for nữa.

for (i...)
    if (sinhvien[i].diem == diem_max)
        // in stt sinh viên đó ra
4 Likes

Có cách nào gán giá trị cho cả một mảng không ạ ?
Cách nào mà không cần dùng memset

Dùng fill. memset không thực sự hiệu quả nếu giá trị cần gán cho toàn mảng != 0.

https://en.cppreference.com/w/cpp/algorithm/fill

2 Likes

Fill chỉ dùng được cho vector hay cho cả mảng bình thường vậy ?

Dùng được cả cho mảng tĩnh. Bạn thử là biết ngay mà.

Demo:

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