[ create a new paste ] login | about

Link: http://codepad.org/qjk0NLJa    [ raw code | output | fork ]

C, pasted on May 6:
/* Viết chương trình nhập vào danh sách liên kết đơn các số nguyên và thực hiện các yêu cầu sau : 
	1/ Liệt kê các số nguyên tố có trong danh sách .
	2/ Liệt kê các số chính phương có trong danh sách .
	3/ Liệt kê các số hoàn thiện có trong danh sách .
	4/ Liệt kê các số đối xứng có trong danh sách .
	5/ Liệt kê các số Amstrong có trong danh sách .
678.cpp */

/* Định Nghĩa:
	1/ Số nguyên tố là những số >=2 và chỉ có 2 ước số là 1 và chính nó . vd:số 3
	2/ Số chính phương là những số mà khai căn ra là giá trị nguyên . vd : số 4
	3/ Số hoàn thiện là số mà tổng các ước số nhỏ hơn nó cộng lại bằng chính nó . vd:số 6 vì số 6 có các ước số là 1,2,3,6.Các ước số nhỏ hơn 6 là 1,2,3 và 1+2+3=6 . 
	4/ Số đối xứng là số mà đảo ngược các chữ số lại vẫn bằng chính nó . vd:số 121
	5/ Số Amstrong là số mà từng chữ số của nó mũ lên theo số lượng các chữ số rồi cộng lại bằng chính số ban đầu . vd:số 370 vì số 370 có 3 chữ số và 3^3+7^3+0^3 = 370 .
*/
/* 

Tác giả: Nguyễn Việt Nam Sơn
Trung tâm đào tạo tin học - Thiết kế phần mềm - Sơn Đẹp Trai: www.SonDepTrai.com

Nguồn source code này Tôi viết vào năm 2012 lúc mới bắt đầu học lập trình C/C++ nên một số cách sẽ không được tối ưu - Bạn chỉ nên dùng trên tinh thần tham khảo thôi nhé.
Mong giúp đỡ được Bạn trên con đường Học Lập Trình.
TẤT CẢ VÌ SỰ THÀNH CÔNG CỦA BẠN

*/
// Các thư viện sử dụng trong chương trình .
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "Windows.h"
#define MAX 6

// Khai báo cấu trúc dữ liệu danh sách liên kết đơn các số nguyên .
struct node
{
	int Data;
	struct node*pNext;
};
typedef struct node NODE;

struct list
{
	NODE*pHead;
	NODE*pTail;
};
typedef struct list LIST;

// Khởi tạo danh sách liên kết đơn .
void INit(LIST &l)
{
	l.pHead=NULL;
	l.pTail=NULL;
}

// Tạo Node trong danh sách liên kết đơn .
NODE*getnode(int x)
{
	NODE*p;
	p=new NODE;
	if(p==NULL)
		return NULL;
	p->Data=x;
	p->pNext=NULL;
	return p;
}

// Thêm vào cuối danh sách liên kết đơn .
void AddTail(LIST &l,NODE*new_ele)
{
	if(l.pHead==NULL)
	{
		l.pHead=new_ele;
		l.pTail=l.pHead;
	}
	else
	{
		l.pTail->pNext=new_ele;
		l.pTail=new_ele;
	}
}

// Nhập dữ liệu cho danh sách liên kết đơn .
void InPut(LIST &l)
{
	int n;
	quaylai:printf("\nNhap vao so luong cac so nguyen:");
	scanf("%d",&n);
	if(n<0)
	{
		printf("\nSo luong ban nhap vao khong hop le!Xin vui long nhap lai!");
		goto quaylai;
	}
	INit(l);
	for(int i=1;i<=n;i++)
	{
		int x;
		printf("\nNhap vao so nguyen thu %d:",i);
		scanf("%d",&x);
		NODE*p=getnode(x);
		AddTail(l,p);
	}
}

// Xuất dữ liệu của danh sách liên kết đơn .
void OutPut(LIST l)
{
	printf("\n>>>>>>>>>>>>>>> Danh Sach Cac So Nguyen <<<<<<<<<<<<<<<<<<<<<\n");
	for(NODE*p=l.pHead;p!=NULL;p=p->pNext)
	{
		printf("%10d",p->Data);
	}
}

// Liệt kê các số nguyên tố có trong danh sách liên kết đơn .
void NguyenTo(LIST l)
{
	int f;
	NODE*pNode;
	printf("\n>>>>>>>>>>>>>>>>> Cac So Nguyen To <<<<<<<<<<<<<<<<<<<<<\n");
	for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
	{
		f=1;
		if(pNode->Data<2)
		{
			f=0;
		}
		for(int j=2;j<=(pNode->Data)/2;j++)
		{
			if(pNode->Data%j==0)
			{
				f=0;
			}
		}
		if(f==1)
		{
			printf("%4d",pNode->Data);
		}
	}
}

// Liệt kê các số chính phương có trong danh sách liên kết đơn .
void ChinhPhuong(LIST l)
{
	NODE*pNode;
	float sqrt(float x);
	printf("\n>>>>>>>>>>>>>>>>> Cac So Chinh Phuong <<<<<<<<<<<<<<<<<<<<<\n");
	for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
	{
		float ketqua=sqrt(pNode->Data);
		if((float)ketqua==(int)ketqua) // Ép kiểu để kiểm tra xem số đó có phải là số chính phương hay không ? ví dụ : số 4 sẽ là số chính phương vì căn của 4 = 2 (giá trị nguyên) . ta thực hiện ép kiểu giá trị căn của 4 để kiểm tra . tính căn của 4 ở dạng thực sẽ ra là 2.00000 và ép về dạng nguyên sẽ ra là 2 . So sánh thấy chúng bằng nhau => số chính phương . Ngược lại ví dụ số 5 khai căn ra sẽ là 2.236067978 và khi ép về kiểu nguyên sẽ là 2 . So sánh thấy chúng không bằng nhau => không phải là số chính phương .
		{
			printf("%4d",pNode->Data);
		}
	}
}

// Liệt kê các số hoàn thiện có trong danh sách liên kết đơn .
void HoanThien(LIST l)
{
	NODE*pNode;
	printf("\n>>>>>>>>>>>>>>>>> Cac So Hoan Thien <<<<<<<<<<<<<<<<<<<<<\n");
	for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
	{
		int tong=0;
		for(int j=1;j<pNode->Data;j++)
		{
			if(pNode->Data%j==0)
			{
				tong+=j;
			}
		}
		if(tong==pNode->Data)
		{
			printf("%4d",pNode->Data);
		}
	}
}

// Liệt kê các số đối xứng có trong danh sách liên kết đơn .
void DoiXung(LIST l)
{
	NODE*pNode;
	printf("\n>>>>>>>>>>>>>>>>> Cac So Doi Xung <<<<<<<<<<<<<<<<<<<<<\n");
	for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
	{
		int reverse = 0; // Số đảo ngược của số đang cần xét .
		int temp = pNode->Data; // Copy giá trị của số đang cần xét vào biến temp để lưu trữ lại giá trị của số đó vì trong quá trình chạy thuật toán thì giá trị của số đó sẽ bị thay đổi .
		
		// 1. Đảo ngược số n
		while(temp>0)
		{
			int digit = temp % 10;
			reverse = reverse * 10 + digit;
			temp = temp / 10;
		}

		// 2. Kiểm số đảo ngược của số đang cần xét có bằng chính nó hay không?
		//	+ Nếu bằng, số đó chính là số đối xứng => in ra màn hình .
		//	+ Ngược lại,số đó không phải là số đối xứng .
		if(reverse == pNode->Data)
		{
			printf("%6d",pNode->Data);
		}
	}
}

// Liệt kê các số Amstrong có trong danh sách liên kết đơn .
void Amstrong(LIST l)
{
	int a[MAX];
	NODE*pNode;
	float pow(float x,float y);
	printf("\n>>>>>>>>>>>>>>>>> Cac So Amstrong <<<<<<<<<<<<<<<<<<<<<\n");
	for(pNode=l.pHead;pNode!=NULL;pNode=pNode->pNext)
	{
		int i=0;
		int temp = pNode->Data; // Copy giá trị của số đang cần xét vào biến temp để lưu trữ lại giá trị của số đó vì trong quá trình chạy thuật toán thì giá trị của số đó sẽ bị thay đổi .
		while(temp!=0)
		{
			a[i]=temp%10; // Lưu các chữ số vào mảng a .
			temp=temp/10;
			i++; // tăng biến i lên .
		}
		int tong=0; // khởi tạo tổng=0 .
		for(int k=i-1;k>=0;k--)
		{
			tong+=pow(a[k],i); // i lúc này chính là số lượng chữ số của số đang cần xét , còn mảng a[k] chính là từng chữ số của số đó .
		}
		if(tong==pNode->Data) // nếu tổng = đúng số ban đầu => đó là số Amstrong và in ra màn hình .
		{
			printf("%10d",pNode->Data);
		}
	}
}

// Hàm chính .
void main()
{
	int tieptuc;
	LIST lst;
	quaylai:InPut(lst);
	printf("\n");
	OutPut(lst);
	printf("\n");
	NguyenTo(lst);
	printf("\n");
	ChinhPhuong(lst);
	printf("\n");
	HoanThien(lst);
	printf("\n");
	DoiXung(lst);
	printf("\n");
	Amstrong(lst);
	printf("\n");
	printf("\nBan co muon tiep tuc thuc hien chuong trinh hay khong ? Neu co bam phim C,nguoc lai bam bat ky 1 phim nao khac de ket thuc! ");
	tieptuc=getch();
	if(tieptuc=='c'||tieptuc=='C')
	{
		system("cls");
		goto quaylai;
	}
}


Output:
Line 18: error: conio.h: No such file or directory
Line 20: error: Windows.h: No such file or directory
Line 49: error: expected ';', ',' or ')' before '&' token
In function 'getnode':
Line 59: error: 'new' undeclared (first use in this function)
Line 59: error: (Each undeclared identifier is reported only once
Line 59: error: for each function it appears in.)
Line 59: error: expected ';' before 'NODE'
t.c: At top level:
Line 68: error: expected ';', ',' or ')' before '&' token
Line 83: error: expected ';', ',' or ')' before '&' token
In function 'OutPut':
Line 108: error: 'for' loop initial declaration used outside C99 mode
In function 'NguyenTo':
Line 127: error: 'for' loop initial declaration used outside C99 mode
In function 'ChinhPhuong':
Line 145: error: conflicting types for 'sqrt'
In function 'HoanThien':
Line 165: error: 'for' loop initial declaration used outside C99 mode
In function 'Amstrong':
Line 212: error: conflicting types for 'pow'
Line 225: error: 'for' loop initial declaration used outside C99 mode
In function 'main':
Line 238: warning: return type of 'main' is not 'int'


Create a new paste based on this one


Comments: