作业5

作业5-1

输入n个整数,按从小到大输出这n个整数(输出时 数据之间用一个空格隔开)。其中,n由键盘输入。

#include<stdio.h>

void sort(arr[],int n){
for(int i=0;i<n;i++){
int min=i;
for(int j=i;j<n;j++){
if(arr[min].arr[j]){
min=j;
}
int temp=arr[min];
arr[min]=arr[j];
arr[j]=temp
}
}
}

int main(){
int n,arr[100];
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",arr[i]);
}
sort(arr,n);
for(int i=0;i<n;i++){
printf("%d",arr[i]);
}
return 0;
}

排序题,关于排序我会另写一篇blog。

作业5-2

输入 4*4 阶矩阵,输出下三角(含主对角线)的数之和。

#include<stdio.h>

int main(){
int arr[4][4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
scanf("%d",&arr[i][j]);
}
}
int s=0;
for(i=0;i<M;i++)
for(j=0;j<=i;j++)
s+=a[i][j];
printf("%d\n",s);
return 0;
}

二维数组输入就是多了个for语句嵌套

作业6

作业6-1

输入一个字符串,统计其中数字和非数字字符各有多少 个,输出的两个数字用1个空格隔开。

```

### 作业6-2

编写一程序,功能是:输入一个字符串,判断其是否为回文,即对称字符串。

```c
#include<stdio.h>
#include<string.h>

int huiwen(char arr[]){
int left = 0, right = strlen(arr) - 1;
while(left<right){
if(arr[left]!=arr[right])
return 0;
left++;
right--;
}
return 1;
}

int main(){
char arr[100];
gets(arr);
if(huiwen(arr))
printf("YES");
else
printf("NO");
return 0;
}

作业6-3

输入一个字符串,删除其中的数字字符。

#include<stdio.h>
#include<ctype.h>

int main(){
char str[100];
gets(str);
int j=0;
for(int i=0;str[i];i++){
if(!isdigit(str[i])){
str[j]=str[i];
j++;
}
}
str[j] = '\0';
puts(str);
return 0;
}

注意点:

  • 在外声明j变量方便加上结束符
  • j递增不能写在for内,当不是数字的时候j才能递增

作业7

作业7-1

统计单词个数。从键盘上输入一行字符,统计其中有多 少个单词,单词之间用空格隔开.

#include <stdio.h>

int main() {
char ch[100];
int i,count=0,word=0;
for(i=0;ch[i]!='\0';i++) {
if (ch[i]==' ') {
word=0;
}
else if (word==0) {
word=1;
count++;
}
}
printf("%d\n",count);
return 0;
}

使用gets(也可以用fgets)而不是scanf,是因为scanf读到空格就会停止而gets不会。

作业7-2

输入n个国家名称,使用选择法排序从小到大排序后输 出,输出时每个名称间用一个空格隔开,其中n由键盘输入。

例如: 输入:5 China France Britain Russia America 输出:America Britain China France Russia

#include <stdio.h>
#include <string.h>

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

char arr[5][100];
for (int i=0; i<n; i++) {
scanf("%s", &arr[i]);
}

for (int i=0; i<n-1; i++) {
for (int j=0; j<n-1-i; j++) {
if (strcmp(arr[j], arr[j+1])>0) {
char temp[100];
strcpy(temp, arr[j]);
strcpy(arr[j], arr[j+1]);
strcpy(arr[j+1], temp);
}
}
}

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

return 0
}

不同于比较数值,字符串的比较要用到strcmp,若strcmp(str1,str2)等于0,说明str1=str2;大于0就是str1大于str2,小于则相反

作业8

作业8-1

编写两个函数comm_div和comm_mul,分别求两个整数的最大公约数和最小公倍数,在main函数中输入两个整数,调用这两个函数并输出两个整数的最大公约数和最 小公倍数,输出时两数间用一个空格隔开。

例如: 输入:48 64,输出:16 192

​ 输入:45 88,输出:1 3960

#include<stdio.h>

int comm_div(int m, int n) {
while(n!=0) {
int temp=n;
n=m%n;
m=temp;
}
return m;
}

int comm_mul(int m,int n){
int x=m>n?m:n;
while(x%m!=0||x%n!=0){
x++;
}
return x;
}

int main(){
int m,n,x,y;
scanf("%d%d",&m,&n);
x=comm_div(m,n);
y=comm_mul(m,n);
printf("%d %d",x,y);
}

作业8-2

编写一个从小到大排序(选择法)的函数sort(int x[],int n),其中 n 为整数个 数。在main函数中输入n的值和一n个整数,调用排序函数sort后,输出排序后的n个整数,每个数间用一个空格隔开。

例如: 输入:5 7 2 1 8 4

​ 输出:1 2 4 7 8

​ 输入:10 67 56 45 89 34 21 87 32 89 12

​ 输出:12 21 32 34 45 56 67 87 89 89

#include<stdio.h>
#define N 100

void sort(int x[],int n);

int main(){
int arr[N],n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
sort(arr,n);
for(int i=0;i<n;i++){
printf("%d ", arr[i]);
}
return 0;
}

void sort(int x[],int n){
for(int i=0;i<n-1;i++)
{
int min=i;
for(int j=i+1;j<n;j++)
{
int temp;
if(x[min]>x[j]){
min=j;
}
}
if (min!=i) {
int temp=x[i];
x[i]=x[min];
x[min]=temp;
}
}
}

作业8-3

编写一函数str_reverse(char c[]),功能是将一个字符串逆序存放,在main函 数中输入一个字符串,调用str_reverse函数后,输出该字符串。

例如: 输入:abcd,输出:dcba

​ 输入:12345,输出:54321

#include<stdio.h>
#include<string.h>
#define N 100

void str_reverse(char c[]);

int main(){
char c[N];
gets(c);
str_reverse(c);
printf("%s",c);
return 0;
}

void str_reverse(char c[]){
int i,j;
char temp;
for(i=0,j=strlen(c)-1;i<j;i++,j--){
temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}