C语言期末考试编程题练习

1.结构体存学生信息,冒泡排序总成绩

#include <stdio.h>
#define MAX_N 100
struct Student{
	char name[20];
	char id[10];
	float ma,ch,total;
} stu[MAX_N];

void main(){
  int n=4,i,j;
  printf("请输入学生人数n=\n");
  scanf("%d",&n);
  printf("请输入学生信息:\n");
	for(i=0;i<n;i++){
		scanf("%s %s %f %f", &stu[i].name,&stu[i].id,&stu[i].ma,&stu[i].ch);
		stu[i].total=(stu[i].ma+stu[i].ch)/2;
	}
	for(i=0;i<n-1;i++){
		for(j=0;j<n-1-i;j++){
			if(stu[j].total>stu[j+1].total){
				struct Student mid;
				mid=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=mid;
			}
		}
	}
	for(i=0;i<n;i++) printf("%s %s %.2f\n", stu[i].name,stu[i].id,stu[i].total);
}

2.平闰年

#include <stdio.h>
void main() {
  int year;
  printf("请输入年份(正整数):");
  scanf("%d", &year);
  (year%4==0&&year%100!=0||year%400==0)?printf("%d年是闰年", year):printf("%年是平年", year);
}

3.某年某月天数

#include <stdio.h>
void main()
{
	int year,month,day;
	scanf("%d %d", &year, &month);
	switch(month){
		case 1: case 3: case 5: case 7: case 8: case 10: case 12:
			day = 31;
			break;
		case 4: case 6: case 9: case 11:
			day = 30;
			break;
		case 2: day=(year%4==0&&year%100!=0||year%400==0)?29:28;
	}
	printf("%d年%d月有%d天", year, month, day);
}

4.数组最大值平均数

#include <stdio.h>
#define MAX_N 100
void main() {
    float nums[MAX_N];
	int n,i;
	float max,avg;
	printf("请输入数组个数n=");
	scanf("%d",&n);
	for (i=0;i<n;i++) {
	  scanf("%f",&nums[i]);
	  avg+=nums[i];
	}
	max=nums[0];
	for(i=0;i<n;i++) (max<nums[i])?(max=nums[i]):max; 
	printf("max=%.2f, avg=%.2f",max,avg/n);
}

5.递归模拟strlen

#include <stdio.h>
#define MAX_N 100
int Mylen(char *s){
	return (*s=='\0')?0:1+Mylen(++s);
}
void main() {
	char strs[MAX_N];
	printf("请输入字符串:");
	gets(strs);
	printf("len%s=%d",strs,Mylen(strs));
}

6.素数判断

函数传递

#include <stdio.h>
#include <math.h>
int total=0;
int prime(int num) {
	// 6n- 6n+1 6n+2- 6n+3- 6n+4- 6n+5
	if (num==2||num==3) return ++total;
	else if(num%6!=1&&num%6!=5) return 0;
	int i,sq=sqrt(num);
	for (i=5;i<sq+1;i+=6) {
		if (num%i==0||num%(i+2)==0) return 0;
	}
	return ++total;
}

void main() {
	int i;
	for (i=2;i<=100;i++) {
		if (prime(i)){
			printf("%d\t", i);
			total%5==0?printf("\n"):0;
		}
	}
}

嵌套循环

#include <stdio.h>
#include <math.h>
void main() {
	int i,j,isPrime=1;
	for (i=2;i<=100;i++){
		if (i==2||i==3) isPrime=1;
		else if (i%6!=1&&i%6!=5) isPrime=0;
		else {
			for (j=5;j<sqrt(i)+1;j+=6){
				if (i%j==0||i%(j+2)==0){
					isPrime=0;
					break;
				}
			}
		}
		(isPrime==1)?printf("%d\t", i):(isPrime=1);
	}
}

7.水仙花数

#include <stdio.h>
#include <math.h>
void main() {
	int i;
	for (i=100;i<1000;i++) (i==pow(i/100,3)+pow(i%10,3)+pow(i/10%10,3))?printf("%d\t", i):0;
}

8.冒泡排序从最大值输出

#include <stdio.h>
#define MAX_N 100
void main() {
    int n,i,j,a[MAX_N];
    printf("请输入数组长度n=");
    scanf("%d",&n);
    for (i=0;i<n;i++) scanf("%d", &a[i]);
    for (i=0;i<n-1;i++) {
    	for (j=0;j<n-1-i;j++){
    		if (a[j]>a[j+1]){
    			a[j]=a[j]^a[j+1];
    			a[j+1]=a[j+1]^a[j];
    			a[j]=a[j]^a[j+1];
			}
		}
		printf("%d\t",a[n-1-i]);
	}
	printf("%d",a[n-1-i]);
}

9.冒泡排序字符串数组

字符串仅通过赋值修改,否则使用strcpy()函数,指针数组不能修改字符串
指针数组字符串不可变,只能修改指针指向,不能修改字符串交换

#include <stdio.h>
#include <string.h>
void sort(char *m[], int n){
	char *t;
	int i,j;
	for(i=0;i<n-1;i++){
		for(j=0;j<n-1-i;j++){
			if(strcmp(m[j],m[j+1])>0){
				t=m[j];
				m[j]=m[j+1];
				m[j+1]=t;
			}
		}
	}
}

void main() {
	char *f[]={"peach", "grape", "pear", "banana", "apple"};
	int n=5,i;
	sort(f,n);
	for(i=0;i<n;i++) printf("%s\n",f[i]);
}

二维自定义输入字符串

#include <stdio.h>
#include <string.h>
#define MAX_N 100

void sort(char strs[][10], int n){
	int i,j;
	char mid[10];
	for(i=0;i<n-1;i++){
		for(j=0;j<n-i-1;j++){
			if(strcmp(strs[j],strs[j+1])>0){
				strcpy(mid,strs[j]);
				strcpy(strs[j],strs[j+1]);
				strcpy(strs[j+1],mid);
			}
		}
	}
}
void main() {
	char strs[MAX_N][10];
	int n,i;
	printf("请输入字符串数组个数n=");
	scanf("%d",&n);
	for(i=0;i<n;i++) scanf("%s",strs[i]);
	sort(strs,n);
	for(i=0;i<n;i++) printf("%s\t",strs[i]);
}

10.九九乘法表

void main(){
	int i,j;
	for (i=1;i<=9;i++){
		for (j=1;j<=i;j++) {
			printf("%d*%d=%-2d\t",j,i,i*j);
		}
		printf("\n");
	}
}

11.字符串反置

#include <stdio.h>
#include <string.h>
#define MAX_N 100
void reverse(char *left, char *right){
	char mid;
	while(left<right){
		mid = *left;
		*left = *right;
		*right = mid;
		left++;
		right--;
	}
}

void main() {
	char strs[MAX_N];
	printf("请输入字符串strs=");
	// welcome to the world of c!
	// scanf()录入会导致空格判定结束只能录进一个字符串
	gets(strs);
	int len=strlen(strs);
	reverse(strs,strs+len-1);
	// !c fo dlrow eht ot emoclew
	printf("%s\n",strs);
	char *start=strs,*end=strs;
	while(*start!='\0'){
		while(*end!=32&&*end!='\0') end++;
		reverse(start,end-1);
		end++;
		start=end;
	}
	// c! of world the to welcome
	printf("%s",strs);
}

12.斐波那契数列

  • 特殊公式法+递归
    F(n+m)=F(n+1)*F(m)+F(n)*F(m-1)
#include <stdio.h>
int fib(int n){
	// n为项数 
	return (n==1||n==2)?1:fib(n/2 + 1)*fib(n-n/2)+fib(n/2)*fib(n-n/2 - 1);
}
void main(){
	int n,i=1;
	printf("请输入n=");
	scanf("%d", &n);
	while(fib(i)<=n) printf("%d\t",fib(i++)); 
}
  • 递归
// 该递归属于多分支递归,会造成栈溢出。
int Fib(int x)
{
	if (x >= 2) return Fib(x - 1) + Fib(x - 2);
	else if (x == 1) return 1;
	else return 0;
}

13.大写转小写

#include <stdio.h>
#define MAX_N 100
void main(){
	char strs[MAX_N];
	int i=0;
	printf("请输入字符串"); 
	gets(strs);
	while(strs[i]!='\0') {
		if(strs[i]>=65&&strs[i]<=90) strs[i]+=32;
		printf("%c",strs[i++]);
	}
}

14.统计字符串字符个数

// 打表统计
#include <stdio.h>
#define MAX_N 100
void main()
{
    char s[MAX_N];
    int total[MAX_N]={0};
    gets(s);
    int i=0;
    while(s[i]!='\0'){
    	if (s[i]>=65&&s[i]<=90){
    		total[((int)s[i])-65]++;
		}
		else if (s[i]>=97&&s[i]<=122){
    		total[((int)s[i])-71]++;
		}
		else if (s[i]>=48&&s[i]<=57){
    		total[((int)s[i])+4]++;
		}
		else total[62]++;
    	i++;
	}
	for(i=0;i<=62;i++) {
		if(total[i]!=0) {
			if(i<=25)printf("%-2c有%-2d个\n",i+65,total[i]);
			else if(i<=51)printf("%-2c有%-2d个\n",i+71,total[i]);
			else if(i<=61)printf("%-2c有%-2d个\n",i-4,total[i]);
			else printf("其它字符串有%-2d个\n",total[i]);
		}
	}
}

15.杨辉三角形

#include <stdio.h>
int Tri(int r, int c) {  //杨辉三角算法函数
	return (c==1||c==r)?1:Tri(r-1,c-1)+Tri(r-1, c);
}
void main() {
    int i, j, n;
	printf("请输入杨辉三角形的行数(1 ~ 20):");
	scanf("%d", &n);
    for(i=1;i<=n;i++) { // 输出n行
		for(j=0;j<n-i;j++)	printf("%c%c%c",32,32,32);	//每行前面补空格,显示成等腰三角形
        for(j=1;j<=i;j++) printf("%-6d", Tri(i, j));	//计算并输出杨辉三角形
        printf("\n");
	}
}

16.递归阶乘

n = 0; n! = 1;
n > 0; n! = n*(n-1);

#include <stdio.h>
int kn(int n){
	return (n==0)?1:n*kn(n-1);
}
void main(){
	int n,i;
	printf("请输入阶乘数n=");
	scanf("%d", &n);
	printf("%d!=",n);
	for(i=n;i>0;i--) (i!=1)?printf("%d*",i):printf("%d",i);
	printf("=%d",kn(n));
}

17.汉诺塔

#include<stdio.h>

void move(char A, char C, int n){
	printf("把第%d个圆盘从%c--->%c\n", n, A, C);
}

void HanoiTower(char A, char B, char C, int n){
	if (n == 1) move(A, C, n);
	else{
		//将n-1个圆盘从A柱借助于C柱移动到B柱上
		HanoiTower(A, C, B, n - 1);
		//将A柱子最后一个圆盘移动到C柱上
		move(A, C, n);
		//将n-1个圆盘从B柱借助于A柱移动到C柱上
		HanoiTower(B, A, C, n - 1);
	}
}

void main(){
	int n = 0;
	printf("输入A柱子上的圆盘个数:");
	scanf("%d", &n);
	//将n个圆盘从A柱借助于B柱移动到C柱上
	HanoiTower('A', 'B', 'C', n);
}

18.回文数

#include <stdio.h>
#include <string.h>
#define MAX_N 100
void main() {
  char n[MAX_N];
  printf("请输入数字n=");
  gets(n);
  int len=strlen(n),i,flag=1;
  for(i=0;i<len/2+1;i++){
    if(n[i]!=n[len-1-i]) {
      flag=0;
      break;
    }
  }
  (flag==1)?printf("%s是回文数",n):printf("%s不是回文数",n);
}

19.输出对应月份英文

#include <stdio.h>
void main() {
  char *month[]={"Month:","January","February","March","April",
  					"May","June","July","August",
					  "September","October","November","December",};
  int mon;
  scanf("%d", &mon);
  printf("%s",month[mon]);
}

20.猴子摘桃

#include <stdio.h>
void main(){
	int day=10,total=1;
	while(day>0){
		printf("第%-2d天有%4d个桃子\n",day--,total);
		total=(total+1)*2;
	}	
}

21.逆序输出数字

#include <stdio.h>
void main(){
	int n;
	scanf("%d",&n);
	while(n>0){
		(n%10!=0)?printf("%d",n%10):0;
		n/=10;
	}
}

22.单链表

  • 链表:内存是不连续的,元素各自被分配一块内存,内存与内存之间通过指针相连

|data0|next0|->|data1|next1|->NULL
单链表操作:

  1. 增加
  • 头插法
>|data0|next0|->|data2|next2|===>|data1|next1|->NULL
  • 尾插法
>|data0|next0|->|data1|next1|===>|data2|next2|===>NULL
  1. 删除
    只需找到对应节点,将其上一节点连接指向到下一节点,即该节点前驱指向后继只需操作前序指针即可,并free释放该节点空间

|data0|next0|->->|data2|next2|->NULL
|data1|next1|===free

头节点(node0):保存链表元素个数,实际从第二链开始

  #include <stdio.h>
  #include <stdlib.h>
  typedef struct Node {
  	int data;
  	struct Node* next;
  } Node;

  Node* initList() {
  	Node* list = (Node*)malloc(sizeof(Node));
  	list->data = 0;
  	list->next = NULL;
  	return list;
  }

  void headInsert(Node* list, int data) {
  	Node* node = (Node*)malloc(sizeof(Node));
  	node->data = data;
  	node->next = list -> next;
  	list->next = node;
  	list->data++;
  }

  void tailInsert(Node* list, int data) {
  	Node* head = list;
  	Node* node = (Node*)malloc(sizeof(Node));
  	node->data = data;
  	node->next = NULL;
  	while (list->next) {
  		list = list->next;
  	}
  	list->next = node;
  	head->data++;
  }

  void Insert(Node* list) {
  	int s, i;
  	scanf("%d", &s);
  	for ( i=0;i<s;i++ ) {
  		int mid;
  		scanf("%d", &mid);
  		headInsert(list, mid);
  	}
  }

  void deleteNode(Node* list, int data) {
  	Node* current = list->next;
  	Node* pre = list;
  	while ( current ) {
  		if ( current->data==data ) {
  			pre->next = current->next;
  			free(current);
  			break;
  		}
  		pre = current;
  		current = current->next;
  	}
  	list->data--;
  }

  void printfList(Node* list) {
  	list = list->next;
  	while ( list ) {
  		printf("%d ", list->data);
  		list = list->next;
  	}
  	printf("\n");
  }

  int main() {
  	Node* list = initList();
  	tailInsert(list, 1);
  	tailInsert(list, 2);
  	tailInsert(list, 3);
  	printfList(list);
  //	Insert(list);
  //	printfList(list);
  	return 0;
  }
  • 10
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值