C语言练习作业4

55.十六进制字符串转换成十进制非负整数。输入一个以‘#’为结束标志的字符串(少于10个字符),滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,输出该字符串并将其转换为十进制后输出。
/*进制转换*/
#include<stdio.h>
int main(void){
	int i,k,number;
	char hexad[80],str[80];
	
	printf("请输入一个字符串:");
	i=0;
	while((str[i]=getchar())!='#'){
		i++;
	}
	str[i]='\0';
	
	//滤去非十六进制字符后生成的新字符串hexad
	i=0;k=0;
	while(str[i]!='\0'){
		if((str[i]>='0'&&str[i]<='9')||
		   (str[i]>='a'&&str[i]<='f')||
		   (str[i]>='A'&&str[i]<='F')){
			hexad[k]=str[i];
			k++;
		}
		i++;
	}
	hexad[k]='\0';
	
	//输出十六进制新字符串
	printf("新字符串:");
	for(i=0;hexad[i]!='\0';i++){
		putchar(hexad[i]);
	}
	printf("\n");
	
	//转换为十进制整数
	number=0;
	for(i=0;hexad[i]!='\0';i++){
		if(hexad[i]>='0'&&hexad[i]<='9'){
			number=number*16+hexad[i]-'0';
		}
		else if(hexad[i]>='A'&&hexad[i]<='F'){
			number=number*16+hexad[i]-'A'+10;
		}
		else if(hexad[i]>='a'&&hexad[i]<='f'){
			number=number*16+hexad[i]-'a'+10;
		}
	}
	printf("对应的十进制为:%d",number);
	
	return 0;
}
56.查找指定字符。输入一个字符,再输入一个以回车符结束的字符串(少于80个字符),在字符串中查找该字符。如果找到,则输出该字符在字符串中所对应的最大下标,下标从0开始;否则输出“Not found”。
/*查找指定字符*/
#include <stdio.h>

int main() {
	char target;
	char str[80];
	int index = -1;
	int i = 0;
	
	printf("请输入一个字符:");
	scanf("%c", &target);
	getchar(); // 消耗回车符
	
	printf("请输入一个字符串(少于80个字符):");
	while((str[i]=getchar())!='\n'){
		i++;
	}
	str[i]='\0';
	
	// 在字符串中查找目标字符
	i=0;
	while (str[i] != '\0') {
		if (str[i] == target) {
			index = i;
		}
		i++;
	}
	
	if (index != -1) {
		printf("目标字符在字符串中的最大下标为:%d\n", index);
	} else {
		printf("Not found\n");
	}
	
	return 0;
}
57.字符串逆序。输入一个以回车符结束的字符串(少于80个字符),将该字符串逆序存放,输出逆序后的字符串。
/*字符串逆序*/
#include <stdio.h>
#include <string.h>
void reverseString(char* str) {
	int len = strlen(str);
	int i, j;
	char temp;
	
	for (i = 0, j = len - 1; i < j; i++, j--) {
		temp = str[i];
		str[i] = str[j];
		str[j] = temp;
	}
}

int main() {
	int i=0;
	char str[80];
	printf("请输入一个字符串:\n");
	while((str[i]=getchar())!='\n'){
		i++;
	}
	str[i]='\0';
	
	reverseString(str);
	printf("逆序后的字符串为:%s\n", str);
	
	return 0;
}
58.求一批整数中出现最多的数字。输入一个正整数n(1<n≤1000),再输入n个整数,分析每个整数的每一位数字,求出现次数最多的数字。例如输入3个整数1234、2345、3456,其中出现次数最多的数字是3和4,均出现了3次。
/*求一批整数中出现最多的数字*/
#include <stdio.h>
int main() {
	int n;
	printf("请输入一个正整数n:");
	scanf("%d", &n);
	
	int numbers[n];
	printf("请输入%d个整数:\n", n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &numbers[i]);
	}
	
	int digitCount[10] = {0};  // 用于统计0-9每个数字的出现次数
	
	for (int i = 0; i < n; i++) {
		int num = numbers[i];
		while (num > 0) {
			int digit = num % 10;
			digitCount[digit]++;
			num /= 10;
		}
	}
	
	int maxCount = 0;
	for (int i = 0; i < 10; i++) {
		if (digitCount[i] > maxCount) {
			maxCount = digitCount[i];
		}
	}
	
	printf("出现次数最多的数字是:");
	for (int i = 0; i < 10; i++) {
		if (digitCount[i] == maxCount) {
			printf("%d ", i);
		}
	}
	printf(",出现了%d次。\n", maxCount);
	
	return 0;
}
59.判断上三角矩阵。输入一个正整数n(1≤n≤6)和n阶方阵a中的元素,如果a是上三角矩阵,输出“YES”,否则,输出“NO”。上三角矩阵指主对角线以下的元素都为0的矩阵,主对角线为从矩阵左上角至右下角的连线。
//判断上三角矩阵
#include <stdio.h>
#include <stdbool.h>

bool isUpperTriangularMatrix(int n, int matrix[][6]) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < i; j++) {
			if (matrix[i][j] != 0) {
				return false;
			}
		}
	}
	return true;
}

int main() {
	int n;
	printf("请输入正整数n(1≤n≤6):\n");
	scanf("%d", &n);
	
	if (n < 1 || n > 6) {
		printf("输入的n不符合要求!\n");
		return 0;
	}
	
	int matrix[6][6];
	printf("请输入%d阶方阵的元素:\n", n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &matrix[i][j]);
		}
	}
	
	if (isUpperTriangularMatrix(n, matrix)) {
		printf("YES\n");} 
	else {
		printf("NO\n");}
	
	return 0;
}
60.求矩阵各行元素之和。输入2个正整数m和n(1≤m≤6,1≤n≤6),然后输入矩阵a(m行n列)中的元素,分别求出各行元素之和,并输出。
//求矩阵各行元素之和
#include <stdio.h>
int main() {
	int m, n;
	printf("请输入两个正整数m和n(1≤m≤6,1≤n≤6):\n");
	scanf("%d %d", &m, &n);
	
	if (m < 1 || m > 6 || n < 1 || n > 6) {
		printf("输入的m和n不符合要求!\n");
		return 0;
	}
	
	int matrix[6][6];
	printf("请输入矩阵a的元素(%d行%d列):\n", m, n);
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &matrix[i][j]);
		}
	}
	
	printf("各行元素之和为:\n");
	for (int i = 0; i < m; i++) {
		int sum = 0;
		for (int j = 0; j < n; j++) {
			sum += matrix[i][j];
		}
		printf("第%d行:%d\n", i + 1, sum);
	}
	
	return 0;
}
61.找鞍点。输入1个正整数n(1≤n≤6)和n阶方阵a中的元素,假设方阵a最多有1个鞍点,如果找到a的鞍点,就输出其下标,否则,输出“NO”。鞍点的元素值在该行上最大,在该列上最小。
/*找鞍点*/
#include <stdio.h>
#include <stdbool.h>
int main() {
	int n;
	printf("请输入正整数n(1≤n≤6):\n");
	scanf("%d", &n);
	
	if (n < 1 || n > 6) {
		printf("输入的n不符合要求!\n");
		return 0;
	}
	
	int matrix[6][6];
	printf("请输入%d阶方阵的元素:\n", n);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			scanf("%d", &matrix[i][j]);
		}
	}
	
	int saddlePointRow = -1;
	int saddlePointCol = -1;
	for (int i = 0; i < n; i++) {
		int maxInRow = matrix[i][0];
		int maxColIndex = 0;
		
		// 在当前行找到最大值及其列索引
		for (int j = 1; j < n; j++) {
			if (matrix[i][j] > maxInRow) {
				maxInRow = matrix[i][j];
				maxColIndex = j;
			}
		}
		
		// 判断最大值是否是该列上的最小值
		bool isSaddlePoint = true;
		for (int k = 0; k < n; k++) {
			if (matrix[k][maxColIndex] < maxInRow) {
				isSaddlePoint = false;
				break;
			}
		}
		
		if (isSaddlePoint) {
			saddlePointRow = i;
			saddlePointCol = maxColIndex;
			break;
		}
	}
	
	if (saddlePointRow == -1 && saddlePointCol == -1) {
		printf("NO\n");
	} else {
		printf("鞍点的下标是:%d行%d列\n", saddlePointRow + 1, saddlePointCol + 1);
	}
	
	return 0;
}
62.统计大写辅音字母。输入一个以回车结束的字符串(少于80个字符),统计并输出其中大写辅音字母的个数。大写辅音字母是指除‘A','E','I','O','U'以外的大写字母。
/*统计大写辅音字母*/
#include <stdio.h>
int isUpperCaseConsonant(char c) {
	// 检查字符是否为大写辅音字母
	return (c >= 'A' && c <= 'Z' && c != 'A' && c != 'E' && c != 'I' && c != 'O' && c != 'U');
}

int main() {
	char input[80];
	int count = 0;
	
	printf("请输入一个字符串(少于80个字符): ");
	fgets(input, sizeof(input), stdin);
	
	for (int i = 0; input[i] != '\0'; i++) {
		if (isUpperCaseConsonant(input[i])) {
			count++;
		}
	}
	
	printf("大写辅音字母的个数是: %d\n", count);
	
	return 0;
}
63.冒泡排序。输入n(n≤10)个正整数,将它们从小到大排序后输出,要求使用冒泡排序算法。
/*冒泡排序*/
#include<stdio.h>
void swap(int *px,int *py);
void bubble(int a[],int n);
int main(void){
	int n,a[10];
	
	printf("请输入一个正整数n(n≤10):");
	scanf("%d",&n);
	printf("请输入%d个数:",n);
	
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	bubble(a,n);
	printf("排序后:");
	for(int i=0;i<n;i++){
		printf("%3d",a[i]);
	}
	
	return 0;
}

void bubble(int a[],int n){
	for(int i=1;i<n;i++){
		for(int j=0;j<n-i;j++){
			if(a[j]>a[j+1]){
				swap(&a[j],&a[j+1]);
			}
		}
	}
}

void swap(int *px,int *py){
	int t;
	t=*px;
	*px=*py;
	*py=t;
}
64.压缩字符串。输入一个长度小于80的字符串,按规则对字符串进行压缩,输出压缩后的字符串。压缩规则是:如果某个字符x连续出现n(n>1)个,则将这n个字符替换为“nx”的形式,否则保持不变。
/*字符串压缩*/
#include<stdio.h>
void zip(char *p);
int main(void){
	char line[80];
	printf("请输入一个字符串:");
	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=p+n;
	}
	*q='\0';
}
65.任意个整数求和。先输入一个正整数n,再输入任意n个整数,计算并输出这n个整数的和。要求使用动态内存分配方法为这n个整数分配空间。
/*求任意个整数和*/
#include<stdio.h>
#include<stdlib.h>
int main(void){
	int n,sum,i,*p;
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	
	//为数组p动态分配n个整数类型大小的空间
	if((p=(int *)calloc(n,sizeof(int)))==NULL){
		printf("Not able to allocate memory.\n");
		exit(1);
	}
	
	printf("请输入%d个整数:",n);
	for(i=0;i<n;i++){
		scanf("%d",p+i);
	}
	sum=0;
	for(i=0;i<n;i++){
		sum=sum+*(p+i);
	}
	printf("和为%d\n",sum);
	free(p);
	
	return 0;
}
66.在数组中查找指定元素:输入一个正整数n(1<n≤10),然后输入n个整数存入数组a中,再输入一个整数x,在数组a中查找x,若找到则输出相应的下标,否则显示Not found。要求定义和调用函数search(int list[ ],int n,int x),在数组list中查找元素x,若找到则返回相应下标(从0开始),否则返回-1,参数n代表数组list中元素的数量。
/*查找元素方法一*/
#include<stdio.h>
int search(int a[],int n,int x);
int main(void){
	int n,x,index;
	
	printf("请输入一个正整数n(1<n≤10):");
	scanf("%d",&n);
	printf("请输入%d个整数:",n);
	int a[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	printf("请输入一个整数x:");
	scanf("%d",&x);
	
	index=search(a,n,x);
	if(index==-1){
		printf("Not found");
	}
	else{
		printf("%d",index);
	}

	return 0;
}

int search(int a[],int n,int x){
	int i;
	for(i=0;i<n;i++){
		if(a[i]==x)
			return i;
	}
	return -1;
}

改进版:二分查找法:

/*查找元素方法二*/
#include<stdio.h>
int search(int a[],int n,int x);
int main(void){
	int n,x,index;
	
	printf("请输入一个正整数n(1<n≤10):");
	scanf("%d",&n);
	printf("请输入%d个整数:",n);
	int a[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	printf("请输入一个整数x:");
	scanf("%d",&x);
	
	index=search(a,n,x);
	if(index==-1){
		printf("Not found");
	}
	else{
		printf("%d",index);
	}
	
	return 0;
}

int search(int a[],int n,int x){
	int low=0,high=n-1,mid;
	while(low<=high){
		mid=(low+high)/2;
		if(x==a[mid]){
			return mid;
		}
		else if(x<a[mid]){
			high=mid-1;
		}
		else{
			low=mid+1;
		}
	}
	return -1;
}
67.循环后移。有n个整数,使前面各数顺序向后移m个位置,移出的数再从开头移入。编写一个函数实现以上功能,在主函数中输入n个整数并输出调整后的n个数。
/*循环后移*/
#include <stdio.h>
void cyclicShift(int arr[], int n, int m) {
	m = m % n; // 确保 m 在 0 到 n-1 之间
	int temp[n];
	for (int i = 0; i < n; i++) {
		int newPos = (i + m) % n;
		temp[newPos] = arr[i];
	}
	for (int i = 0; i < n; i++) {
		arr[i] = temp[i];
	}
}

int main() {
	int n, m;
	printf("请输入整数个数 n: ");
	scanf("%d", &n);
	
	int arr[n];
	printf("请输入%d个整数:\n", n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	
	printf("请输入向后移动的位置数m: ");
	scanf("%d", &m);
	
	cyclicShift(arr, n, m);
	
	printf("调整后的整数序列为: ");
	for (int i = 0; i < n; i++) {
		printf("%d ", arr[i]);
	}
	
	return 0;
}
68.报数。有n个人围成一圈,按顺序从1到n编好号。从第一个人开始报数,报到m(m<n)的人退出圈子,从下一个人从1开始报数,报到m的人退出圈子。如此下去,直到留下最后一个人。输入整数n和m,并按退出顺序输出退出圈子的人的编号。
/*报数*/
#include <stdio.h>
#include <stdbool.h>

void josephus(int n, int m) {
	bool eliminated[n];
	for (int i = 0; i < n; i++) {
		eliminated[i] = false;
	}
	
	int remaining = n; // 剩余的人数
	int position = 0;  // 当前位置
	
	printf("退出顺序的人的编号: ");
	while (remaining > 0) {
		int count = 0;
		while (count < m) {
			if (!eliminated[position]) {
				count++;
			}
			if (count < m) {
				position = (position + 1) % n;
			}
		}
		eliminated[position] = true;
		remaining--;
		
		printf("%d", position + 1); // 输出人的编号(从1开始)
		if (remaining > 0) {
			printf(", ");
		}
		
		position = (position + 1) % n;
	}
	printf("\n");
}

int main() {
	int n, m;
	printf("请输入总人数 n: ");
	scanf("%d", &n);
	printf("请输入报数的值 m: ");
	scanf("%d", &m);
	
	josephus(n, m);
	
	return 0;
}
69.使用函数实现字符串复制:输入一个字符串t和一个正整数m,将字符串t中从第m个字符开始的全部字符复制到字符串s中,再输出字符串s。要求自定义并调用函数void strmcpy(char *s,char *t,int m)。
/*使用函数实现字符串复制*/
#include<stdio.h>
#include<string.h>
void strmcpy(char *s,char *t,int m){
	int i,j;
	for(i=m-1,j=0;i<strlen(t);i++){
		s[j]=t[i];
		j++;
	}
	printf("字符串t从%d开始复制的字符串s为:%s",m,s);
}
int main(void){
	char t[100],s[100];
	int m;
	printf("请输入一个字符串t:");
	scanf("%s",t);
	printf("请输入一个正整数m:");
	scanf("%d",&m);
	strmcpy(s,t,m);
	
	return 0;
}
70.删除字符。输入一个字符串,在输入一个字符ch,将字符串中所有的ch字符删除后输出该字符串。要求定义和调用函数delchar(s,c),该函数将字符串s中出现的所有c字符删除。
/*删除字符*/
#include<stdio.h>
#include<string.h>
void delchar(char *s,char c){
	int i,j;
	int len=strlen(s);
	for(i=0,j=0;i<len;i++){
		if(s[i]!=c){
			s[j]=s[i];
			j++;
		}
	}
	s[j]='\0';
	printf("删除%c后的字符串为%s",c,s);
}
int main(void){
	char str[100];
	char ch;
	printf("请输入一个字符串:");
	scanf("%s",str);
	printf("请输入要删除的字符:");
	scanf(" %c",&ch);//注意空格,消耗一个换行符
	delchar(str,ch);

	return 0;
}
71.分类统计字符个数。输入一行文字,统计其中的大写字母、小写字母、空格、数字以及其他字符各有多少。
/*分类统计字符个数*/
#include <stdio.h>
#include <ctype.h>

int main() {
	char text[1000];
	int uppercase = 0, lowercase = 0, spaces = 0, digits = 0, other = 0;
	
	printf("请输入一行文字: ");
	gets(text);  // 注意:不推荐在实际应用中使用gets函数,但在此示例中用于简单输入。
	
	for (int i = 0; text[i] != '\0'; i++) {
		if (isupper(text[i])) {
			uppercase++;
		} else if (islower(text[i])) {
			lowercase++;
		} else if (isspace(text[i])) {
			spaces++;
		} else if (isdigit(text[i])) {
			digits++;
		} else {
			other++;
		}
	}
	
	printf("大写字母: %d\n", uppercase);
	printf("小写字母: %d\n", lowercase);
	printf("空格: %d\n", spaces);
	printf("数字: %d\n", digits);
	printf("其他字符: %d\n", other);
	
	return 0;
}
72.输出学生成绩(动态分配):输入学生人数后输入每个学生的成绩,最后输出学生的平均成绩、最高成绩和最低成绩。要求使用动态内存分配来实现。
/*输出学生成绩(动态分配)*/
#include <stdio.h>
#include <stdlib.h>

int main() {
	int num_students;
	printf("请输入学生人数: ");
	scanf("%d", &num_students);
	
	if (num_students <= 0) {
		printf("无效的人数输入\n");
		return 1;
	}
	
	// 使用动态内存分配来存储学生成绩
	int *grades = (int *)malloc(num_students * sizeof(int));
	
	if (grades == NULL) {
		printf("内存分配失败\n");
		return 1;
	}
	
	// 输入每个学生的成绩
	for (int i = 0; i < num_students; i++) {
		printf("请输入第 %d 位学生的成绩: ", i + 1);
		scanf("%d", &grades[i]);
	}
	
	// 计算平均成绩、最高成绩和最低成绩
	int sum = 0;
	int max_grade = grades[0];
	int min_grade = grades[0];
	
	for (int i = 0; i < num_students; i++) {
		sum += grades[i];
		if (grades[i] > max_grade) {
			max_grade = grades[i];
		}
		if (grades[i] < min_grade) {
			min_grade = grades[i];
		}
	}
	
	// 输出结果
	printf("平均成绩: %.2f\n", (float)sum / num_students);
	printf("最高成绩: %d\n", max_grade);
	printf("最低成绩: %d\n", min_grade);
	
	// 释放动态分配的内存
	free(grades);
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你代码有bug!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值