专升本期间部分C语言程序整理

说明

这些程序是我在专升本期间在CSDN上上传的作业、练习等,仅为学习备考的一小部分程序,整理成一篇文章,方便专升本的学弟学妹参考。

时间:2021年~2022年专升本期间

字符串题

输入字符串提取 数字字符 并 求和 (4处错)

题目:输入一个字符串,将其数字符号选出按顺序组成一个整数并输出到屏幕上。

例如:输入-3#45^67@,得到-34567;输入3#4-5*67,得到34567。

#include<stdio.h>
#include<string.h>
int main()
{
	char s[50];
	int i,n=0;	//错误1:n没赋初值 
	gets(s);	//错误2:gets写成了get() 
	if(s[0]=='-')
		putchar(s[0]);
	for(i=0;i<strlen(s);i++)
	{
		if(s[i]>='0'&&s[i]<='9')
		{
			//错误3:①②写反了 
			n*=10;		//②
			n+=s[i]-'0';	//① 错误4:写成了 n=s[i]-'0';  
		}
	}
	printf("%d",n);
	return 0;
 } 

运行结果1:
输入:-3#45^67@
输出:-34567

运行结果2:
3#4-5……67@
34567

strlen的实现

//计算长度 

#include<stdio.h>
int main()
{
	char *str1 = "abcdefg", *str2;
	str2 = str1;	
	
	while(*str1++);
	{
		str1++;
	}
	
	printf("%d",str1 - str2);	//9
}

strcat()的实现

//链接字符串
#include<stdio.h>

int main()
{
	char s1[30] = "abcdefg",s2[30] = "hijklmn";

	char *str1 = s1 , *str2 = s2;
	
	while(*str1)
	{
		str1++;
	}
	
	while(*str2)
	{
		*str1++ = *str2++;
	}
	
	printf("%s",s1);	//abcdefghijklmn 	//输出数组名,不要输出指针名。
//  printf("%s",str1);	//无输出结果,因为此时str2指向了0	 
 } 

strcpy()的实现

#include<stdio.h>

int main()
{
	char str1[30] = "abcdefghiklmn",str2[30] = "asdljgs";
	char *s1 = str1 , *s2 = str2;
	while(*s2)
	{
		*s1 = *s2;
		s1++;
		s2++;
	}
	
	*s1 = '\0';
	
	printf("%s",str1);	//asdljgs 
 } 

删除字符串

#include<stdio.h>

int main()
{
	char s[30] = "a1b2c3d4ef5";
	char *p=s;
	int n=0,i=0;
	
	while(s[i])
	{
		if(s[i] < '0' || s[i] > '9' )
		{
			s[n++] = s[i];
		}
		
		i++;
	}
	s[n] = '\0';
	printf("%s",s);	//abcdef
 }

比较字符串(本题认为值为左串与右串第一个不相同字符之差(左-右))

#include<stdio.h>

int main()
{
	char s1[30],s2[30];
	int i,j;
	scanf("%s%s",s1,s2);
	
	for(i=0;s1[i]==s2[i];i++);
	
	printf("%d",s1[i]-s2[i]);    
}

#include<stdio.h>

int main()
{
	char s1[30],s2[30];
	char *p = s1,*q =s2;
	
	scanf("%s%s",s1,s2);    //scanf("%s%s",p,q);
	
	while(*p == *q)
	{
		p++,q++;
	}
	
	printf("%d",*p-*q);
}

运行结果都如下:

abcdefg
abceefg
-1

字符串转成顺序数字

//把数字字符串转成数字

#include<Stdio.h>

int main()
{
	char s[10] = "1234";
	int i,n=0;
	
	for(i=0;s[i];i++)
	{
		n=n*10+s[i]-'0';
	}
	
	printf("%d",n);
}

1234

2.字符串转成逆序数字
方法很简单啊,把for循环的3条语句都改了就好了,此外注意添加头文件

//把数字字符串转成逆序数字 
#include<Stdio.h>
#include<string.h>

int main()
{
	char s[10] = "1234";
	int i,n=0;
	
	for(i=strlen(s)-1 ;i>=0 ;i--)
	{
		n=n*10+s[i]-'0';
	}
	
	printf("%d",n);
}

4321

输出字符串中最长的单词

#include<Stdio.h>
 
int main()
{
	char str[80] = "this  isndnsjfida  is a pencil   good   ";
	char *p,*s = str;
	int num=0,max = 0;
	
	while(*s)
	{
		while(*s&&(*s>='a'&&*s<='z'||*s>='A'&&*s<='Z'))
		{
			num++;
			s++;
		}
		if(num > max)
		{
			max = num;
			p = s;
		}
		num = 0;
		
		while(*s&&*s==' ')
		{
			s++;
		}
	}
	*p = 0;
	puts(p-max);
}

pencil

判断回文串

#include<stdio.h>
#include<string.h>

int main()
{
	char s[30] = "abcba";
	int i,j;
	
	for(i = 0 , j=strlen(s)-1; i<j; i++,j--)	//-1 不是strlen(s) 
	{
		if(s[i] != s[j])
		{
			break;
		}
	}
	
	if(i>=j)
	{
		printf("是回文串");
	}
	else
	{
		printf("不是回文串");
	}
	
 } 

是回文串

​子串

#include<stdio.h>
#include<string.h>

int main()
{
	char s1[30] = "abcdabdabe" ,s2[10] = "ab";
	int i,j;
	int num = 0;
	
	
	for(i=0; i<strlen(s1); i++)
	{
		for(j=0; j<strlen(s2); j++)
		{
			if(s1[i+j] != s2[j])
			{
				break;
			}
		}
		if(j == strlen(s2))
		{
			num++;
		}
	}
		
	printf("%d",num);
	
	return 0; 
} 

3

输入三个字符串,分别统计每个串的大写字母个数

方法1:指针数组法

#include<stdio.h>

int main()
{
	char str[3][50]; 
	char *name[3] = {str[0],str[1],str[2]}; //指针必须有指向
	int num[3]={0};
	int i,j;
	
	for(i=0;i<3;i++)
	{
		gets(*(name+i));
		
		for(j=0;*(*(name+i)+j);j++)
		{
			if(*(*(name+i)+j)>='A'&&*(*(name+i)+j)<='Z')
			{
				num[i]++;
			}
		}
		
		printf("大写字母有%d个",num[i]);
		putchar('\n');
	}
}

A1B2C3D4
大写字母有4个
zxcasdG
大写字母有1个
大写字母有0个

方法2:二维数组法

#include<stdio.h>

int main()
{
	char name[3][80];
	int num[3]={0};
	int i,j;
	
	for(i=0;i<3;i++)
	{
		gets(name[i]);
		
		for(j=0;name[i][j];j++)
		{
			if(name[i][j]>='A'&&name[i][j]<='Z')
			{
				num[i]++;
			}
		}
		
		printf("大写字母有%d个",num[i]);
		putchar('\n');
	}
}

abcABC123A
大写字母有4个
gjfA
大写字母有1个
kgsSHB4
大写字母有3个

数组题

从整形数组中计算奇数元素的平均值

#include<stdio.h>

double ave(int b[],int n)
{
	double sum=0.0;
	int i,j=0;	//j:奇数个数
	for(i=0;i<n;i++)
	{
		if(b[i]%2!=0)
		{
			sum+=b[i];
	 		j++; 	
		}
	} 
	printf("奇数有:%d个\n",j);
	printf("%f 除以 %d = %f\n",sum,j,sum/j);
	return sum/j;
}
int main()
{
	int a[100];
	int i,n;
	printf("请输入元素个数:");
	scanf("%d",&n); 
	for(i=0;i<n;i++)
	{
		printf("请输入a[%d]:",i); 
		scanf("%d",&a[i]);
	}
	printf("The result is : %lf",ave(a,n));	

	return 0;
}

请输入元素个数:5
请输入a[0]:1
请输入a[1]:2
请输入a[2]:3
请输入a[3]:4
请输入a[4]:5
奇数有:3个
9.000000 除以 3 = 3.000000
The result is : 3.000000

设计程序统计某班全体学生三门课的成绩,要求先输入学生人数,并依次输入每个学生的三门成绩,统计出每门课程的全班平均分及每个考生所有考试的总分。

#include<stdio.h>

int main()
{
	int i,j;
	int n;
	double a[100][5] = {0};
	double avg1 = 0 , avg2 = 0 , avg3 = 0;
	
	scanf("%d",&n);	//n:学生人数
	
	for(i=0; i<n; i++)8
	{
		scanf("%lf%lf%lf",&a[i][0],&a[i][1],&a[i][2]);
		
		a[i][3] = a[i][0] + a[i][1] + a[i][2];	//a[i][3]保存 总分 
				
		avg1+=a[i][0]/n;	//科目1平均分 
		avg2+=a[i][1]/n;
		avg3+=a[i][2]/n;
	 } 
	 
	 for(i=0;i<n;i++)
	 {
	 	printf("第%d个考生总分:%lf\n", i+1 , a[i][3]);
	 }
	 
	 printf("科目1:%lf\n科目2:%lf\n科目3:%lf\n",avg1,avg2,avg3);
	 
}

3
1 2 3
4 5 6
7 8 9
第1个考生总分:6.000000
第2个考生总分:15.000000
第3个考生总分:24.000000
科目1:4.000000
科目2:5.000000
科目3:6.000000

假设10个整数存储在数组a[10]中,要求把其中能被12整除的数标记为T,其他标记为F,标记存储在字符数组b[10]中下标相同的对应位置。输出这两个数组

#include<stdio.h>

int main()
{
	int a[10] = {1,12,144,24,48,25,26,32,2,36};
	int b[10] = {0};
	int i;
	
	for(i=0; i<10; i++)
	{
		//写法1.if - else 
		
//		if(a[i]%12==0)
//		{
//			b[i] = 'T';
//		}
//		else
//		{
//			b[i] = 'F';
//		}
//		
		//写法2.条件表达式
		b[i] = a[i]%12==0 ? 'T' : 'F'; 
		
	}
	
	for(i=0; i<10; i++)
	{
		printf("%-3d - %c\n",a[i],b[i]);
	}
}

1 - F
12 - T
144 - T
24 - T
48 - T
25 - F
26 - F
32 - F
2 - F
36 - T

输出10行杨辉三角

include<stdio.h>

int main()
{
	int a[10][10] = {0};
	int i,j;
	
	for(i=0; i<10; i++)
	{
		a[i][0] = 1;
		a[i][i] = 1;
	 } 
	 
	for(i=1; i<10; i++)
	{
		for(j=1; j<=i; j++)	// <= 或 < 都可以 
		{
			a[i][j] = a[i-1][j-1] + a[i-1][j];
		}
	}
	
	for(i=0; i<10; i++)
	{
		for(j=0; j<=i; j++)
		{
			printf("%-5d",a[i][j]);
		}
		putchar('\n');
	}
}

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

递归输出杨辉三角

#include<stdio.h>

int f(int i , int j)
{
	if(j==0||j==i)
	{
		return 1;
	}
	else
		return f(i-1,j-1) + f(i-1,j);
}

int main()
{
	for(int i=0;i<=9; i++)
	{
		for(int j=0;j<=i;j++)
		{
			printf("%d\t",f(i,j)); 
		}
		putchar('\n');
	}
 } 

判断对称数组

#include<stdio.h>
#define M 4
#define N 4
typedef int integer;

integer Fun(int a[][4])
{
	int i,j;
	
	for(i=0; i<M; i++)
	{
		for(j=0; j<N; j++)
		{
			if(a[i][j] != a[j][i])
			{
				return 0;
			}
		}
	}
	
	return 1;
 } 
 
void main()
{
	int a[M][N] = {1,3,4,5,3,2,7,9,4,7,1,6,5,9,6,1};
	
	if(Fun(a))
	{
		printf("是对称数组");
	}
	else
	{
		printf("不是对称数组");
	}
}

是对称数组

斐波那切数列数组法

#include<stdio.h>

int main()
{
	int s[40] = {0,1};
	int i;
	
	for(i=0;i<20;i++)
	{
		printf("%d\t",s[i]);
		s[i+2] = s[i] + s[i+1];
		
		if((i+1) % 5 == 0)
			putchar('\n');
	}
 } 

0 1 1 2 3
5 8 13 21 34
55 89 144 233 377
610 987 1597 2584 4181

递归输出斐波那契额数列

#include<stdio.h>

int f2(int x)
{
	if(x==0)
	{
		return 0;
	}
	else if(x==1)
	{
		return 1;
	}
	else{
		return f2(x-2)+f2(x-1);
	}
 } 
 
 int main()
 {
 	int n,i;
 	scanf("%d",&n);
 	for(i=0;i<n;i++)
 	{
 		printf("%d\t",f2(i));
	 }
	
 	return 0;
 }
 

在这里插入图片描述

两个两个输出

#include<stdio.h>

int main()
{
	int i=0,j=1,k;
	
	for(k=0;k<10;k++)
	{
		printf("%d\t%d\n",i,j);
		i+=j;
		j+=i;
	}
}

​​​​​​​​在这里插入图片描述

删除指定下标的数组元素

硕成大模考的一道题,答案给错了,太坑了


#include<stdio.h>
#define N 5

void fun(int a[], int k, int *n) 
{
	int *p,* q,*r=a;
	
	if(k<0||k>=N) 
	{
		printf("error!\n");
		exit(0);
	}
	
	for(p=a,q=a+k;p<a+N;p++)
	{
		if(p!=q)
		{
			*r++=*p;
		}
		else
			(*n)--;
	}
}
 
int main()
{
	int a[N] ,k ,n=N,*p;
	
	for(p=a;p<a+N;p++) 
		scanf("%d",p);	
	
	scanf("%d",&k);	
	
	fun(a,k,&n);
	
	for(p=a ;p<a+n;p++)
		printf("%d\t",*p);
} 

1 2 3 4 5
2
1 2 4 5

将一个整数插入到已经排好序的数组中,是该数组仍然有序

#include<stdio.h>

int main()
{
	int a[10] = {1,2,3,4,6,7};
	int x;
	
	scanf("%d",&x);
	int i = 0,j;
	
	while(x > a[i])
	{
		i++;	
	}
	
	for(j=5 ; j>=i; j--)
		a[j+1] = a[j];

	if(x>a[5])
	{
		a[6] = x; 
	}
	else
	{
		a[i] = x;	
	}
	
	
	for(i=0;i<7;i++)
	{
		printf("%d\t",a[i]);
	}
}

0
0 1 2 3 4 6 7

5
1 2 3 4 5 6 7

8
1 2 3 4 6 7 8

删除数组中的重复数字

在这里插入图片描述

#include<stdio.h>

int delete(int a[],int n)
{
	int i,j,flag = 1,k=0;
	
	printf("数组原来元素为:");
	for(i=0;i<n;i++)
	{
		printf("%6d",a[i]);
	}
	putchar('\n');
	for(i=0;i<n;i++)
	{
		flag = 1;
		j=i; 
		for(j=i+1;j<n;j++)
		{
			if(a[i]==a[j])
			{
				flag = 0;
				break;
			}
		}
		
		if(flag ==1)
		{
			a[k++] = a[i];
		}
	}
	printf("\n数组删除后的元素为:");
	for(i=0;i<k;i++)
	{
		printf("%6d",a[i]);
	}
	putchar('\n');
	
	for(i=k;i<n;i++)
	{
		a[i]=0;
	}
	return k;
}

int main()
{
	int a[] = {1,1,1,2,2,2,3,3,4,5};
	
	printf("删除后有%d个元素",delete(a,10));
	
	return 0;
}

数组原来元素为: 1 1 1 2 2 2 3 3 4 5
数组删除后的元素为: 1 2 3 4 5
删除后有5个元素

方法2

#include<stdio.h>

int f(int a[],int n)
{
	int i,j,k=0,num;
	
	printf("\n数组删除前的元素为:");
	
	for(i=0;i<n;i++)
	{
		printf("%6d",a[i]);
	}
	
	putchar('\n');
	
	for(i=0; i<n; i+=num)
	{
		num = 0;
		
		for(j=0;j<n;j++)
		{
			if(a[i] == a[j])
				num++;
		}
		
		a[k++] = a[i];
	}
	
	printf("\n数组删除后的元素为:");
	
	for(i=0;i<k;i++)
	{
		printf("%6d",a[i]);
	}
	
	putchar('\n');
	return k;
}

void main()
{
	int a[10] = {1,1,2,2,2,3,3,4,4,5};
	
	printf("删除后有%d个元素",f(a,10));
}

数组删除前的元素为: 1 1 2 2 2 3 3 4 4 5
数组删除后的元素为: 1 2 3 4 5
删除后有5个元素

方法3

int delete(int *b,int n)
{
	int i,num = 0;
	for(i=0; i < num ; i++)
	{
		if(b[i] != b[i+1])
			b[num++] = b[i];
	}
	
	return num;
}

1 2 3 4 4 5 6 6 6 7
删除前:
1234456667
删除后:
1234567

删除后有7个字符

## 指针程序题
### 指针s所指向的字母数字串只包含数字和字母,编写程序实现如下功能:只保留第一个字母前的数字字符,其余数字字符全部删除。例如:12ab3cd456e → 12abcde
```c
#include<stdio.h>

void Fun2(char *s)
{//123abc12cd1
	char *p = s;
	
	while(*s >= '0' && *s <= '9')
	{
		s++;
		
	}
	
	p = s;
	while(*s)
	{
		if(*s < '0' || *s > '9')
		{
			*p = *s;
			p++;
		}
		
		s++;
	}
	
	*p = '\0';
	
	
//	printf("删除数字字符后的字符串为:%s" , p);	//p指针已经指向了最后一个元素,所以输出结果为空白。应在主函数中调用输出。 
}


int main()
{
	char s[32];
	scanf("%s",s);
	Fun2(s);
	
	printf("删除数字字符后的字符串为:%s" , s);
 } 

12ab3cd456e
删除数字字符后的字符串为:12abcde

用数组实现。

#include<stdio.h>

void Fun2(char *s)
{//123AB12CD1
	int i=0 , j=0;
	
	while(s[i]>='0' && s[i]<='9')
	{
		i++;
	}
	j=i;
	
	for(; s[i]; i++)
	{
		if(s[i]<'0' || s[i]>'9')
		{
			s[j++] = s[i];
		}
	}
	
	s[j] = 0;
	
	printf("删除后的字符串为:%s",s);	//是下标实现的,所以可以在此处输出。 
}


int main()
{
	char s[32];
	scanf("%s",s);
	Fun2(s);					
//	Fun2("123as321y4ddgf"); 	//程序不执行,无反应 
 } 

12ab3cd456e
删除后的字符串为:12abcde

统计字符串 中的 子串 出现的次数。例如 “abcabdabe” 中 “ab” 出现次数为 3 ,“abc”出现次数为 1

#include<stdio.h>

int FUN(char s1[],char s2[])
{
	char *p1 = s1,*p2 = s2;
	char *p3 = NULL;
	int num = 0;
	
	while(*p1)
	{
		p3 = p1;
		while(*p2 == *p3)
		{
			p2++,p3++;
			
		}
		
		if(*p2 == '\0')
		{
			num++;
		}
		
		p2 = &s2[0];
		p1++;
	}
	
	return num;
 } 

int main() 
{
	
	printf("个数为:%d\n",FUN("abcabdabe","ab"));	//个数为:3
	printf("个数为:%d\n",FUN("abcabdabe","abc"));	//个数为:1
	
	return 0;
}

个数为:3
个数为:1

鞍点

//鞍点

#include<stdio.h>
#define N 4

int main()
{
	int i,j,flag=0,t,maxi,maxj,mini,max,min;	//定义
	int a[N][N] =	{1,2,3,4,
					 1,2,3,4,
					 9,10,11,12,
					13,14,15,16
					 };
	
	for(i=0; i<N; i++)
	{
		maxj = 0;
		maxi = i;
		max = a[i][0];
		for(j=0; j<N; j++)
		{
			if(a[i][j] > max)
			{
				max = a[i][j];
				maxj = j;
				maxi = i;			
			}			
		}
		
		//产生了单行最大值
		mini = i;
		for(t=0; t<N; t++) 
		{
			if(a[t][maxj] < max)
			{
				mini = t;
			}
		}
		
		//产生了单列最小值
		
		 if(mini == maxi)
		 {
		 	printf("鞍点:%d行%d列:%d\n",maxi,maxj,max);
		 	flag = 1;
		 }
	}
	
	if(!flag)
	{
		printf("没有鞍点");
	}
	
}

鞍点:0行3列:4
鞍点:1行3列:4

结构体题

1.统计结构体数组中性别(sex)为’M’的变量的个数。

要求:

①数组元素依次赋初值为:{1 , “Andy” , ‘M’ } 、 {2 , “Mike” , ‘F’ } 、 {3 , “Rose” , ‘M’}。

②结构体定义如下:struct Student{int num;char name[30];char sex;};

#include<stdio.h>
 
struct Student{
	int num;
	char name[30];
	char sex;
};
 
int Fun(struct Student *s , int n)
{
	int num=0; 
	int i;
	
	for(i=0; i<n; i++)
	{
		if(s[i].sex == 'M')
		{
			num++;
		}
	}
	
	return 3;
}
 
int main()
{
	struct Student s[3] = {
		1,"Andy",'M',2,"Mike",'F',3,"Rose",'M'
	};
	
	printf("%d",Fun(s , 3));
	
	return 0;
}

3

2.通过函数调用实现:讲结构体数组中的三个元素按num成员进行升序排列。

要求:

①数组元素依次赋初值为:{12,“sunny”,89.1}、{8,“henry”,73.5}、{21,“lucy”,91.7}。

②结构体定义如下:struct s{int num;char name[30];float score;};

写法1:在函数外部 定义 结构体变量并且赋值,参数值为空。

#include<stdio.h>

struct s{
	int num;
	char name[30];
	float score;
}a[3] = {{12,"sunny",89.1} , {8,"henry",73.5} , {21,"lucy",91.7}}; 

void fun()
{
	int i,j;
	struct s t;
	for(i=0; i<2; i++)
	{
		for(j=0; j<2-i; j++)
		{
			if(a[j].num > a[j+1].num)
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	
}

int main()
{
	int i;
	fun();
	for(i=0; i<3; i++)
	{
		printf("%d,%s,%f\n",a[i].num , a[i].name , a[i].score);
	}
	
	return 0;
}

8,henry,73.500000
12,sunny,89.099998
21,lucy,91.699997

写法2:在主函数中定义变量,通过参数传递变量值

#include<stdio.h>

struct s{
	int num;
	char name[30];
	float score;
};

void fun(struct s *a , int n)
{
	int i,j;
	struct s t;
	for(i=0; i<n-1; i++)
	{
		for(j=0; j<n-1-i; j++)
		{
			if(a[j].num > a[j+1].num)
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	
}

int main()
{
	struct s a[3] = {{12,"sunny",89.1} , {8,"henry",73.5} , {21,"lucy",91.7}}; 
	int i;
	fun(a,3);
	for(i=0; i<3; i++)
	{
		printf("%d,%s,%f\n",a[i].num , a[i].name , a[i].score);
	}
	
	return 0;
}

8,henry,73.500000
12,sunny,89.099998
21,lucy,91.699997

3.计算n名学生成绩的平均分并通过函数返回。

要求:

结构体代码如下:
struct StudentScore{double score;};

#include<stdio.h>

struct StudentScore{
	double score;
};

double Fun(struct StudentScore *a , int n)
{
	int i;
	double sum = 0.0;
	
	for(i=0; i<n; i++)
	{
		sum += a[i].score;	
	}
	
	return sum/n;
}

int main()
{
	struct StudentScore a[100];
	int n;	//学生数量 
	int i;
	
	printf("请输入学生数量:");
	scanf("%d",&n);
	
	for(i=0; i<n; i++)
	{
		printf("请输入第%d个学生的成绩:",i+1);
		scanf("%lf",&a[i].score);
	}
	
	printf("%lf",Fun(a,n));
	return 0;
}

请输入学生数量:3
请输入第1个学生的成绩:90
请输入第2个学生的成绩:100.0
请输入第3个学生的成绩:80
90.000000

4.输入三个学生的学号,姓名,分数,输出分最高同学的所有信息。

#include<stdio.h>
 
int main()
{
	struct stu{
		int num;
		char name[20];
		float score;
	};
	
	int i;
	
	struct stu a[3] , max;
	
	for(i=0; i<3; i++)
	{
		printf("第%d个:",i+1);
		scanf("%d%s%f",&a[i].num,&a[i].name,&a[i].score);
	}
	
	max = a[0];		//结构体变量整体赋值 
	
	for(i=1; i<3; i++)
	{
		if(max.score < a[i].score)
			max = a[i];		//结构体变量整体赋值 
	}
	
		printf("成绩最高的是%d号,%s,%f分",max.num,max.name,max.score);
}

第1个:1 亚历山大 80
第2个:2 牛顿 100
第3个:3 李白 59
成绩最高的是2号,牛顿,100.000000分

4.2用函数

#include<stdio.h>
 
struct stu{				//struct stu定义 应该放全局。如果在主函数内,那么定义函数会提示没这个类型。 
	int num;
	char name[20];
	float score;
};
	
struct stu Fun(struct stu *a,int n)
{
	struct stu max = a[0];
	int i;
	
	for(i=1; i<3; i++)
	{
		if(max.score < a[i].score)
			max = a[i];		//结构体变量整体赋值 
	}
	
	return max;
}
 
int main()
{
	int i;
	
	struct stu a[3] = {
		1,"li",70.1,2,"wang",70.5,3,"zhai",70.3
	};
	
	
	
	struct stu max = Fun(a,3);
	
	printf("成绩最高的是%d号,%s,%f分",max.num,max.name,max.score);
}

成绩最高的是2号,wang,70.500000分

枚举类型三道题

1.枚举类型数据的输入和输出

#include<stdio.h>


enum fruits{
	watermelon,peach,strawberry,banana,pineapple,apple
};

int main()
{
	
	char fts[][20] = {"watermelon","peach","strawberry","banana","pineapple","apple"};
	enum fruits x;
	int k;
	
	scanf("%d",&k);
	x=(enum fruits)k;
	printf("%s",fts[x]);
}

2
strawberry
5
apple

2.枚举类型数据的关系运算

#include<stdio.h>

enum fruits{
	watermelon,peach,strawberry,banana,pineapple,apple
};

int main()
{
	enum fruits x;
	int k;
	scanf("%d",&k);
	x=(enum fruits)k;
	if(x==peach)
		printf("x=%d,peach=%d,x==peach\n",x,peach);
	else if(x>peach)
		printf("x=%d,peach=%d,x>peach\n",x,peach);
	else if(x<peach)
		printf("x=%d,peach=%d,x<peach\n",x,peach);
		
	return 0;
 } 

1
x=1,peach=1,x==peach
2
x=2,peach=1,x>peach
4
x=4,peach=1,x>peach

3.水果拼盘

#include<stdio.h>


	enum fruits{
		watermelon,peach,strawberry,banana,pineapple,apple
	};

int main()
{
	
	char fts[][20] = {"西瓜","桃子","草莓","香蕉","菠萝","苹果"};
	enum fruits a,b,c,d;
	int k = 0;
	
	for(a = watermelon; a<=apple; a++)
		for(b = a+1; b<=apple; b++)
			for(c = b+1; b<=apple; c++)
				for(d = c+1; b<=apple; d++)
					printf("%d:%s %s %s %s\n",++k,fts[a],fts[b],fts[c],fts[d]);
					
	printf("共有%d种水果",k);
 } 

1:西瓜 桃子 草莓 香蕉
2:西瓜 桃子 草莓 菠萝
3:西瓜 桃子 草莓 苹果
4:西瓜 桃子 香蕉 菠萝
5:西瓜 桃子 香蕉 苹果
6:西瓜 桃子 菠萝 苹果
7:西瓜 草莓 香蕉 菠萝
8:西瓜 草莓 香蕉 苹果
9:西瓜 草莓 菠萝 苹果
10:西瓜 香蕉 菠萝 苹果
11:桃子 草莓 香蕉 菠萝
12:桃子 草莓 香蕉 苹果
13:桃子 草莓 菠萝 苹果
14:桃子 香蕉 菠萝 苹果
15:草莓 香蕉 菠萝 苹果
共有15种水果拼盘

其他

最大公约数递龟实现

#include<stdio.h>

int Fun(int m , int n)
{
   int r;
   if((r = m % n) == 0)
   {
   	return n;
   }
   else
   {
   	m = n;
   	n = r;
   	return Fun(m , n); 
   }
}

int main()
{
   int m = 18 , n = 12;
   int s = m * n;
   
   printf("最大公约数:%d\n最小公倍数:%d",Fun(m,n) , s / Fun(m , n));
}

最大公约数:6
最小公倍数:36

输出100以内的素数

//素数 

#include<stdio.h>

int main()
{
	int n=100,i,j;
	
	for(i=1; i<100; i++)
	{
		for(j=2; j<i; j++)
		{
			if(i%j == 0)
			{
				break;
			}
		}
		
		if(i == j)
		{
			printf("%d\t",i);
		}
	}
}

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
53 59 61 67 71 73 79 83 89 97

公约数穷举法 和 辗转相除法

#include<stdio.h>

int main()
{
	int m=36,n=12,i;
	
	for(i=n; i>=1; i--)
	{
		if(m%i==0&&n%i==0)
			break;
	}
	
	printf("最大公约数是%d\n最小公倍数是%d\n",i,m*n/i);
}

最大公约数是12
最小公倍数是36

方法2:辗转相除法
辗转相除法终止条件是 余数=0!!!!!!!!!!!!

除数是最小公约数!!!!!!!!!在这里插入图片描述

#include<stdio.h>

int main()
{
	int m=12,n=36,r;
	
	int s=m*n;
	
	while(r=m%n)
	{
		m=n;
		n=r;
	}
	
	printf("最大公约数是%d\n最小公倍数是%d\n",n,s/n);
}

最大公约数是12
最小公倍数是36

复习函数指针 + 质因数分解

#include<stdio.h>

void nb(int n)
{
	int i;
	
	printf("%d = ",n);
	for(i=2; n!=i ;i++)
	{
		if(n % i == 0)
		{
			printf("%d * ", i );
			n /= i;
			i--;
		}
	}
	
	printf("%d\n",n);
	
	
}

int main()
{
	//定义方法1: 先定义后赋值 
//	void (*p)(int p);	 //等价 void (*p)(int);	 void (*p)(int abc); //不检查形参变量名是否一致 
//	p = nb;	//等价 p = &nb;
	
	//定义方法2:定义同时赋值 
	void (*p)(int p) = nb;
	
	
	for(int n=10; n<=20; n++)
	{
		(*p)(n);
	}
}

10 = 2 * 5
11 = 11
12 = 2 * 2 * 3
13 = 13
14 = 2 * 7
15 = 3 * 5
16 = 2 * 2 * 2 * 2
17 = 17
18 = 2 * 3 * 3
19 = 19
20 = 2 * 2 * 5

一元二次方程求根

/*
	1.两根不相等,两根相等,虚根
*/ 
#include<stdio.h>
#include<math.h>

int main()
{
	int s=0;
	
	int a,b,c,x1,x2,t;
	scanf("%d%d%d",&a,&b,&c);
	
	t = b*b-4*a*c; 
	if(t < 0 )
	{
		t = abs(t);
		printf("根为:x = %d ± %di\n",-b/2/a , (int)sqrt(t)/ (2*a));
		//由于输出格式%d,sqrt()的返回值是double,所以需要强制类型转换,
		//才可输出正确结果	
	}	
	else if(t > 0)
	{	
		x1 = (-b + sqrt(t)) / (2*a);
		x2 = (-b - sqrt(t)) / (2*a);
		printf("根为:x1 = %d\nx2 = %d\n",x1,x2);
	}
	else
	{
		x1 = -b / 2 / a;
		printf("根为:x1 = x2 = %d\n",x1);
	 } 
}

1987年,国际C语言混乱代码大赛

发表时间:2022年3月27日 B站ROCK直播
看到的各位,别报这家机构了,听我一句劝~~~

#include<stdio.h>
#include<stdbool.h>

int main()
{
	printf(&true["\021%sck\012\0"], true["have"] + "fro" - 0x60);
	

	
	//第一层
	//背景:历史背景
	//1987年,国际C语言混乱代码大赛,获奖作品
	
	//第一层 (宏定义)
	printf("true = %d\n",true);
	
	//第二层
	printf("%s\n","fro"+1); 
	//const char *p = "fro";
	//printf("%s\n" , p+1);
	
	//第三层
	printf("%c\n","have"[1]);
	//const char * p = "hava";
	//printf("%c\n",p[1]);
	//printf("%c\n ,*(p+1);
	
	//第四层 
	printf("%d\n",(1)["hava"]);	//97
	//(1)["hava"] 等价于 "hava"[1] 
	
	//第五层 
	printf("%d\n",(1)["hava"] - 0x60); //1 0x60:96
	
	//第六层 
	printf("%s\n","fro" + (1)["have"] - 0x60);
	 
	//第七层
	printf("%s\n","fro" + true["have"] - 0x60);	//带不带()编译器都能识别 
	
	//第八层
	printf("%s\n",&"abcde"[1]); //bcde
	//在字符串中,任意一个字符的地址,就是一个"子串"
	
	//第九层
	printf("%s\n",&true["abcde"]); 
	
	//第十层
	printf("%s\n",&"?%sck\n"[1]); //%sck\n
	
	//第十一层
	printf("%s\n",&"\021%sck\012\0"[1]);	//%sck\n
	
	//第十二层 
	//冲! 
	
	//第十三层 
	printf(&true["\021%sck\012\0"], true["have"] + "fro" - 0x60);
	//		"%sck\n", "ro"
	//rock! 

	return 0;
}

rock
true = 1
ro
a
97
1
ro
ro
bcde
bcde
%sck
%sck
rock

可变参数:实现多个整数的和,但是参数的个数不确定

//可变参数函数
//题目:定义一个函数,实现多个整数的和,但是参数的个数不确定


/*应用于:
	1.某些场合下,参数的个数不确定
	2.【主要场合】命令行工具的解析 
	在嵌入式/物联网中有着广泛的使用 
*/ 
#include<stdio.h>
#include<stdarg.h>

int add(int n , ...)	//...表示可变参数 
{
	int sum = 0;
	//可变参数使用,第一步
	va_list arglist;	//定义一个变量,表示参数列表
	//va list实际是一个指针,指向arglist 
	
	//可变参数使用,第2不
	va_start(arglist , n); 
	for(int i=0; i<n; i++)
	{
		sum += va_arg(arglist , int);
	}
	va_end(arglist);
	
	return sum;
 } 
 
 int main()
 {
 	int x = add(9, 1,2,3,4,5,6,7,8,9);
 	printf("sum = %d\n" , x);	//45
 }
 

输入一个正整数,以相反的顺序输出该数。 1234 → 4321

方法1:

//逆序输出数字
#include<stdio.h>

int main()
{
	int n = 1234;
	int i,s=0;
	
	while(n)
	{
		s = s * 10 + n % 10;
		n /= 10;
	}
	
	printf("%d",s);
	
 } 

4321

方法二:一位一位数字输出

#include<stdio.h>

int main()
{
	int n = 1234;
	
	do
	{
		printf("%d",n%10);
	}while(n/=10);
	
 } 

从键盘输入一个正整数,求出各位数字之和,各位数字之积,并输出。

#include<stdio.h>

int main()
{
	int n = 1234;
	int i , s = 0 , mul = 1;
	
	while(n)
	{
		s += n % 10;
		mul *= n % 10;
		n /= 10;
	}
	
	printf("sum:%d\nmul:%d",s,mul);
	
 } 

sum:10
mul:24

​数字累加 规律题

这种题在纸上先写写画画,找到规律后就好办了。

1-22+333-4444+……+999999999
方法1:简单

#include<stdio.h>

int main()
{
	int i,j=0,t=0,s=0;
	int flag=1;	//正负号变量 
	
	for(i=1;i<=9;i++)
	{
		t = (t+j) * 10 + i;
		j = j * 10 + 1;
		s += t * flag;
		printf("%d\n",t*flag);
		flag = -flag;
	}
	
	printf("\n\nsum=%d",s);
}

1
-22
333
-4444
55555
-666666
7777777
-88888888
999999999
sum=918273645

方法2:两个循环

#include<stdio.h>

int main()
{
	int i,j,t,s=0;
	int flag=1;	//正负号变量
	
	for(i=1; i<=9; i++)
	{
		t = 0;
		
		for(j=1; j<=i; j++)
		{
			t = t * 10 + i;
		}
		
		printf("%d\n",t*flag);
		s += t*flag;
		flag = -flag;
	 }
	 
	 printf("\n\nsum=%d",s);
	
}

1
-22
333
-4444
55555
-666666
7777777
-88888888
999999999
sum=918273645

二分查找法

#include<stdio.h>

int main()
{
	int a[10]={1,2,3,4,5,6,7,8,9,10};
	int l = 0 , r = 10 - 1 , mid;
	int n;
	printf("请输入要查找的数:");
	scanf("%d",&n);
	
	while(l<=r)
	{
		mid = l + (r - l) / 2;	//据说防溢出,不咋懂 
		if(a[mid] < n)
		{
			l = mid+1;
		}
		else if(a[mid] > n)
		{
			r = mid-1;
		}
		else if(a[mid] == n)
		{
			break;
		}
	}
	
	printf("数%d的下标是:%d",n,mid);
}

请输入要查找的数:5
数5的下标是:4

牛顿迭代法

在这里插入图片描述

#include<stdio.h>
#include<math.h>
#define eps 1e-6

int main()
{
	float x1,x0,f,f1;
	x1 = 1.0;
	do
	{
		x0 = x1;
		f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;	
		f1 = (6 * x0 - 8) * x0 + 3;
		x1 = x0 - f / f1;
	}while(fabs(x1 - x0) > eps);
	
	printf("%6.2f",x1);	
	return 0;
} 

2.00

递归的初级中级高级应用

初级 - 斐波那切数列
int fib(int n)
{
	if(n <= 2)
	{
		return 1;
	}
	else
	{
		return fib(n-1) + fib(n-2);
	}
 } 
 
int main()
{
	for(int i=1; i <= 10; i++)
	{
		printf("%d\t",fib(i));
	}
}


1 1 2 3 5 8 13 21 34 55

中级 - 汉诺塔

void hnt(int n,
		 const char *start , //起始柱 
		 const char *mid ,	//中间柱 
		 const char *dest)	//目标柱
{
	if(n == 1 )
	{
		printf("从%s移动到%s\n",start , dest);
		return ;
	} 
	else
	{
		hnt(n-1 , start , dest , mid); //中间柱变成了目标柱 
		printf("从%s移动到%s\n",start,dest);
		hnt(n-1 , mid , dest , start);
	}
}

int main()
{
	hnt(3, "A柱","B柱","C柱");
	return 0;
} 

从A柱移动到C柱
从A柱移动到B柱
从C柱移动到A柱
从A柱移动到C柱
从B柱移动到C柱
从B柱移动到A柱
从C柱移动到B柱

高级 - 排列组合

//高级应用 - 
//对于指定的数字,请列出所有的排列组合
//例如:3的排列组合
// 1 2 3 、 1 3 2 、2 1 3 、 2 3 1 、 3 1 2 、 3 2 1
#include<stdio.h>
#define N 3		//可以改变数值 

int used[N] = {0};	//0:未被使用 1:已经使用 
int data[N] = {0};	//用来存放我们使用的数字
 
void work(int i)	//i表示已经放入了i个数据 
{
	for(int j = 0; j < N; j++)	//对所有的数字搜索一遍 
	{
		//取出一个可以使用的数字 
		if(used[j] == 0)	// = 0:数字j还未被使用 
		{
			//...马上使用数字j 
			data[i] = j;	//
			//修改标记
			used[j] = 1;
			
			if(i == N-1)	//塞满了就打印 
			{
				for(int k=0; k<N; k++)
				{
					printf("%d ",data[k]+1);
				}
				putchar('\n'); 
			}
			else	//没塞满就继续塞 
			{
				work(i + 1);
			}
			
			//清理现场 
			used[j] = 0;
			 
		} 
		 
	}	
 } 
 
 int main()
 {
 	work(0);
 }

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

数组名作为形参时,可以数组名++

#include<stdio.h>

int func(int a[5],int n)
{
	a++;	//正常执行 
}
int main()
{
	int a[5] = {1,2,3,4,5};
	//a++;	//报错 
	 
	func(a,5);
	printf("%d",0Xffa);
}

原因是:
数组名作为实参,值传递首元素地址;
因数组名作为形参,会转换为指针,指向实参中数组首元素地址,因此形参必须是一个存储地址值的变量,即指针变量。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值