1. 程式人生 > >大一學C語言做過的作業。

大一學C語言做過的作業。

本人用得教科書是《C程式設計(第四版)》譚浩強 著  清華大學出版社。大一的時候剛上大學,也沒統一的交報告的格式,作業也沒備註題目跟要求,就只有一個文字,想想大一還真的是好蠢萌。

下面放出大一上學期學的C語言所做過的作業。

  1. 輸入一個數,判斷是正數、負數還是零。(第七題)
#include <stdio.h>
int main()
{
	int x;
	printf("請輸入x的值:");
	scanf("%d",&x);
	if(x<0)
		printf("Y=-1\n");
	else
	   	if(x=0)
			 printf("Y=0\n");
		else
			 printf("Y=1\n");
	return 0;
}
測試結果:
請輸入x的值:4
Y=1
Press any key to continue
請輸入x的值:0
Y=0
Press any key to continue
請輸入x的值:-9
Y=-1
Press any key to continue
2. 輸入一個小於10000的正整數,將其每個位數輸出,並且逆序輸出。(第9題)
#include <stdio.h>
#include <math.h>
int main()
{
	int num,weishu,ge,shi,bai,qian,wan;
	printf("請輸入一個小於10000的正整數\n");
	scanf("%d",&num);
		if(num>9999)
		  weishu=5;
		else
			if(num>999)
				weishu=4;
			else
				if(num>99)
					weishu=3;
				else
					if(num>9)
						weishu=2;
			else weishu=1;
				printf("你輸入的數為%d位數\n",weishu);
	wan=num/10000;
	qian=(int)(num-wan*10000)/1000;
	bai=(int)(num-wan*10000-qian*1000)/100;
	shi=(int)(num-wan*10000-qian*1000-bai*100)/10;
	ge=(int)(num-wan*10000-qian*1000-bai*100-shi*10);
switch(weishu)
	{
	case 5:printf("每位數字為:%d,%d,%d,%d,%d\n",wan,qian,bai,shi,ge);	
		   printf("逆序輸出為:%d,%d,%d,%d,%d\n",ge,shi,bai,qian,wan);break;
	case 4:printf("每位數字為:%d,%d,%d,%d\n",qian,bai,shi,ge);
		   printf("逆序輸出為:%d,%d,%d,%d\n",ge,shi,bai,qian);break;
	case 3:printf("每位數字為:%d,%d,%d\n",bai,shi,ge);
		   printf("逆序輸出為:%d,%d,%d\n",ge,shi,bai);break;
	case 2:printf("每位數字為:%d,%d\n",shi,ge);
		   printf("逆序輸出為:%d,%d\n",ge,shi);break;
	case 1:printf("每位數字為:%d\n",ge);
		   printf("逆序輸出為:%d\n",ge);break;
	}
	return 0;

}
測試結果:
請輸入一個小於10000的正整數
8998
你輸入的數為4位數
每位數字為:8,9,9,8
逆序輸出為:8,9,9,8
Press any key to continue

3. 輸入4個數字,讓其從小到大排序。(第11題)
#include <stdio.h>
int main()
	{
	int a,b,c,d,i;
	printf("請輸入4個數字,以逗號隔開\n");
	scanf("%d,%d,%d,%d",&a,&b,&c,&d);
	printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
		if(a>b)
		{i=a;a=b;b=i;}
		if(a>c)
		{i=a;a=c;c=i;}
		if(a>d)
		{i=a,a=d;d=i;}
		if(b>c)
		{i=b;b=c;c=i;}
		if(b>d)
		{i=b;b=d;d=i;}
		if(c>d)
		{i=c;c=d;d=i;}
	printf("從小到大排序為:%d %d %d %d\n",a,b,c,d);
	return 0;
	}
測試結果:
請輸入4個數字,以逗號隔開
5,9,2,11
a=5,b=9,c=2,d=11
從小到大排序為:2 5 9 11
Press any key to continue

4. 求三位數的水仙花數。(第八題)
#include <stdio.h>
#include <math.h>
int main()
{
	 int a,b,c,i;
	 printf("水仙花數為:\n");
	 for(i=100;i<1000;i++)
	 {
		 a=i/100;
		 b=i/10-a*10;
		 c=i%10;
		 if (i==pow(a,3)+pow(b,3)+pow(c,3))
			 printf("%d\n",i);
	 }
 return 0;
}
測試結果:
水仙花數為:
153
370
371
407
Press any key to continue

5. 用c語言求下列分數序列的前20項之和(第10題)
#include <stdio.h>
int main()
{
	int i,n=20;
	float a=2,b=1,c,s=0;
	for(i=1;i<=n;i++)
	{
		s=s+a/b;
		c=a;
		a=a+b;
		b=c;
	}
	printf("前20項之和為:%f \n\n",s);
return 0;
}
測試結果:
前20項之和為:32.660261

Press any key to continue

6. 一個球從100m高度自由落下,每次落地後反彈回原來高度的一半,再落下.求它在第10次落地並反彈到最高點,共經過多少m?第10次反彈多高?(第11題)
#include <stdio.h>
int main()
{
	int i,n=10;
	float s=100,h=s/2;
	for(i=2;i<=n;i++)
	{
		s=s+2*h;
		h=h/2;
	}
	printf("小球下落10次共行駛的路程為:%f 米\n\n",s);
	printf("小球下落10次反彈高度為:%f 米\n\n",h);
return 0;
}
測試結果:
小球下落10次共行駛的路程為:299.609375 米


小球下落10次反彈高度為:0.097656 米


Press any key to continue

7. 輸出楊輝三角。(第6題)
#include <stdio.h>
#define N 40 
void main() 
{ 
	int a[N][N]={0},M;
	int i,j;
	printf("請輸入需要輸出的行數:");
	for(i=0;i<N;i++)
		a[i][0]=a[i][i]=1;
	for(i=2;i<N;i++)
		for(j=1;j<i;j++) 
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		scanf("%d",&M);
		 for(i=0;i<M;i++)
		{ 
			for(j=0;j<=i;j++) 
				printf("%-5d",a[i][j]);
			printf("\n");
		}
 }
測試結果:
請輸入需要輸出的行數:10
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5   10  10  5   1
1   6   15  20  15  6   1
1   7   21  35  35  21  7   1
1   8   28  56  70  56  28  8   1
1   9   36  84  126 126 84  36  9   1
Press any key to continue

請輸入需要輸出的行數:15
1
1   1
1   2   1
1   3   3   1
1   4   6   4   1
1   5   10  10  5   1
1   6   15  20  15  6   1
1   7   21  35  35  21  7   1
1   8   28  56  70  56  28  8   1
1   9   36  84  126 126 84  36  9   1
1   10  45  120 210 252 210 120 45  10  1
1   11  55  165 330 462 462 330 165 55  11  1
1   12  66  220 495 792 924 792 495 220 66  12  1
1   13  78  286 715 1287171617161287715 286 78  13  1
1   14  91  364 1001200230033432300320021001364 91  14  1
Press any key to continue

8. 利用折半查詢法找數。(第9題)
#include<stdio.h>
#define N 15
void main()
{
	int i,number,top,bott,mid,loca,a[N],flag=1,sign;
	char c;
	printf("由大到小輸入15個數 :\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[0]);
		i++;
		while(i!=-1&&i<N)
		{
			scanf("%d",&a[i]);
			if(a[i]<a[i-1])
				i++;
			else
			{
				printf("輸入有誤,請重新輸入:\n");
				i=-1;
			}
		}
	}
	printf("\n");
	for(i=0;i<N;i++)
	printf("%4d",a[i]);
	printf("\n");
	while(flag)
		{
			printf("尋找:");
			scanf("%d",&number);
			sign=0;
			top=0;
			bott=N-1;
			if((number<a[0])||(number>a[N-1]))
				loca=-1;
			while((!sign)&&(top<=bott))
				{
					mid=(bott+top)/2;
					if(number==a[mid])
						{
							loca=mid;
							printf("找到%d,它是第%d個數\n",number,loca+1);
							sign=1;
						}
					else if(number>a[mid])
					bott=mid-1;
					else
					top=mid+1;
				}
	if(!sign||loca==-1)
	printf("無此數\n");
	printf("如繼續尋找,請輸入數字;否則按n/N");
	scanf("%c",&c);
	if(c=='N'||c=='n')
	flag=0;
	printf("\n");
	}
}
測試結果:
由大到小輸入15個數 :
5
4
6
輸入有誤,請重新輸入:
55
44
33
22
21
20
18
16
15
14
9
8
3
2
1


  55  44  33  22  21  20  18  16  15  14   9   8   3   2   1
尋找:4
無此數
如繼續尋找,請輸入數字;否則按n/N
尋找:9
找到9,它是第11個數
如繼續尋找,請輸入數字;否則按n/N
尋找:20
找到20,它是第6個數
如繼續尋找,請輸入數字;否則按n/N
尋找:n
找到20,它是第6個數
如繼續尋找,請輸入數字;否則按n/N
Press any key to continue
9. 輸入3行字串,找出其中的大寫字母、小寫字母、數字,空格以及其他字元的個數。(第10題)
#include <stdio.h>
int main()
	{
		int i,j,upp,low,dig,spa,oth;
		char text[3][80];
		upp=low=dig=spa=oth=0;
		for (i=0;i<3;i++)
			{ 
				printf("請輸入第%d行的文字:\n",i+1);
				gets(text[i]);
					for (j=0;j<80 && text[i][j]!='\0';j++)
					{
						if (text[i][j]>='A'&& text[i][j]<='Z')
							upp++;
						else if (text[i][j]>='a' && text[i][j]<='z')
							low++;
						else if (text[i][j]>='0' && text[i][j]<='9')
							dig++;
						else if (text[i][j]==' ')
							spa++;
						else
							oth++;
					 }
			  }
		printf("\n\n\n大寫字母個數為: %d\n",upp);
		printf("小寫字母個數為: %d\n",low);
		printf("數字的個數為  : %d\n",dig);
		printf("空格的個數為  : %d\n",spa);
		printf("其他字元個數為: %d\n",oth);
		return 0;
	}
測試結果:
請輸入第1行的文字:
s4d5fas4df53as4d5fas
請輸入第2行的文字:
JKHJKHKLH2389p8*/-*
請輸入第3行的文字:
sd6f5+asdf+5as+d6f5+a

大寫字母個數為: 9
小寫字母個數為: 26
數字的個數為  : 17
空格的個數為  : 0
其他字元個數為: 8
Press any key to continue

10.輸入一段文字,找出其中的大寫字母、小寫字母、數字,空格以及其他字元的個數。(第9題)
#include <stdio.h>
int zimu,shuzi,kongge,qita;
int main(){
	void count(char []);
	char text[100];
	printf("請輸入一段文字:\n");
	gets(text);
	zimu=0;
	shuzi=0;
	kongge=0;
	qita=0;
	count(text);
	printf("此文章有:\n");
	printf("字母%d個\n",zimu);
	printf("數字%d個\n",shuzi);
	printf("空格%d個\n",kongge);
	printf("其他字元%d個\n",qita);
	return 0;
}


void count(char str[]){
	int i;
	for(i=0;str[i]!='\0';i++)
		if((str[i]>='a' && str[i]<='z' )|| (str[i]>='A' && str[i]<='Z'))
			zimu++;
		else if(str[i]>='0' && str[i]<='9')
			shuzi++;
		else if(str[i]==32)
			kongge++;
		else 
			qita++;
}
測試結果:
請輸入一段文字:
sdf a9+f8 9w+e8f*-/*-wef+98+98,+9l8.9;lkl.kj,fh+9j 8s+93245+1 92898df
此文章有:
字母23個
數字24個
空格4個
其他字元18個
Press any key to continue
11. 寫程式完成下面條件:1)輸入10個職工的姓名和職工號;2)按職工號由小到大的順序排序;3)要求輸入一個職工號,用折半法查找出該職工的姓名,從主函式輸入要查詢的職工號,輸出該職工的姓名。(第15題)
#include<stdio.h>
#include<string.h>
#define N 10
void main()
{
 void input(int[],char name[][8]);
 void sort(int[],char name[][8]);
 void search(int,int[],char name[][8]);
 int num[N],number,flag=1,c;
 char name[N][8];
 input(num,name);
 sort(num,name);
 while(flag==1)
 {
  printf("\n請輸入要查詢的職工號:");
  scanf("%d",&number);
  search(number,num,name);
  printf("是否繼續?Y/N");
  getchar();
  c=getchar();
  if(c=='N'||c=='n')
   flag=0;
 }
}
void input(int num[],char name[N][8])
{
 int i;
 for(i=0;i<N;i++)
 {
  printf("請輸入職工號:");
  scanf("%d",&num[i]);
  printf("請輸入職工名字:");
  getchar();
  gets(name[i]);
 }
}
void sort(int num[],char name[N][8])
{
 int i,j,min,temp1;
 char temp2[8];
 for(i=0;i<N-1;i++)
 {
  min=i;
  for(j=i;j<N;j++)
      if(num[min]>num[j])
       min=j;
  temp1=num[i];
  strcpy(temp2,name[i]);
  num[i]=num[min];
  strcpy(name[i],name[min]);
  num[min]=temp1;
  strcpy(name[min],temp2);
 }
 printf("\n排序輸出:\n");
 for(i=0;i<N;i++)
  printf("\n%5d %10s",num[i],name[i]);
}
void search(int n,int num[],char name[N][8])
{
 int top,bott,mid,loca,sign;
 top=0;
 bott=N-1;
 loca=0;
 sign=1;
 if((n<num[0])||(n>num[N-1]))
  loca=-1;
 while((sign==1)&&(top<=bott))
 {
  mid=(bott+top)/2;
  if(n==num[mid])
  {
   loca=mid;
   printf("職工號是%d的是%s\n",n,name[loca]);
   sign=-1;
  }
  else if(n<num[mid])
   bott=mid-1;
  else
   top=mid+1;
 }
 if(sign==1||loca==-1)
  printf("%d不在名單中\n",n);
}
測試結果:


請輸入職工號:1
請輸入職工名字:a
請輸入職工號:2
請輸入職工名字:b
請輸入職工號:3
請輸入職工名字:c
請輸入職工號:9
請輸入職工名字:d
請輸入職工號:8
請輸入職工名字:e
請輸入職工號:7
請輸入職工名字:f
請輸入職工號:6
請輸入職工名字:g
請輸入職工號:5
請輸入職工名字:h
請輸入職工號:10
請輸入職工名字:zzz
請輸入職工號:13
請輸入職工名字:werwe


排序輸出:


    1          a
    2          b
    3          c
    5          h
    6          g
    7          f
    8          e
    9          d
   10        zzz
   13      werwe
請輸入要查詢的職工號:7
職工號是7的是f
是否繼續?Y/Ny


請輸入要查詢的職工號:3
職工號是3的是c
是否繼續?Y/Nn
Press any key to continue
12. 題目忘記啦,哭(第17題)
#include <stdio.h>
int main()
{
	void convert(int n);
	int number;
	printf("請輸入一個整數:\n");
	scanf("%d",&number);
	printf("輸出:");
	if(number<0)
	{
		putchar('-');
		putchar(' ');
		number=-number;
	}
	convert(number);
	printf("\n\n");
	return 0;
}

void convert(int n)
{
	int i;
	if((i=n/10)!=0)
	convert(i);
	putchar(n%10+'0');
	putchar(32);
}
測試結果:
請輸入整數:
2345678
輸出:2 3 4 5 6 7 8


Press any key to continue

請輸入整數:
-345697
輸出:- 3 4 5 6 9 7


Press any key to continue

13. 輸入3個數字,從小到大排列。(第一題)
#include<stdio.h>
int main()
{
	void swap(int *p1,int *p2);
	int a,b,c;
	int *point1,*point2,*point3;
	printf("請輸入3個數字:");
	scanf("%d %d %d",&a,&b,&c);
		point1=&a;
		point2=&b;
		point3=&c;
	 if(a>b)
	   swap(point1,point2);
     if(a>c)
	   swap(point1,point3);
	 if(b>c)
	   swap(point2,point3);
	 printf("從小到大排列為:%d %d %d",a,b,c);
	 printf("\n\n");
	return 0;
}


void swap(int *p1,int *p2)
{
 int p;
 p=*p1;
 *p1=*p2;
 *p2=p;
}
測試結果:
請輸入3個數字:  99 44 88
從小到大排列為:44 88 99

Press any key to continue

14. 編寫C語言程式,輸入陣列,最大的與第一個元素交換,最小的與最後一個元素交換,輸出陣列。(第三題)
#include<stdio.h>
int main()
{
	void input(int *);
	void paixu(int *);
	void output(int *);
	int number[10];
	input(number);
	paixu(number);
	output(number);
	return 0;
}

void input(int *number)
{
	int i;
	printf("請輸入10個整數:");
	for(i=0;i<10;i++)
		scanf("%d",&number[i]);
}

void paixu(int *number)
{
	int *max,*min,*p,temp;
	max=min=number;
	for(p=number+1;p<number+10;p++)
		if(*p>*max)
			max=p;
		else if(*p<*min)
			min=p;
	temp=number[0];
	number[0]=*min;
	*min=temp;
	if(max==number)
		max=min;
	temp=number[9];
	number[9]=*max;
	*max=temp;
}

void output(int *number)
{
	int *p;
	printf("這10個數分別是: ");
	for(p=number;p<number+10;p++)
		printf("%d    ",*p);
	printf("\n\n\n");
}
測試結果:
請輸入10個整數:9 8 5 545 123 4658 878 9 4 1 
這10個數分別是: 1    8    5    545    123    9    878    9    4    4658

Press any key to continue
15. 輸入一行文字,找出其中的大寫字母、小寫字母、數字,空格以及其他字元的個數。(第八題)
#include<stdio.h>
int main()
{
	int daxie=0,xiaoxie=0,shuzi=0,kongge=0,qita=0,i=0;
	char *p,s[200];
	printf("輸入一行文字: ");
	while((s[i]=getchar())!='\n')
		i++;
	p=&s[0];
	while(*p!='\n')
		{
			if((*p>='A')&&(*p<='Z'))
				daxie++;
			else if((*p>='a')&&(*p<='z'))
				xiaoxie++;
			else if(*p==' ')
				kongge++;
			else if((*p<='9')&&(*p>='0'))
				shuzi++;
			else
				qita++;
	p++;
		}
	printf("大寫字母有: %d 個.\n小寫字母有: %d 個 .\n數字有: %d 個.\n空格有: %d 個.\n其他字元有: %d 個.\n",daxie,xiaoxie,shuzi,kongge,qita);
	return 0;
}
測試結果:
輸入一行文字: sdf+ asd8f +as98df +9as8d+f98UYSAGTEFOIAYWE FIO23Y4982374980237490 82 34 Q 9 O u kDF+9G +6DFG +6 +6 DG+65  S+6
大寫字母有: 29 個.
小寫字母有: 17 個 .
數字有: 37 個.
空格有: 16 個.
其他字元有: 10 個.
Press any key to continue
16. 輸入5個學生的學號、姓名、分數1、分數2以及分數3並輸出。(第三題)
#include<stdio.h>
#define N 5
struct student
{
	char num[6];
	char name[8];
	int score[4];
}stu[N];

int main()
{
	void print(struct student stu[6]);
	int i,j;
	for(i=0;i<N;i++)
		{
			printf("\n請輸入第%d個學生的資料 :\n",i+1);
			printf("學號: ");
			scanf("%s",stu[i].num);
			printf("姓名: ");
			scanf("%s",stu[i].name);
			for(j=0;j<3;j++)
				{
					printf("分數 %d:",j+1);
					scanf("%d",&stu[i].score[j]);
				}
			printf("\n");
		}	
	print(stu);
	return 0;
}


void print(struct student stu[6])
{
	int i,j;
	printf("\n學號\t姓名\t分數1\t分數2\t分數3\n");
	for(i=0;i<N;i++)
		{
			printf("%5s %10s",stu[i].num,stu[i].name);
			for(j=0;j<3;j++)
				printf("%9d",stu[i].score[j]);
			printf("\n");
		}
}
測試結果:
請輸入第1個學生的資料 :
學號: 1
姓名: sb1
分數 1:100
分數 2:10
分數 3:1


請輸入第2個學生的資料 :
學號: 2
姓名: sb2
分數 1:1
分數 2:10
分數 3:100


請輸入第3個學生的資料 :
學號: 3
姓名: sb3
分數 1:4
分數 2:5
分數 3:6


請輸入第4個學生的資料 :
學號: 4
姓名: sb4
分數 1:7
分數 2:8
分數 3:9


請輸入第5個學生的資料 :
學號: 5
姓名: sb5
分數 1:3
分數 2:2
分數 3:1




學號    姓名    分數1   分數2   分數3
    1        sb1      100       10        1
    2        sb2        1       10      100
    3        sb3        4        5        6
    4        sb4        7        8        9
    5        sb5        3        2        1
Press any key to continue