并行计算入门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;
}