(持續更新,最新時間2022年11月26日)
1. 三個數由小到大排序
輸入任意3個整數,編程實現對這3個整數進行由小到大排序井將排序後的結果顯示在屏幕上
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a, b, c, t;
printf("請任意輸入三個數(空格分隔):\n");
scanf("%d %d %d", &a, &b, &c);
if (a < b)
{ t = a;
a = b;
b = t;
}
else if (a < c)
{ t = a;
a = c;
c = t;
}
else if (b < c)
{ t = b;
b = c;
c = t;
}
printf("從大到小排列為:%d %d %d\n", a, b, c);
system("pause");
return 0;
}
2. a²+b²
要求輸入整數a和 b, 若a²+b²的結果大與100, 則輸出a²+b²的值,否則輸出 a+b 的結果
#include <stdio.h>
void main()
{
int a,b;
printf("請輸入兩個整數:\n");
scanf("%d,%d,",&a,&b);
if(a*a+b*b>100)
{
printf("(a*a+b*b)/100=%d",(a*a+b*b)/100);
}
else
{
printf("a+b=%d",a+b);
}
return 0;
}
3. 判斷閏年
判斷任意年份是否為閏年,需要滿足以下條件中的任意一個:
該年份能被 4 整除同時不能被 100 整除;
該年份能被400整除
#include <stdio.h>
int main()
{
int year,a;
printf("請輸人年份:\n");
scanf("%d",&year);
if(year%400==0)
a=1;
else
{
if(year%4==0&&year%100!=0)
a=1;
else
a=0;
}
if(a==1)
{
printf("%d 此年是閏年\n",year);
}
else
{
printf("%d 此年非閏年\n",year);
}
return 0;
}
4. 編程判斷輸入的數是否既是5又是7的整倍數,如果是輸出yes, 否則輸出no
int main(){
int n;
scanf("%d",&n);
if(n%5==0&&n%7==0)
{
printf("yes");
}
else{
printf("no");
}
printf("\n");
return 0;
}
5. 成績排名,編程對輸入的分數給出相應的等級,分數大於等於90為"A",80-89為"B",70-79 為"C",60-69為"D",60分以下為"E"。
#include<stdio.h>
int main()
{
int a;
printf("請輸入成績:");
scanf("%d",&a);
if(a>=90&&a<=100)
printf("等級是A\n");
else if(a>=80&&a<=89)
printf("等級是B\n");
else if(a>=70&&a<=79)
printf("等級是C\n");
else if(a>=60&&a<=69)
printf("等級是D\n");
else if(a>=0&&a<=59)
printf("等級是E\n");
else if(a<0)
printf("輸入錯誤,請輸入1~100的成¦績");
getchar();
return 0;
}
6. 打印乘法口訣表
#include<stdio.h>
int main(){
//外層循環變量,控制行
int i = 0;
//內層循環變量,控制列
int j = 0;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++){
printf("%dx%d=%d\t",j,i,i*j);
}
//每行輸出完後換行
printf("\n");
}
}
7.打印三角形
#include <stdio.h>
int main() {
int i, j;
int line;
printf("請輸入行數:");
scanf("%d", &line);
for (i = 0; i <= line; i++) {
for (j = line - i + 1; j <= line; j++) {
printf("* ");
}
printf("\n");
}
return 0;
}
8.序列求和
用while循環做一個簡單的計算s=1 + 1/2+ 1/3+ ... + 1/n。
#include <stdio.h>
int main()
{
int i=1;
double sum=0;
while(i<=100){
sum += 1.0/i;
i++;
}
printf("sum=%0.2lf",sum);
return;
}
(如果不是題目限制while,這裏也可以用for循環,應該也更加直觀)
9.整數加減法練習
練習者自己選擇是進行加法還是減法運算,之後輸入進行多少以內的加法或減法運算,具體數值會由計算機隨機產生,輸入答案,計算機會根據輸人的數據判斷結果是否正確
#include<stdio.h>
#include<stdlib.h> //srand()
#include<time.h> //time()
int main()
{
int sign,a,b,c;
char sign1;
int max; //最大範圍
scanf("%d", &sign);
scanf("%d", &max);
srand((unsigned long)time(0));
a = rand() % max;
b = rand() % max;
while (sign==1&&a<b) //如果為減,a又比b小重新生成隨機數
{
a = rand() % max;
b = rand() % max;
}
sign1 = (sign == 1 ?'-':'+');
printf("%d%c%d=", a, sign1, b);
scanf("%d", &c);
if ((sign == 1) && (a - b == c) || (sign != 1) && (a + b == c))
printf("right");
else
printf("error");
return 0;
}
10.猴子吃桃問題
猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個,第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
include<stdio.h>
int main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{x1=(x2+1)*2;/*第一天的桃子數是第2天桃子數加1後的2倍*/
x2=x1;
day--;
}
printf("the total is %d\n",x1);
return 0;
}
11.數組逆序排序
#include<stdio.h>
int main()
{
int a[10], i, temp;
printf("請輸入一串要逆序輸出的數字:"); //輸入一串數字
for (i = 0; i < 10; i++)
scanf("%d", &a[i]);
putchar('\n');
for (i = 0; i < 10 / 2; i++) //將數字逆序輸出
{
temp = a[i];
a[i] = a[10 - i - 1];
a[10 - i - 1] = temp;
}
printf("逆序輸出後的結果為:");
for (i = 0; i < 10; i++)
printf("%3d", a[i]);
return 0;
}
12.不用strcat 連接兩個字符串
思路:先了解下strcat的特性,先看一個網上找的demo:
#include <stdio.h>
#include <string.h>
int main ()
{
char src[50], dest[50];
strcpy(src, "This is source");
strcpy(dest, "This is destination");
strcat(dest, src);
printf("最終的目標字符串: |%s|", dest);
return(0);
}
輸出結果:
|This is destinationThis is source|
因此明白是把兩個段落鏈接起來的
#include <stdio.h>
main()
{
char a[100],b[100];
int i=0,j=0;
printf("Please input 2 strings:\n");
gets(a); //輸入字符串啊,a,b
gets(b);
while(a[i]!='\0')
i++; // i 表示字符串a的'\0'所在的位置
while(b[j]!='\0') //將b中字符一個個賦值給'\0'以及其後面的位置,i++,j++控制一一對應
a[i++]=b[j++];
a[i]='\0' //給一個結束標誌
puts(a); //輸出
return 0;
}
13.企業利潤髮放問題
企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高
於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可可提
成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於
40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於
100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?
#include <stdio.h>
int main()
{
unsigned long int i = 0;
int bonus = 0;
printf("輸入利潤:");
scanf("%ld", &i);
if (i <= 100000)
bonus = 100000 * 0.1;
else if (100000 < i <= 200000)
bonus = (i - 100000) * 0.075 + 100000 * 0.1;
else if (200000 < i <= 400000)
bonus = (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
else if (400000 < i <= 600000)
bonus = (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
else if (600000 < i <= 1000000)
bonus = (i - 600000) * 0.015 + (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1;
else if(i > 1000000)
bonus = (i - 600000) * 0.015 + (i - 400000) * 0.003 + (i - 200000) * 0.005 + (i - 100000) * 0.075 + 100000 * 0.1 + (i - 1000000) * 0.001;
printf("bonus=%d", bonus);
return 0;
}
14.根據下面的函數關係,輸入 X,計算 Y,要求輸出結果保留兩位小數
(1)當 x 小於 5 時,y=0
(2)當 x 大於 5 且小於等於 10 時,y=sin(x)
(3)當 x 大於 10 時,y=cos(x)+sin(x)
#include <stdio.h>
#include <math.h>
int main() {
float X;
double Y;
scanf("%f",&X);
if(X<5)
Y=0;
else if(X>5&&X<10)
Y=sin(X);
else if(X>10)
Y=cos(X)+sin(X);
printf("%.2f",Y);
return 0;
}
15.找10個數中的最大值
這個題和第一個題類似,不過難度相對第一題大了一點點,具體思路是構建一個存放10個數的數組,再設定一個最大值max。然後構建兩個循環,第一個循環輸入數據,第二個循環比較兩個數,最大的取出來(如果是比較最小值,大小符號改變就好)
#include <stdio.h>
int main() {
int a[10];
int Max = 0;
for (int i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < 10; i++) {
if(a[i] > Max) {
Max = a[i];
}
}
printf("十個數中最大的是:%d", Max);
return 0;
}
16.判定該正整數是否為一個迴文數
有些題目難度降低了,改成了(輸入一個 3 位的正整數,判斷迴文數),個人覺得如果是三位,方法會很簡單,思路是輸入三個數,第一個數和第三個數比較,如果不相同,輸出否,否則是。
這道題目沒有説明輸入數的多少,在網上看到一種方法不錯
數字法:
#include<stdio.h>
int main()
{
int x,newed,t,n;
while(scanf("%d",&x)!=EOF)
{
newed=0;
n=x;
do
{
newed=newed*10+x%10;
x/=10;
}while(x>0);
if(n==newed)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
字符串處理法:
#include<stdio.h>
#include<string.h>
int main()
{
int i,length,flag=1;
char a[100];
gets(a);
length=strlen(a);
for(i=0;i<=length/2;i++) {
if(a[i]!=a[length-i-1]) {
flag=0;
break;
}
}
if(flag==1)
printf("yes");
else
printf("no");
return 0;
}
17.大小寫轉換
考點:A-Z的ASCII值為 : 65-90
a-z的ASCII值為 : 97-122
兩者相差32
#include<stdio.h>
#include<stdlib.h>
int main()
{
char str[] = "AbCdEf";
char c;
int i = 0;
while (str[i] != '\0')
{
c = str[i];
if (c >= 'A' && c <= 'Z')
{
c = c + 32;
}
else if (c >= 'a' && c <= 'z')
{
c = c - 32;
}
printf("%c",c);
i++;
}
printf("\n");
system("pause");
return 0;
}
18.計算三位整數的邊界
void main()
{
int x;
int max,min;
printf("請輸入三位數 x:");
scanf("%d",&x);
x=x/100;
min=(int)x;
min=min*100;
max=min+99;
19.三角形判斷
給定平面上任意三個點的座標(x1 ,y1 )、(x2 ,y2 )、(x3 ,y3 ),檢驗它們能否構成三角形。
#include "stdio.h"
#include "math.h"
int main()
{
float x1, x2, x3, y1, y2, y3;
float a, b, c, s, l, area; //定義三邊,半周長,周長,面積
scanf("%f%f%f%f%f%f", &x1, &y1, &x2, &y2, &x3, &y3);
a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));
c = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
if (a + b > c && a + c > b && b + c > a) {
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c)); //海倫公式求面積
l = a + b + c;
printf("L = %.2f, A = %.2f\n", l, area);
} else {
printf("Impossible\n");
}
return 0;
}
20.特殊a串數列求和
給定兩個均不超過9的正整數a和n,要求編寫程序求a+aa+aaa++⋯+aa⋯a(n個a)之和。
#include "stdio.h"
#include "math.h"
int main()
{
int a,n;
int num=0;
int sum = 0;
scanf("%d %d",&a,&n);
for (int i=1;i<=n;i++){
num=num+pow(10,i-1)*a;
sum+=num;
}
printf("s = %d",sum);
return 0;
}
21.求奇數和
#include"stdio.h"
int main()
{
int num,sum=0;
for (int i=1; ;i++){
scanf("%d",&num);
if(num<=0){
break;
}
if(num%2!=0){
sum+=num;
}
}
printf("%d",sum);
return 0;
}
22.水仙花數
題目:打印出所有的“水仙花數”,所謂“水仙花數”是指一個三位數,其各位數字立方和等於該數
本身。例如:153是一個“水仙花數”,因為153=1的三次方+5的三次方+3的三次方。
程序分析:利用for循環控制100-999個數,每個數分解出個位,十位,百位。
#include <stdio.h>
int main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;
j=(n-i*100)/10;
k=n%10;
if(i*i*i+j*j*j+k*k*k==n)
printf("%d\n",n);
}
}
## 23.時間換算
本題要求編寫程序,以hh:mm:ss的格式輸出某給定時間再過n秒後的時間值(超過23:59:59就從0點開始計時)
(ps:題目還算比較友善)
#include<stdio.h>
int main(void){
int a,b,c;
int k;
scanf("%d:%d:%d\n",&a,&b,&c);
scanf("%d",&k);
c=k+c;
if(c>=60){
c=c-60;
b=b+1;
if(b>=60){
b=b-60;
a=a+1;
if(a>=24)
a=a-24;
}
}
printf("%02d:%02d:%02d",a,b,c);
return 0;
}
24.讀這段代碼的結果
程序源代碼:
#include <stdio.h>
#define M 5
int main()
{
int a[M]={1,2,3,4,5};
int i,j,t;
i=0;j=M-1;
while(i<j)
{t=*(a+i);
*(a+i)=*(a+j);
*(a+j)=t; //指針相互傳參
i++;j--;
}
for(i=0;i<m;i++)
printf("%d",*(a+i));
return 0;
}
input結果為:
54321
25.static定義靜態變量的用法 (觀察即可)
本題以看和了解為主
在定義變量的時候,在數據類型名之前添加static關鍵字,定義的變量就是靜態變量。那麼,可以包括“靜態局部變量”和“靜態全局變量”。
#include <stdio.h>
void varfunc()
{
int var = 0;
static int static_var = 0;
printf("\40:var equal %d \n", var);
printf("\40:static var equal %d \n", static_var);
printf("\n");
var++;
static_var++;
}
void main()
{
int i;
for (i = 0; i < 3; i++)
varfunc();
return;
}
輸出結果:
26.學習使用auto定義變量的用法(觀察即可)
auto函數:
#include <stdio.h>
int main()
{
int i, num;
num = 2;
for (i = 0; i < 3; i++)
{
printf("\40: The num equal %d \n", num);
num++;
{
auto num = 1;
printf("\40: The internal block num equal %d \n", num);
num++;
}
}
return 0;
}
運行結果:
27.小球下落問題
一球從100米高度自由落下,每次落地後反跳回原高度的一半;再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
#include <stdio.h>
#include<math.h>
int main()
{
float high = 100; //總高度
float s, h; //h代表當前高度,s代表總長度
h = high * pow(0.5, 10); //0.5是這個裏面的規律,一半,10代表十次
s = 2 * (50 - h * 0.5 * 2) / (1 - 0.5) + 100;
printf("第十次的高度為%f;總路程為%f", h, s);
return 0;
}
28.找出1000以內所有完數
一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6=1+2+3.編程找出1000以內的所有完數。
#include<stdio.h>//頭文件
int main()//主函數
{
int number,s,i;//定義變量
for(number=2;number<1000;number++)//for循環
{
//直接從2開始
s=0;
for(i=1;i<number;i++)
{
//檢查i是否是m的因子
if((number%i)==0)
{
//如果是的話
s=s+i;
}
}
if(s==number)
{
printf("%d的因子為:",number);
for(i=1;i<number;i++)
{
if(number%i==0)
{
//判斷是否是因子,是的話就輸出
printf("%d ",i);
}
}
printf("\n");//換行
}
}
return 0;//主函數返回值為0
}
29.猜數字
#include "time.h"
#include "stdlib.h"
#include "stdio.h"
main()
{char c;
clock_t start,end;
time_t a,b;
double var;
int i,guess;
srand(time(NULL));
printf("do you want to play it.('y' or 'n') \n");
loop:
while((c=getchar())=='y')
{
i=rand()%100;
printf("\nplease input number you guess:\n");
start=clock();
a=time(NULL);
scanf("%d",&guess);
while(guess!=i)
{if(guess>i)
{printf("please input a little smaller.\n");
scanf("%d",&guess);}
else
{printf("please input a little bigger.\n");
scanf("%d",&guess);}
}
end=clock();
b=time(NULL);
printf("\1: It took you %6.3f seconds\n",var=(double)(end-start)/18.2);
printf("\1: it took you %6.3f seconds\n\n",difftime(b,a));
if(var<15)
printf("\1\1 You are very clever! \1\1\n\n");
else if(var<25)
printf("\1\1 you are normal! \1\1\n\n");
else
printf("\1\1 you are stupid! \1\1\n\n");
printf("\1\1 Congradulations \1\1\n\n");
printf("The number you guess is %d",i);
}
printf("\ndo you want to try it again?(\"yy\".or.\"n\")\n");
if((c=getch())=='y')
goto loop;
}
30.(第一個項目)通訊錄設計
坦白的説自己做的不太好(因為對於指針一類熟悉度不高),這裏從網上引用了一個別人的,自己修改了一下。裏面設計很多指針的應用,謝謝這位作者的代碼。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
typedef struct student //定義結構體
{
char name[20]; //姓名
char num[15]; //學號
char sex[10]; //性別
char from[20]; //籍貫
char political[10]; //政治面貌
char phone[15]; //手機號
char QQ[15]; //QQ號
char dorm[10]; //宿舍
struct student* next; //結構體指針
}stu;
stu* head;
void print() //主菜單
{
system("cls");
printf("\n\n\n");
printf(" ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf(" ***********************************************************\n");
printf(" \t\t\t班級通訊錄管理系統\n");
printf("\n");
printf(" \t\t1. 輸入數據");
printf("\t\t2. 顯示數據\n");
printf(" \t\t3. 插入數據");
printf("\t\t4. 刪除數據\n");
printf(" \t\t5. 查看數據");
printf("\t\t6. 修改數據\n");
printf(" \t\t7. 保存數據");
printf("\t\t8. 返回主菜單\n");
printf(" ***********************************************************\n");
printf(" ~~~~~退~~~~~~~~~~出~~~~~~~~~~請~~~~~~~~~~按~~~~~~~~~~9~~~~~\n");
printf(" -----------------------------------------------------------\n\n");
}
void input(stu* p1) //輸入相關數據
{
printf("姓名:");
scanf("%s", &p1->name);
printf("學號:");
scanf("%s", &p1->num);
printf("性別:");
scanf("%s", &p1->sex);
printf("籍貫:");
scanf("%s", &p1->from);
printf("政治面貌:");
scanf("%s", &p1->political);
printf("手機號:");
scanf("%s", &p1->phone);
printf("QQ號:");
scanf("%s", &p1->QQ);
printf("宿舍:");
scanf("%s", &p1->dorm);
}
stu* inputdata() //數據輸入的函數
{
stu* p1, * p2;
int i = 1;
p1 = (stu*)malloc(sizeof(stu));
if (p1 != NULL)
{
head = p1;
printf("\n\t\t\t☆☆☆輸入數據☆☆☆\n");
printf("------------------------------------------------------------------\n");
printf("在姓名處輸入“ok”代表輸入數據結束\n");
while (i)
{
printf("姓名:");
scanf("%s", &p1->name);
if (strcmp(p1->name, "ok") == 0)
{
printf("\n輸入完畢!\n");
printf("========================================================================\n");
i = 0;
p2->next = NULL;
free(p1);
p1 = p2;
}
else
{
printf("學號:");
scanf("%s", &p1->num);
printf("性別:");
scanf("%s", &p1->sex);
printf("籍貫:");
scanf("%s", &p1->from);
printf("政治面貌:");
scanf("%s", &p1->political);
printf("手機號:");
scanf("%s", &p1->phone);
printf("QQ號:");
scanf("%s", &p1->QQ);
printf("宿舍:");
scanf("%s", &p1->dorm);
printf("=====================================\n");
p2 = p1;
p1 = (stu*)malloc(sizeof(stu));
if (p1 != NULL)
{
p2->next = p1;
}
}
}
return(p1->next);
}
}
stu* lookdata(stu* p1) //查看數據的函數
{
printf("\n\t\t\t☆☆☆顯示數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
while (p1 != NULL)
{
printf("姓名:%s\n", p1->name);
printf("學號:%s\t", p1->num);
printf("性別:%s\t", p1->sex);
printf("籍貫:%s\t", p1->from);
printf("政治面貌:%s\t", p1->political);
printf("手機號:%s\t", p1->phone);
printf("QQ號:%s\t", p1->QQ);
printf("宿舍:%s\n", p1->dorm);
printf("======================================================================\n");
p1 = p1->next;
}
return p1;
}
void insert() //插入數據
{
int i;
char named[20];
stu* p1, * p2, * p3;
p1 = head;
p3 = (stu*)malloc(sizeof(stu));
p3->next = NULL;
printf("\n\t\t\t☆☆☆插入數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("請輸入插入者的資料:\n");
input(p3);
printf("\n插入選項\n");
printf("1.首位置插入\t2.尾位置插入\t3.前插\n");
printf("請輸入你的選擇:");
scanf("%d", &i);
switch (i)
{
case 1:p3->next = p1;
head = p3;
break;
case 2:while (p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
p1->next = p3;
break;
case 3:printf("請輸入姓名(前插):");
scanf("%s", named);
while (strcmp(named, p1->name) != 0)
{
p2 = p1;
p1 = p1->next;
}
p2->next = p3;
p3->next = p1;
break;
}
printf("插入成功!\n");
printf("======================================================================\n");
return;
}
void deleted() //刪除數據
{
stu* p1, * p2;
char Name[20]; //想要刪除的人的姓名
printf("\n\t\t\t☆☆☆刪除數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("請輸入要刪除的姓名:");
scanf("%s", Name);
p1 = head;
if (head == NULL)
{
printf("內存空空神馬都沒有!\n");
printf("======================================================================\n");
return;
}
if (strcmp(Name, p1->name) == 0)
{
head = p1->next;
printf("刪除成功!\n");
printf("======================================================================\n");
return;
}
while (p1 != NULL && (strcmp(Name, p1->name) != 0))
{
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL)
{
printf("此人不存在!\n");
printf("======================================================================\n");
return;
}
if (p1->next != NULL)
{
p1 = p1->next;
p2->next = p1;
printf("刪除成功!\n");
printf("======================================================================\n");
return;
}
else
{
p2->next = NULL;
printf("刪除成功!\n");
printf("======================================================================\n");
return;
}
}
void find(stu* p2) //通過姓名查找查看數據的函數
{
char name[20];
int b = 0;
printf("\n\t\t\t☆☆☆查看數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("請輸入您想查找人的姓名:");
scanf("%s", name);
while (p2 != NULL)
{
if (strcmp(name, p2->name) == 0)
{
printf("你要找到的數據\n");
printf("姓名:%s\n", p2->name);
printf("學號:%s\t", p2->num);
printf("性別:%s\t", p2->sex);
printf("籍貫:%s\t", p2->from);
printf("政治面貌:%s\t", p2->political);
printf("手機號:%s\t", p2->phone);
printf("QQ號:%s\t", p2->QQ);
printf("宿舍:%s\n", p2->dorm);
printf("======================================================================\n");
b = 1;
}
p2 = p2->next;
}
if (b == 0)
{
printf("\n您要查找的人不存在!\n");
}
}
void update(stu* p2) //通過姓名查找修改數據
{
char name[20];
int b = 0, i;
printf("\n\t\t\t☆☆☆修改數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("請輸入將要修改人的姓名:");
scanf("%s", name);
while (p2 != NULL)
{
if (strcmp(name, p2->name) == 0)
{
printf("該同學的基本信息\n");
printf("姓名:%s\n", p2->name);
printf("學號:%s\t", p2->num);
printf("性別:%s\t", p2->sex);
printf("籍貫:%s\t", p2->from);
printf("政治面貌:%s\t", p2->political);
printf("手機號:%s\t", p2->phone);
printf("QQ號:%s\t", p2->QQ);
printf("宿舍:%s\n", p2->dorm);
printf("\n請選擇要修改的信息\n");
printf("\t1.姓名\t2.學號\t3.性別\t4.籍貫\n\t5.政治面貌\t6.手機號\t7.QQ\t8.宿舍\n");
printf("\n您的選擇是(1~8):");
scanf("%d", &i);
printf("請輸入修改之後的內容\n");
switch (i)
{
case 1:printf("姓名:");
scanf("%s", &p2->name);
break;
case 2:printf("學號:");
scanf("%s", &p2->num);
break;
case 3:printf("性別:");
scanf("%s", &p2->sex);
break;
case 4:printf("籍貫:");
scanf("%s", &p2->from);
break;
case 5:printf("政治面貌:");
scanf("%s", &p2->political);
break;
case 6:printf("手機號:");
scanf("%s", &p2->phone);
break;
case 7:printf("QQ:");
scanf("%s", &p2->QQ);
break;
case 8:printf("宿舍:");
scanf("%d", &p2->dorm);
break;
}
printf("\n修改成功!\n");
printf("=========================================================================\n");
b = 1;
}
p2 = p2->next;
}
if (b == 0)
{
printf("沒有找到該人的資料!\n");
}
}
void save(stu* p2) //保存數據
{
FILE* fp;
char file[15];
printf("\n\t\t\t☆☆☆保存數據☆☆☆\n");
printf("----------------------------------------------------------------------\n");
printf("輸入文件名:");
scanf("%s", file);
if ((fp = fopen(file, "w")) == NULL)
{
printf("cannot open this file\n");
exit(0);
}
fprintf(fp, "姓名\t學號\t性別\t籍貫\t政治面貌\t手機號\tQQ號\t宿舍\n");
while (p2 != NULL)
{
fprintf(fp, "%s\t", p2->name);
fprintf(fp, "%s\t", p2->num);
fprintf(fp, "%s\t", p2->sex);
fprintf(fp, "%s\t", p2->from);
fprintf(fp, "%s\t", p2->political);
fprintf(fp, "%s\t", p2->phone);
fprintf(fp, "%s\t", p2->QQ);
fprintf(fp, "%s\n", p2->dorm);
p2 = p2->next;
}
printf("\n保存成功!\n");
printf("======================================================================\n");
fclose(fp);
}
void screen()
{
int i;
char s[251] = { "歡迎使用由ZM製作班級通訊錄管理系統,\n\n\t\t\t本系統用於通訊錄管理----排序,打印\n\n\n\t\tWelcome to use produced by ZM class address book\n\n\t\t management system,sorting,printing" };
printf("\n================================================================================\n");
printf("\n\n\n\t\t\t");
for (i = 0; s[i] != NULL; i++)
{
Sleep(30);
printf("%c", s[i]);
}
printf("\n\n\n\n\n\n\n\n\t\t ~ Hi~ o(* ̄▽ ̄*)ブ~ ~ ~祝您旅途愉快~ ~\n");
printf("================================================================================\n");
}
void main()
{
int i;
system("color 4e");
screen();
Sleep(3000);
print();
while (1)
{
printf("請輸入你的選擇(1~9):");
loop:scanf("%d", &i);
if (i < 1 || i>9)
{
printf("輸入有誤,請在1~9中進行選擇:");
goto loop;
}
switch (i)
{
case 1:
inputdata();
break;
case 2:
lookdata(head);
break;
case 3:
insert();
break;
case 4:
deleted();
break;
case 5:
find(head);
break;
case 6:
update(head);
break;
case 7:
save(head);
break;
case 8:
print();
break;
case 9:
exit(1);
break;
}
}
}
31.求兩個數組的和
已知一個數組a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}數組c[5]等於數組a、b對應元素之和。輸出數組c中個元素的值。
#include<stdio.h>
`
int main()`
{
int a[5] = { 1,2,3,4,5 };
int b[5] = { 11,4,2,7,9 };
int c[5];
int i;
for (i = 0; i < 5; i++)
{
c[i] = a[i] + b[i];
printf("%d\n", c[i]);
}
return 0;
}
32.自定義函數逆序數組
寫一個函數void change(int array[],int n),可以將數組array中的n個元素逆序存放。即array[0]與a[n-1]互換,array[1]與array[n-2]互換……。
void change(int array[], int n)
{
int i, temp; //i在數組內,temp負責交換
for (i = 0; i < n / 2; i++)
{
temp = array[i];
array[i] = array[n - i - 1];
array[n - i - 1] = temp;
}
for (i = 0; i < n; i++)
printf("%4d", array[i]);
}
33.求兩個矩陣的乘積c。已知矩陣a、b的值
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cout<<"請輸入兩矩陣的行列:"<<endl;
cin>>a>>b>>c; //分別錄入第一個矩陣的行,兩矩陣共同行列,第二個矩陣的列
int X[a][b],Y[b][c],Z[a][c]; //開闢三個二維數組存儲矩陣,注意相乘結果的行列值
cout<<"請輸入第一個矩陣:"<<endl;
for(int i=0;i<a;i++){ //矩陣的行
for(int j=0;j<b;j++){ //矩陣的列
cin>>X[i][j];
}
}
cout<<"請輸入第二個矩陣:"<<endl;
for(int i=0;i<b;i++){ //矩陣的行
for(int j=0;j<c;j++){ //矩陣的列
cin>>Y[i][j];
}
}
memset(Z,0,sizeof(Z)); //將二維數組Z初始化為0
//int temp=0;
cout<<"矩陣相乘的結果為:"<<endl;
for(int i=0;i<a;i++){
for(int j=0;j<c;j++){
for(int k=0;k<b;k++){
Z[i][j]=Z[i][j]+X[i][k]*Y[k][j]; //行與列的乘積和為相應結果值
//temp=temp+X[i][k]*Y[k][j];
}
cout<<Z[i][j]<<" "; //計算完一個後輸出
//cout<<temp<<" ";
//temp=0;
}
cout<<endl; //計算完一列後輸出換行
}
return 0;
}
34.應用數組實現輸入年year、月month、日date,計算該日期是這年的第幾天。
要求:定義二維數組求總天數
#include<stdio.h>
int day_of_year(int year, int month, int day); //自定義函數
int main()
{
int year, month, day;
scanf("%d %d %d", &year, &month, &day);
printf("%d", (day_of_year(year, month, day)));
return 0;
}
int day_of_year(int year, int month, int day)
int i, leap; //i指輸入月份-1,其他月的天數遍歷,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}//閏年
};
leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);//1為閏年 0為非
for (i = 1; i < month; i++) {
day += tab[leap][i];
}
return day;
}
35.按照平均成績從高到低的順序輸出學號和平均分。
提示:對平均分排序,當元素互換時,學號元素對應互換。
思路:冒泡排序,冒泡排序算法樣例如下:
#include <stdio.h>
int main()
{
int i,j,t,a[11]; //定義變量及數組為基本整型
printf("請輸入10個數:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]); //從鍵盤中輸入10個數
for(i=1;i<10;i++) //變量i代表比較的趟數
for(j=1;j<11-i;j++) //變最j代表每趟兩兩比較的次數
if(a[j]>a[j+1])
{
t=a[j]; //產利用中間變童實現兩值互換
a[j]=a[j+1];
a[j+1]=t;
}
printf("排序後的順序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //將胃泡排序後的順序輸出
printf("\n");
return 0;
}
本代碼及gif動畫分別引用自:
https://www.runoob.com/w3cnot...
http://c.biancheng.net/view/5...
因此
本題代碼為:
#include<stdio.h>
struct student
{
int num; //學號
char name[20]; //姓名
float score; //分數
}; //先構造結構體,把需要的東西放一起,方便同時排序調換
int main()
{
struct student stu[5] = { { 17,"keen",97.5 }, { 18,"tom",59 }, { 19,"wangli",31 }, { 20,"lihua",54 }, { 21,"yuzhou",98 }
};
struct student t;
int i, j, k;
printf("成績由大到小的順序:\n");
for (i = 0; i < 4; i++) //代表的比較趟數
{
k = i;
for (j = i + 1; j < 5; j++)
{
if (stu[j].score > stu[k].score)
{
k = j;
}
t = stu[k];
stu[k] = stu[i];
stu[i] = t;
}
for (i = 0; i < 5; i++)//循環輸出5個人的成績
{
printf("%d,%10s,%6.2f分\n", stu[i].num, stu[i].name, stu[i].score);//輸出結果
}
return 0;//主函數返回值為0
}
}
36.編寫一個函數,實現str中的字符的互換。如”abcde”換成”edcba”。
關於數組逆序的幾種做法
1.非遞歸做法
已有字符串逆序
#include <stdio.h>
int main()
{
char arr[] = "abcdef";
int sz = sizeof(arr) / sizeof(arr[0]); //求的是數組包含的元素個數,'\0'也包括在內
int left = 0;
int right = sz - 2; //減2是因為求得的sz包含了'\0'這個元素。
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
自己輸入逆序
#include <stdio.h>
#include <string.h>
int main()
{
char arr[101] = { 0 }; //要給字符數組一定的內存大小,如果寫成char arr[] = { 0 };,當在給數組輸入的時候就會造成越界訪問。
scanf("%s", arr);
int sz = strlen(arr); //在給定字符數組的大小為101的情況下,只能用strlen求輸入字符串長度。
//用sizeof(arr)/sizeof(arr[0])求出來的是數組大小,為101。
int left = 0;
int right = sz - 1;
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
printf("%s", arr);
return 0;
}
封裝成函數
#include <stdio.h>
#include <string.h>
void reverse(char arr[])
{
int left = 0;
int right = strlen(arr) - 1; //封裝成函數只能用庫函數求字符串長度,不能用sizeof(arr)/sizeof(arr[0])-1這種方式。
//因為數組形參就是個地址。sizeof(arr)與sizeof(arr[0])的大小都是四個字節或者八個字節。
while (left < right)
{
char tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse(arr);
printf("%s", arr);
return 0;
}
2.遞歸做法
#include <stdio.h>
#include <string.h>
void reverse(char str[], int left, int right)
{
if (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
reverse(str, left + 1, right - 1);
}
}
int main()
{
char arr[101] = { 0 };
scanf("%s", arr);
int left = 0;
int right = strlen(arr) - 1;
reverse(arr, left, right);
printf("%s\n", arr);
return 0;
}
37.從字符串中查找指定的字符並且將其刪除
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<string.h>
int main()
{
char str[100];
char* p = str;
int z = 0;
int t = 0;
char c;
printf("輸入字符串:");
gets(str);
printf("輸入刪除的字符:");
scanf("%c", &c);
t = strlen(str);
for (z = 0; z <= t; z++)
{
*p = str[z];
if (*p != c)
p++;
}
printf("%s", str);
return 0;
}
38.寫一個函數int isprime(int x),如果x是素數返回值為1,否則返回0。
這裏摘抄一段網上對於素數的規律總結:
根據素數的定義思考。素數是大於1的自然數,除了1和自身外,其他數都不是它的因子。
那我們就可以用一個循環,從2開始遍歷到這個數減去1,如果這個數都不能被整除,那麼這個數就是素數。
也就是説:
給定一個數 n , i 從 2 開始取值,直到 n - 1(取整數),如果 n % i != 0 , n 就是素數
進一步思考,有必要遍歷到 n - 1 嗎?
除了1以外,任何合數最小的因子就是2,那最大的因子就是 n/2
那我們就遍歷到 n/2就足夠了
nt isPrime(int target) {
int i = 0;
if (target <= 1) {
printf("illegal input!\n");//素數定義
return -1;
}
for (i = 2; i <= target / 2; i++) {
if (target % i == 0)
return 0;//不是素數直接返回0
}
return 1;//是素數返回1
}
39.用遞歸算法編寫求Fibonacci數列第n項值的函數fib(int n),並用主函數輸出它的前20項來驗證該函數
關於斐波拉第序列,作為程序員,我們只需要知道公式(或者網上找到合適的公式,在計算就好)
F (0)=0, F (1)=1, F (n)= F (n - 1)+ F (n - 2)( n ≥ 2, n ∈ N*)
#include <stdio.h>
int fib(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return fib(n - 1) + fib(n - 2); //公式輸進去
}
}
int main(int argc, char* argv[])
{
for (int i = 1; i <= 20; i++) //第一個到第20個
{
printf("%d\n", fib(i));
}
return 0;
}
vc6.0上的輸出結果:
40.定義3個整型變量及指向整型變量的指針變量,利用3個指針變量完成數據的輸入、從小到大排序、輸出。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a, b, c;
int* p1 = &a,* p2 = &b, * p3 = &c;
int temp;
printf("請輸入三個整型變量:\n");
scanf("%d%d%d", p1, p2, p3);
if (*p1 > *p2)
{
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
if (*p1 > *p3)
{
temp = *p1;
*p1 = *p3;
*p3 = temp;
}
if (*p2 > *p3)
{
temp = *p2;
*p2 = *p3;
*p3 = temp;
}
printf("%d %d %d\n", *p1, *p2, *p3);
return 0;
}
輸出結果:
41.已知一個整型數組a[10],要求定義2個指向整型變量的指針變量max、min,使得它們分別指向數組的最大數和最小數。
//設定一個數組
//設定兩個指針
//將兩個指針定義初始化
//循環
//比較大小
//輸出
#include<stdio.h>
int main()
{
int a[5] = { 11,15,99,24,35 }, i;
int* max, * min;
max = min = &a[0];
for (i = 1; i < 5; i++)
{
if (*max < a[i])
max = &a[i];
if (*min > a[i])
min = &a[i];
}
printf("max=%d,min=%d\n", *max, *min);
}
42.實現字符串的查找、刪除、替換
//實現字符串的查找、刪除、替換
# include<stdio.h>
# include<string.h>
//字符串的查找
int find(char *str1,char *str2)//在str1中尋找str2
{
int len1=strlen(str1);
int len2=strlen(str2);
int i=0,index;
if(len1<len2)
return -1;//查找失敗
else
{
index=0;
for(i=0;i<len1;i++)
{
if(str1[i]==str2[index])
{
index++;
if(index==len2)
return i-len2+1;//返回第一次碰到str2的索引
}
else
{
index=0;
}
}
return -1;
}
}
//字符串的刪除
char* delet(char* str,int start,int step)//在str1中刪除從start到start+step的子串
{
int len=strlen(str);
int i=0;
if(len<start+step)
return NULL;//char *返回值NULL
else
{
for(i=start;i<len-step;i++)
{
str[i]=str[i+step];
}
str[len-step]='\0';//末尾補0,補全新的字符串
return str;
}
}
//字符串的替換
char *replace(char *str1,int start,char *str2)
{
int len1=strlen(str1);
int len2=strlen(str2);
int i=0,index=0;
if(len1<start+len2)
return NULL;
else
{
for(i=start;i<start+len2;i++)
{
str1[i]=str2[index++];
}
str1[len1]='\0';
return str1;
}
}
int main()
{
char str1[40];
char str2[40];
//刪除重複子串
while(scanf("%s%s",str1,str2)!=EOF)
{
int t=find(str1,str2);
// printf("%d\n",t);
while(t!=-1)
{
//刪除
char *p=delet(str1,t,strlen(str2));
t=find(p,str2);
}
printf("%s\n",str1);
}
return 0;
}
43.請編寫函數fun,該函數的功能是:移動字符串中的內容,移動的規則如下:把第1到第n個字符,平移到字符串的最後,把第n+1到最後的字符移到字符串的前部
思考中...如果你們有思路,可以評論區説説,謝謝
給它一個空白
44.小明有5本新書,要借給A、B、C這3位小朋友,若每人每次只能借1本,則可以有多少種不同的借法
剛剛那個題欠着,有點沒想出來,放鬆一下....這道題很簡單,如果你是高手,可以略過
#include<stdio.h>
int main()
{
int a, b, c, x = 0;
for (a = 1; a <= 5; a++)
for (b = 1; b <= 5; b++)
for (c = 1; c <= 5; c++)
if (a != b && a != c && b != c)
x++;
printf("有%d種不同的借法\n", x);
}
45.某市體育彩票採用整數1,2,3,…,36表示36種體育運動,一張彩票可選擇7種運動。編寫程序,選擇一張彩票的號碼,使這張彩票的7個號碼之和是105且相鄰兩個號碼之差按順序依次是1,2,3,4,5,6。例如,第一個號碼是1,則後續號碼應該是2,4,7,11,16,22。
程序分析:若7個號碼中的第一個號碼是k0,則後續號碼之間的關係是ki-ki-1=i。其中i=1,2,3,4,5,6。
(老實説,個人覺得這道題意思有些不明確,號碼之差順序1,2,3和2,4,7是怎麼來的,我想了很久....)
#include<stdio.h>
int main()
{
int a[7];
int i,sum;
for(a[0]=1;a[0]<=15;a[0]++)
{
for(i=1;i<=6;i++)
a[i]=a[i-1]+i;
sum=0;
for(i=0;i<=6;i++)
sum+=a[i];
if(sum==105)
{
for(i=0;i<=6;i++)
printf("%d ",a[i]);
printf("\n");
}
}
return 0;
}
46.將一個正整數分解質因數。
例如:輸入90,打印出90=2*3*3*5
思路:短除法
#include<stdio.h>
int main()
{
int n, i;
printf("請輸入整數:");
scanf("%d", &n); //輸入這個數
printf("%d=", n); //輸出左側n的值
for (i = 2; i <= n; i++) //從2開始依次循環
{
while (n % i == 0)
{
printf("%d", i);
n /= i;
if (n != 1) printf("*");
}
}
printf("\n");
return 0;
}
47.求1-1000以內的迴文素數。迴文素數指的是這個數既是迴文數又是素數。
#include <stdio.h>
int main()
{
int i, a, b, k;
for (i = 1; i <= 1000; i++)
{
b = 0;
if ((i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) || i == 2 || i == 3 || i == 5 || i == 7) //素數條件
{
k = i;
while (1)
{
a = k % 10;
b = 10 * b + a;
if (k < 10)
break;
k = k / 10;
}
if (b == i)
printf("%d\n", i);
}
}
return 0;
}
輸出截圖:
46.百萬富翁問題
一個百萬富翁遇到一個陌生人,陌生人找他談一個換錢的計劃,該計劃如下:我每天給你十萬元,而你第一天只需給我一分錢;第二天我仍給你十萬元,你給我兩分錢;第三天我仍給你十萬元,你給我四分錢;…,你每天給我的錢是前一天的兩倍,直到滿一個月(30天)。百萬富翁很高興,欣然接受了這個契約。請編寫一個程序計算:這一個月中陌生人給了百萬富翁多少錢,百萬富翁給陌生人多少錢
#include<stdio.h>
void main()
{
double i, sum = 0, x = 0.01;
for (i = 1; i <= 30; i++)
{
x *= 2;
sum += x;
}
printf("這一個月中陌生人給了百萬富翁%d元\n", 30 * 100000);
printf("這一個月中百萬富翁給了陌生人%f元\n", sum);
return;
}
vs運行結果:
47.如果整數A的全部因子(包括1,不包括A本身)之和等於B;且整數B的全部因子(包括1,不包括B本身)之和等於A,則將整數A和B稱為親密數。求3000以內的全部親密數
程序分析:求A的因子之和為B,再求B的因子之和為C。判斷A是否等於C。
#include <stdio.h>
int main()
{
int a, b, i, j, c;
for(a=1;a<3000;a++)
{
b = 0;
for (i = 1; i <= a / 2; i++)
if (a % i == 0)
b += i;
c = 0;
for (j = 1; j <= b / 2; j++)
if (b % j == 0)
c += j;// c=b的因子和
if (a == c && a < b)// 排除重複
printf("%d和%d為親密數\n", a, b);
}
return 0;
}
48.一數三平方
在【100000,999999】範圍內找出符合以下條件的數並輸出:
- 該數本身是一個平方數
- 該數的前3位也是一個平方數
- 該數的後3位也是一個平方數
#include <stdio.h>
#include <math.h>
int main()
{
int i, num0, num1, num2;
for (i = 100000; i < 999999; i++) //範圍確定
{
num0 = (int)sqrt(i); //平方根,int強制整型
num1 = (int)sqrt(i / 1000);
num2 = (int)sqrt(i % 1000);
if (num0 * num0 == i && num1 * num1 == i / 1000 && num2 * num2 == i % 1000) //如果這些條件都滿足
printf("%d\n", i);
}
return 0;
}
49.簡化的插入排序
#include<stdio.h>
main()
{
int N, X, i, t, k, j;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &X);
N += 1;
a[N - 1] = X;
for (i = 0; i < N; i++)
{
for (j = 0; j < N - i - 1; j++)
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 0; i < N; i++)
printf("%d ", a[i]);
return 0;
}
50.求最大值及其下標
#include <stdio.h>
#define N 10
int main()
{
int i, n, max;
int index = 0;
int arr[N];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
max = arr[0];
for (i = 1; i < n; i++)
{
if (max < arr[i])
{
max = arr[i];
index = i;
}
}
printf("%d %d\n", arr[index], index);
return 0;
}
51.將數組中的數逆序存放
設定10個數值的數組
#include<stdio.h>
#define N 10
int main()
{
int i, n;
int temp;
int arr[N];
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < n / 2; i++)
{
temp = arr[i];
arr[i] = arr[n - i - 1];
arr[n - i - 1] = temp;
}
for (i = 0; i < n; i++)
{
printf(" %d", arr[i]); //因為行末尾不能有空格
}
return 0;
}
52.找出不是兩個數組共有的元素
輸入樣例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
#include <stdio.h>
int main()
{
int n1, n2;
int a[20], b[20], i, j; //分別遍歷a,b兩個數組
scanf("%d", &n1);
for (i = 0; i < n1; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &n2);
for (j = 0; j < n2; j++)
{
scanf("%d", &a[j]);
}
//兩個數組帶入輸入
int c[40] = { 0 };
int flag = 1;
int mark;
int k;
for (i = 0; i < n1; i++)
{
flag = 1;
for (j = 0; j < n2; j++)
{
if (a[i] = b[j])
{
flag = 0;
break;
}
}
if (flag == 1)
{
c[mark] == b[j];
mark++;
}
}
for (i = 0; i < mark; i++)
{
for (j = i + 1; j < mark; j++)
{
if (c[j] == c[i])
{
for (k = j; k < mark - 1; k++)
{
c[k] = c[k + 1];
}
mark--;
j--;
}
}
}
//完成篩查c[]重複的數
printf("%d", c[0]);
for (i = 1; i < mark; i++) {
printf(" %d", c[i]);
}
return 0;
}
53.凱撒密碼
為了防止信息被別人輕易竊取,需要把電碼明文通過加密方式變換成為密文。輸入一個以回車符為結束標誌的字符串(少於80個字符),再輸入一個整數offset,用凱撒密碼將其加密後輸出。愷撒密碼是一種簡單的替換加密技術,將明文中的所有字母都在字母表上偏移offset位後被替換成密文,當offset大於零時,表示向後偏移;當offset小於零時,表示向前偏移。
它又叫循環移位密碼.它的加密方法,就是將明文中的每個字母用此字符在字母表中後面第k個字母替代.它的加密過程可以表示為下面的函數:
E(m)=(m+k) mod n
其中:m為明文字母在字母表中的位置數;n為字母表中的字母個數;k為密鑰;E(m)為密文字母在字母表中對應的位置數.
例如,對於明文字母H,其在字母表中的位置數為8,設k=4,則按照上式計算出來的
密文為L:
E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L
#include <stdio.h>
#include <string.h>
int main()
{
char password[100];
int i, move, tmp;
printf("加密選擇1,解密選擇2");
scanf("%d", &tmp);
switch (tmp)
{
case(1): //加密
printf("輸入原文:");
scanf("%s", &password);
printf("自定義密鑰");
scanf("%d", &move);
for (i = 0; i < strlen(password); i++)
{
if (password[i] >= 'A' && password[i] <= 'Z')
{
password[i] = ((password[i] - 'A') + move) % 26 + 'A';
}
else if (password[i] >= 'a' && password[i] <= 'z')
{
password[i] = ((password[i] - 'a') + move) % 26 + 'a';
}
}
printf("加密後的密文");
printf("%s\n", password);
break;
case(2): //解密
{
printf("輸入密文:");
scanf("%s", &password);
printf("密匙為(1-25):");
scanf("%d", &move);
for (i = 0; i < strlen(password); i++)
{
if (password[i] >= 'A' && password[i] <= 'Z')
{
password[i] = ((password[i] - 'A') + 26 - move) % 26 + 'A';
}
else if (password[i] >= 'a' && password[i] <= 'z')
{
password[i] = ((password[i] - 'a') + 26 - move) % 26 + 'a';
}
}
printf("解密後的原文");
printf("%s\n", password);
}
default:
break;
}
return 0;
}
54.數字加密
輸入一個四位數,將其加密後輸出。方法是將該數每一位上的數字加9,然後除以10取餘,做為該位上的新數字,最後將千位和十位上的數字互換,百位和個位上的數字互換,組成加密後的新四位數。例如輸入1257,經過加9取餘後得到新數字0146,再經過兩次換位後得到4601。
輸入格式:
輸入在一行中給出一個四位的整數x,即要求被加密的數。
輸出格式:
在一行中按照格式“The encrypted number is V”輸出加密後得到的新數V。
輸入樣例:
1257
輸出樣例:
The encrypted number is 4601
#include <stdio.h>
int main()
{
int a[4]; //原始數組
int i; //循環遍歷數
int input;//input number
int temp; //交換
printf("輸入一個四位數");
scanf("%d", input);
// 每個數分離出來
for (i = 4; i >= 1; i--)
{
a[i] = input % 10;
input = input / 10;
}
//將該數每一位上的數字加9,然後除以10取餘
for (i = 0; i <= 4; i++)
{
a[i] = a[i] + 9;
}
for (i = 0; i <= 4; i++)
{
a[i] = a[i] % 10;
}
//千位和十位上的數字互換
for (i = 0; i < 2; i++)
{
temp = a[i];
a[i] = a[i + 2];
a[i + 2] = temp;
}
printf("The encrypted number is ");
for (i = 0; i < 4; i++)
{
printf("%d", a[i]);
}
return 0;
}
55.平面向量加法
本題要求編寫程序,計算兩個二維平面向量的和向量。
輸入格式:
輸入在一行中按照“x1 y1 x2 y2”的格式給出兩個二維平面向量v1=(x1,y1)和v2=(x2,y2)的分量。
輸出格式:
在一行中按照(x, y)的格式輸出和向量,座標輸出小數點後一位(注意不能輸出−0.0)。
輸入樣例:
3.5 -2.7 -13.9 8.7
輸出樣例:
(-10.4, 6.0)
代碼如下:
#include <stdio.h>
int main(){
double x1,x2,y1,y2,x,y;
scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);
x=x1+x2;y=y1+y2;
if(x>-0.05&&x<0){
x=0.0;
}
if(y>-0.05&&y<0){
y=0.0;
}
printf("(%1.1f, %1.1f)",x,y);
return 0;
}
56.查找書籍
給定n本書的名稱和定價,本題要求編寫程序,查找並輸出其中定價最高和最低的書的名稱和定價。
輸入格式:
輸入第一行給出正整數n(<10),隨後給出n本書的信息。每本書在一行中給出書名,即長度不超過30的字符串,隨後一行中給出正實數價格。題目保證沒有同樣價格的書。
輸出格式:
在一行中按照“價格, 書名”的格式先後輸出價格最高和最低的書。價格保留2位小數。
輸入樣例:
3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0
完整代碼如下:
#include <stdio.h>
#include<string.h>
#include<windows.h>
struct book
{
char name[65];
float price;
}books[10];
int input(int n)
{
for (int i = 0; i < n; i++)
{
gets_s(books[i].name);
scanf("%f", &books[i].price);
system("pause");
}
}
int main()
{
int n, i;
scanf("%d", &n);
getchar();
input(n);
int min, max=0;
for (i = 1; i < n; i++)
{
if (books[i].price < books[min].price)
min = i;
if (books[i].price > books[max].price)
max = i;
}
printf("%.2f, %s\n", books[max].cost, books[max].name);
printf("%.2f, %s", books[min].cost, books[min].name);
return 0;
}
57.求一批整數中出現最多的個位數字
給定一批整數,分析每個整數的每一位數字,求出現次數最多的個位數字。例如給定3個整數1234、2345、3456,其中出現最多次數的數字是3和4,均出現了3次。
輸入格式:
輸入在第1行中給出正整數N(≤),在第二行中給出N個不超過整型範圍的非負整數,數字間以空格分隔。
輸出格式:
在一行中按格式“M: n1 n2 ...”輸出,其中M是最大次數,n1、n2、……為出現次數最多的個位數字,按從小到大的順序排列。數字間以空格分隔,但末尾不得有多餘空格。
輸入樣例:
3
1234 2345 3456
輸出樣例:
3: 3 4
#include<stdio.h>
int main(void)
{
int i, n; //i每一次,n總次數
int number; //輸入這批數字
int index;
int a[10] = { 0 };
int sum; //對比
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &number);
while (number)
{
index = number % 10;
a[index]++;
number = number / 10;
}
}
sum = 0;
for (i = 0; i < 10; i++)
{
if (a[i] > sum)
{
sum = a[i];
printf("%d", sum);
for (i = 0; i < 10; i++)
if (sum == a[i])
printf("%d", &i);
return 0;
}
}
}
58.使用函數求特殊a串數列和
給定兩個均不超過9的正整數a和n,要求編寫函數求a+aa+aaa++⋯+aa⋯a(n個a)之和。
#include <stdio.h>
int fn(int a, int n);
int SumA(int a, int n);
int main()
{
int a, n;
scanf("%d %d", &a, &n);
printf("fn(%d, %d) = %d\n", a, n, fn(a, n));
printf("s = %d\n", SumA(a, n));
return 0;
}
int fn(int a, int n) //fn須返回的是n個a組成的數字
{
int sum1 = 0;
int i = 0;
for (int i = 0; i < n; i++)
{
sum1 = 10 * sum1 + a;
}
return sum1;
}
int SumA(int a, int n)//SumA返回要求的和
{
int sum2 = 0;//總和
int j = 0; //j當前循環次數的和
int k = 0; //a為數,n為次數,k為配合n
for (int k = 0; k < n; k++)
{
j = 10 * j + a;
sum2 += j;
}
return sum2;
}
59.選擇法排序
輸入格式:
輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。
輸出格式:
在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。
思路:
給定一個數,這個數就是數組的大小
第二行輸入的數在數組裏放置
設定一個變量(用於比較用),兩兩交換,最後輸出
#include <stdio.h>
int main()
{
int a[10];
int i, n;
int temp;
int j;//用於兩兩比較
scanf("%d\n", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < n; i++)
{
for (j = n - 1; j > i; j--)
{
if (a[j] > a[i])
{
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (i = 0; i < n; i++)
printf("%d", a[i]);
return 0;
}
60. 找鞍點
一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。
本題要求編寫程序,求一個給定的n階方陣的鞍點。
輸入格式:
輸入第一行給出一個正整數n(1)。隨後n行,每行給出n個整數,其間以空格分隔。
輸出格式:
輸出在一行中按照“行下標 列下標”(下標從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點。
輸入樣例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
輸出樣例1:
2 1
輸入樣例2:
2
1 7
4 1
輸出樣例2:
NONE
完整代碼如下:
#include <stdio.h>
int main()
{
int a[10][10];
int i, j;
int n; //希望的數組大小,輸入
int max;//定義該行最大值
int min;//定義該列最小值
int point1;//橫座標
int point2;//縱座標
int sign;//標誌數
int k;//比較最小時用
scanf("%d", &n); //數組大小輸入
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &a[i][j]);
}
}
for (i = 0; i < n; i++)
{
max = a[i][0];
point1 = i;
point2 = 0;
sign = 1;
for (j = 0; j < n; j++)
{
if (a[i][j] >= max)
max = a[i][j];
point1 = i;
point2 = j;
}
min = max;
for (k = 0; k < n; k++)
{
if (a[k][point2] < min)
{
sign = 0;
break;
}
}
}
if (sign == 1)
printf("%d %d,point1,point2");
else
printf("NONE");
return 0;
}
61.使用函數驗證哥德巴赫猜想
任何一個不小於6的偶數均可表示為兩個奇素數之和。素數就是隻能被1和自身整除的正整數。注意:1不是素數,2是素數。
int prime( int p );
void Goldbach( int n );
其中函數prime當用户傳入參數p為素數時返回1,否則返回0;函數Goldbach按照格式“n=p+q”輸出n的素數分解,其中p≤q均為素數。又因為這樣的分解不唯一(例如24可以分解為5+19,還可以分解為7+17),要求必須輸出所有解中p最小的解。
#include <stdio.h>
#include <math.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
/* 你的代碼將被嵌在這裏 */
插入函數部分:
#include<stdio.h>
int prime(int p)
{
int i;
if (p == 1) {
return 0;
}
else if (p == 2)
{
return 1;
}
else {
for (i = 2; i < p; i++) {
if (p % i == 0)
return 0;
}
}
return 1;
}
void Goldbach(int n)
{
int a;
int count = 0;
for (a = 2; a <= n; a++) {
if (prime(a) == 1 && prime(n - a) == 1) {
printf("%d=%d+%d", n, a, n - a);
break;
}
}
}
62.判斷上三角矩陣
上三角矩陣指主對角線以下的元素都為0的矩陣;主對角線為從矩陣的左上角至右下角的連線。
本題要求編寫程序,判斷一個給定的方陣是否上三角矩陣。
輸入格式:
輸入第一行給出一個正整數T,為待測矩陣的個數。接下來給出T個矩陣的信息:每個矩陣信息的第一行給出一個不超過10的正整數n。隨後n行,每行給出n個整數,其間以空格分隔。
輸出格式:
每個矩陣的判斷結果佔一行。如果輸入的矩陣是上三角矩陣,輸出“YES”,否則輸出“NO”。
輸入樣例:
2
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
輸出樣例:
YES
NO
完整代碼如下:
#include<stdio.h>
int main(void)
{
int T;
int i;
int j, k;
int a[10][10];
int n;
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%d", &n);
int sign = 1;
for (j = 0; j < n; j++)
{
for (k = 0; k < n; k++)
{
scanf("%d", &a[j][k]);
if (j > k)
{
if (a[j][k] != 0)
sign = 0;
}
}
}
if (sign)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
63.ip地址轉換
一個IP地址是用四個字節(每個字節8個位)的二進制碼組成。請將32位二進制碼錶示的IP地址轉換為十進制格式表示的IP地址輸出。
輸入格式:
輸入在一行中給出32位二進制字符串。
輸出格式:
在一行中輸出十進制格式的IP地址,其由4個十進制數組成(分別對應4個8位的二進制數),中間用“.”分隔開。
輸入樣例:
11001100100101000001010101110010
輸出樣例:
204.148.21.114
#include<stdio.h>
int main()
{
char ip[32] = "192.168.1.151"; //ip值
char address[32] = ""; //存儲字符串ip
unsigned int ipaddress = 0; //存儲整型ip
int fenge[4] = { 0 };
int i = 0;
sscanf(ip, "%d.%d.%d.%d", &fenge[0], &fenge[1], &fenge[2], &fenge[3]);
for (i = 0; i < 4; i++)
{
ipaddress += (fenge[i] << (24 - (i * 8)) & 0xFFFFFFFF);
}
printf("整型ip:%u\r\n", ipaddress);
sprintf(address, "%d.%d.%d.%d", ipaddress>> 24, (ipaddress & 0xFF0000) >> 16, (ipaddress & 0xFF00) >> 8, ipaddress & 0xFF);
//輸出
printf("字符串IP:%s\r\n", address);
return 0;
}
64.括弧匹配檢驗
假設表達式中允許包含兩種括號:圓括號和方括號,其嵌套的順序隨意,如([ ]())或[([ ][ ])]等為正確的匹配,[( ])或([ ]( )或 ( ( ) ) )均為錯誤的匹配。
現在的問題是,要求檢驗一個給定表達式中的括弧是否正確匹配?
輸入一個只包含圓括號和方括號的字符串,判斷字符串中的括號是否匹配,匹配就輸出 “OK” ,不匹配就輸出“Wrong”。輸入一個字符串:[([][])],輸出:OK。
#include<stdio.h>
#include<stdlib.h>
char stack[256];
int main()
{
int top = 0;
char str[256];
gets_s(str);
int i = 0;
while (str[i] != '\0')
{
if (str[i] == '(' || str[i] == '[');
{
stack[++top] == str[i];
}
else if (str[i] == ')' || str[i] == ']')
{
if ((str[i] == ')' && stack[top] == '(') || (str[i] == ']' && stack[top] == '['))
{
top--;
}
else
{
printf("wrong");
return 0;
}
}
i++;
}
if (top == 0)
{
printf("ok");
}
else
{
printf("wrong");
}
return 0;
}
65.求最大公約數
#include <stdio.h>
//函數聲明
int gcd(int a, int b); //也可以寫作 int gcd(int, int);
int main(){
printf("The greatest common divisor is %d\n", gcd(100, 60));
return 0;
}
//函數定義
int gcd(int a, int b){
//若a<b,那麼交換兩變量的值
if(a < b){
int temp1 = a; //塊級變量
a = b;
b = temp1;
}
//求最大公約數
while(b!=0){
int temp2 = b; //塊級變量
b = a % b;
a = temp2;
}
return a;
}
66. 字符串壓縮
字符串壓縮。利用字符重複出現的次數,編寫一種方法,實現基本的字符串壓縮功能。比如,字符串aabcccccaaa會變為a2b1c5a3。若“壓縮”後的字符串沒有變短,則返回原先的字符串。你可以假設字符串中只包含大小寫英文字母(a至z)。
class Solution {
public:
string compressString(string S) {
if ((int)S.length() == 0) return S; // 空串處理
string ans = "";
int cnt = 1;
char ch = S[0];
for (int i = 1; i < (int)S.length(); ++i){
if (ch == S[i]) cnt++;
else{
ans += ch + to_string(cnt); // 注意 cnt 要轉為字符串
ch = S[i];
cnt = 1;
}
}
ans += ch + to_string(cnt);
return ans.length() >= S.length() ? S : ans;
}
};
67.狼類中有一個成員是攻擊力 Attacks value 人類中也有一個攻擊力Attacks value。由狼類和人類共同的派生類狼人類中,該如何消除二義性,請用代碼實現。
#include <iostream>
using namespace std;
class animal
{
public:
int attack;
};
class wolf :virtual public animal
{
public:
void wolfmember()
{
cout << "狼人攻擊" << endl;
}
};
class people :virtual public animal
{
public:
void peoplemember()
{
cout << "人類攻擊" << endl;
}
};
class wolfman :public wolf, public people
{
public:
void wolfmanattack()
{
cout << "wolfman attack is" << attack << endl;
}
};
int main()
{
wolfman keen; //對狼人下定義
keen.attack = 10;
keen.wolfmanattack();
return 0;
}
68.左旋轉字符串
字符串的左旋轉操作是把字符串前面的若干個字符轉移到字符串的尾部。請定義一個函數實現字符串左旋轉操作的功能。比如,輸入字符串"abcdefg"和數字2,該函數將返回左旋轉兩位得到的結果"cdefgab"。
示例 1:
輸入: s = "abcdefg", k = 2
輸出: "cdefgab"
示例 2:
輸入: s = "lrloseumgh", k = 6
輸出: "umghlrlose"
class Solution {
public:
string reverseLeftWords(string str,int n){
if(str.size()==0) return str;
string s = str.substr(0,n);
string res = str.substr(n,str.size()-n) + s;
return res;
}
};
(持續更新,未完待續)