大一學C語言做過的作業。
阿新 • • 發佈:2018-10-31
本人用得教科書是《C程式設計(第四版)》譚浩強 著 清華大學出版社。大一的時候剛上大學,也沒統一的交報告的格式,作業也沒備註題目跟要求,就只有一個文字,想想大一還真的是好蠢萌。
下面放出大一上學期學的C語言所做過的作業。
- 輸入一個數,判斷是正數、負數還是零。(第七題)
測試結果:#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