C语言上机任务


本文代码亲测有效,转载请注明出处

顺序结构程序设计

上机任务一
1、输入一个三位数,求三位数的百位、十位和个位之和

// 输入一个三位数,求三位数的百位、十位和个位之和
#include <stdio.h>
int main()
{
	int a,b,c,e,s;
	printf("Please enter a three digit number\n");
	scanf("%d",&s);
	a=s/100;      // "/"表示取整,比如567/100=5,注意m(被除数)/n(除数)=k ,当m<n时,k=0
	b=(s/10)%10; //  "%"表示取模,即取余数。比如567%100=67
	c=s%10;
	e=a+b+c;
	printf("hundred's place is %d,ten's place is %d,the unit is %d,sum is %d\n",a,b,c,e); //百位是a,十位是b,个位是c,各各位之和为e
	return 0;
}

2、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积,编程序,用scanf输入数据,然后输出计算结果。输出时要有文字说明,取小数点后两位数字

//设半径r为1.5,高h为3,求圆周长、圆面积、球表面积、球体积和圆柱体积,结果去小数点后两位数字(用scanf输入数据)
#include <stdio.h> 
#define pai 3.1415926 //定义常量π的值
int main()
{
	float c,s,s1,v1,v;   //定义变量圆周长为c,圆面积为s,球表面积为s1,球体积为v1,圆柱体积为v
	float r,h;
	scanf("%f %f",&r,&h);
	  
	c=2*pai*r;
	s=pai*r*r;
	s1=4*pai*r*r;
	v1=4/3*pai*r*r*r;
	v=pai*r*r*h;
	printf("Circumference is c : %.2f\n",c); //均以四舍五入保留小数点后两位
	printf("Circular area is s:%.2f.\n",s);  //%m.nf中,m代表输出数长,n代表小数点后的数长。
	printf("The ball area is s1:%.2f.\n",s1); //如12.4567按%5.2f输出为12.46(小数点也算一位数字)
	printf("The ball volume is v:%.2f.\n",v);
	printf("Cylindrical volume is v1:%.2f.\n",v1);
	return 0;
}

选择结构程序设计

上机任务二
1、求一元二次方程的根
if语句

//求一元二次方程ax^2+bx+c=0的根x1,x2 ,保留小数点后两位(if嵌套)
//注意每次文件内容更改都需要重新编译gcc,即gcc x.c -o x
//但使用math.n,gcc命令必须加"-lm"。即gcc x.c -o x -lm

#include <stdio.h>
#include <math.h>   //使用sqrt()函数需调用math.h函数库

int main()
{
	float a,b,c,s,e,x1,x2;
	printf("Please enter the three coefficients of the equation\n"); //输入a,b,c三个系数的值
	scanf("%f %f %f",&a,&b,&c);
	s=b*b-4*a*c;
	e=sqrt(s);
    if (a!=0)  //判断系数a是否为0,若为0,则将跳过嵌套里面的所有程序(第16至第32行)
	{
		if (s<0)
		{
			printf("The solution of this equation is imaginary\n");   //解为虚数,如x^2-2x+2=0 <=> (x-1)^2=-1=i^2  x1=1+i , x2=1-i
		}
		else if (s>0)
		{
			x1=(-b+e)/(2*a); 
			x2=(-b-e)/(2*a);
			printf("This equation has two different solutions : %5.2f %5.2f\n",x1,x2); //有两个不同的解 ,如x^2+5x+6=0 x1=-2  x2=-3
		}
		else 
		{
			x1=x2=(-b+e)/(2*a); 
			printf("This equation has two identical solutions : %5.2f %5.2f\n",x1,x2); //有两个相同的解,如x^2-2x+1=0  x1=x2=1
		}
	}
    else
	{
		printf("This equation is not a quadratic one\n"); //该方程不是一元二次方程
	}
	return 0;
}

switch嵌套

//求一元二次方程的根(switch嵌套)
#include <stdio.h>
#include <math.h>

int main()
{
	float a,b,c,s,e,x1,x2;
	printf("Please enter the three coefficients of the equation\n"); //输入a,b,c三个系数的值
	scanf("%f %f %f",&a,&b,&c);
	s=b*b-4*a*c;
	e=sqrt(s);
	x1=(-b+e)/(2*a);
	x2=(-b-e)/(2*a);
	switch(a!=0){
		case 1:
			switch(s<0)
				case 2:
					printf("The solution of this equation is imaginary\n");
					break;
				case 3:
					
}

2、给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。事先编好程序,要求分别用if语句和switch语句来实现。运行程序并检查结果是否正确
if语句

//总分100分,90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。(if)
//A=[90,100],B=[80,90),C=[70,80),D=[60,70),E=[0,60)

#include <stdio.h>
int main()
{
	float g;
	printf("Please enter your score\n");   
	scanf("%f",&g);
	if (g>100 || g<0)            //逻辑运算符 "或":||
	{
		printf("Input error, please retype\n"); //输入错误,请重新输入
	}
	else                                      //当输入错误时,跳过第14-37行,系统从第38行开始识别和运行
	{
		if (g >=90 && g<=100)   //逻辑运算符 "与":&&
		{
			printf("Your grade level is A\n");  
		}
		else if (g >=80 && g<90) 
		{
			printf("Your grade level is B\n");
		}
		else if (g >=70 && g<80)
		{
			printf("Your grade level is C\n");
		}
		else if (g >=60 && g<70)
		{
			printf("Your grade level is D\n");
		}
		else 
		{
			printf("Your grade level is E\n");
		}
	printf("Your score is %5.2f\n",g);   //"%m.nf"中,m代表输出数长,n代表小数点后的数长。
    }	                                 //如12.4567按%5.2f输出为12.46(小数点也算一位数字);123.345按%5.2f输出为123.35(整数部分不受m影响)
	return 0;                            
}

switch嵌套

//总分100分,90分以上为A,80~89分为B,70~79分为C,60~69分为D,60分以下为E。(switch)
//A=[90,100],B=[80,90),C=[70,80),D=[60,70),E=[0,60)

#include <stdio.h>
int main()
{
	float g;
	int a;
	printf("Please enter your score\n");
	scanf("%f",&g);
	a=g/10;
	if(g>100 || g<0)  //逻辑运算符 "或":||
	{
		printf("Enter the wrong score\n");
	}
	else
	{
		switch(a)
		{
		    case 10 :
				printf("Your grade level is A\n");
				break;
			case 9 :
				printf("Your grade level is A\n");
				break;
			case 8 :
				printf("Your grade level is B\n");
				break;
			case 7 :
				printf("Your grade level is C\n");
				break;
			case 6 :
				printf("Your grade level is D\n");
				break;
			case 5 :
				printf("Your grade level is E\n");
				break;
			case 4 :
				printf("Your grade level is E\n");
				break;
			case 3 :
				printf("Your grade level is E\n");
				break;
			case 2 :
				printf("Your grade level is E\n");
				break;
			case 1 :
				printf("Your grade level is E\n");
				break;
			case 0 :
				printf("Your grade level is E\n");
				break;  
		}
		printf("Your score is %5.2f\n",g);
	}
	return 0;
}

循环结构程序设计

上机任务三
1、求100到200之间的素数,每行输出6个。

//求100到200之间的素数,每行输出6个
//判断一个整数number是否为素数,只需把number 被2~(number-1)之间的每一个整数去除,若都不能被整除,则number就是一个素数

#include <stdio.h>
int main()
{
	int i, j, number;
	j = 0;
	printf("Prime Numbers have the following :\n");
	for (number = 100; number <= 200; number++)   //举出100-200之间的数字 
	{
		for(i = 2; i <= number-1; i++)  //从2开始,使用辗转相除法进行计算
		{
			if(number % i == 0)        //若条件成立,则余数为0,不是素数
			{
				break;
			}                
		} 
		if (i >= number)         //判断要打印的素数是否满足大于本身 
		{
			printf ("%d\t", number);   
			j++;               //对素数的数目进行累计 
			if ( j % 6 == 0)      //每行输出6个数字
			printf ("\n");
		}
	} 
	printf("\n");
	return 0;
}

2、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如153是一个水仙花数,因为153=13 +53 + 33

for循环

//输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。
//在任务一第一题求三个数各各位之和的基础上加循环和判断
//用for循环

#include <stdio.h>

int main()
{
	int a,b,c,j=0,n;
	printf("Daffodil numbers have the following : \n");
	for (n=100; n<1000; n++) //从100开始逐个开始检验
	{
		a=n/100;     //百位
		b=n/10%10;   //十位
		c=n%10;      //个位
		if(n==a*a*a+b*b*b+c*c*c)
		{
			printf("%d\t",n);
			j++;
			if (j%3==0)   //结果每行输出3个
			{
				printf("\n");
			}
		}
	}
	printf("\n"); //这行代码目的是为了输出结果美观,若要求每行2个或4个,可去掉这一行
	return 0;
}

while循环

//水仙花问题,用while循环

#include <stdio.h>

int main()
{
	int a,b,c,j=0,n=100;
	printf("Daffodil numbers have the following : \n");
	while ( n<1000) //用while时,要事先定义n=100。
	{               //若将n=100,放在while循环里,结果不显示。
		a=n/100;     //百位
		b=n/10%10;   //十位
		c=n%10;      //个位
		if(n==a*a*a+b*b*b+c*c*c)
		{
			printf("%d\t",n);
			j++;
			if (j%2==0)   //结果每行输出2个
			{
				printf("\n");
			}
		}
		n++;
	}
	return 0;
}

do…while循环

//水仙花问题,用do...while循环
//do...while循环与while类似,都需要事先定义n=100。

#include <stdio.h>
int main()
{
	int a,b,c,j=0,n=100;
	printf("Daffodil numbers have the following : \n");
	do
	{              
		a=n/100;     //百位
		b=n/10%10;   //十位
		c=n%10;      //个位
		if(n==a*a*a+b*b*b+c*c*c)
		{
			printf("%d\t",n);
			j++;
			if (j%4==0)   //结果每行输出4个
			{
				printf("\n");
			}
		}
		n++;
	}while(n<1000);   //记得加分号“;”
	return 0;
}

数组

上机任务四
1、冒泡排序(从小到大,从大到小)
从小到大

#include <stdio.h>
void main()
{
	int a[10] = {23,22,34,56,23,78,69,31,34,56}; //静态赋值
	int i,j,t;
	for(j=0;j<9;j++)   
	{
		for(i=0;i<9-j;i++)  //数组内相邻数相比较
		{
			if(a[i]>a[i+1])
			{
				t=a[i];    //加入中间值,两值互换
				a[i]=a[i+1];
				a[i+1]=t;
			}
		}
	}
	printf("small to large : \n");
	
	for(i=0;i<10;i++)
	{
		printf("%5d",a[i]);   //%nd  输出n个数据宽度的整型
	}
	printf("\n");
} 
 //小--->大

从大到小

#include <stdio.h>
void main()
{
	//动态赋值
	int a[10],i,j,t;
	printf("please input 10 numbers :\n");
	for(i=0;i<=9;i++)
	{
		scanf("%d",&a[i]);
	}
	
	printf("\n");
	for (j=0;j<9;j++)
	{
		for (i=0;i<9-j;i++)
		{
			if (a[i+1]>a[i])
			{
				t=a[i+1]; 
				a[i+1]=a[i]; 
				a[i]=t;
			}
		}
	}
	printf("large to small is : \n");
	
	for (i=0;i<10;i++)
	{
		printf("%4d",a[i]);
	}
	printf("\n");
}

冒泡优化——显示每一轮的数组

#include <stdio.h>
#define n 5

int main()
{
	int array[n]={11,12,1,3,5};
	int i, j, temp, m, mark,g;
	int exchange=0,num=0;
	m = n;
	
	for (j=0;j<n;j++)
	{
		mark = 0;     //设置标志
		m--;         //每一趟确定最后一个元素(max或min),因此-1来减少冒泡次数!比如n个数,在第一趟第n-1次比较时,就确定了最后一个元素
		for (i=0;i<m;i++)
		{
			if (array[i]>array[i+1])
			{
				mark = 1;     //每次交换时,标志变为0
				temp = array[i];
				array[i] = array[i+1];
				array[i+1] = temp;
				exchange++;   //记下每次交换的次数
			}
			num++;            //记下排序的次数
			
		}
		
		printf("The %d  ford is:\n",j);
		for (g=0;g<n;g++)    //显示每一趟的数组
		{
			printf("%5d",array[g]);
		}	
		printf("\n");
	
		
		if (0 == mark)        //当没有发生交换时,结束循环,减少排序次数
		{
			break;
		}
	}
	
	printf("The number of sorts is %d\n",num);
	printf("The number of exchanges is %d\n",exchange);
	printf("The final array is:\n");
	
	for (i=0;i<n;i++)        //显示最终的数组
	{
		printf("%5d",array[i]);
	}
	printf("\n");
}

冒泡优化——显示实时数组

#include <stdio.h>
#define n 5

int main()
{
	int array[n]={11,12,1,3,5};
	int i, j, temp, m, mark,g;
	int exchange=0,num=0;
	m = n;
	
	for (j=0;j<n;j++)
	{
		mark = 0;     //设置标志
		m--;         //每一趟确定最后一个元素(max或min),因此-1来减少冒泡次数!比如n个数,在第一趟第n-1次比较时,就确定了最后一个元素
		for (i=0;i<m;i++)
		{
			if (array[i]>array[i+1])
			{
				mark = 1;     //每次交换时,标志变为0
				temp = array[i];
				array[i] = array[i+1];
				array[i+1] = temp;
				exchange++;   //记下每次交换的次数
			}
			num++;            //记下排序的次数
			printf("The %d  array is:\n",num);
			for (g=0;g<n;g++)    //显示实时的数组
			{
				printf("%5d",array[g]);
			}
			printf("\n");			
		}
		printf("\n");
		
		if (0 == mark)        //当没有发生交换时,结束循环,减少排序次数
		{
			break;
		}
	}
	
	printf("The number of sorts is %d\n",num);
	printf("The number of exchanges is %d\n",exchange);
	printf("The final array is:\n");
	
	for (i=0;i<n;i++)        //显示最终的数组
	{
		printf("%5d",array[i]);
	}
	printf("\n");
}

2、求取数组的序号:已知一个整数数组,求出这个数组中每个元素在整个数组的排序。例:
数组:{23,22,34,56,23,78,69,31,34,56},得到的数组排序序号为:{ 8, 10, 5, 3, 8, 1, 2, 7, 5, 3}。

#include<stdio.h>
#define n 10

int main() 
{
	int rank[n]={1,1,1,1,1,1,1,1,1,1};
	int a[n] = {23,22,34,56,23,78,69,31,34,56};
	int i,j;
	for (i = 1;i < n;i++)
	{
		for (j = 0;j < i;j++)
		{
			if (a[i] <a[j])
			{
				rank[i]=rank[i]+1;
			}
			else if(a[i]>a[j])
			{
				rank[j]=rank[j]+1;
			}
			else
			{
				rank[i]=rank[i];
				rank[j]=rank[j];
			}
		}
		 
	}
	
	printf("score\t");
	printf("rank\t");
	printf("\n"); 
	
    for(i=0;i<n;i++)
	{  
	    printf(" %d \t",a[i]);
		printf(" %d\t\n", rank[i]);
    }
}

3、求一个数组中的最大值和最小值
这是一维数组

#include <stdio.h>
void main()
{
	int a[10]={23,22,34,56,23,78,69,31,34,56};
	int i,max_column,min_column;
	int max = a[0];
	int min = a[0];
	for (i = 0; i < 10; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
			max_column = i;
		}
		if (min > a[i])
		{
			min = a[i];
			min_column = i;
		}
	}
	printf("max = %d ,max_column = %d\n",max,max_column);
	printf("min = %d ,min_column = %d\n",min,min_column);
	
} 

//一维数组,最大值和最小值及其相应的序号

这是多维数组

#include <stdio.h>
void main()
{
	int i,j,row=0,colum=0,max;
	int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,5,2}};
	max =a[0][0];
	for (i=0;i<=2;i++)
	{
		for (j=0;j<=3;j++)
		{
			if (a[i] [j] > max)
			{
				max =a[i][j];row=i;colum=j;
			}
		}
	}
	printf("max = %d,row=%d,colum=%d\n",max,row,colum);
}
//多维数组,最大值及序号

4、统计单词,例如:对于一个句子I love you,单词个数为4个。注意单词之间隔开的空格不只一个。

#include<stdio.h>

void main()
{
	char str[100] = "I love you";
	int i,count=0,flag=0;
	for(i=0;(str[i])!='\0';i++)                       //判断是否达到字符串结尾.
	{
		if( str[i] == ' ' )      
		{
			flag=0;                                    //当识别为空字符时,flag为0;当识别为字母时,flag为1。
		}                                              //若一个单词的字母大于1时,识别仍为字母,但flag为1,
		else if(flag==0) 								//为了不让count+1,设置一个标志位。 
		{                 								//直到这个单词识别完毕,开始识别下一个单词为止。
			flag=1;
			count++;
		}
	}                  									//count表示输入单词的总数目
	printf("The sentence you input contains %d English words\n",count);
}

函数

上机任务五
1、递归函数,求任意数阶乘,试试你的计算机能够算到最大数的阶乘

#include <stdio.h>

long recursion(int n); //声明

void main()
{
	int n;
	long result;
	printf("input a integer number:\n");
	scanf("%d",&n);
	result = recursion(n);
	printf("%d! = %5d\n",n,result);
}

long recursion(int n)
{
	long temp_result;
	if(n<0)
	{
		printf("n<0,input error!\n");
	}
	else if (n == 0 || n == 1)
	{
		temp_result=1;
	}
	else 
	{
		temp_result = recursion(n-1)*n;
	}
	return temp_result;
}

2、求100到200之间的素数。要求:①将素数的判断写成函数;②写出main函数调用过程,每行输出5个素数后换行。

#include <stdio.h>
int j=0;
void isleap(int num); //声明

int main()
{
	int i,t;
	printf("Prime Numbers have the following:\n");
	isleap(t);     //调用
	printf("\n");
}

void isleap(int n) // 定义
{
	int i;
	for (n=100;n<=200;n++)
	{
		for(i=2;i<n;i++)
		{
			if (n % i == 0)
			{
				break;
			}
		}
		if (i>=n)
		{
			printf("%d\t",n);
			j++;
			if(j % 5 ==0)
			printf("\n");
		}
	}
}

3、将第4次上机的第1题中排序写成函数形式即将冒泡排序写成函数

#include <stdio.h>
#define n 10
void sort(int *a,int k);
void print(int *a,int k);

int main()
{
	int b[]={23,22,34,56,23,78,69,31,34,56};
	sort(b,n);
	print(b,n);
	return 0;
}

void sort(int *a,int k)
{
	int i,j,m,flag,temp;
	m=n;
	for(j=0;j<n;j++)
	{
		flag=0;
		m--;
		for(i=0;i<m;i++)
		{
			if((*(a+i))<(*(a+i+1)))
			{
				flag=1;
				temp=(*(a+i));     //*(a+i)与a[i]等价
				(*(a+i))=(*(a+i+1));
				(*(a+i+1))=temp;
			}
		}
		if(0==flag)
		{
			break;
		}
	}
}

void print(int *a,int k)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\t",*(a+i));
	}
	printf("\n");
}

4、将第4次上机的第2题中写成函数形式

#include<stdio.h>
#define n 10
int rank(int *str,int *a);  //声明
int main()
{
	int str1[]={23,22,34,56,23,78,69,31,34,56};
	int a1[]={1,1,1,1,1,1,1,1,1,1};
	rank(str1,a1);  //调用
	return 0;
}

int rank(int *str,int *a)  //定义
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<i;j++)
		{
			if(str[i]>str[j])
			{
				a[j]=a[j]+1;
			}
			else if(str[i]<str[j])
			{
				a[i]=a[i]+1;
			}
			else
			{
				a[i]=a[i];
				a[j]=a[j];
			}
			
		}
	}
	printf("score\t rank\t\n");
	for(i=0;i<n;i++)
	{
		printf("%d\t%d\t\n",str[i],a[i]);
	}
	return 0;
}

指针

上机任务六
1、设计2个数的交换函数,用指针变量作参数

#include <stdio.h>
void swap(int *x,int *y);

main()
{
	int a,b;
	int *p1,*p2;
	printf("please input two numbers:\n");
	scanf("%d %d",&a,&b);
	p1=&a;
	p2=&b;
	swap(p1,p2);
	printf("a=%d,b=%d\n",a,b);
	return 0;
}

void swap(int *x,int *y)
{
	int temp;
	temp=*x;
	*x=*y;
	*y=temp;
}

2、输入一行字符串,统计其中有多少个单词,单词之间用空格隔开。例:
字符串:I am a boy,得到结果是4个单词。
要求:①字符串有多少个单词写成函数。例如:int WordNum(char *s)//输入参数char *s是字符串指针,输出参数是单词个数;② 写出main调用过程,测试函数的结果。

#include<stdio.h>

int WordNum(char *s);
char str[100]="I love you";
int main()
{
	int num;
	num=WordNum(str);
	printf("%d\n",num);
	return 0;
}

int WordNum(char *s)
{
	int i,count=0,flag=0;
	for(i=0;(str[i]) != '\0';i++)
	{
		if( str[i] == ' ' )
		{
			flag=0;
		}
		else if(flag == 0)
		{
			flag=1;
			count++;
		}
	}
	return count;
}

3、改写函数strlen

#include <stdio.h>
int mystrlen(char *str);

void main()
{
	char str[20] = "I love you";
	printf("%d\n",mystrlen(str));
}

int mystrlen(char *str)
{
	int n=0;                                   
	while (str[n] != '\0')               
	{
		n++;
	}
	return n;
}

//字符串长度测试函数strlen
//功能:计算字符串的实际长度(不包含字符串结束标志'\0'),作为其函数返回值
//"i love you" :8个字母+2个空格=10=n.

4、改写函数strcpy

#include<stdio.h>
void my_strcpy(char arr1[],char brr1[])  //此时被调用函数的定义在主函数之前 所以被调用函数不用声明
{
	int j=0;
	int k=0;
    while(brr1[j]!=0)
	{
        arr1[j]=brr1[j];
        j++;
	}
    arr1[j]='\0';            //最后必须以‘\0’结束
    while(arr1[k]!=0)       //打印复制后的字符串
	{
		printf("%c",arr1[k]);
        k++;
	}
}
void main()
{
    char arr[]="hello";
    char brr[]="world";
    my_strcpy(arr,brr);  //调用strcpy函数
    printf("\n");
}

用for

#include <stdio.h>
void mystrcpy (char *src,char *des);

int main()
{
	char des[50]="I love you";
	char src[50]="uuuuuuuuuuuuuu";
	mystrcpy(src,des);
	printf("%s\n",src);
	return 0;
}

void mystrcpy (char *src,char *des)
{
	int i;
	for(i=0;des[i] != '\0';i++)
	{
		src[i]=des[i];
	}
	src[i] = '\0'; 
}

用while

#include <stdio.h>
void mystrcpy (char *src,char *des);

int main()
{
	char des[50]="I love you";  
	char src[50]="uuuuuuuuuuuuuuuuuuuu";
	mystrcpy(src,des);
	printf("%s\n",src);
	return 0;
}

void mystrcpy (char *src,char *des)
{
	int i=0;
	while(des[i] != '\0') //des[10]='u';  des[11]='\0'
	{
		src[i]=des[i];  //当des[10] != '\0'的时候,继续赋值
		i++;            //然后i+1,此时i=11
	}
	src[i] = '\0';  //此时i=11,des[11]='\0'
}

版权声明:本文为kundezui原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。