课外闲谈1.谈一谈最近自己遇到的比较不错的题目(C语言)

我现在写的是从头开始,比较经典,难以理解的一些题目。

1.求1-1/3+1/5-1/7+......+1/n;

#include<stdio.h>
int main(){
	int flog,i,f,n;
	double item,sum;
	printf("请输入n的值:");
	scanf("%d",&n);
	flog=1;
	f=1;
	sum=0;item=1;
	for(i=1;i<=n;i++)
	{
	sum=sum+item;
	flog=-flog;
	f=f+2;
	item=flog*1.0/f;}
	printf("sum=%f",sum);
	return 0;
} 

2. 

 3.输出图形

#include<stdio.h>
int main()
{
	int i,j;
	for(i=1;i<=5;i++)
	{
		for(j=4;j>=i;j--)
		printf(" ");
		for(j=1;j<=i;j++)
		printf("*");
		putchar('\n');
	}
	
	
	
	return 0;
}

4.逆序输出

#include<stdio.h>
int main(){
	int x;
	printf("请输入一个逆序的整数:");
	scanf("%d",&x);
	printf("正序为:"); 
	do{
		printf("%d",x%10);//每当一个数%10时,结果都为最后一位数值。 
		x=x/10;//每当一个数/10时,都会去掉最后一位数值。 
	}while(x!=0);
	return 0;
}
bool symm(long m){
	long temp = m,n=0;
	while (temp){
		n = n*10+temp%10;
		temp = temp/10;//逆序输出数
	}
	return (m == n);
}

5.证明哥德巴赫思想

#include<stdio.h>
#include<math.h>
int main(){
	int x,y,i,n;
	printf("请输入一个数:");
	scanf("%d",&n);
	for(x=2;x<=n/2;x++){
		//定义一个x,属于2~n/2。两个数相加,必有一个大于二分之n另一个则小于二分之n
		for(i=2;i<=sqrt(x);i++){//判断x是否为素数
			if(x%i==0)
			break;
		}
		 if(i>sqrt(x)){
		 	y=n-x;
		 	for(i=2;i<=sqrt(y);i++){//判断y是否为素数。 
		 		if(y%i==0)
		 		break;
			 }
		 	    if(i>sqrt(y))
		 	    printf("%d+%d=%d\n",x,y,n);
		 }      
		 
		 
	}
	return 0;
}
/*判断一个数是否为素数
假设有数x,
 for(i=2;i<=sqrt(x);i++){
   if(x%i==0)		
   	break;  
     if(i>sqrt(x))
      printf("这是一个素数!");
   }
*/ 

6.斐波那契数列问题

#include<stdio.h>
int main(){
	int i,n,x1,x2,x;
	printf("请输入n:");
	scanf("%d",&n);
	if(n<1||n>46){//据题目限定,超出此范围则无效。
		printf("Invalid.\n");
	}
	   else if(n==1)
	        printf("%10d",1);
	    else{
	    	x1=1;
	        x2=1;
	        printf("%10d%10d",x1,x2);
			for(i=3;i<=n;i++){
				x=x1+x2;
				printf("%10d",x);
				if(i%5==0)
				printf("\n");
				x1=x2;
			    x2=x;
			}
		}
	return 0;
} 
#include<stdio.h>
#define MAXN 46//定义在最上面,需要更改时便只需改这一个地方。 数组都可以如此,更方便 
int main(){
	int i,n;
	int fib[MAXN]={1,1};//先输出前两项 
	printf("请输入n:");
	scanf("%d",&n);
	if(n>=1&&n<=46){
		for(i=2;i<n;i++){//i=2,是因为,数组从零开始,i=2时,其实是第三项 
			fib[i]=fib[i-1]+fib[i-2];//前一项等于后两项之和 
		}
		for(i=0;i<n;i++){
			printf("%6d",fib[i]);
		if((i+1)%5==0)
			printf("\n");
		}
			if(n%5!=0)
				printf("\n");
	}
	else
		printf("Invalid Value!\n");
	return 0;
} 

7.数学思维问题

#include<stdio.h>
int main(){
	int x,men,women,cnt,n;
	printf("请输入n:");
	scanf("%d",&n);
	cnt=0;
	for(men=0;men<=n;men++){
		for(women=0;women<=n;women++){
			for(x=0;x<=n;x++){
				if((men+women+x==n)&&(men*3+women*2+x*0.5==n))
				printf("men=%d,women=%d,x=%d\n",men,women,x);
				cnt++;
			}
		}
		if(cnt==0)
	printf("None!\n");//未经过循环,即无方案。 
	}
	printf("cnt=%d",cnt);//count的缩写,代表循环的次数。97336 
	return 0;
} 

 8.a与b中找不同

#include<stdio.h>
#define N 10
int main(){
	int m,n,i,j,k,a[N],b[N],c[2*N],flag=0;
	printf("请输入一个数:");
	scanf("%d",&m);
	printf("请输入%d个数据:",m);
	for(i=0;i<m;i++){
		scanf("%d",&a[i]);//初始化a数组 
	}
    printf("请输入一个数:");
	scanf("%d",&n);
	printf("请输入%d个数据:",n);
	for(i=0;i<n;i++){
		scanf("%d",&b[i]);//初始化b数组 
	}
	for(i=0;i<m;i++){
		for(j=0;j<n;j++){
			if(a[i]==b[j])
			break;//将a数组中的元素拿出与b数组中的元素比较 
		}
		if(j>=n){
		flag=1;
		c[k++]=a[i];//如果是正常循环结束,则表明a中的元素无与b中相同的元素 ,且flag=1 
	}
	} 
	for(j=0;j<n;j++){
		for(i=0;i<m;i++){
			if(b[j]==a[i])
			break;
		}
		if(i>=m){
		flag=1;
		c[k++]=b[j];//b也要与a比较 
		}
	}
	for(i=0;i<k;i++)
	printf("%d ",c[i]);
	if(flag==0)
	printf("No found!");//避免两数组无非公有元素而无操作 
	return 0;
}

9.日期计算

#include<stdio.h>
#define MAXN 8
int main(){
	int i,n,response;
	int count[MAXN+1];//实际问题是以1开头的,所以定义一个更长的,其实也可以在宏定义时定义更长的 
	printf("请输入n:");
	scanf("%d",&n);
	for(i=1;i<=MAXN;i++)
	count[i]=0;//数据的初始化,避免该存储单元之前的数据影响 !!!!!!! 
	for(i=1;i<=n;i++){
		printf("Enter your response:");
		scanf("%d",&response);
		if(response>=1&&response<=MAXN)
		count[response]++;//等价于count[response]+=1. 上面已经初始化过了,所以出现一次就会累加一次 
		else
			printf("Invalid:%d\n",response);
	}
	printf("result:\n");
	for(i=1;i<=MAXN;i++){
		if(count[i]!=0)
		printf("%4d%4d\n",i,count[i]);
	}
	return 0;
} 

10.压缩字符串

#include<stdio.h>
#define MAXN 80
void zip(char *p);

int main(){
	char line[MAXN];	
	printf("Input the string:");
	
	gets(line);
	zip(line);
	puts(line);
	
	return 0;
}
void zip(char *p){
	char *q=p; 
	int n;
	while(*p!='\0'){
		n=1;
		while(*p==*(p+n)){
			n++;
		}
		if(n>=10){
			*q++=(n/10)+'\0';
			*q++=(n%10)+'\0';
		}
		else if(n>=2){
			*q++=n+'\0';
		}
		*q++=*(p+n-1);
		p+=n;
	}
	*q='\0';
	
}

11.正序输出整数(递归)

//正序输出数字 
void print(unsigned int num ){
	//递归 
	if(n>9){
		print(n/10);
	}//反复调用此自定义函数,直到n<=9,首先输出n<=9时的数,因为n<=9时函数最先调用完,其次就是它的上一层调用,妙呀 
	printf("%d",n%10);
	//数组 
}

#include<stdio.h>
int main(){
	unsigned int num=0;	
	
	scanf("%u",&num);
	print(num);
	
	return 0;
} 

12.移动字母(把字符串的前三个移动到最后)

#include <stdio.h>
#include <string.h>
void Shift( char s[] ){
	getchar();
	int a[3];
	int i,j;
	for(i=0;i<3;i++){
		a[i]=s[i];
	}
	for(i=3;s[i];i++){
		s[i-3]=s[i];
	}
	for(j=i-3,i=0;i<3;i++){
		s[j++]=a[i];
	}
	
}
/*void Shift( char s[] ){
	char temp[MAXN];
	int len=strlen(s);
	strcpy(temp,s);
	
	for(int i=0;i<len;i++)
	s[i]=temp[(i+3) % len];//数组左移都能用这套。 
}*/ 

#define MAXS 10

void Shift( char s[] );

void GetString( char s[] ); /* 实现细节在此不表 */

int main()
{
    char s[MAXS];

    GetString(s);
    Shift(s);
    printf("%s\n", s);

    return 0; 
}


/*void Shift( char s[] )
{
    char str1[4],str2[MAXS];
    
	strncpy(str1,s,3);   //将前三个字符复制到str1中
	strcpy(str2,s+3);    //将剩余的字符复制到str2中
	strcat(str2,str1);   //连接
	strcpy(s,str2);      //复制到s中
	
}*/

13.模拟实现qsort函数

//模拟实现qsort函数
#include<stdio.h>
//交换函数(也可以不单独写成函数,但是我觉得主要可读性更好)
void swap(char* buf1, char* buf2,size_t width) {
	int i;
	for (i = 0; i < width; i++) {
		char temp = *buf1;
		*buf1 = *buf2;
		*buf2 = temp;
		buf1++;
		buf2++;
	}
}
//写qsort必须写的函数,必须由使用者写,虽然我们这里是模拟实现qsort函数,但是仍需要写这个。
int compare(const void* e1, const void* e2) {

	//根据返回值进行排序(来绝对是升序还是降序)
	return *(char*)e1 - *(char*)e2;
}
void bubble_sort(void* base, size_t sz, size_t width, int (*compare)(const void*, const void*)) {
	int i, j;

	//外层循环控制总趟数
	for (i = 0; i < sz-1; i++) {//这里一定是sz减一,sz是数组长度,下标只能到sz-1;


		for (j = 0; j < sz - i- 1; j++) {


			//这个地方是妥妥的重点了,为什么要强制类型转换为char* 类型?
			//其实这个地方我觉得转换为其他类型也行,但是qsort函数是可以对所有数据类型进行排序的,如果只是对单一的一种数据排序,那的确是可以的
			//但是我们这里是模拟实现qsort函数的功能,故,我们这里转换为char* 类型
			//还有一个原因,char*类型的指针解引用时只走一个字节,众所周知,字节是代码的最小存储单位了,其他无论什么类型的数据都是以字节论的
			if (compare((char*)base + j * width, (char*)base + (j + 1) * width) > 0)

				swap(((char*)base + j * width), ((char*)base + (j + 1) * width),width);
			//我们再来理解一下这个(char*)base + j * width是什么意思呢?
			//首先这个char*我是已经将过了的,接下来我们要解释的就是j*width的含义
			//因为我们对未知类型的数据进行排序,(int*)+1是走四个字节,但对它本身来说就只移动了一个元素长度
			//那如果是(int*)+i呢?我们是不是就可以理解为从头开始往后面走了i个元素,拿这个例子与上面一对比,这就十分明确了
			//j*width的意思就是待排序数据一个元素所占用的长度,也就是往后面移动了一位。

		}
	}
}

int main() {
	int arr[] = { 1,3,5,7,9,2,4,6,8,0 };

	bubble_sort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]), compare);

	int i = 0;
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("%d",arr[i]);
	}
	printf("\n");

	char arr1[] = "hello world";//这里我准备了两个例子供大家参考

	bubble_sort(arr1, sizeof(arr1) / sizeof(arr1[0]), sizeof(arr1[0]), compare);

	for (i = 0; i < sizeof(arr1) / sizeof(arr1[0]); i++)
		printf("%c",arr1[i]);
	printf("\n");

	return 0;
}

14.模拟实现计算器

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(void) {
	printf("************请选择****************\n");
	printf("******1.Add*********2.Sub*********\n");
	printf("******3.Mul*********4.Div*********\n");
	printf("************0.exit****************\n");
	printf("**********************************\n");
}
int Add(int x, int y) {
	return x + y;
}
int Sub(int x, int y) {
	return x - y;
}
int Mul(int x, int y) {
	return x * y;
}
int Div(int x, int y) {
	return x / y;
}

int main() {
	//这里并没有用switch结构,这里跟第一个程序不同,上一个程序中input定义在了switch外面,所以没啥问题
	//但是在这里,函数的主体就只有一个循环,由于我们用的是do-while循环,最后while后面的input是在循环体外面的,
	//如果在里面定义input的话,作用域就到不了外面,故,我们把input定义在外面。
	int input = 0;
	do {
		//这里我们采用函数指针数组的方法。
		int (*parr[5])(int, int) = { NULL,Add,Sub,Mul,Div };
		int x, y, ret;
		x = y = ret = 0;
		//输出菜单
		menu();
		//选择方法
		printf("请选择:>");
		scanf("%d", &input);
		if (input >= 1 && input <= 4) {
			//初始化数据
			printf("请输入2个操作数:");
			scanf("%d%d", &x, &y);
			//用函数指针的方法,用指针调用函数
			ret = (parr[input])(x, y);

			printf("ret =%d\n", ret);
		}
		else if (input == 0)
			printf("程序结束。");

		else
			printf("选择错误,请重新选择\n");
	
	} while (input);


	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void menu(void) {
	printf("************请选择****************\n");
	printf("******1.Add*********2.Sub*********\n");
	printf("******3.Mul*********4.Div*********\n");
	printf("************0.exit****************\n");
	printf("**********************************\n");
}

int Add(int x, int y) {
	return x + y;
}

int Sub(int x, int y) {
	return x - y;
}

int Mul(int x, int y) {
	return x * y;
}

int Div(int x, int y) {
	return x / y;
}

int Calc(int(*pf)(int, int)) {
	int x, y;
	x = y  = 0;
	printf("请输入两个操作数:");
	scanf("%d%d",&x,&y);
	return pf(x, y);
}


int main() {
	int input=0;
	menu();
	printf("请选择:>");
	scanf("%d",&input);
	do {
		switch (input) {
		case 1:
			printf("ret=%d\n",Calc(Add));
		case 2:
			printf("ret =%d\n",Calc(Sub));
		case 3:
			printf("ret=%d\n", Calc(Mul));
		case 4:
			printf("ret=%d\n", Calc(Div));
		case 0:
			printf("退出程序");
		default:
			printf("请重新选择:");
		}

	} while (input);
		

	return 0;
}
/*其实这个地方就是一个回调函数的方法,首先,我们要清楚回调函数的作用和定义,回调函数就是在b函数调用a函数,
那么回调函数的作用是什么呢?就是在有多个函数选择时,我们可以另外定义一个函数,这个函数就是就是回调函数了,
回调函数的参数就是一个函数指针,这个指针便可以接收函数了,因为指针并没有指向,所以这个指针可以接收任意一个函数、
这就是回调函数。*/

15.建立一个有N个学生信息数据的链表

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#define N 4
struct student {
	//数据域
	int num;
	char name[20];
	char sex;
	int score;
	//指针域
	struct student* next;
};
int main() {
	//定义指针变量
	struct student* head, * p, * q;
	//定义结点大小
	p = (struct student*)malloc(sizeof(struct student));
	//初始化结点
	scanf("%d%s%c%d",&p->num,p->name,&p->sex,&p->score);
	//将第一个结点的地址给head。
	head = p;
    head->next=NULL;
	//用一个for循环,初始化所有的结点,即整个链表。
	for (int i = 0; i < N; i++) {
		//要重新定义第二个结点,然后初始化
		q = (struct student*)malloc(sizeof(struct student));
		scanf("%d%s%c%d", &q->num, q->name, &q->sex, &q->score);
		//让前一个结点的指针域指向下一个结点的地址
		p->next = q;
		//再让p指向已定义好的结点,q指针继续去处理下一个结点。
		p = q;
	}
	//循环结束后,最后一个结点的指针域为空。
	p->next = NULL;
	//用一个for循环输出所有结点中的信息
	for (p = head; p; p = p->next) {
		printf("%d %s %c %d\n",p->num,p->name,p->sex,p->score);
	}


	return 0;
}

16.输出平均分最高的学生信息

#define _CRT_SECURE_NO_WARNINGS 1
//输出平均分最高的学生信息
#include<stdio.h>
struct student {
	int num;
	char name[10];
	int computer, english, math;
	double average;
};
int main() {
	int i, n;
	//定义结构变量
	struct student max, stu;

	printf("Input n:");
	scanf("%d",&n);
	printf("Input the student's information:");
	
	//这里与已知长度和数据的数组的选择法排序不同,这里数据都是未知的。
	for (i = 1; i <= n; i++) {
		printf("NO.%d:",i);
		scanf("%d%s%d%d%d",&stu.num,stu.name,&stu.math,&stu.english,&stu.computer);
		stu.average = (stu.math + stu.english + stu.computer) / 3.0;
		if (i == 1) {
			max = stu;
		}
		else if (max.average < stu.average)
			max = stu;
	}
	printf("num:%d,name:%s.average:%2lf\n",max.num,max.name,max.average);

	return 0;

17.链表的比较及排序

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#define N 10
struct student {
	int num;
	int score;
	struct student* next;
};
int main() {
	struct student* head, * p, * q, * k;
	k = (struct student*)malloc(sizeof(struct student));
	//以后内存函数的使用都要判断一下,是否开辟成功,如果未开辟成功,则结束进程
	if (!k)
		exit(1);

	scanf("%d%d",&k->num,&k->score);
	//初始化第一个结点,因为结点是不连续的,仅仅是靠指针域中的地址来进行联系,所以,这既是第一个结点,也是最后一个结点,对指针域进行初始化
	k->next = NULL;
	head = k;


	//接下来对后面的N-1个结点进行定义初始化
	//这一整个片段是很关键的一环,写的是真的好,主要是我没见过
	for (int i = 1; i < N; i++) {
		k = (struct student*)malloc(sizeof(struct student));
		//判断语句
		if (!k)
			exit(1);

		scanf("%d%d", &k->num, &k->score);
		//让p指向第一个结点
		p = head;
		q = NULL;
		//此时的while起一个比较的作用(升序)
		while (p && (p->num <= k->num)) {
			
			q = p;
			p = p->next;
		}
		if (p == head) {
			k->next = head;
			head = k;
		}
		else {
			k->next = q->next;
			q->next = k;
		}
	}
	/*首先,让p指向第一个结点,k指向的是第二个结点,二者相比较,如果k指向的结点大于p指向的,先把初始结点的地址给q,p就指向下一位,
	执行else语句。即在q指向的结点后面插入k指向的结点。
	如果p指向的结点数据大于k指向的结点数据,则将k指向的结点插到第一个结点前面,也就是插到相比较结点的前面。
    交换完数据以后,利用for循环再次重新定义一个新节点,再次进行比较。
	*/

    free(k);//一定要记得释放申请的内存
	//输出整个的链表
	for (p = head; p; p = p->next) {
		printf("%d  %d\n", p->num,p->score);
	}

	return 0;
}

18.建立链表,查找值为x的结点并删除这个结点,x的值从键盘输入。

#define _CRT_SECURE_NO_WARNINGS 1
//建立链表,查找值为x的结点并删除这个结点,x的值从键盘输入。
#include<stdio.h>
#include<stdlib.h>
//先定义结构体类型
struct node {
	int date;
	struct node* next;
};
//函数声明
struct node* create_number(int);
struct node* find(struct node *, int);
struct node* Delete(struct node *, struct node * );
void out_list(struct node*);

int main() {
	//建议还是初始化一下
	struct node* head=NULL, * p=NULL;
	int n, x;
	n = x = 0;

	printf("Create List,Enter n:");
	scanf("%d", &n);
	
	head = create_number(n);

	printf("List:");
		out_list(head);

	printf("x:");
		scanf("%d", &x);

		p = find(head, x);
		head = Delete(head, p);

		printf("Result:");
		out_list(head);

	return 0;
}

//创造结点的函数
struct node* create_number(int n) {//n代表准备创造结点的个数
	//创造结点时,至少需要三个指针变量,head固定在首结点,p和k用于创造新结点
	int i;
	struct node* head=NULL, * k=NULL, * p=NULL;

	if (n < 1) {
		return NULL;
	}
	else {
		k = (struct node*)malloc(sizeof(struct node));
		//判断是否申请成功
		if (!k)
			exit(1);
		k->date = 1;//初始化第一个数据
		//第一个结点,也是最后一个,这个操作相当于给指针域初始化
		k->next = NULL;
		head = k;

		p = k;
		for (i = 2; i <= n; i++) {
			k = (struct node*)malloc(sizeof(struct node));

			if (!k)
				exit(1);
			k->date = i;
			//初始化
			k->next = NULL;

			p->next = k;
			p = k;
		}
		
		return head;
	
	}
}
//查找函数
struct node* find(struct node* head, int x) {//头指针和待查找的元素
	//另外定义一个指针去遍历,从而保证head指针不被改变
	struct node* p = head;
	while (p && p->date != x) {
		p = p->next;
	}
	if (!p)
		return NULL;
	else
		return p;
}
//删除函数
struct node* Delete(struct node* head, struct node* p) {
	struct node* q;
	if (!p)
		return head;
	//如果p不为空,判断p指向结点的位置,从而进行删除操作
	if (p = head)
		head = head->next;
	else {
		q = head;
		while (q->next != p)
			q = q->next;
		q->next = p->next;
	}
	//别忘了释放空间
	free(p);

	return head;
}
//输出函数
void out_list(struct node* head) {
	//另外定义变量去遍历
	struct node* p;
	if (!head) {
		p = head;
		while (!p) {
			printf("%d", p->date);
			p = p->next;
		}
	}
	else
		printf("不存在\n");

	putchar('\n');
}

19.有序表的增删查操作(这个题目用了比较少见的全局变量)

#define _CRT_SECURE_NO_WARNINGS 1
//有序表的增删查操作
#include<stdio.h>
#define MAXN 100
//***用全局变量count来表示数组a中待处理的元素个数
int count = 0;
//决定对有序数组a进行何种操作的控制函数
void select(int a[], int option, int value);
//输入有序数组
void input_array(int a[]);
//输出有序数组
void print_array(int a[]);
//在有序数组a中插入一个值为value的元素
void insert(int a[], int value);
//删除有序数组中等于value的元素
void remove(int a[], int value);
//用二分法查找等于value的元素
void query(int a[], int value);

int main() {
	int option, value, a[MAXN];

	input_array(a);
	//显示菜单
	printf("[1] Insert\n");
	printf("[2] Delete\n");
	printf("[3] Query\n"); 
	printf("[Other option] End\n");

	while (1) {
		printf("Input option:");
		scanf("%d", &option);

		if (option < 1 || option>3) {
			break;
		}

		printf("Input an element:");
		scanf("%d", &value);
		//调用函数
		select(a, option, value);
		printf("\n");
	}
	//结束操作
	printf("Thanks!");

	return 0;
}

void select(int a[], int option, int value) {
	switch (option) {
	case 1:
		insert(a, value);//增
		break;
	case 2:
		remove(a, value);//删
		break;
	case 3:
		query(a, value);//查
		break;
	}//跟模拟计算器的三种方法相似,都可。
}

void input_array(int a[]) {
	printf("Input the number of array element:");
	scanf_s("%d", &count);

	printf("Input an order array element:");
		for (int i = 0; i < count; i++) {
			scanf_s("%d", &a[i]);//初始化数组
	}

}

void print_array(int a[]) {
	printf("The ordered array a is:");
		for (int i = 0; i < count; i++) {
			if (i == 0)
				printf("%d", a[i]);
			else
				printf("%d", a[i]);
		}
}
//有序表插入函数
void insert(int a[], int value) {
	int i, j;
	//定位,找到待插入的位置,即退出循环时i的位置
	for (i = 0; i < count; i++) {
		if (value < a[i]) {
			break;
		}
	}
	//腾位:将a[i]~a[count-1]向后顺移一位
	for (j = count - 1; j >= i; j--) {
		a[j + 1] = a[j];
	}
	a[i] = value;//将value的值赋给a[i]
	
	count++;//数组待处理的元素数量加1

	print_array(a);
}
//有序表删除函数
void remove(int a[], int value) {
	int i, index = -1;
	//定位:如果找到待删除的元素,用index记录其下标
	for (i = 0; i < count; i++) {
		if (value == a[i]) {
			index = i;
			break;
		}	
	}
	//没找到
	if (index == -1) {
		printf("Failed to find the date,deletion failed.");
	}
	//找到,删除a[index],并且将之后的所有元素向前挪一位
	else {
		for (i = index; i < count - 1; i++) {
			a[i] = a[i + 1];
		}
	}
	//待处理的元素数量减1
	count--;

	print_array(a);

}
//有序表二分查找法查询函数
void query(int a[], int value) {
	int mid, left = 0, right = count - 1;

	while (left <= right) {
		mid = (left + right) / 2;
	
		if (value == a[mid]) {
			printf("The index is:%d", mid);
			return;//
		}
		else if (value < a[mid]) {
			right=mid - 1;
		}
		else {
			left = mid + 1;
		}
	}

	printf("This element does not exist.");
}

20.这个题目就是给学生分等级,但是由于分级的时候,分数不是整十的数,所以不能用switch,但是我们要知道,switch只不过是比较厉害的多分支结构罢了,所以我们直接用多分支就好了

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0; 
}

int set_grade( struct student *p, int n ){
	int count=0; 
	for(int i=0;i<n;i++){
		if((p->score)<60){
			count++;
			p->grade='D';
		}else if(p->score>=60 && p->score<=69){
			p->grade='C';
		}else if(p->score>=70 && p->score<=84)
			p->grade='B';
		else
			p->grade='A';	
		p++;
	}
	return count;
}

21.凯撒密码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define MAXLINE 80
#define M 26
//凯撒密码
int main() {
	int i, offset;//offset是偏移量
	char str[MAXLINE];

	printf("Enter a string:");
	//初始化数组
	i = 0;
	while ((str[i] = getchar()) != '\n') {
		i++;
	}
	str[i] = '\0';//一定要记得这一步,字符串数组没有‘\0’是很难操作的

	printf("Enter offest:");
	scanf("%d", &offset);
	//如果偏移量大于26,
	if (offset >= M) {
		offset = offset % M;
	}
	//遍历数组
	for (i = 0; str[i]; i++) {

		if (str[i] >= 'A' && str[i] <= 'Z') {
			if ((str[i] - 'A' + offset) < M)
				str[i] += offset;
			else {
				str[i] -= (M - offset);
			}
		}

		else if (str[i] >= 'a' && str[i] <= 'z') {
				if ((str[i] - 'a' + offset) < M){
					str[i] += offset;
				}
				else {
					str[i] -= (M - offset);
				}
			}
		}
	//做题目的时候,一定要养成这种思维,不是为了做题而去做题,不是说有了思路之后就直接写完了,要全面考虑,考虑会不会有其他bug。
	printf("After being encrypted:");
	for (i = 0; str[i]; i++) {
		putchar(str[i]);
	}
	printf("\n");

	return 0;
}

/*如果我需要随机输入一个字符串,我可以选择定义数组长度,然后用一个for循环来输入,但是这样并不能保证完美用到每个空间,就算自己计算,则会导致
运算量的增大。最常用的办法就是用while循环来输入,表达式为(str[i]=getchar())!='\n'.就跟上面一样,要先定义一个i=0;然后在循环体中i++。*/

22.判断完数

#define _CRT_SECURE_NO_WARNINGS 1
//判断完数-一个数敲好等于它的因子之和,这个数就叫做完数。
#include<stdio.h>
int main() {
	int i, j, n, sum;
	static int k[10];
	
	for (i = 2; i <= 1000; i++) {
		n = -1;
		sum = i;
		//遍历找因子,如果sum-=j成立且最后为0,则代表他们相等,再把每次的因子分别存到数组。
		for (j = 1; j < i; j++) {
			if (i % j == 0)
			{
				n++;
				sum -= j;
				k[n] = j;
			}
		}

		if (sum == 0)
		{
			printf("%d is a 完数.", i);
			for (j = 0; j <=n; j++) {
				printf("%d,", k[j]);
			}
			printf("\n");
		}
	}

	return 0;
}

23.旋转数组

#define _CRT_SECURE_NO_WARNINGS 1
//旋转数组(以逆时针旋转90度为例)
#include<stdio.h>
int main() {
	int a[4][4], b[4][4];
	int i, j;
	printf("请输入16个数据:");

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			scanf("%d", &a[i][j]);

			b[3 - j][i] = a[i][j];//真正的点睛之笔,把这个式子带到程序中理解,b数组第一个存进去的元素是b[3][0],b[2][0],
			                     //b[1][0],b[0][0],分别是由a[0][0],a[0][1],a[0][2],a[0][3]存进去的,就像旋转了一样
		}
	}

	printf("array b:\n");

	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) 
			printf("%6d", b[i][j]);
		printf("\n");
		
	}
	return 0;
}

24.

#define _CRT_SECURE_NO_WARNINGS 1
/*
通过键盘输入3名学生4门课程的成绩,
分别求每个学生的平均成绩和每门课程的平均成绩。
要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车
其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。*/
#include<stdio.h>
int main() {
	float a[4][5], sum1, sum2;
	int i, j;
	//先初始化不算平均值的地方,把其他地方空出来
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 4; j++) {
			scanf("%f", &a[i][j]);
		}
	}
	//将上面的数据算出平均值存到最后一列
	for (i = 0; i < 3; i++) {
		sum1 = 0;
		for (j = 0; j < 4; j++) {
			sum1 += a[i][j];	
		}
		a[i][4] = sum1 / 4;
	}
	//由于此时最后一列是有数据的,所以此时j的循环条件改变为j<5,最后一列也要求平均值
	for (j = 0; j < 5; j++) {
		sum2 = 0;
		for (i = 0; i < 3; i++) {
			sum2 += a[i][j];
		}
		a[3][j] = sum2 / 3;
	}
	//输出
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 5; j++) {
			printf("%6.2f", a[i][j]);
		}
		putchar('\n');
	}

	return 0;
}

25.删除字符串中的某个字母并输出

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main() {
	char s[100], c;
	int i, j = 0;

	printf("Enter a string:");
	//编译器问题,vs2022里面的stdio.h中里面没有gets函数,只有gets_s函数
	gets_s(s);
	printf("\nEnter a character:");
	c = getchar();

	for (i = 0; s[i]; i++) {
		//把不同的字母存到另一个数组中,从而达到删除的目的
		if (s[i] != c)
			s[j++] = s[i];
	}
		s[j] = '\0';
		printf("\n%s", s);

	return 0;
}

26.

#define _CRT_SECURE_NO_WARNINGS 1
//在有序数组中插入一个元素,并且插入过后同样是有序的。
#include<stdio.h>
int main() {
	//a[0]为工作单元,从a[1]开始存放数据。
	int a[10] = { 0,1,2,3,4,6,7};
	//j代表元素个数
	int x, i, j = 6;
	//输入插入的值
	printf("Enter a number:");
	scanf("%d", &x);
	//把x要放在数组中,避免数据的丢失。
	a[0] = x;
	//可以选择从大往小,也可以选择从小往大。我这里是从大往小。
	i = j;
	while (a[i] > x) {
		a[i + 1] = a[i];
		i--;
	}
	//把x放到比他小的值后面一位,因为上面已经把它的后面一位空出来了,所以,这个操作不会对数组内的数据有影响
	a[++i] = x;
	//插入x后,元素总个数增加。
	j++;
	//输出数组
	for (i = 1; i <= j; i++)
		printf("%8d", a[i]);
	printf("\n");

	return 0;
}

暂时写这么多了,够你们啃好久了,如果不知道题目,根据我代码里面的描述去搜题,同时也可以对比看看,看看别人的代码再看看我的,不说谁写的好,但是我注释一定是比很多人要清楚的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜欢吃豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值