程序设计第六周

输入最多10个大小写字符,以回车符结束输入,输出其中的大写字母。
比如:输入 abcDeF
则输出 DF

#include
#include
int main()
{
	char temp[10] = {'\0'};
	char str[10] = "";
	gets(str);
	int i;
	int index = 0;
	for(i = 0; i < 10; i++)
	{
		if(str[i] > 'A' && str[i] < 'Z')
		{
			temp[index++]=str[i];
		}
		if(str[i] == '\0')
		{
			break;
		}
	}
	printf("%s",temp);
	return 0;
}

对于一个已排好序的字符数组,要求输入一个字符,按照字符顺序插入数组中。

已知数组为char ch[20]="bcfmr",

输入:a

输出:abcfmr

输入:n

输出:bcfmnr

输入:z

输出:bcfmrz

#include
int main()
{
	char ch[20]="bcfmr";
	char c;
	scanf("%c",&c);
	// 从最后一位开始找应该存在的位置 
	int i;
	int index = -1;
	char d = c;
	// ?? 这里的字符顺序是指忽略大小写吗?不是很理解题目意思,但是写上对小写肯定不影响 
	if(c >= 'A' && c <= 'Z')
	{
		d = 'a' + (c - 'A');
	}
	for(i = 4; i >= 0; i--)
	{
		char temp = ch[i];
		if( temp < d)
		{
			index = i + 1;
			break;
		}
	}
	for(i = 5; i > index; i--)
	{
		ch[i] = ch[i - 1];	
	}
	ch[index] = c;	
	printf("%s",ch);	
	return 0;
}

写两个函数,分别求两个正整数的最大公约数与最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。如输入15和18,输出3和90 。
【输入输出样例】
输入:
15 18
输出:
3 90

#include
int getGreat(int n1, int n2)
{
	// 先找到小的那个数,最大公约数肯定比它小
	int min = n1 > n2 ? n2 : n1;
	while(1)
	{
		if(n1 % min == 0 && n2 % min ==0)
		{
			break; // 找到了 
		}
		min--;
	}
	return min; 
}

int getMin(int n1, int n2)
{
	// 先找到大那个数,如何从它开始+1
	int max = n1 > n2 ? n1 : n2;
	while(1)
	{
		if(max % n1 == 0 && max % n2 == 0)
		{
			break;	
		}
		max++;	
	} 
	return max;
}

int main()
{
	int n1,n2;
	scanf("%d%d",&n1,&n2);
	int m = getGreat(n1,n2);
	int k = getMin(n1,n2);
	printf("%d %d",m,k);
	return 0;
}

编写函数,用“冒泡法”对输入的n个整数按从小到大的顺序排列。编写主函数,输入n和n个数组元素,调用函数排序,在主函数中输出。注意,输入、输出可以通过单独的函数实现,在排序函数中不能输出数组元素。

输入:输入n,换行后输入n个整数。(n不超过20)
输出:从小到大的排列,数字之间有空格,末尾无空格。
【输入输出样例】
输入:
5
5 4 3 2 1
输出:
1 2 3 4 5

#include
#include
int* BubbleSort(int* num,int len)
{
	int i, j;
	for(i = len - 1; i >= 0; i--)
	{
		for(j = 0; j < i ;j++)
		{
			if(num[j] > num[j + 1])
			{
				int temp = num[j];
				num[j] = num[j + 1];
				num[j+1] = temp;
			}
		}
	}
}
void print1(int* num,int n)
{
	int i;
	for(i = 0; i < n; i++)
	{
		if(i == 0)
		{
			printf("%d",num[0]);
		}
		else
		{
			printf(" %d",num[i]);
		}
	}
	return;
}

int main()
{
	int n;
	scanf("%d",&n);
	int num[20] = {0};
	int i;
	for(i = 0; i < n; i++)
	{
		scanf("%d",&num[i]);
	}
	BubbleSort(num,n);
	print1(num,n);
	return 0;
}

用牛顿迭代法求根。方程为ax³+bx²+cx+d=0,系数a,b,c,d的值依次为1,2,3,4。求x在x0附近的一个实根。数据类型用float。
输入:输入x0和迭代次数n。
输出:输出一个实数(用%f输出)
【输入输出样例】
输入:
1 10
输出:
-1.650629

#include
#include
float getX(float n,float x)
{
	float f;
	int i;
	for(i = 0; i < n; i++)
	{
		f = (pow(x,3) + 2 * pow(x,2) + 3 * x + 4) / (3 * pow(x,2) + 2 * 2 * x + 3);
		x -= f;
	}
	return x;
} 
int main()
{
	// 这一题要知道牛顿迭代法的数学公式才能做 
	float x0,n;
	scanf("%f%f",&x0,&n);
	float res = getX(n,x0);
	printf("%f",res);
	return 0;
}

题目内容:
分别编写函数输入数组元素(输入-9999表示结束)、从小到大排序数组元素、用二分法在有序数组中查找(返回下标)。
编写主函数,调用函数进行输入、排序和查找。数组元素不超过100个,均为整数。
输入格式:
两行,第1行为输入的数组元素,以-9999结束;第2行输入5个待查找的元素。数据用空格隔开。
输出格式:
5行,每行是查找到的元素的下标,找不到时结果为-1。
输入样例:
2 1 3 4 5 -9999
2 3 4 -10 10
输出样例:
1
2
3
-1
-1

#include
int num[100]; 
// 在接收输入的同时进行计数,看一共输入了多少个

int input(int* num)
{
	int i;
	int count = 0; 
	for(i = 0; i < 100; i++)
	{
		int t;
		scanf("%d",&t);
		if(t == -9999)
		{
			break;
		}
		num[i] = t;
		count++;
	}
	return count;
}
int* BubbleSort(int* num,int len)
{
	int i, j;
	for(i = len - 1; i >= 0; i--)
	{
		for(j = 0; j < i ;j++)
		{
			if(num[j] > num[j + 1])
			{
				int temp = num[j];
				num[j] = num[j + 1];
				num[j+1] = temp;
			}
		}
	}
}
int find(int len,int x)
{
	int l = 0;
	int r = len - 1;
	int index = -1;
	while(l <= r)
	{
		int mid = (l + r) / 2;
		int t = num[mid];
		if(t == x)
		{
			index = mid;
			break;
		}
		if(t < x)
		{
			l = mid + 1;
		}else
		{
			r = mid - 1;
		}
	}
	return index;
}
int main()
{
	int len = input(num);
	BubbleSort(num,len);
	int i;
	for(i = 0; i < 5; i++)
	{
		int t;
		scanf("%d",&t);
		int index = find(len,t);
		printf("%d\n",index);
	}
	
	return 0;
} 

题目内容:
编写函数,将一个矩阵原地逆时针旋转90度,如原矩阵为
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
旋转后为:
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13
所谓原地旋转就是不能使用另外一个一维或二维数组做中间存储,但可以使用变量。
矩阵的输入、输出也用函数实现。
编写主函数,先输入矩阵的行数和列数,然后调用函数按行输入矩阵的元素(设均为整数),
调用函数转,调用函数显示。矩阵的行数、列数均不超过10。
输入格式:
第1行,两个整数。表示矩阵的行数n和列数m。
以后n行,每行m个整数,用空格隔开。
输出格式:
m行,每行n个数,行中数据用一个空格隔开,末尾无空格。
输入样例:
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

输出样例:
4 8 12 16
3 7 11 15
2 6 10 14
1 5 9 13

#include

// 设置为全局变量就不用传参啦 
int arr[10][10];
void input(int m,int n)
{
	int i, j;
	for(i = 0; i < m;i++)
	{
		for(j = 0; j < n; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
}

void change(int n,int m)
{
	for (int i = 0; i < n / 2; i++) {
        for (int j = i; j < m - i - 1; j++) {
        	// 一次变四个元素 
            int temp = arr[i][j];
            arr[i][j] = arr[j][m - i - 1];
            arr[j][m - i - 1] = arr[n - i - 1][m - j - 1];
            arr[n - i - 1][m - j - 1] = arr[m - j - 1][i];
            arr[m - j - 1][i] = temp;
        }
    }
}

void print(int n,int m)
{
	int i,j;
	for(i = 0; i < m; i++)
	{
		
		for(j = 0; j < n; j++)
		{
			if(j == 0)
			{
				printf("%d",arr[i][j]);
			}
			else
			{
				printf(" %d",arr[i][j]);
			}
		}
		printf("\n");
	}
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	input(n,m);
	change(n,m);
	print(n,m);
	return 0;
}

编写函数将整数k变换为一个字母串,规则如下:设0对应A,1对应B,......,25对应Z。从左向右考察k的各位数字,若连续两位对应上面一种变换,则直接换掉两位数字,否则一位数字换成对应的字母。变换结果存入res反馈给调用者。函数原型为:
void DigiTran( int k, char res[] );
在主函数输入一些非负整数,最后输入-1代表结束,利用上面函数对每个数字变换后输出。

示例输入:(数字间空一格)
12 3925 0 -1
示例输出:(每个字符串后面空一格)
M DJZ A

#include
#include
void DigiTran( int k, char res[] )
{
	int n;
	if(k != 0)
		n = (int)log10(k) + 1;
	else
		n = 1;
	// 直接将这个整数分解开
	int arr[10];
	int i;
	int temp = k;
	for(i = n - 1; i >= 0; i--)
	{
		arr[i] = temp % 10;
		temp = temp / 10;
	} 
	int k1 = 0;
	for(i = 0; i < n; i++)
	{
		int t = arr[i];
		if(i < n - 1)
		{
			t = arr[i] * 10 + arr[i + 1];
			if(t > 25)
			{
				t = arr[i];
			}
			else
			{
				i++;
			}
		}
		//printf("%d",t);
		res[k1++] = 'A' + t;
	}
}

int main()
{
	int k;
	scanf("%d",&k);

	while(1)
	{
		char res[20] = {'\0'};
		if(k == -1)
		{
			break;
		}
		DigiTran(k,res);
		printf("%s ",res);
		scanf("%d",&k);

	}
	return 0;
}

你可能感兴趣的:(程设设计基础,c语言)