C语言经典编程282例13

101 使用数组统计学生成绩

输入学生的学号及语文、数学、英语成绩,输出学生各科成绩及平均成绩信息。

1、可宏定义学号及各科成绩的最大范围,这样可更改
2、平均值放在float

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

#define MAX 50

  main()
{
	int name[MAX], ch[MAX], en[MAX], ma[MAX];
	float avg[MAX]; 
	int i = 0, num;
	
	printf("输入学生总数\n");
	scanf("%d", &num);
	for(i = 0; i < num; i++)
	{
		scanf("%d %d %d %d", &name[i], &ch[i], &en[i], &ma[i]); 
	}
	
	//求平均值
	for(i = 0; i < num; i++)
	{
		avg[i] = ( ch[i] + en[i] +ma[i]) /3;
	}
	
	//输出学号&平均值
    for(i = 0; i < num; i++)
    {
    	printf("学号: %d, 平均成绩:%f \n", name[i], avg[i]);
	}
	
  	printf("\n");
 }

102 查找数组中的最值

实现查找数组中的最大值和最小值,并将最大值和最小值对应的下标和数值输出:

先将最大值和最小值赋值为数组的第一个数,后在通过for分别和数组中其他值比较。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
	int ch[20];
	int i = 0, num, max, min, j, k;
	
	printf("输入个数\n");
	scanf("%d", &num);
	for(i = 0; i < num; i++)
	{
		scanf("%d", &ch[i]); 
	}
	
	max = ch[0];
	min = ch[0];
	
	for(i = 1; i < num; i++)
	{
		if(ch[i] > max)
		{
			max = ch[i];
			j = i;
		}
		if(ch[i] < min)
		{
			min = ch[i];
			k = i;
		}
	}
	
    printf("最大值: %d, 第:%d \n", max, j);
    printf("最小值: %d, 第:%d \n", min, k); 
  	printf("\n");
 }

103 判断一个数是否存在数组中

定义一个数组,并为这个数组初始化,在屏幕上输入一个整数来查看是否在数组中。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
	int ch[10] = {10, 20, 30, 40,50, 60, 70,80,90,100};
	int i = 0, num;
	
	printf("输入整数\n");
	scanf("%d", &num);
	for(i = 0; i < 10; i++)
	{
		if(num == ch[i])
		{
			 printf("存在该整数,在第%d 个\n", i);
			 return 0;
		}  
	}
	
	printf("不存在该整数 \n");
  	printf("\n");
 }
 

104 求二维数组对角线之和

有一个4 * 4 的矩阵,要求编程求出其从左上到右下的对角线之和。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
	int a[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, { 9, 10, 11, 12}, {13, 14, 15, 16}};
	int i = 0, j = 0, sum = 0;
	
	for(i = 0; i < 4; i++)
	{
		for(j = 0; j < 4; j++)
		{
		    if(i == j)
		    {
		    	sum += a[i][j];
			}
		}
		 
	}
	
	printf("和: %d \n", sum);
  	printf("\n");
 }

105 模拟比赛打分

从键盘输入选手数目,然后输入裁判对每个选手的打分情况。这里假设裁判5个人,最后输出每位选手的总成绩。

就定义一个数组来存放裁判的分数

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>


  main()
{
	float a[100], b[100], sum = 0;
	int i = 0, j = 1, n = 0;
	
    printf("输入个数\n");
	scanf("%d", &n);
	
	for(i = 1; i <= n ; i++)
	{
		 printf("now player %d\n", i);
		 
		 for(; j < 5 * n + 1; j++)
		 {
		 	scanf("%f", &a[j]);
		 	sum += a[j];
		 	
		 	if(j %5 == 0)
		 	{
		 		break;
			 }
		 }
		
		b[i] = sum;
		sum = 0;
		j++;
	} 
	
	j = 1;
	printf("player    judgeA   judgeB  judgeC  judgeD   judgeE   total\n");
	
	for(i = 1; i <= n; i++)
	{
		printf(" player %d ", i);
		for(; j < 5 *n + 1; j++)
		{
			printf("%8.1f", a[j]);
			if(j % 5 == 0)
			{
				break;
			}
		}
		
		printf("%8.1f\n",b[i]);
		j++;
	}
	 
  	printf("\n");
 }
 

这里将各个裁判分成5个数组,最后在算总和,
优点:通俗易懂
缺点:冗余

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

#define MAX 50

  main()
{
	int num1[MAX], num2[MAX], num3[MAX], num4[MAX], num5[MAX],sum[MAX];
	int i = 0, j = 0, num = 0;
	
    printf("输入个数");
	scanf("%d", &num);
	
	for(i = 0; i < num ; i++)
	{
		scanf("%d", &num1[i]);
	} 
	 for(i = 0; i < num ; i++)
	{
		scanf("%d", &num2[i]);
	}
	for(i = 0; i < num ; i++)
	{
		scanf("%d", &num3[i]);
	} 
	for(i = 0; i < num ; i++)
	{
		scanf("%d", &num4[i]);
	}
	for(i = 0; i < num ; i++)
	{
		scanf("%d", &num5[i]);
	} 
	
	for(i = 0; i < num ; i++)
	{
		sum[i] = num1[i] + num2[i] + num3[i] + num4[i]+ num5[i];
	 } 
	 
	 for(i = 0; i < num ; i++)
	{
		printf("第%d位 和: %d \n", i,sum[i]);
	 } 
	
  	printf("\n");
 }

106矩阵的转置

将一个二维数组的行和列元素互换,存到另外一个二维数组中。

1、输入需要转换的数组元素的行和列,再输入数组
数组a的 i 行 j 列存到数组b 的 j 行 i 列。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>


  main()
{
	int a[100][100], b[100][100]; 
	int i1, j1, i, j;
	
	printf("输入几行"); 
	scanf("%d",&i1);
	printf("输入几列"); 
	scanf("%d", &j1);
	
	for(i = 0; i < i1; i++)
	{
		for(j = 0; j < j1; j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	
	for(i = 0; i < i1; i++)
	{
		for(j = 0; j < j1; j++)
		{
			b[j][i] = a[i][j];
		}
	}
	
	for(i = 0; i < i1; i++)
	{
		for(j = 0; j < j1; j++)
		{
		  	printf("%4d", a[i][j]);
		}
			printf("\n");
	}
	
  	printf("\n");
  	
  	for(i = 0; i < i1; i++)
	{
		for(j = 0; j < j1; j++)
		{
		  	printf("%4d", b[i][j]);
		}
			printf("\n");
	}
	printf("\n");
 }
 

107 设计魔方阵

魔方阵:由自然数组成方阵,方阵的每个元素都不相等,且每行和每列以及主副对角线的各个元素之和都相等

在这里插入图片描述
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:

  • (1)将1放在第一行中间一列;
  • (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
  • (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
  • (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
  • (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

  main()
{
	int a[6][6] = {0}; 
	int  i, j, x =1, y = 3;
	
	for(i = 1; i <= 25; i++)
	{
		a[x][y] = i;
		if(x == 1 && y == 5)
		{
			x +=1;
			continue;
		}
		
		if(x == 1) //
		{
			x = 5;
		}
		else
		{
			x--;
		}
		
		if(y == 5)
		{
			y = 1;
		}
		else
		{
			y ++;
		}
		
		if(a[x][y] != 0) //如果新位置存在该数,则退回原来数的列的下一行
		{
			x += 2;
			y -= 1;
		}	
		
	}

	for(i = 1; i <= 5; i++)
	{
		for(j = 1; j <= 5; j++)
		{
		  	printf("%4d", a[i][j]);
		}
		printf("\n");
	}
	
	printf("\n");
 }
 

108 字符升序排列

将已按升序排好字符串a和字符串b按升序归并到字符串c输出。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
  main()
{
   char a[100], b[100], c[200], *p;
   int i = 0, j = 0, k = 0;
   
   scanf("%s", &a);
   scanf("%s", &b);
   
   while(a[i] != '\0' && b[j] != '\0')
   {
   		if(a[i] > b[j])
   		{
   			c[k] = b[j];
   			j++;
		}
		else
		{
			c[k] = a[i];
			i++;
		}
		k++;
   }
   
   c[k] = '\0';
   if(a[i] == '\0')
   {
   		p = b + j;
   }
   else
    {
    	p = a + i;
	}
	
	strcat(c, p);
	puts(c);
	printf("\n");
 }
 

109 在指定位置输入字符

在屏幕上输入一个字符串和一个要插入的字符,并输入要插入的位置,会在指定的位置插入指定的字符,并输出结果

插入字符注意点:
需要判断输入的字符串是否为空

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

void insert(char s[], char x, int pos)
{
	char string[100];
	
	if(strlen(s) == 0)
	{
		s[0] = x;
		s[1] = '\0';
	}
	else
	{
		strncpy(string, s, pos);
		string[pos] = x;
		string[pos +1] = '\0';
		strcat(string, (s + pos));
		strcpy(s, string);
	}
}

main()
{
	char str[100], c;
	int pos;
	
	printf("input:\n");
	gets(str);
	printf("插入?\n");
	scanf("%c", &c);
	printf("位置?\n");
	scanf("%d", &pos);
	insert(str, c, pos);
	puts(str);
	
	printf("\n");
}

110 删除字符串中的连续字符

实现删除字符串中指定位置指定长度的连续字符串。运行后输入一个字符串,输入要删除的位置及长度,输出删除字符后的字符串。

缺点:耗资源 ,
主要应用字符串各个处理函数解决
————ME__
void del(char str[],int pos, int n) 
{
	char str2[100], str3[100];
	int len, i, j;
	
	strncpy(str2, str, pos);
	len = strlen(str);
	
	for(i = pos + n, j =0; i < len; i++, j++)
	{
		str3[j] = str[i];
	}
	strcat(str2, str3);
	printf("%s", str2);
}

main()
{
	char string[100];
	int pos, n;
	scanf("%s", &string);
	
	printf("删除位置: \n");
	scanf("%d", &pos);
	printf("删除个数: \n");
	scanf("%d", &n);
	
	del(string, pos, n);
   	printf("\n");
}	
____ 官方
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
//小逻辑处理
char *del(char s[],int pos, int n) 
{
    int i;
    for(i = pos + n -1; s[i] != '\0'; i++, pos++)
    {
    	s[pos - 1] = s[i];
	}
	
	s[pos - 1] ='\0';
	return s;
}

main()
{
	char string[100];
	int pos, n;
	scanf("%s", &string);
	
	printf("删除位置: \n");
	scanf("%d", &pos);
	printf("删除个数: \n");
	scanf("%d", &n);
	
	del(string, pos, n);
   	printf("string = %s\n", string);
   	printf("\n");
}	

111 统计各种字符个数

输入一组字符数,要求分别统计出其中英文字母,数字、空格以及其他字符的个数。

直接通过gets()获得字符串,然后在判断输入字符类型。

#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>

main()
{
	char string[100];
	int  en = 0, num = 0, space = 0, other = 0, i;
	gets(string);
	
	for(i = 0; string[i] != '\0'; i++)
	{
		if(string[i] >= '0' && string[i] <= '9')
		{
			num++; 
		}
		else if(string[i] >= 'a' && string[i] <= 'z' || string[i] >= 'A' && string[i] <='Z')
		{
			en++;  
		}
		else if(string[i] == ' ')
		{
			space++;
		}
		else
		{
			other++;
		}
	}
	 
   	printf("英文 = %d\n", en);
   	printf("空格 = %d\n", space);
   	printf("数字 = %d\n", num);
   	printf("其他 = %d\n", other);
   	printf("\n");
}	

通过getchar()获得字符,while循环来判断结束条件,在循环中判断输入字符类型。

————官方
main()
{
	char c;
	int  letters = 0, digit = 0, space = 0, others = 0;

	while((c = getchar()) != '\n')
	{
		if(c >= '0' && c <= '9')
		{
			digit++; 
		}
		else if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' )
		{
			letters++;  
		}
		else if(c == ' ')
		{
			space++;
		}
		else
		{
			others++;
		}
	}
	 
   	printf("英文 = %d\n", letters);
   	printf("空格 = %d\n", space);
   	printf("数字 = %d\n", digit);
   	printf("其他 = %d\n", others);
   	printf("\n");
}

112 字符串替换

实现将字符串“today is Monday”转变为“today is Friday”

char *replace(char *s1, char *s2, int pos)
{
	int i, j = 0;
	
	for(i = pos; s1[i] != '\0'; i++)
	{
		if(s2[j] != '\0')
		{
			s1[i] = s2[j];
			j++;
		}
		else
		{
			break;
		}
	}
	return s1;
	
}

main()
{
	char string1[100], string2[100];
	int position;
	printf("输入string1:\n"); 
	gets(string1);
	 
	printf("输入string2:\n"); 
	gets(string2);
	
	printf("输入位置:\n"); 
	scanf("%d", &position);
	replace(string1, string2, position);
	printf("the string :%s", string1);
	printf("\n");
}

在这里插入图片描述

113 回文字符串

回文字符串:正读反读都一样的字符串,如radar,要求从键盘中输入字符串,判断该字符串是否为回文字符串。

将输入的字符串一分为二,进行判断。

//me 
int judge(char *str1, char *str2, int num)
{
	int i, j = num - 1, k = 0;

	for (i = 0; i < num; i++)
	{
		if (str1[i] == str2[j])
		{
			j--;
			k++;
		}
	}

	if (k == num )
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

main()
{
	int i, n;
	char  str[20];
	gets(str);

	n = strlen(str);
	if (n % 2 == 1)
	{
		i = judge(str, str + ((n / 2) + 1), n / 2);
	}
	else
	{
		i = judge(str, str + (n / 2), n / 2);
	}

	if (i == 1)
	{
		printf("是回文");
	}
	else
	{
		printf("不是回文");
	}
	printf("\n");
}

114 字符串加密和解密

设计一个加密和解密算法,对一个指定字符串加密之后,利用解密函数能够对密文解密,显示明文信息。加密的方式是:将字符串中每个字符加上它在字符串中的位置和一个偏移值5,以字符串“mrsoft”为例,第一个字符“m”在字符串中的位置为0,则对应密文:“‘m’ + 0+ 5”

应用while(1)无限循环,result = 1,将明文加密输出,result = 2,将密文解密输出。

main()
{
	int i = 0, result = 1;
	char  str[100], passstr[100];

	while(1)
	{
		if(result == 1)
		{
			//将字符串加密。
			printf("输入要加密的明文:\n"); 
			gets(str);
			while(str[i] != '\0')
   		 	{
    			passstr[i] = str[i] +i + 5;
    			i++;
			}
			
			passstr[i] = '\0';
			printf("输出要加密的明文:\n"); 
			puts(passstr);
			printf("\n");
			result = 2;	
		}
		else if(result == 2)
		{
			i = 0;
			 
			//将字符串解密。 
			while(str[i] != '\0')
   		 	{
    			passstr[i] = str[i] +i - 5;
    			i++;
			}
			
			passstr[i] = '\0';
			printf("输出要解密的明文:\n"); 
			puts(passstr);
			
			result = 1;
			printf("\n");
		}
	}
	printf("\n");
}

115 对调最大数与最小数

从键盘输入一组数组,找出这组数组中的最大数与最小数,将最大数与最小数位置互换,并将互换后数据输出

先将max,min值假设为数组第一位。后在进行比较。

main()
{
	int i = 0, posmax, posmin;
	char max, min, temp;
	char  str[100], passstr[100];

	printf("输入:\n"); 
	gets(str);
	
	min = max = str[0];
	
	while(str[i] != '\0')
   	{
   		if(max < str[i])
   		{
   			max = str[i];
   			posmax = i;	   
		}
		
		if(min > str[i])
   		{
   			min = str[i];
   			posmin = i;	   
		}
		i++;
	}
	
	for(i = 0; str[i] !='\0'; i++)
	{
		if(i == posmax)
		{
			str[i] = min;
		}
		
		if(i == posmin)
		{
			str[i] = max;
		}
	}
	
	puts(str);
	
	printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值