【并行计算入门C语言篇】

并行计算入门C语言篇

入门需要熟悉的一些题

一、环境搭建
自行搭建LInux系统(本处采用特殊服务器,因此略)
二、C语言程序
1、函数调用:主函数为输入两个数,子函数求两个数目的最大值。
2、使用指针遍历输出二维数组:

arr[3][4] ={{1,2,3,4},{5,6,7,8},{9,10,11,12}}

3、实现二叉树的三种遍历方式(递归建立)
4、从键盘读入若干个字符串,按字母大小的顺序排序,将排好序的字符保存到文件中。
5、二维数组运算,包括加、减、乘、乘逆。
6、蒙特卡洛求解派值
7、高斯消元解方程组
三、C++程序
上述C语言程序改写为C++实现
四、Fortran语言程序
1、求两束的最大公约数和最小公倍数
2、对任意自然数 n,设计一个求 n 的各位数字的立方和的函数子程序 F(n)
(如 F(121)=13+23+13=1+8+1=10),并调用 F(n)求 1000 以内的所有水仙花数
(当一个数各个数位的立方和等于这个数本身时,称这样的数为水仙花数)。
3、判断输入字符串是否为“回文”,即顺读与倒读相同,如 level 为回文。
4、二维数组运算,包括加、减、乘、乘逆。
5、蒙特卡洛求解 π 值
6、高斯消元解方程组。
五、Shell脚本语言程序
1、输入两个参数a b 常数。a b 范围为0-1023,即共1024个点。
脚本实现 以每2个为一个小组,每32个为一个大组。
即 当 a b分别为(0,1)或(2,3)时输出结果为1跳
当a b分别为(1,2)或(3,4)时输出结果为3跳
当a b分别为(0,32)或(1,32)时输出结果为5跳
例:./hop.sh 29 31 两点跳数为3 跳
2、C 语言实现判断最大值,将计算结果存到该次运行的临时文件中。
用 Shell 脚本,循环运行十次该 C 程序,每次运行时脚本修改 C 程序
中的两个输入值,编译运行得到结果,脚本从临时文件中取出结果并累加,通过
脚本循环结束输出累加结果。以上需在只执行一次 shell 程序后完成,不再手动操作

C语言程序

1、函数调用:主函数为输入两个数,子函数求两个数目的最大值

#include<stdio.h>
int sum2(a,b)
{
	return a+b;
}
void main()
{
	int a,b,sum;
	scanf("%d,%d",&a,&b);
	sum = sum2(a,b);
	printf("sum=%d\n",sum)
}

2、使用指针遍历输出二维数组:

#include<stdio.h>
int main()
{	
	int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
	int (*p)[4] = a;
	int i,j;
	printf("\n\n列指针:\n");
	for(i=0;i<3;i++)
	{
		for(j=0;j<4;j++)
		{
			printf("%3d",*(*(p+i)+j));
		}
		printf("\n");
	}
	return 0;
}

3、实现二叉树的三种遍历方式(递归建立)

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef struct Node
{
	char data;
	struct Node* LChild;
	struct Node* RChild;
}TREE,*LPTREE;
LPTREE createNode(char data)
{
	LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
	assert(newNode);
	newNode->data = data;
	newNode->LChild = NULL;
	newNode->RChild = NULL;
	return newNode;
}
void insertNode(LPTREE parent,LPTREE LChild,LPTREE RChild)
{
	parent->LChild = LChild;
	parent->RChild = RChild;
}

void preOrder(LPTREE root)
{
	if(root != NULL)
	{
		printf("%c",root->data);
		preOrder(root->LChild);
		preOrder(root->RChild);
	}
}

void minOrder(LPTREE root)
{
	if(root!=NULL)
	{
		minOrder(root->LChild);
		printf("%c",root->data);
		minOrder(root->RChild);
	}
}

void lastOrder(LPTREE root)
{
	if(root!=NULL)
	{
		lastOrder(root->LChild);
		lastOrder(root->RChild);
		printf("%c",root->data);
	}	
}

void createTree(LPTREE* T)
{
	char userKey = 0;
	scanf("%c",&userKey,1);
	if (userKey == '#')
	{
		*T = NULL;
	}
	else
	{
		*T = (LPTREE)malloc(sizeof(TREE));
		assert(*T);
		(*T)->data = userKey;
		createTree(&(*T)->LChild);
		createTree(&(*T)->RChild);
	}
}

int main()
{
	LPTREE A = createNode('A');
	LPTREE B = createNode('B');
	LPTREE C = createNode('C');
	LPTREE D = createNode('D');
	LPTREE E = createNode('E');
	LPTREE F = createNode('F');
	LPTREE G = createNode('G');
	LPTREE H = createNode('H');

	insertNode(A,B,C);
	insertNode(B,D,E);
	insertNode(E,G,NULL);
	insertNode(C,NULL,F);
	insertNode(F,H,NULL);
	
	preOrder(A);
	printf("\n");
	
	minOrder(A);
	printf("\n");
	
	lastOrder(A);
	printf("\n");

	
	return 0;
}

4、从键盘读入若干个字符串,按字母大小的顺序排序,将排好序的字符保存到文件中。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	FILE * fp;
	char str[3][10],temp[10];
	int i,j,k,n=3;
	printf("Enter strings:\n");
	for(i=0;i<n;i++)
		fgets(str[i],10,stdin);
	for(i=0;i<n-1;i++)
	{	
		k=i;
		for(j=i+1;j<n;j++)
		{
			if(strcmp(str[k],str[j])>0)
				k=j;
		}
		if(k!=i)
		{
			strcpy(temp,str[i]);
			strcpy(str[i],str[k]);
			strcpy(str[k],temp);
		}
	}
	if((fp=fopen("E:\\save.dat","w"))==NULL)
	{
		printf("can not open file!\n");
		exit(0);
	}
	printf("\n the new sequence:\n");
	for(i=0;i<n;i++)
	{
		fputs(str[i],fp);
		fputs("\n",fp);
		printf("%s\n",str[i]);
	}
	return 0;
}

5、二维数组运算,包括加、减、乘、乘逆。

#include<stdio.h>
#include<math.h>
float option(char,float,float);
float chengni(float,float);
float option(char op,float a,float b)
{
	switch(op)
	{
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '^':return chengni(a,b);
	}
}
float chengni(float a ,float b){
	int c = (int)a;
	int d = (int)b;
	int i;
	float e = 1.0;
	for (i=0;i<fabs(d);i++){
		e*=a;
	}
	if(b>0){
		return e;
	}else{
		return 1/e;
	}
}
int main(){
	char op;
	float a=0.0,b=0.0;
	printf("请选择你要进行的操作:‘+’、‘-’,‘*’,‘^’ number1 number2 \n");
	scanf("%c%f%f",&op,&a,&b);
	printf("%f\n",option(op,a,b));
	return 0;
}

6、蒙特卡洛求解派值
众所周知,蒙特卡洛求派的核心代码就是不停的往一个范围内输出随机数,最后计算在四分之一圆范围内的点占比。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
double fun(int num);
int main()
{
	int n;
	printf("请输入产生随机点的数目:\n");
	scanf("%d",&n);
	printf("圆周率PI的值为:%f\n",fun(n));
	return 0;
}
double fun(int num)
{
	int numCount =0;
	int i;
	double x =0;
	double y =0;
	srand((unsigned)time(NULL));
	for(i=0;i<num;i++)
	{
		x =rand()/(double)(RAND_MAX);
		y =rand()/(double)(RAND_MAX);
		if ((x*x)+(y*y)<1)
			numCount++;
	}
	return (4.0*numCount/num);
}

7、高斯消元解方程组
这个代码挺多的

#include<stdio.h>
#include<math.h>


int main(){
	int a[100][101];
	float ans[100];
	float MIN=1e-8;
	int numberOfUnknown;//未知量的数量 
	printf("请输入线性方程组未知数数量:");
	scanf("%d",&numberOfUnknown);
	int init_f=init(a,numberOfUnknown,numberOfUnknown+1);
	if(init_f==0){
		return 0;
	}
	int Guss_f=Guss(a,numberOfUnknown,numberOfUnknown+1);
	if(Guss_f==0){
		return 0;
	}
	return 0;
}

int isUniqueAns(int a[100][101],int i){
	int m;
	float MIN =1e-8;
	for(m=1;m<=i;m++){
		if(abs(a[m][m])<MIN){
			printf("No Solution");
			return 0;
		}
	}
	return 1;
}

int init(int a[100][101],int i,int j){
	int m,n;
	for(m=1;m<=i;m++){
		printf("请输入第%d行系数与常数:",m);
		for(n=1;n<=j;n++){
			scanf("%d",&a[m][n]);
		}
	}
	if(isUniqueAns(a,i)==0){
		return 0;
	}
	return 1;
}

void printfResult(float ans[100],int i){
	int m;	
	for(m=1;m<i;m++){
		printf("%.2f\n",ans[m]);
	}
	printf("%.2f",ans[i]);
}

void getResult(int a[100][101],float ans[100],int i){
	int m,n;
	for(m=i;m>=1;m--){
		float sum=0;
		for(n=i+1;n>m;n--){
			sum+=a[m][n]*ans[n];
		}
		ans[m]=(a[m][i+1]-sum)/a[m][m];
	}
	printfResult(ans,i);
}
void mul(int num,int a[101],int j){
	int m;
	for(m=1;m<=j;m++){
		a[m]=num*a[m];
	}
}

void offset(int a[101],int b[101],int i,int j){
	int m;
	for(m=i;m<=j;m++){
		a[m]=a[m]-b[m];
	}
}

int Guss(int a[100][101],int i,int j){
	int n,m;
	float ans[100];
	for(m=1;m<i;m++){
		for(n=m+1;n<=i;n++){
			mul(a[m][m],a[n],j);
			mul(a[n][m],a[m],j);
			offset(a[n],a[m],m,j);
		}
	}
	
	if(isUniqueAns(a,i)==0){
		return 0;
	}
	getResult(a,ans,i);
	return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值