本文代码亲测有效,转载请注明出处
顺序结构程序设计
上机任务一
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'
}