C语言练习作业3

39.输入一个十进制数,输出相应的八进制数和十六进制数。例如:输入31,输出37和1F。
/*进制转换*/
#include<stdio.h>
#include <stdio.h>

int main(void) {
	int decimalNum;
	printf("请输入一个十进制数: ");
	scanf("%d", &decimalNum);
	
	int octalNum = 0;
	int hexNum = 0;
	int base = 1;
	
	int tempDecimalNum = decimalNum;
	
	while (tempDecimalNum > 0) {
		int remainder = tempDecimalNum % 8;
		octalNum = octalNum + remainder * base;
		tempDecimalNum = tempDecimalNum / 8;
		base = base * 10;
	}
	
	base = 1;
	tempDecimalNum = decimalNum;
	
	while (tempDecimalNum > 0) {
		int remainder = tempDecimalNum % 16;
		hexNum = hexNum + remainder * base;
		tempDecimalNum = tempDecimalNum / 16;
		base = base * 10;
	}
	
	printf("八进制数: %d\n", octalNum);
	printf("十六进制数: %X\n", hexNum);
	
	return 0;
}

快捷版本:

/*进制转换简洁版*/
#include <stdio.h>

int main() {
	int decimalNum;
	
	printf("请输入一个十进制数: ");
	scanf("%d", &decimalNum);
	
	printf("八进制数: %o\n", decimalNum);
	printf("十六进制数: %X\n", decimalNum);
	
	return 0;
}
40.英文字母转换。输入一行字符,将其中的英文字母转换后输出,其他字符按原样输出。其中英文字母(a~z或A~Z)的转换规则是:将当前字母替换为字母表中的后一个字母,同时将小写字母转换为大写,大写字母转换为小写,如:'a'->'B'、'C'->'d'、'Z'->'a'、'z'->'A'。

使用函数输入版:

/*英文字母转换*/
#include <stdio.h>
int main() {
	char inputString[100];
	
	printf("请输入一行字符: ");
	fgets(inputString, sizeof(inputString), stdin);
	
	for (int i = 0; inputString[i] != '\0'; i++) {
		char currentChar = inputString[i];
		
		if ((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z')) {
			// Check if it's a lowercase letter
			if (currentChar >= 'a' && currentChar <= 'z') {
				// Convert lowercase to uppercase
				currentChar = currentChar - 'a' + 'A';
			} else {
				// Convert uppercase to lowercase
				currentChar = currentChar - 'A' + 'a';
			}
			
			// Apply the letter shift
			if (currentChar == 'z') {
				currentChar = 'A';
			} else if (currentChar == 'Z') {
				currentChar = 'a';
			} else {
				currentChar++;
			}
		}
		
		printf("%c", currentChar);
	}
	
	return 0;
}

 使用循环输入版:

/*英文字母转换*/
#include <stdio.h>

int main() {
	printf("请输入一行字符: ");
	
	int currentChar;
	while ((currentChar = getchar()) != '\n' && currentChar != EOF) {
		if ((currentChar >= 'a' && currentChar <= 'z') || (currentChar >= 'A' && currentChar <= 'Z')) {
			if (currentChar >= 'a' && currentChar <= 'z') {
				currentChar = currentChar - 'a' + 'A';
			} else {
				currentChar = currentChar - 'A' + 'a';
			}
			
			if (currentChar == 'z') {
				currentChar = 'A';
			} else if (currentChar == 'Z') {
				currentChar = 'a';
			} else {
				currentChar++;
			}
		}
		putchar(currentChar);
	}
	
	return 0;
}
41.求最大公约数。输入两个整数m和n,计算m和n的最大公约数

函数版:

/*求最大公约数*/
#include<stdio.h>
int gcd(int a,int b);
int main(void){
	int m,n,result;
	
	printf("请输入两个整数(用空格隔开):");
	scanf("%d %d",&m,&n);
	result=gcd(m,n);
	printf("%d和%d的最大公约数是%d",m,n,result);
	
	return 0;
}
int gcd(int a,int b){
	int r,temp;
	
	if(a<b){
		temp=a;
		a=b;
		b=temp;
	}
	r=a%b;
	while(r!=0){
		a=b;
		b=r;
		r=a%b;
	}
	return b;
}

直接版:

/*求最大公约数*/
#include<stdio.h>
int main(void){
	int m,n,i;
	
	printf("请输入两个整数(用空格隔开):");
	scanf("%d %d",&m,&n);
	for(i=m<n?m:n;i>=1;i--){
		if(m%i==0&&n%i==0){
			break;
		}
	}
	printf("%d和%d的最大公约数是%d",m,n,i);
	
	return 0;
}
42.输入一行字符,统计其中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
/*统计单词个数*/
#include<stdio.h>
int main(void){
	char ch;
	int cnt,word;//cnt记录单词的个数,word是新单词标识
	
	word=cnt=0;//置word的初值为0,表示还没有遇到新单词
	printf("请输入一串字符:");
	while((ch=getchar())!='\n'){
		if(ch==' '){//读入空格,表示不是单词
			word=0;//word赋0,表示不是单词
		}
		else if(word==0){//读入非空格且word为0,此为单词首字符
			word=1;//word赋1,表示遇到新单词
			cnt++;//累加单词计数器cnt
		}
	}
	printf("%d\n",cnt);
	
	return 0;
}
43.输出所有大于平均值的数。输入n个整数(1≤n≤10),计算这些数的平均值,再输出所有大于平均数的数。
/*输出所有大于平均值的数*/
#include<stdio.h>
int main(void){
	int n,sum=0;
	double average;
	
	printf("请输入数字个数:");
	scanf("%d",&n);
	int numbers[n];
	printf("请输入%d个数,并用空格隔开:\n",n);
	
	for(int i=0;i<n;i++){
		scanf("%d",&numbers[i]);
		sum+=numbers[i];
	}
	average=sum/n;
	for(int i=0;i<n;i++){
		if(numbers[i]>average){
			printf("%d  ",numbers[i]);
		}
	}
	
	return 0;
  }
44.利用数组计算斐波那契数列。利用数组计算斐波那契数列的前n个数(1≤n≤46),即:1,1,2,3,5,8,...,并按每行打印5个数的格式输出,如果最后一行的输出少于5个数,也需要换行。

用数组计算并存放斐波那契数列的前n个数,有下列关系式成立:

f[0]=f[1]=1

f[n]=f[n-1]+f[n-2],2≤n≤45

/*利用数组计算斐波那契数列*/
#include<stdio.h>
int main(void){
	int n,fib[46];
	
	printf("请输入需要计算计算的斐波那契数列项数n:(1≤n≤46)");
	scanf("%d",&n);
	if(1<=n&&n<=46){
		fib[0]=fib[1]=1;
		for(int i=2;i<n;i++){
			fib[i]=fib[i-1]+fib[i-2];
		}
		for(int i=0;i<n;i++){
			printf("%6d",fib[i]);
			if((i+1)%5==0){
				printf("\n");
			}
		}
		if(n%5!=0){
			printf("\n");
		}
	}else
		printf("输入的n不合法!");
	
	return 0;
}
45.查找满足条件的所有整数——顺序查找法。输入正整数n(1≤n≤10)和整数x,再输入n个整数并存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始);如果没有找到,输出“Not found"。
/*顺序查找法*/
#include<stdio.h>
int main(void){
	int n,x,flag;
	int a[10];
	
	printf("请输入数的个数n和给定的数x:");
	scanf("%d%d",&n,&x);
	printf("请输入%d个数",n);
	for(int i =0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	//查找
	flag=0;//flag标志x是否找到,先假设x不在数组中,置初值为0
	for(int i=0;i<n;i++){
		if(a[i]==x){
			printf("下标为:%d",i);
			flag=1;
		}
	}
	if(flag==0){
		printf("Not found\n");
	}
	
	return 0;
}
46.输入一个正整数n(1≤n≤10),再输入n个整数,将它们存入数组a中。求最小值及其下标。输出最小值和它所对应的最小下标。交换最小值。将最小值与第一个数交换,输出交换后的n个数。
/*查找最小值下标并与第一个数交换*/
#include<stdio.h>
int main(void){
	int n,index;
	int a[10];
	
	printf("请输入数字个数n:");
	scanf("%d",&n);
	printf("请输入%d个数:",n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	//找最小值a[index]
	index=0;
	for(int i=1;i<n;i++){
		if(a[index]>a[i]){
			index=i;
		}
	}
	printf("最小值为%d,下标为%d\n",a[index],index);
	
	//交换
	int temp=a[0];
	a[0]=a[index];
	a[index]=temp;
	printf("交换第一个数与最小值后的数字为:");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	
	return 0;
}
47.选择法排序。输入一个正整数n(1≤n≤10),再输入n个整数 ,用选择法将它们从小到大排序后输出。
/*选择法排序*/
#include<stdio.h>
int main(void){
	int index,n,temp;
	int a[10];
	
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	printf("请输入%d个整数:",n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	
	//排序
	for(int k=0;k<n-1;k++){
		index=k;
		for(int i=k+1;i<n;i++){
			if(a[i]<a[index]){
				index=i;
			}
		}
		temp=a[index];
		a[index]=a[k];
		a[k]=temp;
	}
	
	//输出
	printf("排序后:");
	for(int i=0;i<n;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	
	return 0;
}
48.二分查找法。输入一个整数n,再输入n个整数,判断其是否按从小到大的顺序排列,如果是按照升序排列的,则使用二分法查找;否则先对数据进行排序再使用二分法查找。
/*二分查找法*/
#include <stdio.h>
#include <stdlib.h>

// 比较函数用于排序
int compare(const void *a, const void *b) {
	return (*(int *)a - *(int *)b);
}

// 二分查找函数
int binarySearch(int arr[], int size, int target) {
	int left = 0;
	int right = size - 1;
	
	while (left <= right) {
		int mid = left + (right - left) / 2;
		
		if (arr[mid] == target) {
			return mid; // 找到了目标值
		}
		
		if (arr[mid] < target) {
			left = mid + 1;
		} else {
			right = mid - 1;
		}
	}
	
	return -1; // 目标值不存在
}

int main() {
	int n;
	printf("请输入整数n: ");
	scanf("%d", &n);
	
	int *arr = (int *)malloc(n * sizeof(int));
	
	if (arr == NULL) {
		printf("内存分配失败\n");
		return 1;
	}
	
	printf("请输入%d个整数: ", n);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	
	// 判断是否按升序排列
	int isSorted = 1;
	for (int i = 1; i < n; i++) {
		if (arr[i] < arr[i - 1]) {
			isSorted = 0;
			break;
		}
	}
	
	if (isSorted) {
		// 使用二分法查找
		int target;
		printf("请输入要查找的整数: ");
		scanf("%d", &target);
		
		int index = binarySearch(arr, n, target);
		
		if (index != -1) {
			printf("%d 在位置 %d 中找到。\n", target, index);
		} else {
			printf("%d 未找到。\n", target);
		}
	} else {
		// 对数据排序
		qsort(arr, n, sizeof(int), compare);
		
		printf("数据已排序,排序后的数据为:\n");
		for(int i=0;i<n;i++){
			printf("%d ",arr[i]);
		}
		printf("\n");
		
		// 使用二分法查找
		int target;
		printf("请输入要查找的整数: ");
		scanf("%d", &target);
		
		int index = binarySearch(arr, n, target);
		
		if (index != -1) {
			printf("%d 在位置 %d 中找到。\n", target, index);
		} else {
			printf("%d 未找到。\n", target);
		}
	}
	
	free(arr);
	return 0;
}
49.求矩阵的最大值。输入两个正整数m和n(1≤m,n≤6),再输入1个m×n的矩阵,找出最大值以及它的行下标和列下标。假设最大值唯一。
/*找出矩阵中最大值及其行、列下标*/
#include<stdio.h>
int main(void){
	int m,n,col,row;
	int a[6][6];
	
	printf("请输入两个正整数m和n:");
	scanf("%d%d",&m,&n);
	printf("请输入%d个数:",m*n);
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&a[i][j]);
		}
	}
	row=col=0;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if(a[i][j]>a[row][col]){
				row=i;
				col=j;
			}
		}
	}
	printf("最大值为a[%d][%d]=%d\n",row,col,a[row][col]);
	
	return 0;
}
50.方阵转置。输入0一个正整数n(1<n≤6),根据下式生成一个n×n的方阵,将该方阵转置(行列互换)后输出。 

a[i][j]=i*n+j+1(0≤i≤n-1,0≤j≤n-1)

/*方阵转置*/
#include<stdio.h>
int main(void){
	int n,temp,i,j;
	int a[6][6];
	
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			a[i][j]=i*n+j+1;
		}
	}
	
	//转置
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			if(i<=j){
				temp=a[i][j];
				a[i][j]=a[j][i];
				a[j][i]=temp;
			}
		}
	}
	
	//输出
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			printf("%4d",a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}
51.计算天数。定义函数day_of_year(year,month,day),计算并返回年year、月month和日day对应的是该年的第几天。
///*计算某个日期对应该年的第几天*/
#include <stdio.h>

int day_of_year(int year, int month, int day) {
	int leap;
	int tab[2][13] = {
		{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
		{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
	};
	
	// 判断闰年,当year是闰年时,leap=1,当year是非闰年时,leap=0;
	leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
	
	// 边界检查
	if (month < 1 || month > 12 || day < 1 || day > tab[leap][month]) {
		return -1; // 表示日期无效
	}
	
	int dayOfYear = day;
	
	// 计算天数
	for (int i = 0; i < month; i++) {
		dayOfYear += tab[leap][i];
	}

	return dayOfYear;
}

int main(void) {
	int year, month, day;
	int dayOfYear;
	printf("请输入年、月、日(例:2001.1.1)\n");
	scanf("%d.%d.%d", &year, &month, &day);
	
	dayOfYear = day_of_year(year, month, day);
	
	if (dayOfYear == -1) {
		printf("输入日期无效\n");
	} else {
		printf("%d.%d.%d是%d年的第%d天\n", year, month, day, year, dayOfYear);
	}
	
	return 0;
}
52.判断回文字符串。输入一个以回车符为标志的字符串(少于80个字符),判断该字符串是否为回文。(回文就是以字符串中心对称,如:“noon”,“radar”是回文,“reader”不是回文。
/*判断字符串是否为回文*/
#include<stdio.h>
int main(void){
	char line[80];
	int k=0;
	
	printf("请输入一段字符串:");
	while((line[k]=getchar())!='\n'){
		k++;
	}
	line[k]='\0';//字符串结束符
	
	//判断line是否是回文
	int i=0;
	k=k-1;
	
	while(i<k){//同时从字符串两端向中间靠拢并对比对应字符是否相等
		if(line[i]!=line[k]){
			break;
		}
		i++;
		k--;
	}
	if(i>=k){//循环正常结束,字符串是回文
		printf("输入的字符串是回文!");
	}else{//while循环非正常结束,对应字符不相等
		printf("输入的字符串不是回文!");
	}
	
	return 0;
}
53.凯撒密码。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个正整数offset,用凯撒密码(将明文中的所有字母都在字母表上向后偏移offset位后替换成密文)加密输出。
/*凯撒密码加密*/
#include<stdio.h>
#define M 26  //定义符号常量M,表示字母表中大写或小写字母的数量26
int main(void){
	int offset;
	char str[80];
	
	printf("请输入一个字符串:");
	int i=0;
	while((str[i]=getchar())!='\n'){
		i++;
	}
	str[i]='\0';
	
	printf("请输入偏移量:");
	scanf("%d0",&offset);
	if(offset>=M){
		offset=offset%M;
	}
	
	//加密
	for(i=0;str[i]!='\0';i++){
		if(str[i]>='A'&&str[i]<='Z'){
			if((str[i]-'A'+offset)<M){
				str[i]=str[i]+offset;
			}else{
				str[i]=str[i]-(M-offset);
			}
		}else if(str[i]>='a'&&str[i]<='z'){
			if((str[i]-'a'+offset)<M){
				str[i]=str[i]+offset;
			}else{
				str[i]=str[i]-(M-offset);
			}
		}
	}
	
	printf("加密后字符串为:");
	for(i=0;str[i]!='\0';i++){
		putchar(str[i]);
	}
	printf("\n");
	
	return 0;
}

注:凯撒密码解密:

#include <stdio.h>
#define M 26
int main(void) {
	int offset;
	char str[80];
	
	printf("请输入一个字符串:");
	int i = 0;
	while ((str[i] = getchar()) != '\n') {
		i++;
	}
	str[i] = '\0';
	
	printf("请输入偏移量:");
	scanf("%d", &offset);
	if (offset >= M) {
		offset = offset % M;
	}
	
	// 解密
	for (i = 0; str[i] != '\0'; i++) {
		if (str[i] >= 'A' && str[i] <= 'Z') {
			if ((str[i] - 'A' - offset) >= 0) {
				str[i] = str[i] - offset;
			} else {
				str[i] = str[i] + (M - offset);
			}
		} else if (str[i] >= 'a' && str[i] <= 'z') {
			if ((str[i] - 'a' - offset) >= 0) {
				str[i] = str[i] - offset;
			} else {
				str[i] = str[i] + (M - offset);
			}
		}
	}
	
	printf("解密后字符串为:");
	for (i = 0; str[i] != '\0'; i++) {
		putchar(str[i]);
	}
	printf("\n");
	
	return 0;
}
54.字符转换,输入一个以回车符为结束标志的字符串(少于10个字符),提取其中的所有数字字符(‘0’,‘...’,‘9’),将其转换为一个十进制整数输出。

注:由于字符串少于10个字符,数字长度就取其上限10,以回车符‘\n’作为输入结束符。

/*字符转换*/
#include<stdio.h>
int main(void){
	int number;
	char str[10];
	
	printf("请输入一个字符串:");
	int i=0;
	while((str[i]=getchar())!='\n'){
		i++;
	}
	str[i]='\0';
	
	number=0;
	for(i=0;str[i]!='\0';i++){
		if(str[i]>='0'&&str[i]<='9'){
			number=number*10+str[i]-'0';
		}
	}
	
	printf("十进制整数为:%d\n",number);
	
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你代码有bug!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值